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