设为首页收藏本站帮助中心
查看: 956|回复: 0
收起左侧

Quartus Verilog HDL/FPGA 实现并行计算数据CRC64循环冗余校验码的程序源码

[复制链接]
发表于 2021-12-19 21:05:33 | 显示全部楼层 |阅读模式
main.png
循环计算10亿个空格的CRC64值,计算过程中LED闪烁,计算正确点亮,否则熄灭。
50Mhz晶振每秒计算5000万字节,10亿则需要20秒时间。
  1. module crc64_table(                        //CRC64表格 查表模块
  2.         input [7:0] in,                        //数组下标
  3.         output [63:0] out                        //数组返回值
  4. );
  5.                 reg [63:0] crc;
  6.                 always @(*) begin
  7.                 crc = {56'd0,in};
  8.                         repeat(8) begin
  9.                         crc = (crc >> 1) ^ (crc & 1 ? 64'hC96C5795D7870F42 : 0);
  10.                         end
  11.                 end
  12. assign out = crc;
  13. endmodule

  14. module crc64_byte(                                        //CRC64 字节计算模块
  15.         input [63:0] in_crc64,                        //输入CRC64 (开始计算前先取反,计算中途不取反)
  16.         input [7:0] dat,                                        //字节值
  17.         output [63:0] out_crc64                        //输出CRC64 (计算结束后再次取反)
  18. );
  19.         wire [63:0] out;
  20.                 crc64_table crc64_table(
  21.                         .in(in_crc64[7:0] ^ dat),
  22.                         .out(out)
  23.                 );
  24.         assign out_crc64 = out ^ (in_crc64 >> 8);
  25. endmodule

  26. module main(                        //主模块
  27.         input clk,                        //50Mhz时钟输入 Pin17
  28.         output reg led                //LED Pin3 计算正确点亮 错误则熄灭 计算中闪烁 (低电平点亮)
  29. );

  30. reg [63:0] i64 = 64'hFFFFFFFFFFFFFFFF;
  31. wire [63:0] in_crc64 = i64;
  32. wire [7:0] dat = 8'h20;
  33. wire [63:0] out_crc64;
  34. wire [63:0] crc64 = ~out_crc64;
  35. reg [63:0] bit8 =0;                //CRC64 字节计数器
  36. reg [31:0] j =0;                        //LED 1Hz闪烁分频计数器
  37. reg run = 1;                                //CRC64计算运行标志

  38. crc64_byte crc64_byte(
  39.         .in_crc64(in_crc64),
  40.         .dat(dat),
  41.         .out_crc64(out_crc64)
  42. );

  43. always @(posedge clk) begin                //50Mhz CLK上升沿触发
  44.         bit8 = bit8 + 1;
  45.         if(bit8 == 64'd1000000000 && run) begin                        //10亿个空格的CRC64值为:DAD4CDCB1EE7392C 50Mhz需要20秒时间
  46.                 run = 0;                //停止计算下一字节
  47.                 if(crc64 == 64'hDAD4CDCB1EE7392C) begin                //计算正确则点亮LED
  48.                         led = 0;
  49.                 end else begin                        //错误则熄灭
  50.                         led = 1;
  51.                 end
  52.         end
  53.         if(run) begin                        //计算中闪烁LED
  54.                 j = j + 1;
  55.                 if(j == 25000000) begin
  56.                         j = 0;
  57.                         led = !led;
  58.                 end
  59.                 i64 <= out_crc64;
  60.         end
  61. end
  62. endmodule

复制代码

相关帖子

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则