陳夢婷 衛(wèi)津逸 張怡昕 張立



摘要 狀態(tài)機(jī)簡寫為FSM(Finite State Machine),是數(shù)字系統(tǒng)的重要組成部分。本文結(jié)合AD9822的工作特點(diǎn),以AD9822的序列發(fā)生器的采樣控制過程為例,分析了狀態(tài)機(jī)產(chǎn)生毛刺的原因,討論并比較了三種消除毛刺的方案,分別給出了調(diào)整編碼消除毛刺和狀態(tài)碼直接輸出消除毛刺這兩種方案的VHDL源程序,利用Quartus Ⅱ仿真,成功消除毛刺。
關(guān)鍵詞 AD9822 序列發(fā)生器 狀態(tài)碼
中圖分類號:TN911.7 文獻(xiàn)標(biāo)識碼:A DOI:10.16400/j.cnki.kjdkx.2016.07.071
狀態(tài)機(jī)是一種重要的數(shù)字控制系統(tǒng)設(shè)計(jì)方法,它的速度和效率,以及在執(zhí)行時表現(xiàn)出的很強(qiáng)的可靠性和安全性,都是設(shè)計(jì)時的重要優(yōu)勢。除此以外,與其他方法相比,用VHDL描述狀態(tài)機(jī)的表達(dá)更加多元豐富,結(jié)構(gòu)清晰、易讀,容易理解;VHDL語句在調(diào)試修改和移植模塊方面也有其獨(dú)特的特點(diǎn)。
1 AD9822介紹
AD9822是一種CCD視頻信號處理的低功耗處理器,因其具有高速數(shù)據(jù)傳輸能力和準(zhǔn)確性,被廣泛用于研究、過程控制等。
AD9822包括3路采樣電路,即VING、VINR、VINB,分別是綠色、紅色、藍(lán)色通道信號輸入。每一路由相關(guān)雙采樣器CDS,一個嵌位開關(guān),可編程增益放大器PGA,數(shù)模轉(zhuǎn)換器DAC,通過多路選擇器選擇把信號送給模數(shù)轉(zhuǎn)換器ADC,通過位寬為8的總線的輸出。這樣由CCD輸入的模擬視頻信號便被合理地調(diào)整,進(jìn)而轉(zhuǎn)換成數(shù)字信號,最后交由上層處理。
AD9822是通過三線雙向串行接口來進(jìn)行控制其工作模式和狀態(tài)的,三路信號分別是SCLK、SLOAD、SDATA。外部控制器(如FPGA)給出合理的時鐘信號SCLK,在該時鐘下數(shù)據(jù)通過SDATA傳輸?shù)紸D9822的內(nèi)部寄存器中。
2應(yīng)用VHDL設(shè)計(jì)狀態(tài)機(jī)
設(shè)計(jì)狀態(tài)機(jī)的傳統(tǒng)方法需要大量且繁瑣的狀態(tài)分配、狀態(tài)表繪制和化簡。但利用VHDL硬件語言可以最大程度地跳過這些,直接用狀態(tài)圖描述,且涉及到的任意狀態(tài)都可表達(dá)為CASE WHEN中的CASE語句。
具體步驟如下:
(1)根據(jù)系統(tǒng)特定要求,確定不同狀態(tài)的數(shù)量、狀態(tài)相互轉(zhuǎn)移的條件及每個狀態(tài)輸出的信號值,進(jìn)而畫出狀態(tài)轉(zhuǎn)移圖;(2)根據(jù)狀態(tài)轉(zhuǎn)移圖來編寫相應(yīng)的VHDL程序;(3)對功能進(jìn)行仿真及驗(yàn)證。
本實(shí)驗(yàn)的主要目的就是基于己選定的芯片AD9822,設(shè)計(jì)一個產(chǎn)生序列的計(jì)數(shù)型信號驅(qū)動電路。
3毛刺產(chǎn)生原因
狀態(tài)機(jī)在硬件上通常由主控時序電路、主控組合電路及輔助電路這三個部分構(gòu)成。其中,主控組合電路的功能是由當(dāng)前的狀態(tài)值和外部控制信號來確定下一狀態(tài)的轉(zhuǎn)移方向,并且確定內(nèi)部其他電路輸出的信號內(nèi)容。一方面,由于存在組合邏輯電路,整個電路的輸出信號會出現(xiàn)毛刺現(xiàn)象,換句話說,即競爭冒險現(xiàn)象;另一方面,當(dāng)狀態(tài)信號是多位值時,在此電路中有多路信號對應(yīng)于該信號。因?yàn)閭鬏斞舆t,每路信號的值發(fā)生的改變存在先后,令狀態(tài)遷移時在初始狀態(tài)和目的狀態(tài)之間會出現(xiàn)臨時狀態(tài)“毛刺”。
如,根據(jù)AD9822的Datasheet,時鐘信號SCLK含CDSCLK1、CDSCLK2和ADCCLK三個外部控制端口,用十二個狀態(tài)描述其變化。首次采用狀態(tài)機(jī)編寫程序的主要代碼如下:
將每個狀態(tài)的維持時間設(shè)為10ns,其仿真結(jié)果為(圖1):
如圖1所示,其中在整個周期中的第一個時鐘和第二個時鐘之間會產(chǎn)生毛刺。
4毛刺的消除方案
“毛刺”只會發(fā)生在時鐘兩個有效邊沿之間,因此一般情況下,“毛刺”在同步電路中不會產(chǎn)生嚴(yán)重影響。但當(dāng)輸出信號是其他功能電路的控制信號時,便會讓受控電路發(fā)生錯誤動作,產(chǎn)生故障,繼而導(dǎo)致整個系統(tǒng)的混亂,比如作為異步控制、三態(tài)使能控制或時鐘信號使用時。所以,當(dāng)作為控制信號時,必須修改程序消除毛刺。消除“毛刺”通常有以下三種方法:
(1)對狀態(tài)的編碼進(jìn)行調(diào)整,以使相鄰的狀態(tài)轉(zhuǎn)移只有一個信號碼變化,從而去除了競爭冒險的可能。一般采用格雷碼來編碼。
(2)采用時鐘同步,即向組合邏輯電路引入時鐘信號。狀態(tài)機(jī)每次輸出都會在時鐘信號的同步下經(jīng)過一個附加的寄存器,故可保證輸出無毛刺。但這種方法存在一定的缺點(diǎn):由于增加了寄存器,直接增大了硬件開銷,這對本身寄存器資源比較少的芯片是有很大弊端的;從狀態(tài)位到達(dá)輸出必須經(jīng)過兩級組合邏輯電路,這對系統(tǒng)時鐘的最大工作頻率有一定限制:輸出信號需要在時鐘節(jié)拍下加載到附加寄存器上,所以實(shí)際得到的輸出信號會比狀態(tài)轉(zhuǎn)移延遲一個時鐘周期。
(3)直接把狀態(tài)碼作為輸出信號。狀態(tài)和輸出信號同步,可以優(yōu)化譯碼電路,因此不會出現(xiàn)競爭冒險。該方法占用芯片資源少,同步變化速度很快,所以為較好的方法。但在編碼過程中,可能會增加狀態(tài)位,出現(xiàn)多余狀態(tài)。雖然在控制狀態(tài)轉(zhuǎn)移的時候可以使用WHEN OTHERS來處理,但是有的時候并不能有效地控制多余狀態(tài),故適用于輸出信號數(shù)量比較小的情況。
因?yàn)楸緦?shí)驗(yàn)涉及的狀態(tài)機(jī)編碼較為簡單,輸出狀態(tài)較少,故采用第一種和第二種方法來解決毛刺現(xiàn)象。
4.1調(diào)整編碼消除毛刺
因本狀態(tài)機(jī)不是順序遷移,并不采用格雷碼編碼方式,但進(jìn)一步考慮到毛刺只出現(xiàn)在第一個狀態(tài)和第二個狀態(tài)之間,且若未指明輸出信號改變,其輸出不會改變,故將多余的信號輸出語句刪除,其主要程序如下:
毛刺成功消除,故在時序較簡單時,若出現(xiàn)毛刺,應(yīng)首先考慮該種方式。
4.2狀態(tài)碼直接輸出消除毛刺
該方法將先將狀態(tài)碼以常數(shù)表示,輸出時將狀態(tài)碼的某位對應(yīng)輸出,故其狀態(tài)碼的設(shè)置是最首要的問題,需要設(shè)置識別碼將相同的輸出碼分別開來,具體實(shí)現(xiàn)如下:
寫出輸出的應(yīng)正確輸出的輸出碼,從左至右分別對應(yīng)ADCCLK、CDSCLK2、CDSCLK1,將其相同的輸出碼歸類為一組,按組別的最大大小確定識別碼的位數(shù)(本例最大為5個,故為3位),每組的識別碼從0開始遞增直至編碼完畢,如表1所示:
按表1調(diào)整后主要程序如下:
仿真之后成功消除毛刺,在輸出信號不多的情況下,若嘗試過調(diào)整編碼的方法仍不能成功的話,這種方法也是一種簡單易行的方法。但是輸出信號個數(shù)過多的話,狀態(tài)碼位數(shù)過多,會產(chǎn)生很多多余狀態(tài),導(dǎo)致輸出不可控。
其仿真圖如圖2:
5結(jié)束語
在數(shù)字控制系統(tǒng)設(shè)計(jì)中狀態(tài)機(jī)靈活易用,但是由于VHDL編碼的狀態(tài)機(jī)輸出信號有可能產(chǎn)生競爭冒險,所以為了避免系統(tǒng)工作狀態(tài)混亂,必須對癥下藥來消除毛刺。若使用有限狀態(tài)機(jī)編碼遇到毛刺問題,首先采用調(diào)整編碼的辦法,若無法解決再采用狀態(tài)碼直接輸出的辦法,最后采用時鐘同步的方法。本文作為實(shí)例,為之后狀態(tài)機(jī)毛刺的解決提供了良好的參考。