中级会员
- 积分
- 351
- 金钱
- 351
- 注册时间
- 2017-8-11
- 在线时间
- 92 小时
|
1金钱
先上源码:module CRC(
input [7:0] data_in,
input d_valid,
output [15:0] crc,
input sys_rst_n,
input sys_clk);
reg [15:0] lfsr_q,lfsr_c;
assign crc = lfsr_q;
always @(*)
begin
lfsr_c[0] = lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[15] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7];
lfsr_c[1] = lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[15] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7];
lfsr_c[2] = lfsr_q[8] ^ lfsr_q[9] ^ data_in[0] ^ data_in[1];
lfsr_c[3] = lfsr_q[9] ^ lfsr_q[10] ^ data_in[1] ^ data_in[2];
lfsr_c[4] = lfsr_q[10] ^ lfsr_q[11] ^ data_in[2] ^ data_in[3];
lfsr_c[5] = lfsr_q[11] ^ lfsr_q[12] ^ data_in[3] ^ data_in[4];
lfsr_c[6] = lfsr_q[12] ^ lfsr_q[13] ^ data_in[4] ^ data_in[5];
lfsr_c[7] = lfsr_q[13] ^ lfsr_q[14] ^ data_in[5] ^ data_in[6];
lfsr_c[8] = lfsr_q[0] ^ lfsr_q[14] ^ lfsr_q[15] ^ data_in[6] ^ data_in[7];
lfsr_c[9] = lfsr_q[1] ^ lfsr_q[15] ^ data_in[7];
lfsr_c[10] = lfsr_q[2];
lfsr_c[11] = lfsr_q[3];
lfsr_c[12] = lfsr_q[4];
lfsr_c[13] = lfsr_q[5];
lfsr_c[14] = lfsr_q[6];
lfsr_c[15] = lfsr_q[7] ^ lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[15] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7];
end
always @(posedge sys_clk, negedge sys_rst_n) begin
if(!sys_rst_n) begin
lfsr_q <= {16{1'b1}};
end
else begin
lfsr_q <= d_valid ? lfsr_c : {16{1'b1}};
end
end // always
endmodule // crc
校验出来的结果总是不对。这是根据http://outputlogic.com/?page_id=321网站生成的,经测试该网站生成的 ccitt crc-16的校验结果是对的,但是modbus crc-16始终不对。ccitt初始值是0x0000,modbus初始值为0xffff。究竟问题出在哪里?求高手解答。
|
最佳答案
查看完整内容[请看2#楼]
自己搞出了一个正确结果,但还是对算法的过程不太明白。我是参照https://blog.csdn.net/wuzhikaidetb/article/details/136441181大神的帖子来捋的思路。既然CCITT和MODBUS差不多,那算法也应该差不多,但是上面的源码结果却不对。问题出在哪呢,自己先看了看帖子,经过多次调整,发现需要输入和输出翻转。翻转后仍然结果不对,但是对比一个C或C#程序,假如初始值都是0X0000,那么C程序结果和FPGA结果是一样的,但是初始值改为0XFFF ...
|