1 有限狀態(tài)機(jī)
有限狀態(tài)機(jī)(Finite State Machine,FSM)在數(shù)字系統(tǒng)設(shè)計(jì)中應(yīng)用十分廣泛。根據(jù)狀態(tài)機(jī)的輸出是否與輸入有關(guān),可將狀態(tài)機(jī)分為兩大類:摩爾(Moore)型狀態(tài)機(jī)和米莉 (Mealy)型狀態(tài)機(jī)。Moore型狀態(tài)機(jī)的輸出僅與現(xiàn)態(tài)有關(guān);Mealy型狀態(tài)機(jī)的輸出不僅與現(xiàn)態(tài)有關(guān),而且和輸入也有關(guān)。
有限狀態(tài)機(jī)一般包括三個(gè)部分,其中組合邏輯部分包括狀態(tài)譯碼器和輸出譯碼器,狀態(tài)譯碼器確定狀態(tài)機(jī)的下一個(gè)狀態(tài),輸出譯碼器確定狀態(tài)機(jī)的輸出,狀態(tài)寄存器屬于時(shí)序邏輯部分,用來存儲(chǔ)狀態(tài)機(jī)的內(nèi)部狀態(tài)。
2 好的狀態(tài)機(jī)標(biāo)準(zhǔn)
好的狀態(tài)機(jī)的標(biāo)準(zhǔn)很多,最重要的幾個(gè)方面如下:
第一,狀態(tài)機(jī)要安全,是指FSM不會(huì)進(jìn)入死循環(huán),特別是不會(huì)進(jìn)入非預(yù)知的狀態(tài),而且由于某些擾動(dòng)進(jìn)入非設(shè)計(jì)狀態(tài),也能很快的恢復(fù)到正常的狀態(tài)循環(huán)中來。這里面有兩層含義。其一要求該FSM的綜合實(shí)現(xiàn)結(jié)果無毛刺等異常擾動(dòng),其二要求FSM要完備,即使受到異常擾動(dòng)進(jìn)入非設(shè)計(jì)狀態(tài),也能很快恢復(fù)到正常狀態(tài)。
第二,狀態(tài)機(jī)的設(shè)計(jì)要滿足設(shè)計(jì)的面積和速度的要求。
第三,狀態(tài)機(jī)的設(shè)計(jì)要清晰易懂、易維護(hù)。
在芯片設(shè)計(jì)中,對(duì)綜合結(jié)果評(píng)判的兩個(gè)基本標(biāo)準(zhǔn)為:面積和速度。“面積”是指設(shè)計(jì)所占用的邏輯資源數(shù)量;“速度”指設(shè)計(jì)在芯片上穩(wěn)定運(yùn)行所能夠達(dá)到的最高頻率。兩者是對(duì)立統(tǒng)一的矛盾體,要求一個(gè)設(shè)計(jì)同時(shí)具備設(shè)計(jì)面積最小,運(yùn)行頻率最高,這是不現(xiàn)實(shí)的?茖W(xué)的設(shè)計(jì)目標(biāo)應(yīng)該是:在滿足設(shè)計(jì)時(shí)序要求(包含對(duì)設(shè)計(jì)最高頻率的要求)的前提下,占用最小的芯片面積,或者在所規(guī)定的面積下,使設(shè)計(jì)的時(shí)序余量更大,頻率更高。另外,如果要求FSM安全,則很多時(shí)候需要使用full case的編碼方式,即將狀態(tài)轉(zhuǎn)移變量的所有向量組合情況都在FSM 中有相應(yīng)的處理,這經(jīng)常勢必意味著要多花更多的設(shè)計(jì)資源,有時(shí)也會(huì)影響FSM的頻率所以,上述的標(biāo)準(zhǔn)要綜合考慮,根據(jù)設(shè)計(jì)的要求進(jìn)行權(quán)衡。
3 狀態(tài)機(jī)描述方法
狀態(tài)機(jī)描述時(shí)關(guān)鍵是要描述清楚幾個(gè)狀態(tài)機(jī)的要素,即如何進(jìn)行狀態(tài)轉(zhuǎn)移,每個(gè)狀態(tài)的輸出是什么,狀態(tài)轉(zhuǎn)移的條件等。具體描述時(shí)方法各種各樣,最常見的有三種描述方式:
(1)一段式:整個(gè)狀態(tài)機(jī)寫到一個(gè)always模塊里面,在該模塊中既描述狀態(tài)轉(zhuǎn)移,又描述狀態(tài)的輸入和輸出;
(2)二段式:用兩個(gè)always模塊來描述狀態(tài)機(jī),其中一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移;另一個(gè)模塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律以及輸出;
(3)三段式:在兩個(gè)always模塊描述方法基礎(chǔ)上,使用三個(gè)always模塊,一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移,一個(gè)always采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律,另一個(gè)always模塊描述狀態(tài)輸出(可以用組合電路輸出,也可以時(shí)序電路輸出)。
一般推薦的FSM 描述方法是后兩種。因?yàn)镕SM和其他設(shè)計(jì)一樣,最好使用同步時(shí)序方式設(shè)計(jì),以提高設(shè)計(jì)的穩(wěn)定性,消除毛刺。狀態(tài)機(jī)實(shí)現(xiàn)后,一般來說,狀態(tài)轉(zhuǎn)移部分是同步時(shí)序電路而狀態(tài)的轉(zhuǎn)移條件的判斷是組合邏輯。
第二種描述方法同第一種描述方法相比,將同步時(shí)序和組合邏輯分別放到不同的always模塊中實(shí)現(xiàn),這樣做的好處不僅僅是便于閱讀、理解、維護(hù),更重要的是利于綜合器優(yōu)化代碼,利于用戶添加合適的時(shí)序約束條件,利于布局布線器實(shí)現(xiàn)設(shè)計(jì)。在第二種方式的描述中,描述當(dāng)前狀態(tài)的輸出用組合邏輯實(shí)現(xiàn),組合邏輯很容易產(chǎn)生毛刺,而且不利于約束,不利于綜合器和布局布線器實(shí)現(xiàn)高性能的設(shè)計(jì)。
第三種描述方式與第二種相比,關(guān)鍵在于根據(jù)狀態(tài)轉(zhuǎn)移規(guī)律,在上一狀態(tài)根據(jù)輸入條件判斷出當(dāng)前狀態(tài)的輸出,從而在不插入額外時(shí)鐘節(jié)拍的前提下,實(shí)現(xiàn)了寄存器輸出。
4 狀態(tài)機(jī)的編碼
二進(jìn)制編碼(Binary)、格雷碼(Gray-code)編碼使用最少的觸發(fā)器,較多的組合邏輯,而獨(dú)熱碼(One-hot)編碼反之。獨(dú)熱碼編碼的最大優(yōu)勢在于狀態(tài)比較時(shí)僅僅需要比較一個(gè)位,從而一定程度上簡化了比較邏輯,減少了毛刺產(chǎn)生的概率。由于CPLD更多地提供組合邏輯資源,而FPGA更多地提供觸發(fā)器資源,所以CPLD多使用二進(jìn)制編碼或格雷碼,而FPGA多使用獨(dú)熱碼編碼。另一方面,對(duì)于小型設(shè)計(jì)使用二進(jìn)制和格雷碼編碼更有效,而大型狀態(tài)機(jī)使用獨(dú)熱碼更高效。
5 避免從case語句中綜合出鎖存器
不完整的case語句會(huì)生成鎖存器。
解決方法:
(1)在case語句中對(duì)變量賦初值。
always @ (state or A or B)
begin
q=0;
case(state)
s0: q=A & B;
s1: q=A| B;
endcase
end
(2)在case語句中增加default語句。
always @ (state or A or B)
begin
case(state)
s0: q=A & B;
s1: q=A| B;
default: q=0;
endcase
end
(3)在case語句中使用full_case綜合指令。
always @ (state or A or B)
begin
case(state) /* synthesis full_case*/
s0: q=A & B;
s1: q=A| B;
endcase
end
附加說明:當(dāng)case語句中的所有選擇項(xiàng)是互斥的,為了簡化電路,不出現(xiàn)優(yōu)先級(jí)解碼邏輯,可以使用 “synthesis parallel_case”綜合指令,減少不必要的邏輯資源。
6 狀態(tài)機(jī)例子
設(shè)計(jì)一個(gè)自動(dòng)飲料售賣機(jī),飲料10分錢,硬幣有5分和10分兩種,并考慮找零。
(1)點(diǎn)路變量分析:投入5分硬幣為一個(gè)變量,定義為A,為輸入;投入10分硬幣為一個(gè)變量,定義為B,為輸入;售貨機(jī)給出飲料為一變量,定義為Y,為輸出;售貨機(jī)找零為一變量,定義為Z,為輸出。
(2)狀態(tài)確定:電路共有兩個(gè)狀態(tài):狀態(tài)S0,表示未投入任何硬幣;狀態(tài)S1,表示投入了5分硬幣。
(3)設(shè)計(jì)過程:設(shè)當(dāng)前為S0狀態(tài),當(dāng)接收到5分硬幣時(shí),轉(zhuǎn)換到S1狀態(tài),等待繼續(xù)投入硬幣;當(dāng)接收到10分硬幣時(shí),保持S0狀態(tài),彈出飲料,不找零。當(dāng)前狀態(tài)為S1時(shí),表示已經(jīng)有5分硬幣,若再接收5分硬幣,轉(zhuǎn)換到S0狀態(tài),彈出飲料,不找零;若接收到10分硬幣,轉(zhuǎn)換到S0狀態(tài),彈出飲料,找零。

module machine(clk,rst,A,B,Y,Z);
input clk,rst,A,B;
output Y,Z;
parameter S0=2’b01;
parameter S1=2’b10;
reg Y,Z;
reg [1:0] ns,cs;
always @ (posedge clk or negedge rst)
begin
if(!rst)
cs<=2'd0;
else
cs<=ns;
end
always @ (cs,A,B,rst)
begin
if(!rst)
begin
ns=2'd0;Y=1'd0;Z=1'd0;
end
else
begin
case(cs)
S0:
begin
if(A) //5
begin
ns=S1; Y=1'd0;Z=1'd0;
end
else if(B) //10
begin
ns=S0;Y=1'd1;Z=1'd0;
end
else
begin
ns=S0;Y=1'd0;Z=1'd0;
end
end
S1:
begin
if(A) //5
begin
ns=S0; Y=1'd1;Z=1'd0;
end
else if(B) //10
begin
ns=S0; Y=1'd1;Z=1'd1;
end
else
begin
ns=S1; Y=1'd0;Z=1'd0;
end
end
endcase
end
end
endmodule
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |