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

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

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

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

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

  30. reg [31:0] i32 = 32'hFFFFFFFF;
  31. wire [31:0] in_crc32 = i32;
  32. wire [7:0] dat = 8'h20;
  33. wire [31:0] out_crc32;
  34. wire [31:0] crc32 = ~out_crc32;
  35. reg [63:0] bit8 =0;                //CRC32 字节计数器
  36. reg [31:0] j =0;                        //LED 1Hz闪烁分频计数器
  37. reg run = 1;                                //CRC32计算运行标志

  38. crc32_byte crc32_byte(
  39.         .in_crc32(in_crc32),
  40.         .dat(dat),
  41.         .out_crc32(out_crc32)
  42. );

  43. always @(posedge clk) begin                //50Mhz CLK上升沿触发
  44.                                         bit8 = bit8 + 1;
  45.                                         if(bit8 == 64'd1000000000 && run) begin                        //10亿个空格的CRC32值为:B7F4C6A9 50Mhz需要20秒时间
  46.                                                 run = 0;                //停止计算下一字节
  47.                                                 if(crc32 == 32'hB7F4C6A9) 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.                                                 i32 <= out_crc32;
  60.                                         end
  61.                 end
  62. endmodule
复制代码

相关帖子

回复

使用道具 举报

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

本版积分规则