📄 crc_rx.v
字号:
//-------------本设计为CRC5接收效验模块
//---本设计模块用来接收数据的CRC效验。
//---本模块共需要5个时钟周期来完成:
//---第一个周期:模块初始化;
//---第2周期: 上升沿接收数据,调用函数CRC5处理前16bit
//---第3周期: 上升沿接收数据,调用函数CRC5_S处理第17bit;并接收来之数据流的CRC,用于与计算的CRC比较
//---第4个周期,输出比较结果,若接收来之数据流的CRC,等于计算的CRC,则Rx_over=1;否则Rx_over=0;
//---第5个周期,输出Rx_over=0,以便模块调用时接口的处理;
module CRC_Rx(clk,rset,data,Rx_over);
input clk,rset; //输入时钟、使能端
input[15:0] data;
output Rx_over; //CRC效验的握手信号,高电平有效,表示接受数据正确
reg Rx_over;
reg[2:0] i; //完成整个数据的CRC运算的计数
reg[4:0] crc_reg; //用来存储CRC临时计算结果
reg[4:0] crc_data; //用来存储接收的CRC效验码,与计算出来的CRC进行比较!
always @(posedge clk)
begin
if(rset) //初始化
begin
crc_reg<=5'b01001; //按6C标准,预置01001
i<=3'b0;
Rx_over<=1'b0;
end
else if(i==0) //调用函数CRC5处理前16bit,一个时钟完成
begin
crc_reg<=CRC5(data,crc_reg);
i<=i+1;
Rx_over<=1'b0;
end
else if(i==1) //调用函数CRC5_S处理第17bit,一个时钟完成
begin
crc_reg<=CRC5_S(data[15],crc_reg);
crc_data<={data[14],data[13],data[12],data[11],data[10]}; //接收来之数据流的CRC,用于与计算的CRC比较
i<=i+1;
Rx_over<=1'b0;
end
else if(i==2) //输出比较结果
begin
i<=i+1;
if(crc_reg==crc_data)
Rx_over<=1'b1;
else
Rx_over<=1'b0;
end
else if(i==3)
begin
Rx_over<=1'b0;
end
end
///函数CRC5是对输入数据为整字的处理,在一个时钟内,调用一次,可以完成并行输入16bit的CRC处理。
function [4:0] CRC5;
input[15:0] D; //输入待处理的数据
input[4:0] R; //寄存器
reg[4:0] R_temp; //
begin
R_temp[0]=R[4]^R[3]^R[2]^D[15]^D[14]^D[13]^D[9]^D[8]^D[6]^D[5]^D[4]^D[2]^D[0];
R_temp[1]=R[4]^R[3]^D[15]^D[14]^D[10]^D[9]^D[7]^D[6]^D[5]^D[3]^D[1];
R_temp[2]=R[4]^R[0]^D[15]^D[11]^D[10]^D[8]^D[7]^D[6]^D[4]^D[2];
R_temp[3]=R[4]^R[3]^R[2]^R[1]^R[0]^D[15]^D[14]^D[13]^D[12]^D[11]^D[7]^D[6]^D[4]^D[3]^D[2]^D[0];
R_temp[4]=R[4]^R[3]^R[2]^R[1]^D[15]^D[14]^D[13]^D[12]^D[8]^D[7]^D[5]^D[4]^D[3]^D[1];
CRC5=R_temp;
end
endfunction
///函数CRC5_S是对输入数据为bit的处理,在一个时钟内,调用一次,可以完成串行输入1bit的CRC处理。
function [4:0] CRC5_S;
input din; //串行输入数据流(从MsB开始)
input [4:0] crc5_reg;
reg crc_r2,crc_r4;
begin
crc_r2=crc5_reg[2];
crc5_reg[2:1]=crc5_reg[1:0];
crc_r4=crc5_reg[4];
crc5_reg[4]=crc5_reg[3];
crc5_reg[0]=crc_r4^din;
crc5_reg[3]=crc_r4^din^crc_r2;
CRC5_S=crc5_reg;
end
endfunction
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -