|
可用于需要FPGA硬件处理以太网MAC层包,比如打时间戳等等。
//4-bit parallal crc generation block for ethernet package
//resource utilization: 45LEs
module CRC(
clk, //clock input
reset_n, //reset synced at rising edge of clk
en_i, //crc block enable signal. en_i will be checked on rising edge
in_i, //4-bit input data. change on falling edge of clk.
crc32_o //32-bit crc result. change on rising edge of clk
);
input clk;
input reset_n;
input en_i;
input [3:0]in_i;
output [31:0]crc32_o;
reg [31:0]crc_o;
wire [31:0]crc_in;
wire P0;
wire P1;
wire P2;
wire P3;
assign crc32_o[0]=~crc_o[31];
assign crc32_o[1]=~crc_o[30];
assign crc32_o[2]=~crc_o[29];
assign crc32_o[3]=~crc_o[28];
assign crc32_o[4]=~crc_o[27];
assign crc32_o[5]=~crc_o[26];
assign crc32_o[6]=~crc_o[25];
assign crc32_o[7]=~crc_o[24];
assign crc32_o[8]=~crc_o[23];
assign crc32_o[9]=~crc_o[22];
assign crc32_o[10]=~crc_o[21];
assign crc32_o[11]=~crc_o[20];
assign crc32_o[12]=~crc_o[19];
assign crc32_o[13]=~crc_o[18];
assign crc32_o[14]=~crc_o[17];
assign crc32_o[15]=~crc_o[16];
assign crc32_o[16]=~crc_o[15];
assign crc32_o[17]=~crc_o[14];
assign crc32_o[18]=~crc_o[13];
assign crc32_o[19]=~crc_o[12];
assign crc32_o[20]=~crc_o[11];
assign crc32_o[21]=~crc_o[10];
assign crc32_o[22]=~crc_o[9];
assign crc32_o[23]=~crc_o[8];
assign crc32_o[24]=~crc_o[7];
assign crc32_o[25]=~crc_o[6];
assign crc32_o[26]=~crc_o[5];
assign crc32_o[27]=~crc_o[4];
assign crc32_o[28]=~crc_o[3];
assign crc32_o[29]=~crc_o[2];
assign crc32_o[30]=~crc_o[1];
assign crc32_o[31]=~crc_o[0];
assign P0=crc_o[31]^in_i[0];
assign P1=crc_o[30]^in_i[1];
assign P2=crc_o[29]^in_i[2];
assign P3=crc_o[28]^in_i[3];
assign crc_in[0]=P3;
assign crc_in[1]=P2^P3;
assign crc_in[2]=P1^P2^P3;
assign crc_in[3]=P0^P1^P2;
assign crc_in[4]=crc_o[0]^P0^P1^P3;
assign crc_in[5]=crc_o[1]^P0^P2^P3;
assign crc_in[6]=crc_o[2]^P1^P2;
assign crc_in[7]=crc_o[3]^P0^P1^P3;
assign crc_in[8]=crc_o[4]^P0^P2^P3;
assign crc_in[9]=crc_o[5]^P1^P2;
assign crc_in[10]=crc_o[6]^P0^P1^P3;
assign crc_in[11]=crc_o[7]^P0^P2^P3;
assign crc_in[12]=crc_o[8]^P1^P2^P3;
assign crc_in[13]=crc_o[9]^P0^P1^P2;
assign crc_in[14]=crc_o[10]^P0^P1;
assign crc_in[15]=crc_o[11]^P0;
assign crc_in[16]=crc_o[12]^P3;
assign crc_in[17]=crc_o[13]^P2;
assign crc_in[18]=crc_o[14]^P1;
assign crc_in[19]=crc_o[15]^P0;
assign crc_in[20]=crc_o[16];
assign crc_in[21]=crc_o[17];
assign crc_in[22]=crc_o[18]^P3;
assign crc_in[23]=crc_o[19]^P2^P3;
assign crc_in[24]=crc_o[20]^P1^P2;
assign crc_in[25]=crc_o[21]^P0^P1;
assign crc_in[26]=crc_o[22]^P0^P3;
assign crc_in[27]=crc_o[23]^P2;
assign crc_in[28]=crc_o[24]^P1;
assign crc_in[29]=crc_o[25]^P0;
assign crc_in[30]=crc_o[26];
assign crc_in[31]=crc_o[27];
always@(posedge clk)begin
if(!reset_n)
crc_o[31:0]<=32'b11111111111111111111111111111111;
else if(en_i)begin
crc_o[31:0]<=crc_in[31:0];
end
end
endmodule |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|