YFM 发表于 2015-11-17 08:59:24

发个以太网4-bit MAC层的并行CRC32 verilog代码,项目已验证

可用于需要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 in_i;
output crc32_o;

reg crc_o;
wire crc_in;
wire P0;
wire P1;
wire P2;
wire P3;

assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;

assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;

assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;

assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;

assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;

assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;

assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;

assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;
assign crc32_o=~crc_o;


assign P0=crc_o^in_i;
assign P1=crc_o^in_i;
assign P2=crc_o^in_i;
assign P3=crc_o^in_i;

assign crc_in=P3;
assign crc_in=P2^P3;
assign crc_in=P1^P2^P3;
assign crc_in=P0^P1^P2;

assign crc_in=crc_o^P0^P1^P3;
assign crc_in=crc_o^P0^P2^P3;
assign crc_in=crc_o^P1^P2;
assign crc_in=crc_o^P0^P1^P3;

assign crc_in=crc_o^P0^P2^P3;
assign crc_in=crc_o^P1^P2;
assign crc_in=crc_o^P0^P1^P3;
assign crc_in=crc_o^P0^P2^P3;

assign crc_in=crc_o^P1^P2^P3;
assign crc_in=crc_o^P0^P1^P2;
assign crc_in=crc_o^P0^P1;
assign crc_in=crc_o^P0;

assign crc_in=crc_o^P3;
assign crc_in=crc_o^P2;
assign crc_in=crc_o^P1;
assign crc_in=crc_o^P0;

assign crc_in=crc_o;
assign crc_in=crc_o;
assign crc_in=crc_o^P3;
assign crc_in=crc_o^P2^P3;

assign crc_in=crc_o^P1^P2;
assign crc_in=crc_o^P0^P1;
assign crc_in=crc_o^P0^P3;
assign crc_in=crc_o^P2;

assign crc_in=crc_o^P1;
assign crc_in=crc_o^P0;
assign crc_in=crc_o;
assign crc_in=crc_o;

always@(posedge clk)begin
        if(!reset_n)
                crc_o<=32'b11111111111111111111111111111111;
        else if(en_i)begin
                crc_o<=crc_in;
        end
end

endmodule

lgc150 发表于 2015-11-17 09:05:57

ganxiefenxiang 感谢分享~~~~目前还没进入fpga{:lol:}{:lol:}{:lol:}{:lol:}

tjuspring001 发表于 2015-11-17 21:50:58

CRC32的硬件实现

YFM 发表于 2015-11-17 22:52:03

tjuspring001 发表于 2015-11-17 21:50
CRC32的硬件实现

网上有很多都是1-bit那种的,我花了两天时间推导出来这个每次4-bit的并行crc32。

talkingbeast 发表于 2015-11-17 23:07:57

谢谢分享,以后可能会玩玩fpga。

tjuspring001 发表于 2015-11-18 10:50:00

能不能把算法的数学原理分享一下,处理速度需要参考设计需求,1bit比较常用

FORDREAM0 发表于 2015-11-19 15:47:37

MARK!!!!!!

vermon 发表于 2016-10-26 23:31:31

非常有实用价值
页: [1]
查看完整版本: 发个以太网4-bit MAC层的并行CRC32 verilog代码,项目已验证