设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 846|回复: 0
收起左侧

Quartus Verilog HDL/FPGA 实现 CRC32 循环冗余校验算法硬件芯片 (串行移位输入,输出)

[复制链接]
发表于 2022-10-10 16:41:20 | 显示全部楼层 |阅读模式
本帖最后由 HDL 于 2022-10-10 16:43 编辑

main.png
  1. module crc32_table(                        //CRC32查表模块
  2.         input [7:0] in,                        //8位宽地址
  3.         output [31:0] out                        //32位宽值
  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(                        //CRC32硬件算法芯片 使用从芯片(单片机,Arduino等...)产生时钟并控制主芯片,未使用板载50Mhz晶振
  27.         input [7:0] dat,        //一字节并行输入 (8位宽) Pin:60,58,55,52,48,45,43,41
  28.         input clkc,                        //Pin18 算数时钟 sel:(高电平:计算一字节,低电平:将移位输入寄存器的值装入算数寄存器) (上升沿触发)
  29.         input clki,                        //Pin21 移位输入时钟 (上升沿触发)
  30.         input clko,                        //Pin22 移位输出时钟 sel:(高电平:左移1位,低电平:将算数寄存器的值装入移位输出寄存器) (上升沿触发)
  31.         input sel,                        //Pin25 数据选择控制位 (配合clkc,clko时钟使用)
  32.         input din,                        //Pin24 CRC32数据入口
  33.         output dout                        //Pin28 CRC32数据出口
  34. );

  35. reg [31:0] crc32;                                        //CRC32算数寄存器
  36. reg [31:0] crc32i;                                //CRC32串转并移位输入寄存器
  37. reg [31:0] crc32o;                                //CRC32并转串移位输出寄存器
  38. wire [31:0] crc32w;                                //CRC32算数结果线网

  39. assign dout = crc32o[31];                //移位数据输出口,与移位输出寄存器的最高位连接

  40. crc32_byte crc32_byte(                        //CRC32字节计算模块 (组合逻辑)
  41.         .in_crc32(crc32),                                //输入:CRC32
  42.         .dat(dat),                                                //输入:字节
  43.         .out_crc32(crc32w)                        //输出:CRC32 (输入值改变瞬间反馈到线网)
  44. );

  45. always @(posedge clki) begin                        //移位输入时钟上升沿
  46.         crc32i <= (crc32i << 1) | din;
  47. end

  48. always @(posedge clko) begin                        //移位输出时钟上升沿
  49.         crc32o <= sel ? (crc32o << 1) : crc32;
  50. end

  51. always @(posedge clkc) begin                        //算数时钟上升沿
  52.         crc32 <= sel ? crc32w : crc32i;
  53. end

  54. endmodule
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-20 09:46 , Processed in 0.941053 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表