[問題] CRC 錯誤偵測
CRC的運算方法就是利用長除法求得餘數
然而硬體設計方式為使用移位暫存器和互斥或閘合成
就是類似一個pncode的方式
然而我想問的是
1:為何使用類似pncode的方式,當資料全部輸出完的下一筆資料,就是所謂的餘數???
還有如何使長除法跟硬體的想法連結在一起,現在我二者都懂,不過聯想不起來,謝謝
2:我使用CRC-3的方式 (X^3+X^2+1)
verilog code大致如下
always @(posedge clk)
begin
if(reset)
data_out<=0;
else
xor_out[0] <= data_out[2] ^ data_in;
xor_out[1] <= data_out[0];
xor_out[2] <= data_out[1] ^ xor_out[0];
data_out <= xor_out;
end
並且在傳送端輸入10101010
^ ^
| |
msb lsb
經過CRC-3能求得110,所以在接收端的data最後加入110(也就是10101010+110),
再經過CRC-3能求得最後餘數為0
代表正確
不過我在使用CRC-4以及CRC-16
均不能解回正解,也就是餘數為零,請問是input data bit有限制嗎?
還是我哪裡弄錯了
下面為 CRC-16的code (X^16+X^15+X^2+1)
xor_out[0] = data_out[15] ^ data_in;
xor_out[1] = data_out[0];
xor_out[2] = data_out[1] ^ xor_out[0];
xor_out[3] = data_out[2];
xor_out[4] = data_out[3];
xor_out[5] = data_out[4];
xor_out[6] = data_out[5];
xor_out[7] = data_out[6];
xor_out[8] = data_out[7];
xor_out[9] = data_out[8];
xor_out[10] = data_out[9];
xor_out[11] = data_out[10];
xor_out[12] = data_out[11];
xor_out[13] = data_out[12];
xor_out[14] = data_out[13];
xor_out[15] = data_out[14] ^ xor_out[0];
data_out<=xor_out;
謝謝...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.217.208.198
→
01/03 05:17, , 1F
01/03 05:17, 1F
→
01/03 05:18, , 2F
01/03 05:18, 2F
→
01/03 12:04, , 3F
01/03 12:04, 3F
→
01/03 12:05, , 4F
01/03 12:05, 4F
→
01/03 16:02, , 5F
01/03 16:02, 5F
推
01/03 20:40, , 6F
01/03 20:40, 6F