|
- module crc64_table( //CRC64表格 查表模块
- input [7:0] in, //8位宽地址
- output [63:0] out //64位宽查表输出
- );
- 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, //64位宽输入CRC
- input [7:0] dat, //8位宽字节值
- output [63:0] out_crc64 //64位宽输出CRC
- );
- 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( //CRC64硬件算法芯片 使用从芯片(单片机,Arduino等...)产生时钟并控制主芯片,未使用板载50Mhz晶振
- input [7:0] dat, //一字节并行输入 (8位宽) Pin:60,58,55,52,48,45,43,41
- input clkc, //Pin18 算数时钟 sel:(高电平:计算一字节,低电平:将移位输入寄存器的值装入算数寄存器) (上升沿触发)
- input clki, //Pin21 移位输入时钟 (上升沿触发)
- input clko, //Pin22 移位输出时钟 sel:(高电平:左移1位,低电平:将算数寄存器的值装入移位输出寄存器) (上升沿触发)
- input sel, //Pin25 数据选择控制位 (配合clkc,clko时钟使用)
- input din, //Pin24 CRC64数据入口
- output dout //Pin28 CRC64数据出口
- );
- reg [63:0] crc64; //CRC64算数寄存器
- reg [63:0] crc64i; //CRC64串转并移位输入寄存器
- reg [63:0] crc64o; //CRC64并转串移位输出寄存器
- wire [63:0] crc64w; //CRC64算数结果线网
- assign dout = crc64o[63]; //移位数据输出口,与移位输出寄存器的最高位连接
- crc64_byte crc64_byte( //CRC64字节计算模块 (组合逻辑)
- .in_crc64(crc64), //输入:CRC64
- .dat(dat), //输入:字节
- .out_crc64(crc64w) //输出:CRC64 (输入值改变瞬间反馈到线网)
- );
- always @(posedge clki) begin //移位输入时钟上升沿
- crc64i <= (crc64i << 1) | din;
- end
- always @(posedge clko) begin //移位输出时钟上升沿
- crc64o <= sel ? (crc64o << 1) : crc64;
- end
- always @(posedge clkc) begin //算数时钟上升沿
- crc64 <= sel ? crc64w : crc64i;
- end
- endmodule
复制代码 |
|