|
循环计算10亿个空格的CRC64值,计算过程中LED闪烁,计算正确点亮,否则熄灭。
50Mhz晶振每秒计算5000万字节,10亿则需要20秒时间。 - module crc64_table( //CRC64表格 查表模块
- input [7:0] in, //数组下标
- output [63:0] out //数组返回值
- );
- reg [63:0] crc;
- always @(*) begin
- crc = {56'd0,in};
- repeat(8) begin
- crc = (crc >> 1) ^ (crc & 1 ? 64'hC96C5795D7870F42 : 0);
- end
- end
- assign out = crc;
- endmodule
- module crc64_byte( //CRC64 字节计算模块
- input [63:0] in_crc64, //输入CRC64 (开始计算前先取反,计算中途不取反)
- input [7:0] dat, //字节值
- output [63:0] out_crc64 //输出CRC64 (计算结束后再次取反)
- );
- wire [63:0] out;
- crc64_table crc64_table(
- .in(in_crc64[7:0] ^ dat),
- .out(out)
- );
- assign out_crc64 = out ^ (in_crc64 >> 8);
- endmodule
- module main( //主模块
- input clk, //50Mhz时钟输入 Pin17
- output reg led //LED Pin3 计算正确点亮 错误则熄灭 计算中闪烁 (低电平点亮)
- );
- reg [63:0] i64 = 64'hFFFFFFFFFFFFFFFF;
- wire [63:0] in_crc64 = i64;
- wire [7:0] dat = 8'h20;
- wire [63:0] out_crc64;
- wire [63:0] crc64 = ~out_crc64;
- reg [63:0] bit8 =0; //CRC64 字节计数器
- reg [31:0] j =0; //LED 1Hz闪烁分频计数器
- reg run = 1; //CRC64计算运行标志
- crc64_byte crc64_byte(
- .in_crc64(in_crc64),
- .dat(dat),
- .out_crc64(out_crc64)
- );
- always @(posedge clk) begin //50Mhz CLK上升沿触发
- bit8 = bit8 + 1;
- if(bit8 == 64'd1000000000 && run) begin //10亿个空格的CRC64值为:DAD4CDCB1EE7392C 50Mhz需要20秒时间
- run = 0; //停止计算下一字节
- if(crc64 == 64'hDAD4CDCB1EE7392C) begin //计算正确则点亮LED
- led = 0;
- end else begin //错误则熄灭
- led = 1;
- end
- end
- if(run) begin //计算中闪烁LED
- j = j + 1;
- if(j == 25000000) begin
- j = 0;
- led = !led;
- end
- i64 <= out_crc64;
- end
- end
- endmodule
复制代码 |
|