什麼是CRC(循環冗餘檢查)

把資料的位元列視為多項式,以生成多項式相除後將餘數附作檢查值,接收端再做同樣計算以檢測資料錯誤的方法。廣泛用於乙太網路、PCI Express、USB 與檔案格式等。

日文名稱: CRC(巡回冗長検査)

「CRC(循環冗餘檢查)」出現在2領域的4道練習題中(邏輯電路, 介面與匯流排規格等)。

這個名詞所屬的領域: 介面與匯流排規格

原理

CRC 把資料的位元列視為模 2 多項式的係數,求出以生成多項式相除後的餘數。在模 2 運算中,加法與減法都是 XOR,因此除法就是重複「開頭為 1 時 XOR 生成多項式,再移一位」。寬度 w 位元的 CRC,會把資料後面補 w 個 0 相除所得的 w 位元餘數附上送出,接收端做同樣的計算確認是否一致。實際的標準還會加上初始值、每個位元組的位元反轉、最後的 XOR 等約定來定義。

可檢測的錯誤與用途

寬度 w 位元的 CRC 可檢測所有長度在 w 以下的連續錯誤(叢發錯誤),其他隨機錯誤被漏掉的機率也只有約 2⁻ʷ。不過它只能發現錯誤而無法更正,發現後通常以重送等方式恢復。CRC 用於乙太網路的 FCS(CRC-32)、PCI Express 的封包、USB、CAN、儲存裝置的命令,以及 ZIP、PNG 等檔案格式;在硬體中可用正反器與 XOR 閘構成的線性回授移位暫存器計算。

練習CRC(循環冗餘檢查)的題目

2輸入XOR(互斥或)閘的輸出何時為1?

  1. A兩個輸入皆為1時
  2. B兩個輸入不同時
  3. C兩個輸入皆為0時
查看答案與解析

正確答案:B. 兩個輸入不同時

XOR在兩個輸入不同時輸出1,相同時輸出0。以式子表示為 A⊕B = A·¬B + ¬A·B。也可視為「一個輸入為1時將另一個反相,為0時則原樣通過」,可當作受控反相器使用。它用途廣泛,例如半加器的和、比較電路(偵測一致用XNOR)、同位元的計算,以及加密的串流加密與CRC的計算。

將移位暫存器部分輸出的XOR送回輸入的線性回授移位暫存器(LFSR),其代表性用途是哪一個?

  1. A產生偽隨機圖樣,以及測試中的圖樣產生、CRC計算
  2. B精確計時
  3. C放大類比訊號
查看答案與解析

正確答案:A. 產生偽隨機圖樣,以及測試中的圖樣產生、CRC計算

只要選擇適當的分接點,LFSR以n位元會循環經過除全0以外的 2ⁿ − 1 種狀態,產生看似隨機的序列(M序列)。由於只需XOR與正反器即可製作,用於內建自我測試(BIST)的圖樣產生與結果壓縮、乙太網路等的CRC計算,以及將訊號平均化以減少電磁雜訊的拌碼器。由於序列可預測,不能用作加密用的亂數。

常見問題

CRC 和檢查和有什麼不同?

檢查和是把位元組相加等簡單計算,容易漏掉順序對調或互相抵消的錯誤;CRC 以多項式除法為基礎,能區分位元位置,確實發現叢發錯誤等。

CRC 能更正錯誤嗎?

一般不能。CRC 用來檢查是否有錯誤,但無法得知是哪個位元出錯,因此需要更正的記憶體等會使用漢明碼等 ECC。

解析中的「CRC(循環冗餘檢查)」

出現「CRC(循環冗餘檢查)」的題目(4題)

  1. 2輸入XOR(互斥或)閘的輸出何時為1?
  2. 將移位暫存器部分輸出的XOR送回輸入的線性回授移位暫存器(LFSR),其代表性用途是哪一個?
  3. 針對傳輸中的位元錯誤,PCI Express的資料連結層會做什麼?
  4. 在PCI Express中,若大量傳送寫入64位元組小量資料的封包,有效頻寬會遠小於理論值。其主要原因為下列何者?

半導體、電子電路與資訊計算工具

相關名詞

PCI Express 移位暫存器 正反器 BIST(內建自我測試) 128b/130b 編碼(128b/130b encoding) 8b/10b 編碼(8b/10b encoding) 位元錯誤率(Bit error rate, BER) 信用式流量控制(Credit-based flow control) 重定時器(Retimer) 展頻時脈(Spread-spectrum clocking, SSC)

前往名詞解釋列表