在(zài)一(yī)些電(diàn)磁环(huán)境比較惡劣的(de)情(qíng)況下(xià),一(yī)些大規模集成(chéng)電(diàn)路(lù)常常会(huì)受到(dào)干(gàn)擾,導致(zhì)不(bù)能(néng)正(zhèng)常工作。特(tè)别是(shì)像RAM这(zhè)種(zhǒng)利用(yòng)双(shuāng)稳态進(jìn)行存儲的(de)器件(jiàn),往往会(huì)在(zài)強(qiáng)干(gàn)擾下(xià)發(fà)生(shēng)翻轉(zhuǎn),使原来(lái)存儲的(de)"0"變(biàn)为(wèi)"1",或(huò)者(zhě)"1"變(biàn)为(wèi)"0",造成(chéng)的(de)後(hòu)果(guǒ)往往是(shì)很嚴重(zhòng)的(de)。例如(rú)導致(zhì)一(yī)些控制程序跑飛,存儲的(de)關(guān)鍵數據(jù)出(chū)錯等等。現(xiàn)在(zài),随着芯片(piàn)集成(chéng)度(dù)的(de)增加,發(fà)生(shēng)錯誤的(de)可(kě)能(néng)性(xìng)也(yě)在(zài)增大。在(zài)一(yī)些特(tè)定(dìng)的(de)應(yìng)用(yòng)中(zhōng),这(zhè)已經(jīng)成(chéng)为(wèi)一(yī)个(gè)不(bù)能(néng)忽視的(de)問(wèn)題(tí)。例如(rú)在(zài)空間(jiān)電(diàn)子應(yìng)用(yòng)領域,單粒(lì)子翻轉(zhuǎn)效應(yìng)就(jiù)成(chéng)为(wèi)困擾設計(jì)师(shī)的(de)一(yī)个(gè)難題(tí)。
在(zài)这(zhè)種(zhǒng)情(qíng)況下(xià),我(wǒ)们(men)可(kě)以(yǐ)采用(yòng)錯誤檢测與(yǔ)糾正(zhèng)EDAC(Error DetecTIon And CorrecTIon)電(diàn)路(lù)来(lái)有(yǒu)效地(dì)減少(shǎo)或(huò)避免这(zhè)種(zhǒng)情(qíng)況的(de)出(chū)現(xiàn)。根(gēn)據(jù)檢錯、糾錯的(de)原理,主(zhǔ)要(yào)思(sī)想(xiǎng)是(shì)在(zài)數據(jù)写入(rù)时(shí),根(gēn)據(jù)写入(rù)的(de)數據(jù)生(shēng)成(chéng)一(yī)定(dìng)位數的(de)校(xiào)验(yàn)碼,與(yǔ)相應(yìng)的(de)數據(jù)一(yī)起保存起来(lái);當读(dú)出(chū)时(shí),同(tóng)时(shí)也(yě)将校(xiào)验(yàn)碼读(dú)出(chū),進(jìn)行判決。如(rú)果(guǒ)出(chū)現(xiàn)一(yī)位錯誤則自(zì)動(dòng)糾正(zhèng),将正(zhèng)确的(de)數據(jù)送出(chū),并同(tóng)时(shí)将改正(zhèng)以(yǐ)後(hòu)的(de)數據(jù)回(huí)写覆蓋原来(lái)錯誤的(de)數據(jù);如(rú)果(guǒ)出(chū)現(xiàn)两(liǎng)位錯誤則産生(shēng)中(zhōng)斷報告,通(tòng)知CPU進(jìn)行异(yì)常处理。所(suǒ)有(yǒu)这(zhè)一(yī)切(qiè)動(dòng)作都是(shì)靠硬(yìng)件(jiàn)設計(jì)自(zì)動(dòng)完成(chéng)的(de),具有(yǒu)实时(shí)性(xìng)和(hé)自(zì)動(dòng)完成(chéng)的(de)特(tè)點(diǎn)。通(tòng)过(guò)这(zhè)樣(yàng)的(de)EDAC電(diàn)路(lù),能(néng)大大提(tí)高(gāo)系(xì)統的(de)抗干(gàn)擾能(néng)力,從而(ér)提(tí)高(gāo)系(xì)統的(de)可(kě)靠性(xìng)。
當然,有(yǒu)一(yī)些現(xiàn)成(chéng)的(de)集成(chéng)電(diàn)路(lù)芯片(piàn)可(kě)以(yǐ)完成(chéng)上(shàng)述功能(néng),如(rú)74系(xì)列的(de)74630芯片(piàn)等。但由(yóu)于(yú)嵌入(rù)式系(xì)統中(zhōng),往往由(yóu)于(yú)集成(chéng)化(huà)的(de)需要(yào),要(yào)将这(zhè)樣(yàng)的(de)功能(néng)集成(chéng)到(dào)FPGA中(zhōng)去(qù)实現(xiàn),因(yīn)此(cǐ)采用(yòng)VHDL語(yǔ)言進(jìn)行設計(jì)具有(yǒu)靈活性(xìng)和(hé)通(tòng)用(yòng)性(xìng)的(de)特(tè)點(diǎn)。
1 檢錯與(yǔ)糾錯原理
首先(xiān)来(lái)看(kàn)看(kàn)檢錯和(hé)糾錯的(de)基本(běn)原理。進(jìn)行差錯控制的(de)基本(běn)思(sī)想(xiǎng)是(shì)在(zài)信(xìn)息碼組中(zhōng)以(yǐ)一(yī)定(dìng)規則加入(rù)不(bù)同(tóng)方(fāng)式的(de)冗餘碼,以(yǐ)便在(zài)信(xìn)息读(dú)出(chū)的(de)时(shí)候依靠多(duō)餘的(de)監督碼或(huò)校(xiào)验(yàn)碼来(lái)發(fà)現(xiàn)或(huò)自(zì)動(dòng)糾正(zhèng)錯誤。
針(zhēn)对(duì)誤碼發(fà)生(shēng)的(de)特(tè)點(diǎn),即錯誤發(fà)生(shēng)的(de)随機(jī)性(xìng)和(hé)小概率性(xìng),它(tā)幾(jǐ)乎總(zǒng)是(shì)随機(jī)地(dì)影響某个(gè)字(zì)节(jié)中(zhōng)的(de)某一(yī)位(bit),因(yīn)此(cǐ),如(rú)果(guǒ)能(néng)够設計(jì)自(zì)動(dòng)糾正(zhèng)一(yī)位錯誤,而(ér)檢测两(liǎng)位錯誤的(de)編碼方(fāng)式,就(jiù)可(kě)以(yǐ)大大的(de)提(tí)高(gāo)系(xì)統的(de)可(kě)靠性(xìng)。
現(xiàn)在(zài)我(wǒ)们(men)以(yǐ)16位的(de)CPU數據(jù)總(zǒng)線(xiàn)为(wèi)例,假定(dìng)信(xìn)息源的(de)位數为(wèi)16,要(yào)構造一(yī)種(zhǒng)能(néng)够糾正(zhèng)一(yī)位錯誤,檢查两(liǎng)位錯誤的(de)編碼方(fāng)式。根(gēn)據(jù)"糾錯定(dìng)?quot;,需要(yào)設計(jì)最(zuì)小漢明(míng)距離≥4的(de)碼組。我(wǒ)们(men)可(kě)以(yǐ)采用(yòng)線(xiàn)形分(fēn)組碼,利用(yòng)線(xiàn)性(xìng)分(fēn)組碼的(de)概念可(kě)以(yǐ)構造六(liù)位監督碼,它(tā)们(men)由(yóu)如(rú)下(xià)線(xiàn)性(xìng)關(guān)系(xì)産生(shēng):
其中(zhōng),d0~d15为(wèi)16位數據(jù)(15为(wèi)最(zuì)高(gāo)位MSB,0为(wèi)最(zuì)低位LSB),C0~C5为(wèi)産生(shēng)的(de)六(liù)位監督碼,表(biǎo)示進(jìn)行异(yì)或(huò)運算。
在(zài)數據(jù)读(dú)出(chū)时(shí),我(wǒ)们(men)只(zhī)需要(yào)考察伴随式S=[S0 S1 S2 S3 S4 S5],其中(zhōng):
很容易證明(míng),根(gēn)據(jù)伴随式進(jìn)行誤差診斷,符合表(biǎo) 1所(suǒ)列情(qíng)況。
表(biǎo)1
當S = [0 0 0 0 0 0]时(shí),數據(jù)正(zhèng)确无誤;
當S = [0 0 1 0 1 1]时(shí),數據(jù)錯一(yī)位,并且錯誤發(fà)生(shēng)在(zài)d0位,可(kě)将d0位的(de)數據(jù)取(qǔ)反(fǎn)加以(yǐ)糾正(zhèng);
當S = [0 0 1 1 0 1]时(shí),數據(jù)錯一(yī)位,并且錯誤發(fà)生(shēng)在(zài)d1位,可(kě)将d1位的(de)數據(jù)取(qǔ)反(fǎn)加以(yǐ)糾正(zhèng);
.
.
.
當S= [1 1 0 1 0 0]时(shí),數據(jù)錯一(yī)位,并且錯誤發(fà)生(shēng)在(zài)d15位,可(kě)将d15位的(de)數據(jù)取(qǔ)反(fǎn)加以(yǐ)糾正(zhèng);
當S = [0 0 0 0 0 1]时(shí),數據(jù)錯一(yī)位,并且錯誤發(fà)生(shēng)在(zài)C0位;
.
.
.
當S = [1 0 0 0 0 0]时(shí),數據(jù)錯一(yī)位,并且錯誤發(fà)生(shēng)在(zài)C5位;
當S为(wèi)其它(tā)情(qíng)況时(shí),至(zhì)少(shǎo)發(fà)生(shēng)两(liǎng)位錯誤。
可(kě)以(yǐ)看(kàn)出(chū),这(zhè)種(zhǒng)編碼方(fāng)式可(kě)以(yǐ)滿足自(zì)動(dòng)糾正(zhèng)一(yī)位錯誤,而(ér)發(fà)現(xiàn)两(liǎng)位錯誤的(de)要(yào)求。下(xià)面(miàn)就(jiù)進(jìn)一(yī)步讨論如(rú)何用(yòng)電(diàn)路(lù)来(lái)实現(xiàn)。
2 EDAC電(diàn)路(lù)的(de)設計(jì)
EDAC電(diàn)路(lù)必須配合CPU的(de)读(dú)写时(shí)序進(jìn)行工作,不(bù)同(tóng)類(lèi)型CPU的(de)时(shí)序往往是(shì)不(bù)一(yī)樣(yàng)的(de)。一(yī)般来(lái)说(shuō),總(zǒng)可(kě)以(yǐ)分(fēn)为(wèi)读(dú)周期(qī)和(hé)写周期(qī)。在(zài)写周期(qī)时(shí),按照上(shàng)面(miàn)的(de)設計(jì)邏輯,根(gēn)據(jù)16位數據(jù)位生(shēng)成(chéng)6位的(de)校(xiào)验(yàn)字(zì),这(zhè)时(shí),數據(jù)位是(shì)輸入(rù),校(xiào)验(yàn)位是(shì)輸出(chū),并在(zài)該写周期(qī)中(zhōng)将數據(jù)位和(hé)校(xiào)验(yàn)位都存儲到(dào)相應(yìng)的(de)存儲器位置中(zhōng)去(qù),这(zhè)種(zhǒng)情(qíng)況比較簡單。在(zài)读(dú)周期(qī)时(shí),情(qíng)況複雜些,可(kě)以(yǐ)設計(jì)成(chéng)三(sān)步完成(chéng)。第(dì)一(yī)步,在(zài)CPU读(dú)信(xìn)号(hào)来(lái)之前(qián),由(yóu)于(yú)存儲器地(dì)址和(hé)片(piàn)選信(xìn)号(hào)已經(jīng)有(yǒu)效,可(kě)先(xiān)将數據(jù)位和(hé)校(xiào)验(yàn)位读(dú)入(rù),这(zhè)时(shí),數據(jù)位和(hé)校(xiào)验(yàn)位都是(shì)作为(wèi)輸入(rù)。第(dì)二(èr)步,在(zài)读(dú)信(xìn)号(hào)来(lái)时(shí),将數據(jù)位、校(xiào)验(yàn)位鎖存,同(tóng)时(shí)進(jìn)行檢测,如(rú)果(guǒ)无錯,則不(bù)進(jìn)行任何处理,直(zhí)接将數據(jù)輸出(chū);如(rú)果(guǒ)發(fà)現(xiàn)二(èr)位錯,則産生(shēng)中(zhōng)斷;如(rú)果(guǒ)是(shì)一(yī)位錯,在(zài)輸出(chū)上(shàng)有(yǒu)所(suǒ)反(fǎn)應(yìng),并進(jìn)入(rù)下(xià)一(yī)步。第(dì)三(sān)步,如(rú)果(guǒ)是(shì)數據(jù)位出(chū)錯,将其自(zì)動(dòng)更(gèng)正(zhèng),并将正(zhèng)确的(de)值再回(huí)写到(dào)相應(yìng)的(de)內(nèi)存地(dì)址中(zhōng),将正(zhèng)确的(de)數據(jù)值輸出(chū)到(dào)數據(jù)總(zǒng)線(xiàn);如(rú)果(guǒ)是(shì)校(xiào)验(yàn)位出(chū)錯,可(kě)以(yǐ)直(zhí)接将正(zhèng)确的(de)數據(jù)位輸出(chū)到(dào)數據(jù)總(zǒng)線(xiàn)上(shàng)。这(zhè)部(bù)分(fēn)功能(néng)是(shì)EDAC功能(néng)的(de)核心(xīn),可(kě)以(yǐ)用(yòng)VHDL語(yǔ)言来(lái)实現(xiàn),以(yǐ)下(xià)是(shì)設計(jì)思(sī)路(lù)。
(1)对(duì)輸入(rù)的(de)設計(jì)
① 數據(jù)位和(hé)校(xiào)验(yàn)位的(de)輸入(rù)。
② 控制端的(de)輸入(rù)。經(jīng)过(guò)前(qián)面(miàn)的(de)分(fēn)析,一(yī)共(gòng)有(yǒu)四(sì)種(zhǒng)狀态(写一(yī)種(zhǒng)狀态、读(dú)三(sān)種(zhǒng)狀态),可(kě)以(yǐ)設計(jì)两(liǎng)个(gè)控制端,設为(wèi)C0、C1。其功能(néng)見(jiàn)表(biǎo) 2。
表(biǎo)2
(2)对(duì)輸出(chū)的(de)設計(jì)
① 數據(jù)位和(hé)校(xiào)验(yàn)位的(de)輸出(chū)。其中(zhōng)校(xiào)验(yàn)位的(de)輸出(chū)在(zài)读(dú)周期(qī)和(hé)写周期(qī)有(yǒu)所(suǒ)不(bù)同(tóng):在(zài)写周期(qī)校(xiào)验(yàn)位輸出(chū)是(shì)生(shēng)成(chéng)的(de)校(xiào)验(yàn)位;而(ér)读(dú)周期(qī)就(jiù)沒(méi)有(yǒu)必要(yào)輸出(chū)校(xiào)验(yàn)位了(le),可(kě)以(yǐ)設計(jì)为(wèi)輸出(chū)伴随式S。
② 錯誤标(biāo)記(jì)輸出(chū)。在(zài)應(yìng)用(yòng)中(zhōng),可(kě)以(yǐ)設計(jì)两(liǎng)種(zhǒng)錯誤标(biāo)記(jì)輸出(chū),分(fēn)别記(jì)为(wèi)ERR和(hé)INT。其中(zhōng)ERR輸出(chū)"1"表(biǎo)示數據(jù)位有(yǒu)錯誤産生(shēng),包(bāo)括可(kě)自(zì)動(dòng)糾正(zhèng)的(de)一(yī)位錯誤和(hé)两(liǎng)位或(huò)两(liǎng)位以(yǐ)上(shàng)錯誤。INT輸出(chū)"1"則表(biǎo)示發(fà)生(shēng)了(le)两(liǎng)位或(huò)以(yǐ)上(shàng)錯誤,无法自(zì)動(dòng)糾正(zhèng),向(xiàng)CPU申請中(zhōng)斷,由(yóu)CPU進(jìn)行异(yì)常处理。
在(zài)表(biǎo)2中(zhōng),總(zǒng)結了(le)上(shàng)面(miàn)所(suǒ)描述的(de)功能(néng)設計(jì)。
图(tú)1为(wèi)EDAC部(bù)分(fēn)邏輯等效图(tú)。
由(yóu)于(yú)邏輯關(guān)系(xì)已經(jīng)非(fēi)常明(míng)确了(le),下(xià)面(miàn)讨論采用(yòng)VHDL語(yǔ)言实現(xiàn)上(shàng)述EDAC模块(kuài)的(de)功能(néng)。可(kě)以(yǐ)有(yǒu)两(liǎng)種(zhǒng)方(fāng)法来(lái)实現(xiàn)VHDL編程,即RTL級語(yǔ)言描述和(hé)行为(wèi)級語(yǔ)言描述。其中(zhōng)RTL級描述的(de)实現(xiàn)難度(dù)比較大,需要(yào)根(gēn)據(jù)前(qián)面(miàn)設計(jì)的(de)邏輯功能(néng),轉(zhuǎn)換为(wèi)基本(běn)的(de)門(mén)来(lái)描述;有(yǒu)效率高(gāo)和(hé)受邏輯綜合软(ruǎn)件(jiàn)的(de)影響小等优點(diǎn),但可(kě)读(dú)性(xìng)差,实現(xiàn)起来(lái)比較困難。因(yīn)此(cǐ)我(wǒ)们(men)采用(yòng)的(de)是(shì)行为(wèi)級描述,根(gēn)據(jù)四(sì)个(gè)輸入(rù)作敏感(gǎn)量(liàng),用(yòng)一(yī)个(gè)進(jìn)程(process)就(jiù)可(kě)以(yǐ)实現(xiàn)。編程思(sī)路(lù)是(shì):根(gēn)據(jù)控制端C0和(hé)C1進(jìn)行判斷,如(rú)果(guǒ)是(shì)写周期(qī),直(zhí)接将輸入(rù)的(de)數據(jù)相應(yìng)位進(jìn)行异(yì)或(huò)後(hòu)輸出(chū);如(rú)果(guǒ)是(shì)读(dú)周期(qī),先(xiān)生(shēng)成(chéng)伴随式S,然後(hòu)判斷S,用(yòng)CASE語(yǔ)句(jù)執行相應(yìng)的(de)輸出(chū)。需要(yào)強(qiáng)調的(de)是(shì)在(zài)不(bù)需要(yào)輸出(chū)的(de)时(shí)候,要(yào)把輸出(chū)端用(yòng)高(gāo)阻封(fēng)住。 完整的(de)VHDL源代(dài)碼下(xià)载
利用(yòng)这(zhè)个(gè)EDAC模块(kuài)再輔以(yǐ)簡單的(de)外(wài)圍電(diàn)路(lù)就(jiù)可(kě)以(yǐ)实現(xiàn)較強(qiáng)的(de)EDAC功能(néng),可(kě)以(yǐ)把这(zhè)一(yī)部(bù)分(fēn)整个(gè)電(diàn)路(lù)都集成(chéng)到(dào)FPGA中(zhōng)。
3 仿真(zhēn)結果(guǒ)
仿真(zhēn)环(huán)境:MAX+plus II 10.0。
仿真(zhēn)模拟器件(jiàn):FLEX 10K系(xì)列,EPF10K10LC84-3。
信(xìn)号(hào)功能(néng)说(shuō)明(míng)見(jiàn)表(biǎo) 3。
(1)写周期(qī)的(de)仿真(zhēn)
图(tú) 2所(suǒ)示仿真(zhēn)图(tú)中(zhōng),275~500 ns仿真(zhēn)了(le)一(yī)个(gè)写周期(qī),數據(jù)輸入(rù)是(shì)AA55,而(ér)校(xiào)验(yàn)位輸出(chū)是(shì)00,通(tòng)过(guò)验(yàn)證是(shì)符合上(shàng)面(miàn)的(de)設計(jì)邏輯的(de)。
(2)读(dú)周期(qī)的(de)仿真(zhēn)
在(zài)读(dú)周期(qī)的(de)仿真(zhēn)中(zhōng),我(wǒ)们(men)模拟了(le)以(yǐ)下(xià)四(sì)種(zhǒng)情(qíng)況。
① 正(zhèng)确的(de)读(dú)周期(qī):出(chū)現(xiàn)在(zài)650~975ns,校(xiào)验(yàn)位、數據(jù)位都是(shì)正(zhèng)确值。
② 數據(jù)位出(chū)現(xiàn)一(yī)位錯誤:图(tú)2中(zhōng)1.25~1.65 μs模拟了(le)數據(jù)位産生(shēng)一(yī)位錯誤的(de)情(qíng)況。數據(jù)正(zhèng)确的(de)情(qíng)況下(xià)應(yìng)該是(shì)AA55,但現(xiàn)在(zài)d8位發(fà)生(shēng)了(le)錯誤,读(dú)入(rù)的(de)數據(jù)變(biàn)为(wèi)AB55,可(kě)以(yǐ)看(kàn)出(chū)數據(jù)已經(jīng)被(bèi)自(zì)動(dòng)更(gèng)正(zhèng)为(wèi)AA55;同(tóng)时(shí),ERR輸出(chū)"1"表(biǎo)明(míng)有(yǒu)錯誤發(fà)生(shēng),CBOUT輸出(chū)为(wèi)23,即100011,從表(biǎo) 1可(kě)以(yǐ)看(kàn)出(chū)是(shì)d8位發(fà)生(shēng)了(le)錯誤。
③ 校(xiào)验(yàn)位出(chū)現(xiàn)一(yī)位錯誤:图(tú)2中(zhōng)1.8~2.0μs模拟了(le)校(xiào)验(yàn)位産生(shēng)一(yī)位錯誤的(de)情(qíng)況。校(xiào)验(yàn)位正(zhèng)确的(de)情(qíng)況下(xià)應(yìng)該是(shì)00,但現(xiàn)在(zài)C2位發(fà)生(shēng)了(le)錯誤,读(dú)入(rù)的(de)數據(jù)變(biàn)为(wèi)04,可(kě)以(yǐ)看(kàn)出(chū)數據(jù)沒(méi)變(biàn),仍为(wèi)正(zhèng)确值AA55;同(tóng)时(shí),ERR沒(méi)有(yǒu)輸出(chū),CBOUT輸出(chū)为(wèi)04,即000100,從表(biǎo)一(yī)可(kě)以(yǐ)看(kàn)出(chū)是(shì)C2位發(fà)生(shēng)了(le)錯誤。
④ 發(fà)生(shēng)了(le)两(liǎng)位錯誤:图(tú) 2中(zhōng)2.4~2.75μs模拟了(le)數據(jù)位産生(shēng)两(liǎng)位錯誤的(de)情(qíng)況。數據(jù)正(zhèng)确的(de)情(qíng)況下(xià)應(yìng)該是(shì)AA55,但現(xiàn)在(zài)d8位和(hé)d0位發(fà)生(shēng)了(le)錯誤,读(dú)入(rù)的(de)數據(jù)變(biàn)为(wèi)AB54,可(kě)以(yǐ)看(kàn)出(chū)EDAC電(diàn)路(lù)已經(jīng)无法自(zì)動(dòng)更(gèng)正(zhèng)。 ERR和(hé)INT同(tóng)时(shí)輸出(chū)"1"表(biǎo)明(míng)有(yǒu)多(duō)位錯誤發(fà)生(shēng),INT信(xìn)号(hào)可(kě)以(yǐ)向(xiàng)CPU申請中(zhōng)斷,用(yòng)中(zhōng)斷服(fú)务程序進(jìn)行异(yì)常处理。
可(kě)以(yǐ)看(kàn)出(chū)仿真(zhēn)結果(guǒ)可(kě)以(yǐ)滿足設計(jì)时(shí)的(de)思(sī)想(xiǎng),能(néng)够起到(dào)自(zì)動(dòng)糾正(zhèng)一(yī)位錯誤和(hé)檢测两(liǎng)位錯誤的(de)功能(néng)。
文(wén)章(zhāng)摘自(zì):http://www.elecfans.com/emb/fpga/2009062070691.html
更(gèng)多(duō)資訊請關(guān)注:http://www.minyingyiyuan.com/product/www.minyingyiyuan.com






















