|
本帖最后由 HDL 于 2022-10-10 16:43 编辑
- module crc32_table( //CRC32查表模块
- input [7:0] in, //8位宽地址
- output [31:0] out //32位宽值
- );
- reg [31:0] crc;
- always @(*) begin
- crc = {24'd0,in};
- repeat(8) begin
- crc = (crc >> 1) ^ (crc & 1 ? 32'hEDB88320 : 0);
- end
- end
- assign out = crc;
- endmodule
- module crc32_byte( //CRC32 字节计算模块
- input [31:0] in_crc32, //输入CRC32
- input [7:0] dat, //字节值
- output [31:0] out_crc32 //输出CRC32
- );
- wire [31:0] out;
- crc32_table crc32_table(
- .in(in_crc32[7:0] ^ dat),
- .out(out)
- );
- assign out_crc32 = out ^ (in_crc32 >> 8);
- endmodule
- module main( //CRC32硬件算法芯片 使用从芯片(单片机,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 CRC32数据入口
- output dout //Pin28 CRC32数据出口
- );
- reg [31:0] crc32; //CRC32算数寄存器
- reg [31:0] crc32i; //CRC32串转并移位输入寄存器
- reg [31:0] crc32o; //CRC32并转串移位输出寄存器
- wire [31:0] crc32w; //CRC32算数结果线网
- assign dout = crc32o[31]; //移位数据输出口,与移位输出寄存器的最高位连接
- crc32_byte crc32_byte( //CRC32字节计算模块 (组合逻辑)
- .in_crc32(crc32), //输入:CRC32
- .dat(dat), //输入:字节
- .out_crc32(crc32w) //输出:CRC32 (输入值改变瞬间反馈到线网)
- );
- always @(posedge clki) begin //移位输入时钟上升沿
- crc32i <= (crc32i << 1) | din;
- end
- always @(posedge clko) begin //移位输出时钟上升沿
- crc32o <= sel ? (crc32o << 1) : crc32;
- end
- always @(posedge clkc) begin //算数时钟上升沿
- crc32 <= sel ? crc32w : crc32i;
- end
- endmodule
复制代码 |
|