crc 参考:
基于FPGA的CRC校验码生成器_fpga crc 8bit校验_limanjihe的博客-CSDN博客
FPGA产生基于LFSR的伪随机数 - BitArt - 博客园
总结: 有效数据的位宽 是 代码中的 i ,crc校验码宽度是 crc_temp 的位宽,生成多项式(反馈点)为公式中的 异或
module CRC5_GEN(
input rst,
input clk,
input [3:0] data_in,
input d_valid,
output reg[4:0] crc
);
integer i;
reg feedback;
reg [4:0] crc_tmp;
always @(posedge clk or negedge rst)
begin
if(!rst)
crc <= 5'b0;
else if(d_valid==1'b0)
crc <= 5'b0;
else
crc <= crc_tmp;
end
always@( data_in or crc)
begin
crc_tmp = crc;
for(i=3; i>=0; i=i-1)
begin
feedback = crc_tmp[4] ^ data_in[i];
crc_tmp[4] = crc_tmp[3];
crc_tmp[3] = crc_tmp[2];
crc_tmp[2] = crc_tmp[1] ^ feedback;
crc_tmp[1] = crc_tmp[0];
crc_tmp[0] = feedback;
end
end
endmodule
8b/10b 编码:
目的是负载均衡 ,使每一个 8bit 数据都映射成一个 5bit 0 + 5 bit 1 的数据,8bit 有256种数据,而 10bit中5bit0/5bit1 一共可以表示 C(10,5) = 10! / 5! / 5! =252 种数据, 基本可以完全映射
64b/66b 编码 + 扰码:
64b/66b 中多的 2bit 是无法像 8b/10b 一样 ,用 33bit 0 + 33bit 1的组合来表示2^64种情况,一一映射没有足够数量的组合形式。即无法用 2bit 的组合来均衡64bit的数据。
64b/66b 中多的 2bit 只是用来区分数据头,用的扰码的方法来实现了负载均衡,即用类似crc 的多项式将原始数据随机化 ,随机的数据理论上就是均衡的。随机化之后相同的原始数据在不同的时间得到的结果可能是不同的,结果与原始数据不是一一映射的关系,
解扰码只需要根据 一个逻辑运算表达式(如果A^B=C,那么C^B=A,此处A为原始数据,B为扰码器的输出,C为扰码后的数据) ,逆向用相同的多项式和种子值依次解开即可
时钟数据恢复 CDR :
时钟恢复就像 pll锁相一样,但是数据会有连0连1的现象,不像 clk 是周期性的,导致反馈不是稳定的,不能在较短时间内锁住
时钟恢复的基础是有足够多的数据,然后 DC平衡,才能在数据连0导致反馈频率下降和数据连1导致反馈频率上升之间找到最终的平均值,即实际的时钟, 这里的DC平衡就用8b/10b ,64b/66bit 实现
pll 或者 cdr 电路因为有低通滤波器的存在,低频的抖动是可以通过的,高频的抖动会被滤掉,所以会在 pll 的输出clk观察到低频时钟抖动,在 cdr 的数据采集时采集准确度不受低频抖动干扰(数据和恢复的时钟一起抖,所以能采准)