?? crc_rx.v
字號(hào):
//-------------本設(shè)計(jì)為CRC5接收效驗(yàn)?zāi)K
//---本設(shè)計(jì)模塊用來(lái)接收數(shù)據(jù)的CRC效驗(yàn)。
//---本模塊共需要5個(gè)時(shí)鐘周期來(lái)完成:
//---第一個(gè)周期:模塊初始化;
//---第2周期: 上升沿接收數(shù)據(jù),調(diào)用函數(shù)CRC5處理前16bit
//---第3周期: 上升沿接收數(shù)據(jù),調(diào)用函數(shù)CRC5_S處理第17bit;并接收來(lái)之?dāng)?shù)據(jù)流的CRC,用于與計(jì)算的CRC比較
//---第4個(gè)周期,輸出比較結(jié)果,若接收來(lái)之?dāng)?shù)據(jù)流的CRC,等于計(jì)算的CRC,則Rx_over=1;否則Rx_over=0;
//---第5個(gè)周期,輸出Rx_over=0,以便模塊調(diào)用時(shí)接口的處理;
module CRC_Rx(clk,rset,data,Rx_over);
input clk,rset; //輸入時(shí)鐘、使能端
input[15:0] data;
output Rx_over; //CRC效驗(yàn)的握手信號(hào),高電平有效,表示接受數(shù)據(jù)正確
reg Rx_over;
reg[2:0] i; //完成整個(gè)數(shù)據(jù)的CRC運(yùn)算的計(jì)數(shù)
reg[4:0] crc_reg; //用來(lái)存儲(chǔ)CRC臨時(shí)計(jì)算結(jié)果
reg[4:0] crc_data; //用來(lái)存儲(chǔ)接收的CRC效驗(yàn)碼,與計(jì)算出來(lái)的CRC進(jìn)行比較!
always @(posedge clk)
begin
if(rset) //初始化
begin
crc_reg<=5'b01001; //按6C標(biāo)準(zhǔn),預(yù)置01001
i<=3'b0;
Rx_over<=1'b0;
end
else if(i==0) //調(diào)用函數(shù)CRC5處理前16bit,一個(gè)時(shí)鐘完成
begin
crc_reg<=CRC5(data,crc_reg);
i<=i+1;
Rx_over<=1'b0;
end
else if(i==1) //調(diào)用函數(shù)CRC5_S處理第17bit,一個(gè)時(shí)鐘完成
begin
crc_reg<=CRC5_S(data[15],crc_reg);
crc_data<={data[14],data[13],data[12],data[11],data[10]}; //接收來(lái)之?dāng)?shù)據(jù)流的CRC,用于與計(jì)算的CRC比較
i<=i+1;
Rx_over<=1'b0;
end
else if(i==2) //輸出比較結(jié)果
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
///函數(shù)CRC5是對(duì)輸入數(shù)據(jù)為整字的處理,在一個(gè)時(shí)鐘內(nèi),調(diào)用一次,可以完成并行輸入16bit的CRC處理。
function [4:0] CRC5;
input[15:0] D; //輸入待處理的數(shù)據(jù)
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
///函數(shù)CRC5_S是對(duì)輸入數(shù)據(jù)為bit的處理,在一個(gè)時(shí)鐘內(nèi),調(diào)用一次,可以完成串行輸入1bit的CRC處理。
function [4:0] CRC5_S;
input din; //串行輸入數(shù)據(jù)流(從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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -