新聞中心

EEPW首頁(yè) > EDA/PCB > 設(shè)計(jì)應(yīng)用 > Verilog HDL設(shè)計(jì)進(jìn)階:有限狀態(tài)機(jī)的設(shè)計(jì)原理及其代

Verilog HDL設(shè)計(jì)進(jìn)階:有限狀態(tài)機(jī)的設(shè)計(jì)原理及其代

作者: 時(shí)間:2013-08-27 來(lái)源:網(wǎng)絡(luò) 收藏

對(duì)于用FPGA實(shí)現(xiàn)的有限狀態(tài)機(jī)建議采用獨(dú)熱碼。因?yàn)殡m然采用獨(dú)熱編碼多用了兩個(gè)觸發(fā)器,但所用組合電路可省下許多,因而使電路的速度和可靠性有顯著提高,而總的單元數(shù)并無(wú)顯著增加。

本文引用地址:http://m.butianyuan.cn/article/189516.htm


采用了獨(dú)熱碼后有了多余的狀態(tài),就有一些不可到達(dá)的狀態(tài),為此在CASE語(yǔ)句的最后需要增加default分支項(xiàng),以確保多余狀態(tài)能回到Idle狀態(tài)。


另外還可以用另一種風(fēng)格的 模型來(lái)表示同一個(gè)有限狀態(tài)。在這個(gè)模型中,我們用always語(yǔ)句和連續(xù)賦值語(yǔ)句把狀態(tài)機(jī)的觸發(fā)器部分和組合邏輯部分分成兩部分來(lái)描述,如下所示。


例4.3:有限狀態(tài)機(jī)模型3

module fsm (Clock, Reset, A, F, G); //模塊聲明
input Clock, Reset, A;
output F,G;
reg [1:0] state ;
wire [1:0] Nextstate;

parameter //狀態(tài)聲明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;

always @(posedge Clock)
if (!Reset) begin
state = Idle; //復(fù)位狀態(tài)
end
else
state = Nextstate; //狀態(tài)轉(zhuǎn)換

assign Nextstate = //狀態(tài)變換條件
(state == Idle ) ? (A ? Start : Idle):
(state==Start ) ? (!A ? Stop : Start ):
(state== Stop ) ? (A ? Clear : Stop ):
(state== Clear) ? (!A ? Idle : Clear) : Idle;

assign F = (( state == Stop) A ); //狀態(tài)輸出
assign G = (( state == Clear) (!A || !Reset)) //狀態(tài)輸出
endmodule

下面是第4種風(fēng)格的 模型來(lái)表示同一個(gè)有限狀態(tài)。在這個(gè)模型中,我們分別用沿觸發(fā)的always語(yǔ)句和電平敏感的always語(yǔ)句把狀態(tài)機(jī)的觸發(fā)器部分和組合邏輯部分分成兩部分來(lái)描述。


例4.4:有限狀態(tài)機(jī)模型4。

module fsm (Clock, Reset, A, F, G); //模塊聲明
input Clock, Reset, A;
output F,G;
reg [1:0] state, Nextstate;

parameter //狀態(tài)聲明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;

always @(posedge Clock)
if (!Reset) begin
state = Idle; //默認(rèn)狀態(tài)
end
else
state = Nextstate; //狀態(tài)轉(zhuǎn)換

always @( state or A ) begin
F=0;
G=0;
if (state == Idle) begin //處于Idel狀態(tài)時(shí),對(duì)A判斷
if (A)
Nextstate = Start; //Start狀態(tài)
else
Nextstate = Idle; //保持Idel狀態(tài)
G=1;
end
else if (state == Start) //處于Start狀態(tài)時(shí),對(duì)!A判斷
if (!A)
Nextstate = Stop; //Stop狀態(tài)
else
Nextstate = Start; //保持Start狀態(tài)
else if (state == Stop) //處于Stop狀態(tài)時(shí),對(duì)A判斷
if (A)
Nextstate = Clear; //Clear狀態(tài)
else
Nextstate = Stop; //保持Stop狀態(tài)
else if (state == Clear) begin //處于Clear狀態(tài)時(shí),對(duì)!A判斷
if (!A)
Nextstate = Idle; //Idel狀態(tài)
else
Nextstate = Clear; //保持Clear狀態(tài)
F=1;
end
else
Nextstate= Idle; //默認(rèn)狀態(tài)
End
endmodule

上面4個(gè)例子是同一個(gè)狀態(tài)機(jī)的4種不同的 模型,它們都是可綜合的,在設(shè)計(jì)復(fù)雜程度不同的狀態(tài)機(jī)時(shí)有它們各自的優(yōu)勢(shì)。如用不同的綜合器對(duì)這4個(gè)例子進(jìn)行綜合,綜合出的邏輯電路可能會(huì)有些不同,但邏輯功能是相同的。


下面講解有限狀態(tài)機(jī)設(shè)計(jì)的一般步驟。


(1)邏輯抽象,得出狀態(tài)轉(zhuǎn)換圖。
就是把給出的一個(gè)實(shí)際邏輯關(guān)系表示為時(shí)序邏輯函數(shù),可以用狀態(tài)轉(zhuǎn)換表來(lái)描述,也可以用狀態(tài)轉(zhuǎn)換圖來(lái)描述,這就需要完成以下任務(wù)。


① 分析給定的邏輯問(wèn)題,確定輸入變量、輸出變量以及電路的狀態(tài)數(shù)。通常是取原因(或條件)作為輸入變量,取結(jié)果作為輸出變量。
② 定義輸入、輸出邏輯狀態(tài)的含意,并將電路狀態(tài)順序編號(hào)。
③ 按照要求列出電路的狀態(tài)轉(zhuǎn)換表或畫出狀態(tài)轉(zhuǎn)換圖。
這樣,就把給定的邏輯問(wèn)題抽象到一個(gè)時(shí)序邏輯函數(shù)了。


(2)狀態(tài)化簡(jiǎn)。
如果在狀態(tài)轉(zhuǎn)換圖中出現(xiàn)這樣兩個(gè)狀態(tài),它們?cè)谙嗤妮斎胂罗D(zhuǎn)換到同一狀態(tài)去,并得到一樣的輸出,則稱它們?yōu)榈葍r(jià)狀態(tài)。顯然等價(jià)狀態(tài)是重復(fù)的,可以合并為一個(gè)。電路的狀態(tài)數(shù)越少,存儲(chǔ)電路也就越簡(jiǎn)單。狀態(tài)化簡(jiǎn)的目的就在于將等價(jià)狀態(tài)盡可能地合并,以得到最簡(jiǎn)的狀態(tài)轉(zhuǎn)換圖。


(3)狀態(tài)分配。
狀態(tài)分配又稱狀態(tài)編碼。通常有很多編碼方法,編碼方案選擇得當(dāng),設(shè)計(jì)的電路可以很簡(jiǎn)單。反之,若編碼方案選得不好,則設(shè)計(jì)的電路就會(huì)復(fù)雜許多。


實(shí)際設(shè)計(jì)時(shí),需綜合考慮電路復(fù)雜度與電路性能之間的折衷。在觸發(fā)器資源豐富的FPGA或ASIC設(shè)計(jì)中,采用獨(dú)熱編碼(one-hot-coding)既可以使電路性能得到保證,又可充分利用其觸發(fā)器數(shù)量多的優(yōu)勢(shì)。


(4)選定觸發(fā)器的類型并求出狀態(tài)方程、驅(qū)動(dòng)方程和輸出方程。


(5)按照方程得出邏輯圖。

用Verilog HDL來(lái)描述有限狀態(tài)機(jī),可以充分發(fā)揮硬件描述語(yǔ)言的抽象建模能力,使用always塊語(yǔ)句和case(if)等條件語(yǔ)句及賦值語(yǔ)句即可方便實(shí)現(xiàn)。具體的邏輯化簡(jiǎn)及邏輯電路到觸發(fā)器映射均可由計(jì)算機(jī)自動(dòng)完成。上述設(shè)計(jì)步驟中的第(2)、(4)、(5)步不再需要很多的人為干預(yù),使電路設(shè)計(jì)工作得到簡(jiǎn)化,效率也有很大的提高。



關(guān)鍵詞: Verilog HDL 進(jìn)階 代碼

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉