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

从F到0 - From F to 0

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

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

[复制链接]
发表于 2022-12-28 18:56:22 | 显示全部楼层 |阅读模式
main.png
  1. module crc64_table(                //CRC64表格 查表模块
  2.         input [7:0] in,                //8位宽地址
  3.         output [63:0] out                //64位宽查表输出
  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,                 //64位宽输入CRC
  16.         input [7:0] dat,                                //8位宽字节值
  17.         output [63:0] out_crc64                //64位宽输出CRC
  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(                        //CRC64硬件算法芯片 使用从芯片(单片机,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 CRC64数据入口
  33.         output dout                        //Pin28 CRC64数据出口
  34. );

  35. reg [63:0] crc64;                                        //CRC64算数寄存器
  36. reg [63:0] crc64i;                                //CRC64串转并移位输入寄存器
  37. reg [63:0] crc64o;                                //CRC64并转串移位输出寄存器
  38. wire [63:0] crc64w;                                //CRC64算数结果线网
  39. assign dout = crc64o[63];                //移位数据输出口,与移位输出寄存器的最高位连接

  40. crc64_byte crc64_byte(                        //CRC64字节计算模块 (组合逻辑)
  41.         .in_crc64(crc64),                                //输入:CRC64
  42.         .dat(dat),                                                //输入:字节
  43.         .out_crc64(crc64w)                        //输出:CRC64 (输入值改变瞬间反馈到线网)
  44. );

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

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

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

  54. endmodule
复制代码

相关帖子

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

本版积分规则

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

腾讯云安全认证

GMT+8, 2024-4-19 18:35 , Processed in 0.587033 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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