📄 crc.v
字号:
module crc(
rst,
clk,
din, //input data
vin, //input data valid flag
dout, //output data
vout //output data valid flag
);
input rst;
input clk;
input[7:0] din;
input vin;
output[7:0] dout;
output vout;
reg[7:0] dout;
reg vout
reg[31:0] crcreg; //CRC register
reg[2:0] current;
reg[2:0] next;
reg[2:0] counter;
wire[7:0] crctemp;
parameter IDLE=1, DTP=2, CTP=4;
//DTP: DATA Transmitt Process; CTP: CRC DATA Transmitt Process
always@(current or vin or counter)
begin
next=3'bxxx;
case(current)
IDLE: begin
if(vin)
next=DTP;
else
next=ILDE;
end
DTP: begin
if(!vin)
next=CTP;
else
next=DTP;
end
CTP: begin
if(counter==4)
next=IDLE;
else
next=CTP;
end
default: next=IDLE;
endcase
end
always@(posedge clk or negedge rst)
begin
if(!rst) current<=IDLE;
else current<=next;
end
always@(posedge clk or negedge rst)
begin
if(!rst) counter<=3'b000;
else begin
if(next==CTP)
counter<=counter+1;
else
conter<=3'b000;
end
end
always@(posedge clk or negedge rst)
begin
if(!rst) vout<=1'b0;
else begin
case(next)
DTP,
CTP: vout<=1'b1;
default: vout<=1'b0;
endcase
end
end
always@(posedge clk or negedge rst)
begin
if(!rst) dout<=8'h00;
else begin
case(next)
DTP: dout<=din;
CTP: dout<=crctemp;
default: dout<=8'h00;
endcase
end
end
assign crctemp={crcreg[24],crcreg[25],crcreg[26],crcreg[27],crcreg[28],crcreg[29],crcreg[30],crcreg[31]}^8'hff;
always@(posedge clk or negedge rst)
begin
if(!rst)crcreg<=32'hffffffff;
else begin
case(next)
DTP: begin
crcreg[0] <= crcreg[30] ^ din[7] ^ crcreg[24] ^ din[1];
crcreg[1] <= crcreg[30] ^ crcreg[31] ^ din[6] ^ din[7] ^ crcreg[24] ^ din[0] ^ crcreg[25] ^ din[1];
crcreg[2] <= crcreg[30] ^ crcreg[31] ^ din[5] ^ din[6] ^ din[7] ^ crcreg[24] ^ crcreg[25] ^ crcreg[26] ^ din[0] ^ din[1];
crcreg[3] <= din[4] ^ crcreg[31] ^ din[5] ^ din[6] ^ crcreg[25] ^ crcreg[26] ^ crcreg[27] ^ din[0];
crcreg[4] <= crcreg[30] ^ din[4] ^ din[5] ^ din[7] ^ crcreg[24] ^ crcreg[26] ^ crcreg[27] ^ crcreg[28] ^ din[1] ^ din[3];
crcreg[5] <= crcreg[30] ^ din[4] ^ crcreg[31] ^ din[6] ^ din[7] ^ crcreg[24] ^ crcreg[25] ^ crcreg[27] ^ crcreg[28] ^ crcreg[29] ^ din[0] ^ din[1] ^ din[2] ^ din[3];
crcreg[6] <= crcreg[30] ^ crcreg[31] ^ din[5] ^ din[6] ^ crcreg[25] ^ crcreg[26] ^ crcreg[28] ^ crcreg[29] ^ din[0] ^ din[1] ^ din[2] ^ din[3];
crcreg[7] <= din[4] ^ din[5] ^ crcreg[31] ^ din[7] ^ crcreg[24] ^ crcreg[26] ^ crcreg[27] ^ crcreg[29] ^ din[0] ^ din[2];
crcreg[8] <= din[4] ^ din[6] ^ din[7] ^ crcreg[24] ^ crcreg[25] ^ crcreg[27] ^ crcreg[28] ^ crcreg[0] ^ din[3];
crcreg[9] <= din[5] ^ din[6] ^ crcreg[25] ^ crcreg[26] ^ crcreg[28] ^ crcreg[29] ^ din[2] ^ crcreg[1] ^ din[3];
crcreg[10] <= din[4] ^ din[5] ^ din[7] ^ crcreg[24] ^ crcreg[26] ^ crcreg[27] ^ crcreg[29] ^ din[2] ^ crcreg[2];
crcreg[11] <= din[4] ^ crcreg[3] ^ din[6] ^ din[7] ^ crcreg[24] ^ crcreg[25] ^ crcreg[27] ^ crcreg[28] ^ din[3];
crcreg[12] <= crcreg[30] ^ din[5] ^ crcreg[4] ^ din[6] ^ din[7] ^ crcreg[24] ^ crcreg[25] ^ crcreg[26] ^ crcreg[28] ^ crcreg[29] ^ din[1] ^ din[2] ^ din[3];
crcreg[13] <= din[4] ^ crcreg[30] ^ crcreg[31] ^ din[5] ^ din[6] ^ crcreg[5] ^ crcreg[25] ^ crcreg[26] ^ crcreg[27] ^ crcreg[29] ^ din[0] ^ din[1] ^ din[2];
crcreg[14] <= din[4] ^ crcreg[30] ^ din[5] ^ crcreg[31] ^ crcreg[6] ^ crcreg[26] ^ crcreg[27] ^ crcreg[28] ^ din[0] ^ din[1] ^ din[3];
crcreg[15] <= din[4] ^ crcreg[31] ^ crcreg[7] ^ crcreg[27] ^ crcreg[28] ^ crcreg[29] ^ din[0] ^ din[2] ^ din[3];
crcreg[16] <= din[7] ^ crcreg[24] ^ crcreg[8] ^ crcreg[28] ^ crcreg[29] ^ din[2] ^ din[3];
crcreg[17] <= crcreg[30] ^ din[6] ^ crcreg[25] ^ crcreg[9] ^ crcreg[29] ^ din[1] ^ din[2];
crcreg[18] <= crcreg[30] ^ din[5] ^ crcreg[31] ^ crcreg[26] ^ din[0] ^ din[1] ^ crcreg[10];
crcreg[19] <= din[4] ^ crcreg[31] ^ crcreg[27] ^ din[0] ^ crcreg[11];
crcreg[20] <= crcreg[12] ^ crcreg[28] ^ din[3];
crcreg[21] <= crcreg[13] ^ crcreg[29] ^ din[2];
crcreg[22] <= crcreg[14] ^ din[7] ^ crcreg[24];
crcreg[23] <= crcreg[30] ^ din[6] ^ din[7] ^ crcreg[24] ^ crcreg[15] ^ crcreg[25] ^ din[1];
crcreg[24] <= crcreg[31] ^ din[5] ^ din[6] ^ crcreg[25] ^ crcreg[16] ^ crcreg[26] ^ din[0];
crcreg[25] <= din[4] ^ din[5] ^ crcreg[26] ^ crcreg[17] ^ crcreg[27];
crcreg[26] <= crcreg[30] ^ din[4] ^ din[7] ^ crcreg[24] ^ crcreg[27] ^ crcreg[18] ^ crcreg[28] ^ din[1] ^ din[3];
crcreg[27] <= crcreg[31] ^ din[6] ^ crcreg[25] ^ crcreg[28] ^ crcreg[19] ^ crcreg[29] ^ din[0] ^ din[2] ^ din[3];
crcreg[28] <= crcreg[30] ^ din[5] ^ crcreg[26] ^ crcreg[29] ^ din[1] ^ din[2] ^ crcreg[20];
crcreg[29] <= din[4] ^ crcreg[30] ^ crcreg[21] ^ crcreg[31] ^ crcreg[27] ^ din[0] ^ din[1];
crcreg[30] <= crcreg[31] ^ crcreg[22] ^ crcreg[28] ^ din[0] ^ din[3];
crcreg[31] <= crcreg[23] ^ crcreg[29] ^ din[2];
end
CTP: begin
crcreg[7:0]<=8'hff;
crcreg[15:8]<=crcreg[7:0];
crcreg[23:16]<=crcreg[15:8];
crcreg[31:24]<=crcreg[23:16];
end
default: crcreg<=32'hffffffff;
endcase
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -