關(guān)鍵詞: FPGA , 錯誤檢測 , 自動糾正
引言
2012-1-9 17:23:29 上傳
在一些電磁環(huán)境比較惡劣的情況下,一些大規(guī)模集成電路常常會受到干擾,導(dǎo)致不能正常工作。特別是像RAM這種利用雙穩(wěn)態(tài)進(jìn)行存儲的器件,往往會在強(qiáng)干擾下發(fā)生翻轉(zhuǎn),使原來存儲的"0"變?yōu)?1",或者"1"變?yōu)?0",造成的后果往往是很嚴(yán)重的。例如導(dǎo)致一些控制程序跑飛,存儲的關(guān)鍵數(shù)據(jù)出錯等等。現(xiàn)在,隨著芯片集成度的增加,發(fā)生錯誤的可能性也在增大。在一些特定的應(yīng)用中,這已經(jīng)成為一個不能忽視的問題。例如在空間電子應(yīng)用領(lǐng)域,單粒子翻轉(zhuǎn)效應(yīng)就成為困擾設(shè)計(jì)師的一個難題。
在這種情況下,我們可以采用錯誤檢測與糾正EDAC(ErrorDetectionAndCorrection)電路來有效地減少或避免這種情況的出現(xiàn)。根據(jù)檢錯、糾錯的原理,主要思想是在數(shù)據(jù)寫入時,根據(jù)寫入的數(shù)據(jù)生成一定位數(shù)的校驗(yàn)碼,與相應(yīng)的數(shù)據(jù)一起保存起來;當(dāng)讀出時,同時也將校驗(yàn)碼讀出,進(jìn)行判決。如果出現(xiàn)一位錯誤則自動糾正,將正確的數(shù)據(jù)送出,并同時將改正以后的數(shù)據(jù)回寫覆蓋原來錯誤的數(shù)據(jù);如果出現(xiàn)兩位錯誤則產(chǎn)生中斷報(bào)告,通知CPU進(jìn)行異常處理。所有這一切動作都是靠硬件設(shè)計(jì)自動完成的,具有實(shí)時性和自動完成的特點(diǎn)。通過這樣的EDAC電路,能大大提高系統(tǒng)的抗干擾能力,從而提高系統(tǒng)的可靠性。
當(dāng)然,有一些現(xiàn)成的集成電路芯片可以完成上述功能,如74系列的74630芯片等。但由于嵌入式系統(tǒng)中,往往由于集成化的需要,要將這樣的功能集成到FPGA中去實(shí)現(xiàn),因此采用VHDL語言進(jìn)行設(shè)計(jì)具有靈活性和通用性的特點(diǎn)。
1檢錯與糾錯原理
首先來看看檢錯和糾錯的基本原理。進(jìn)行差錯控制的基本思想是在信息碼組中以一定規(guī)則加入不同方式的冗余碼,以便在信息讀出的時候依靠多余的監(jiān)督碼或校驗(yàn)碼來發(fā)現(xiàn)或自動糾正錯誤。
針對誤碼發(fā)生的特點(diǎn),即錯誤發(fā)生的隨機(jī)性和小概率性,它幾乎總是隨機(jī)地影響某個字節(jié)中的某一位(bit),因此,如果能夠設(shè)計(jì)自動糾正一位錯誤,而檢測兩位錯誤的編碼方式,就可以大大的提高系統(tǒng)的可靠性。
現(xiàn)在我們以16位的CPU數(shù)據(jù)總線為例,假定信息源的位數(shù)為16,要構(gòu)造一種能夠糾正一位錯誤,檢查兩位錯誤的編碼方式。根據(jù)"糾錯定理",需要設(shè)計(jì)最小漢明距離≥4的碼組。我們可以采用線形分組碼,利用線性分組碼的概念可以構(gòu)造六位監(jiān)督碼,它們由如下線性關(guān)系產(chǎn)生:
其中,d0~d15為16位數(shù)據(jù)(15為最高位MSB,0為最低位LSB),C0~C5為產(chǎn)生的六位監(jiān)督碼,表示進(jìn)行異或運(yùn)算。
在數(shù)據(jù)讀出時,我們只需要考察伴隨式S=[S0S1S2S3S4S5],其中:
2012-1-9 17:23:29 上傳
下載附件 (26.22 KB)很容易證明,根據(jù)伴隨式進(jìn)行誤差診斷,符合表1所列情況。
表1誤差診斷碼表
伴隨式
錯誤位置
數(shù)據(jù)位
校驗(yàn)位
無錯
d0
d1
d2
d3
d4
d5
d6
d7
d8
d9
d10
d11
d12
d13
d14
d15
C0
C1
C2
C3
C4
C5
S0
1
1
0
1
1
0
0
0
1
1
1
0
0
1
0
0
1
0
0
0
0
0
0
S1
1
0
1
1
0
1
1
0
1
0
0
1
0
0
1
0
0
1
0
0
0
0
0
S2
0
1
1
0
1
1
0
1
0
1
0
0
1
0
0
1
0
0
1
0
0
0
0
S3
1
1
1
0
0
0
1
1
0
0
1
1
1
0
0
0
0
0
0
1
0
0
0
S4
0
0
0
1
1
1
1
1
0
0
0
0
0
1
1
1
0
0
0
0
1
0
0
S5
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
0
1
0
當(dāng)S=[000000]時,數(shù)據(jù)正確無誤;
當(dāng)S=[001011]時,數(shù)據(jù)錯一位,并且錯誤發(fā)生在d0位,可將d0位的數(shù)據(jù)取反加以糾正;
當(dāng)S=[001101]時,數(shù)據(jù)錯一位,并且錯誤發(fā)生在d1位,可將d1位的數(shù)據(jù)取反加以糾正;
.
.
.
當(dāng)S=[110100]時,數(shù)據(jù)錯一位,并且錯誤發(fā)生在d15位,可將d15位的數(shù)據(jù)取反加以糾正;
當(dāng)S=[000001]時,數(shù)據(jù)錯一位,并且錯誤發(fā)生在C0位;
.
.
.
當(dāng)S=[100000]時,數(shù)據(jù)錯一位,并且錯誤發(fā)生在C5位;
當(dāng)S為其它情況時,至少發(fā)生兩位錯誤。
可以看出,這種編碼方式可以滿足自動糾正一位錯誤,而發(fā)現(xiàn)兩位錯誤的要求。下面就進(jìn)一步討論如何用電路來實(shí)現(xiàn)。
2012-1-9 17:23:29 上傳
下載附件 (18.57 KB)2EDAC電路的設(shè)計(jì)
EDAC電路必須配合CPU的讀寫時序進(jìn)行工作,不同類型CPU的時序往往是不一樣的。一般來說,總可以分為讀周期和寫周期。在寫周期時,按照上面的設(shè)計(jì)邏輯,根據(jù)16位數(shù)據(jù)位生成6位的校驗(yàn)字,這時,數(shù)據(jù)位是輸入,校驗(yàn)位是輸出,并在該寫周期中將數(shù)據(jù)位和校驗(yàn)位都存儲到相應(yīng)的存儲器位置中去,這種情況比較簡單。在讀周期時,情況復(fù)雜些,可以設(shè)計(jì)成三步完成。第一步,在CPU讀信號來之前,由于存儲器地址和片選信號已經(jīng)有效,可先將數(shù)據(jù)位和校驗(yàn)位讀入,這時,數(shù)據(jù)位和校驗(yàn)位都是作為輸入。第二步,在讀信號來時,將數(shù)據(jù)位、校驗(yàn)位鎖存,同時進(jìn)行檢測,如果無錯,則不進(jìn)行任何處理,直接將數(shù)據(jù)輸出;如果發(fā)現(xiàn)二位錯,則產(chǎn)生中斷;如果是一位錯,在輸出上有所反應(yīng),并進(jìn)入下一步。第三步,如果是數(shù)據(jù)位出錯,將其自動更正,并將正確的值再回寫到相應(yīng)的內(nèi)存地址中,將正確的數(shù)據(jù)值輸出到數(shù)據(jù)總線;如果是校驗(yàn)位出錯,可以直接將正確的數(shù)據(jù)位輸出到數(shù)據(jù)總線上。這部分功能是EDAC功能的核心,可以用VHDL語言來實(shí)現(xiàn),以下是設(shè)計(jì)思路。
(1)對輸入的設(shè)計(jì)
①數(shù)據(jù)位和校驗(yàn)位的輸入。
②控制端的輸入。經(jīng)過前面的分析,一共有四種狀態(tài)(寫一種狀態(tài)、讀三種狀態(tài)),可以設(shè)計(jì)兩個控制端,設(shè)為C0、C1。其功能見表2。
(2)對輸出的設(shè)計(jì)
①數(shù)據(jù)位和校驗(yàn)位的輸出。其中校驗(yàn)位的輸出在讀周期和寫周期有所不同:在寫周期校驗(yàn)位輸出是生成的校驗(yàn)位;而讀周期就沒有必要輸出校驗(yàn)位了,可以設(shè)計(jì)為輸出伴隨式S。
②錯誤標(biāo)記輸出。在應(yīng)用中,可以設(shè)計(jì)兩種錯誤標(biāo)記輸出,分別記為ERR和INT。其中ERR輸出"1"表示數(shù)據(jù)位有錯誤產(chǎn)生,包括可自動糾正的一位錯誤和兩位或兩位以上錯誤。INT輸出"1"則表示發(fā)生了兩位或以上錯誤,無法自動糾正,向CPU申請中斷,由CPU進(jìn)行異常處理。
在表2中,總結(jié)了上面所描述的功能設(shè)計(jì)。
表2EDAC模塊功能表
控制端
存儲器周期
功能描述
數(shù)據(jù)位
校驗(yàn)位
錯誤標(biāo)記輸出
C0
C1
ERR
INT
0
0
寫周期
產(chǎn)生校驗(yàn)位,并輸出
輸入
輸出
0
0
0
1
讀周期
讀入數(shù)據(jù)位和校驗(yàn)位
輸入
輸入
0
0
1
1
讀周期
鎖存數(shù)據(jù)位和校驗(yàn)位并進(jìn)行錯誤檢測
鎖存
鎖存
0/1
0/1
1
0
讀周期
校正錯誤并輸出診斷結(jié)果
輸出
輸出伴隨式S
0/1
0/1
圖1為EDAC部分邏輯等效圖。
由于邏輯關(guān)系已經(jīng)非常明確了,下面討論采用VHDL語言實(shí)現(xiàn)上述EDAC模塊的功能。可以有兩種方法來實(shí)現(xiàn)VHDL編程,即RTL級語言描述和行為級語言描述。其中RTL級描述的實(shí)現(xiàn)難度比較大,需要根據(jù)前面設(shè)計(jì)的邏輯功能,轉(zhuǎn)換為基本的門來描述;有效率高和受邏輯綜合軟件的影響小等優(yōu)點(diǎn),但可讀性差,實(shí)現(xiàn)起來比較困難。因此我們采用的是行為級描述,根據(jù)四個輸入作敏感量,用一個進(jìn)程(process)就可以實(shí)現(xiàn)。編程思路是:根據(jù)控制端C0和C1進(jìn)行判斷,如果是寫周期,直接將輸入的數(shù)據(jù)相應(yīng)位進(jìn)行異或后輸出;如果是讀周期,先生成伴隨式S,然后判斷S,用CASE語句執(zhí)行相應(yīng)的輸出。需要強(qiáng)調(diào)的是在不需要輸出的時候,要把輸出端用高阻封住。
利用這個EDAC模塊再輔以簡單的外圍電路就可以實(shí)現(xiàn)較強(qiáng)的EDAC功能,可以把這一部分整個電路都集成到FPGA中。
3仿真結(jié)果
仿真環(huán)境:MAX+plusII10.0。
仿真模擬器件:FLEX10K系列,EPF10K10LC84-3。
信號功能說明見表3。
表3仿真信號說明
信號名稱
功能說明
CLK
模擬CPU時鐘,在該仿真中設(shè)定時鐘頻率為10MHz
WRITE
模擬CPU發(fā)出的寫信號
READ
模擬CPU發(fā)出的讀信號
MEMW
由EDAC電路發(fā)出的內(nèi)存寫信號,主要用于數(shù)據(jù)糾正后的回寫
HIGH
恒為高電平,提供芯片使能信號
INT
EDAC電路檢測到兩個以上錯誤時發(fā)出的中斷請求信號
ERR
EDAC檢測到錯誤時發(fā)出的信號,構(gòu)校驗(yàn)位產(chǎn)生一位錯誤時不產(chǎn)生該信號
CBIN[5..0]
6位校驗(yàn)位輸入
DBIN[15..0
16位數(shù)據(jù)位輸入
CBOUT[5..0
寫周期時作校驗(yàn)輸出,讀周期時輸出為伴隨式S
DBOUT[15..0
16位數(shù)據(jù)位輸出
(1)寫周期的仿真
圖2所示仿真圖中,275~500ns仿真了一個寫周期,數(shù)據(jù)輸入是AA55,而校驗(yàn)位輸出是00,通過驗(yàn)證是符合上面的設(shè)計(jì)邏輯的。
(2)讀周期的仿真
在讀周期的仿真中,我們模擬了以下四種情況。
①正確的讀周期:出現(xiàn)在650~975ns,校驗(yàn)位、數(shù)據(jù)位都是正確值。
②數(shù)據(jù)位出現(xiàn)一位錯誤:圖2中1.25~1.65μs模擬了數(shù)據(jù)位產(chǎn)生一位錯誤的情況。數(shù)據(jù)正確的情況下應(yīng)該是AA55,但現(xiàn)在d8位發(fā)生了錯誤,讀入的數(shù)據(jù)變?yōu)锳B55,可以看出數(shù)據(jù)已經(jīng)被自動更正為AA55;同時,ERR輸出"1"表明有錯誤發(fā)生,CBOUT輸出為23,即100011,從表1可以看出是d8位發(fā)生了錯誤。
③校驗(yàn)位出現(xiàn)一位錯誤:圖2中1.8~2.0μs模擬了校驗(yàn)位產(chǎn)生一位錯誤的情況。校驗(yàn)位正確的情況下應(yīng)該是00,但現(xiàn)在C2位發(fā)生了錯誤,讀入的數(shù)據(jù)變?yōu)?4,可以看出數(shù)據(jù)沒變,仍為正確值A(chǔ)A55;同時,ERR沒有輸出,CBOUT輸出為04,即000100,從表一可以看出是C2位發(fā)生了錯誤。
④發(fā)生了兩位錯誤:圖2中2.4~2.75μs模擬了數(shù)據(jù)位產(chǎn)生兩位錯誤的情況。數(shù)據(jù)正確的情況下應(yīng)該是AA55,但現(xiàn)在d8位和d0位發(fā)生了錯誤,讀入的數(shù)據(jù)變?yōu)锳B54,可以看出EDAC電路已經(jīng)無法自動更正。ERR和INT同時輸出"1"表明有多位錯誤發(fā)生,INT信號可以向CPU申請中斷,用中斷服務(wù)程序進(jìn)行異常處理。
可以看出仿真結(jié)果可以滿足設(shè)計(jì)時的思想,能夠起到自動糾正一位錯誤和檢測兩位錯誤的功能。
結(jié)語
本文利用糾錯編碼的基本知識,提出了一種簡單實(shí)用的能自動糾正一位錯誤和檢查兩位錯誤的編碼方法,并且通過VHDL語言編程,用FPGA器件來實(shí)現(xiàn)。在我們自己的嵌入式系統(tǒng)中,EDAC電路已經(jīng)得到了應(yīng)用和驗(yàn)證。現(xiàn)在越來越多的嵌入式系統(tǒng)對可靠性要求越來越高,采用EDAC技術(shù)可以簡單有效地提高系統(tǒng)的容錯能力;但針對不同系統(tǒng),EDAC和CPU的時序配合可能會有所不同。例如,對于一些時鐘頻率比較高的CPU,可能需要插入等待周期等等,但由于采用VHDL語言進(jìn)行設(shè)計(jì),有很大的靈活性,稍加改動就可以滿足不同場合的需求。
Source:互聯(lián)網(wǎng)
評論
查看更多