您的位置:網站首頁 > 電器維修資料網 > 正文 >
Verilog HDL設計之有限狀態機的設計原理及其代碼風格
來源: 日期:2013-11-3 17:30:05 人氣:標簽:
由于寄存器傳輸級(rtl)描述是以時序邏輯抽象所得到的有限狀態機為依據的,所以把一個時序邏輯抽象成一個同步有限狀態機是設計可綜合風格的verilog hdl模塊的關鍵。
在本章中我們將通過各種實例由淺入深地來介紹各種可綜合風格的verilog hdl模塊,并把重點放在時序邏輯的可綜合有限狀態機的verilog hdl設計要點。至于組合邏輯,因為比較簡單,只需閱讀典型的用verilog hdl描述的可綜合的組合邏輯的例子就可以掌握。
為了更好地掌握可綜合風格,還需要較深入地了解阻塞和非阻塞賦值的差別和在不同的情況下正確使用這兩種賦值的方法。只有深入地理解阻塞和非阻塞賦值語句的細微不同,才有可能寫出不僅可以仿真也可以綜合的verilog hdl模塊。
只要按照一定的原則來編寫代碼就可以保證verilog模塊綜合前和綜合后仿真的一致性。符合這樣條件的可綜合模塊是我們設計的目標,因為這種代碼是可移植的,可綜合到不同的fpga和不同工藝的asic中,是具有知識產權價值的軟核。
4.4.1 有限狀態機(fsm)設計原理
有限狀態機是由寄存器組和組合邏輯構成的硬件時序電路。有限狀態機的狀態(即由寄存器組的1和0的組合狀態所構成的有限個狀態)只可能在同一時鐘跳變沿的情況下才能從一個狀態轉向另一個狀態。
有限狀態機的下一個狀態不但取決于各個輸入值,還取決于當前所在狀態。這里指的是米里mealy型有限狀態機,而莫爾moore型有限狀態機的下一個狀態只決于當前狀態。
verilog hdl中可以用許多種方法來描述有限狀態機, 常用的方法是用always語句和case語句。如圖4.1所示的狀態轉移圖表示了一個有限狀態機,例4.1的程序就是該有限狀態機的多種verilog hdl模型之一。
圖4.1的狀態轉移圖表示了一個四狀態的有限狀態機。它的同步時鐘是clock,輸入信號是a和reset,輸出信號是f和g。
狀態的轉移只能在同步時鐘(clock)的上升沿時發生,往哪個狀態的轉移則取決于目前所在的狀態和輸入的信號(reset和a)。下面的例子是該有限狀態機的verilog hdl模型之一。
例4.1:gray碼有限狀態機模型1。
module fsm (clock, reset, a, f, g); //模塊聲明
input clock, reset, a;
output f,g;
reg f,g;
reg [1:0] state ;
parameter //狀態聲明
idle = 2’b00, start = 2’b01,
stop = 2’b10, clear = 2’b11;
always @(posedge clock)
if (!reset) begin
state <= idle; f<=0; g<=0; //默認狀態
end
else case (state)
idle: begin //idle狀態
if (a) begin
state <= start;
g<=0;
end
elsestate <= idle;
end
start: //start狀態
if (!a) state <= stop;
else state <= start;
stop: begin //stop狀態
if (a) begin
state <= clear;
f <= 1;
end
else state <= stop;
end
clear: begin //clear狀態
if (!a) begin
state <=idle;
f <=0; g <=1;
end
else state <= clear;
end
endcase
endmodule
也可以用下面的verilog hdl模型來表示同一個有限狀態。
例4.2:獨熱碼有限狀態和模型。
module fsm (clock, reset, a, f, g); //模塊聲明
input clock, reset, a;
output f,g;
reg f,g;
reg [3:0] state ;
parameter //狀態聲明
idle = 4’b1000,
start = 4’b0100,
stop = 4’b0010,
clear = 4’b0001;
always @(posedge clock)
if (!reset) begin
state <= idle; f<=0; g<=0; //默認狀態
end
else case (state)
idle: begin //idel狀態
if (a) begin
state <= start;
g<=0;
end
else state <= idle;
end
start: //start狀態
if (!a) state <= stop;
else state <= start;
stop: begin //stop狀態
if (a) begin
state <= clear;
f <= 1;
end
else state <= stop;
end
clear: begin //clear狀態
if (!a) begin
state <=idle;
f<=0; g<=1;
end
else state <= clear;
end
default: state <=idle; //默認狀態
endcase
endmodule
例4.2與例4.1的主要不同點是狀態編碼方式。例4.2采用了獨熱編碼,而例4.1則采用gray碼,究竟采用哪一種編碼好要看具體情況而定。
- 1
- 2
- 3
- 下一頁
【看看這篇文章在百度的收錄情況】