狀態(tài)機“毛刺”的產(chǎn)生及消除方法程序
if lock1=‘1’ and lock1’event then本文引用地址:http://dyxdggzs.com/article/148814.htm
regl=d;
end if;
end process;
q=regl;
……
其時(shí)序仿真波形如圖1所示。

Moore型狀態(tài)機組成框圖如圖2所示。

因為Moore型狀態(tài)機的輸出信號來(lái)自組合邏輯——輸出譯碼器,輸出信號中帶有“毛刺”,且引起了輸出信號Q的誤動(dòng)作,結果從其仿真時(shí)序圖中可以發(fā)現。
在同步電路中,一般情況下“毛刺”不會(huì )產(chǎn)生重大影響。因為“毛刺”僅發(fā)生在時(shí)鐘有效邊沿之后的一小段時(shí)間內,只要在下一個(gè)時(shí)鐘有效邊沿到來(lái)之前“毛刺”消失即可。但當狀態(tài)機的輸出信號作為其他功能模塊的控制信號,例如作為異步控制、三態(tài)使能控制或時(shí)鐘信號使用時(shí),將會(huì )使受控模塊發(fā)生誤動(dòng)作,造成系統工作混亂。因此,在這種情況下必須通過(guò)改變設計消除毛刺。
消除狀態(tài)機輸出信號的“毛刺”一般可采用三種方案:
(1)調整狀態(tài)編碼,使相鄰狀態(tài)間只有1位信號改變,從而消除競爭冒險的發(fā)生條件,避免了毛刺的產(chǎn)生。常采用的編碼方式為格雷碼。它適用于順序遷移的狀態(tài)機。
(2)在有限狀態(tài)機的基礎上采用時(shí)鐘同步信號,即把時(shí)鐘信號引入組合進(jìn)程。狀態(tài)機每一個(gè)輸出信號都經(jīng)過(guò)附加的輸出寄存器,并由時(shí)鐘信號同步,因而保證了輸出信號沒(méi)有毛刺,如圖3所示。這種方法存在一些弊端:由于增加了輸出寄存器,硬件開(kāi)銷(xiāo)增大,這對于一些寄存器資源較少的目標芯片是不利的;從狀態(tài)機的狀態(tài)位到達輸出需要經(jīng)過(guò)兩級組合邏輯,這就限制了系統時(shí)鐘的最高工作頻率;由于時(shí)鐘信號將輸出加載到附加的寄存器上,所以在輸出端得到信號值的時(shí)間要比狀態(tài)的變化延時(shí)一個(gè)時(shí)鐘周期。

(3)直接把狀態(tài)機的狀態(tài)碼作為輸出信號,即采用狀態(tài)碼直接輸出型狀態(tài)機,使狀態(tài)和輸出信號一致,使得輸出譯碼電路被優(yōu)化掉了,因此不會(huì )出現競爭冒險。這種方案,占用芯片資源少,信號與狀態(tài)變化同步,因此速度快,是一種較優(yōu)方案。但在設計過(guò)程中對狀態(tài)編碼時(shí)可能增加狀態(tài)向量,出現多余狀態(tài)。雖然可用CASE語(yǔ)句中WHENOTHERS來(lái)安排多余狀態(tài),但有時(shí)難以有效控制多余狀態(tài),運行時(shí)可能會(huì )出現難以預料的情況。因此它適用于狀態(tài)機輸出信號較少的場(chǎng)合。
若對ADC0809的采樣控制采用狀態(tài)碼直接輸出型狀態(tài)機方案,其主要程序如下:
begin
lock=lock1;
process(current_state,eoc)
begin
case current_state IS
when st0 => next_state =st1;
when st1 => next_state =st2;
when st2 => next_state =st3;
when st3 => if (eoc =‘1’)then next_state =st3; else next_state =st4;end if;
評論