新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于FPGA的循環(huán)冗余校驗(yàn)碼設(shè)計

        基于FPGA的循環(huán)冗余校驗(yàn)碼設(shè)計

        作者:周亮 余小平 時間:2017-03-06 來源:電子產(chǎn)品世界 收藏

             在現(xiàn)代數(shù)字通信中,要求信息在傳輸過程中造成的數(shù)字差錯必須足夠低。但由于通信信道存在噪聲和傳輸特性不 理想等原因造成了信號
        的碼間串?dāng)_,導(dǎo)致信息在傳輸過程產(chǎn) 生差錯。為了最大限度地保證通信過程中信息的完整性,需 要采用信道編碼技術(shù)對可能發(fā)生的差錯進(jìn)行有效地控制,而 循環(huán)冗余就是其中一個最有效的編碼技術(shù)。

        本文引用地址:http://www.104case.com/article/201703/344838.htm


        1  循環(huán)冗余基本思想
        循環(huán)冗余是一種校錯能力很強(qiáng)且使用非常廣泛 的差錯檢驗(yàn)方法。循環(huán)冗余校驗(yàn)碼采用在發(fā)送的有用碼后面 加入校驗(yàn)碼來實(shí)現(xiàn)數(shù)字通信傳輸過程中數(shù)據(jù)的差錯檢測,通 常的構(gòu)成可以描述為:K位的有效信息數(shù)據(jù)串和R位的循環(huán) 冗余校驗(yàn)碼并在一起傳輸。
        1.1 循環(huán)冗余校驗(yàn)碼生成基本原理
        循環(huán)冗余校驗(yàn)碼(亦稱CRC碼)在通信信號校錯里廣泛使 用。其基本原理是,在發(fā)送端:將要發(fā)送的數(shù)據(jù)串序列當(dāng)作 一個多項(xiàng)式T(x)的系數(shù)(比如,多項(xiàng)式為T(x)=x5+x3+x+1,則 此多項(xiàng)式的系數(shù)就為101011,同時可以自定義一個k次冪的 稱為生成多項(xiàng)式的多項(xiàng)式G(x),為了使原來的數(shù)據(jù)串序列在 后面加入校驗(yàn)碼,就必須使其向左移,所以用Xk乘以T(x), 根據(jù)對二進(jìn)制乘法的理解,得到的T(x)Xk,能起到把T(x) 原有數(shù)據(jù)串序列向左移動k位的結(jié)果。為了得到校驗(yàn)碼,用 G(x)作除數(shù),T(x)Xk作被除數(shù),相除得到一個余數(shù)多項(xiàng)式 R(x)。然后將余數(shù)多項(xiàng)式R(x)并在待發(fā)送的數(shù)據(jù)串序列后 面,把這串新的數(shù)據(jù)串序列作為發(fā)送序列發(fā)送。在接收端: 再次使用自定義的生成多項(xiàng)式G(x)去除接收到的數(shù)據(jù)串序列多項(xiàng)式,如果相除所得到的余數(shù)多項(xiàng)式和在發(fā)送端計算得到的余數(shù)多項(xiàng)式相同,則表示信號傳輸正常,沒有出現(xiàn)差錯;
        如果兩者不相同,就表明信號傳輸錯誤,就必須檢查各方面 因素,重新發(fā)送信息,直到兩者相同為止。為了更直觀地說明循環(huán)冗余校驗(yàn)碼的生成過程、校驗(yàn) 過程,以8位的有效信息數(shù)據(jù)串和4位的循環(huán)冗余校驗(yàn)碼并在 一起傳輸為例。

        生成過程:

        (1)假設(shè)要發(fā)送的數(shù)據(jù)串序列為11011101。

        (2)自定義的生成多項(xiàng)式G
        (x)=x4+x3+x+1,其中k=4,相對應(yīng)的序列為11011。
        (3)把待發(fā)送的數(shù)據(jù)串序列向左移動4位,后面補(bǔ)0,從 而得到新的數(shù)據(jù)串序列為110111010000。
        (4)使用模2除法,用生成多項(xiàng)式序列去除新生成的數(shù)據(jù) 串序列。即

        這樣得到了余數(shù)多項(xiàng)式R(x)對應(yīng)序列為1010。
        ( 5 ) 將 余 數(shù) 多 項(xiàng) 式 R ( x ) 對 應(yīng) 序 列 并 到 新 數(shù) 據(jù) 串 序 列 后 面 , 得 到 帶 有 循 環(huán) 冗 余 校 驗(yàn) 碼 的 數(shù) 據(jù) 串 序 列 :
        110111011010。 校驗(yàn)過程: 假 如 信 息 在 傳 輸 過 程 中 沒 有 受 到 影 響 而 發(fā) 生 錯 誤 的話,接收到的帶有循環(huán)冗余校驗(yàn)碼的數(shù)據(jù)串序列必定可以被 在發(fā)送端所自定義的生成多項(xiàng)式整除,也就是:

        1.2  生成多項(xiàng)式的注意事項(xiàng) (1)生成多項(xiàng)式的最高位和最低位必須為1。 (2)當(dāng)所要傳輸?shù)臄?shù)據(jù)序列任何一位發(fā)生錯誤時,用生
        成多項(xiàng)式做模2除法(即加法不進(jìn)位,減法不借位,實(shí)際上就 是數(shù)字邏輯里的“異或”操作)后要使相除后的余數(shù)不為0。 (3)對于不同的位產(chǎn)生錯誤時,要使余數(shù)也不同。
        (4)對余數(shù)繼續(xù)做模2除法時,要使余數(shù)循環(huán)。

        2  Verilog HDL核心程序
        2.1  Verilog HDL實(shí)現(xiàn)循環(huán)冗余校驗(yàn)碼的生成代碼

        其中DXS表示生成多項(xiàng)式PROCESS(clk,rst_n )
        VARIABLE dzl: STD_LOGIC_VECTOR(16 DOWNTO 0); VARIABLE sdzl:     S T D _ L O G I C _ V E C T O R ( 1 1
        DOWNTO 0); BEGIN
        IF (clk'event and clk='1') THEN IF    rst_n='0' THEN hsd_r<='0';
        dcrco_r<=B"0_0000_0000_0000_0000"; ELSIF    dload='1'  THEN
        dzl   :=sdata&'0'&'0'&'0'&'0'&'0';
        sdzl  :=sdata;
        IF dzl(16)='1' THEN
        dzl(16 DOWNTO 11):=dzl(16 DOWNTO 11) XOR DXS; END IF;
        IF dzl(15)='1' THEN
        dzl(15 DOWNTO 10):=dzl(15 DOWNTO 10) XOR DXS; END IF;
        IF dzl(14)='1' THEN
        dzl(14 DOWNTO 9):=dzl(14 DOWNTO 9) XOR DXS; END IF;
        IF dzl(5)='1' THEN

        圖1  循環(huán)冗余校驗(yàn)碼的生成、校驗(yàn)仿真
        dzl(5 DOWNTO 0):=dzl(5 DOWNTO 0) XOR DXS; END IF;
        dcrco_r<=sdzl & dzl(4 DOWNTO 0);

        hsd_r<='1'; ELSE hsd_r<='0'; END IF; END IF;
        END PROCESS;
        2.2  循環(huán)冗余校驗(yàn)碼的校驗(yàn)代碼

        PROCESS(clk,rst_n)

        VARIABLE rdzl:     STD_LOGIC_VECTOR(16 DOWNTO 0); BEGIN
        IF (clk'event and clk='1') THEN IF rst_n='0'    THEN
        rd_r    <=X"000";

        dfsh_r    <='0';

        err_r <='0';

        ELSIF    hrecv='1'  THEN

        rdcrc_r    <=datacrci;

        rdzl         :=datacrci(16 DOWNTO 0); IF    rdzl(16)='1'     THEN
        rdzl(16 DOWNTO 11):=rdzl(16 DOWNTO 11) XOR DXS; END IF;
        IF    rdzl(15)='1'     THEN

        rdzl(15 DOWNTO 10):=rdzl(15 DOWNTO 10) XOR DXS; END IF;
        IF    rdzl(14)='1'     THEN

        rdzl(14 DOWNTO 9):=rdzl(14 DOWNTO 9) XOR DXS; END IF;
        IF rdzl(5)='1' THEN

        rdzl(5 DOWNTO 0):=rdzl(5 DOWNTO 0) XOR DXS; END IF;
        IF    rdzl(5 DOWNTO 0)="000000"
        THEN

        rd_r    < = r d c r c _ r ( 1 6DOWNTO 5);
        dfsh_r    <='1';

        err_r<='0'; ELSE rd_r<=X"000"; err_r<='1'; END IF;
        ELSE dfsh_r<='0'; END IF; END IF;
        END PROCESS;
        對循環(huán)冗余校驗(yàn)碼的生成和校驗(yàn)進(jìn)行了功能仿真,結(jié) 果如圖1所示。

        3  循環(huán)冗余校驗(yàn)碼的應(yīng)用
        由于循環(huán)冗余校驗(yàn)碼強(qiáng)大的校驗(yàn)?zāi)芰Γ诓煌I(lǐng)域, 循環(huán)冗余校驗(yàn)碼的生成多項(xiàng)式位數(shù)也不同,根據(jù)IEEE官方 文件顯示,為了更好地保證校驗(yàn)可靠度,現(xiàn)在的位數(shù)越來越 大,目前最長的循環(huán)冗余校驗(yàn)碼已達(dá)到160位。下面簡單介 紹幾種常見的循環(huán)冗余校驗(yàn)碼及其應(yīng)用領(lǐng)域。
        (1)USB接口用CRC5。對應(yīng)的標(biāo)準(zhǔn)生成多項(xiàng)式:
        P(x) = x5 + x2 + 1 (2)ATM協(xié)議等用CRC8。對應(yīng)的標(biāo)準(zhǔn)生成多項(xiàng)式:P(x) = x8 + x2 + x + 1 (3)文件傳輸通信協(xié)議,X25協(xié)議等用CRC16。對應(yīng)的標(biāo)
        準(zhǔn)生成多項(xiàng)式:
        P(x) = x16 + x12 + x5 + 1 (4)IEEE802.3標(biāo)準(zhǔn)用CRC32。對應(yīng)的標(biāo)準(zhǔn)生成多項(xiàng)式: P(x) = x32 + x26 + x23 + x22 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2
        + x + 1
        (5)ISO 3309規(guī)定的CRC64。對應(yīng)的生成多項(xiàng)式:
        P(x) =x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + x40
        + x39 + x38 + x37 + x35 + x33 + x32 + x31 + x29 + x27 + x24 + x23 + x22 + x21 +
        x19 + x17 + x13 + x12 + x10 + x9 + x7 + x4 + x + 1

        4  結(jié)語
        循 環(huán) 冗 余 校 驗(yàn) 碼 已 經(jīng) 成 為 各 行 各 業(yè) 通 信 校 驗(yàn) 中 最 普 遍的校驗(yàn)方式。本設(shè)計將循環(huán)冗余校驗(yàn)碼的生成與校驗(yàn)過 程進(jìn)行細(xì)致的分析,最終采用Altera公司開發(fā)的FPFA芯片 EP1C12Q240C8進(jìn)行結(jié)果驗(yàn)證。實(shí)驗(yàn)表明在實(shí)現(xiàn)循環(huán) 冗余校驗(yàn)碼方面有著簡單高效的優(yōu)勢。在未來實(shí)現(xiàn)更多位的 循環(huán)冗余校驗(yàn)中有著更深遠(yuǎn)的用途。



        關(guān)鍵詞: FPGA 校驗(yàn)碼

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 崇仁县| 科技| 射阳县| 宁远县| 丹阳市| 岑巩县| 长乐市| 马尔康县| 德惠市| 句容市| 垫江县| 海兴县| 长乐市| 绥芬河市| 淮安市| 宝清县| 永川市| 五大连池市| 龙州县| 梧州市| 仙居县| 保德县| 若尔盖县| 堆龙德庆县| 英吉沙县| 布拖县| 饶河县| 灌阳县| 三都| 成武县| 曲麻莱县| 东方市| 务川| 德惠市| 旌德县| 营山县| 凤山市| 新竹市| 荃湾区| 定州市| 扎兰屯市|