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