狀態機是許多數字系統的核心部件,是一類重要的時序邏輯電路。通常包括三個部分:一是下乙個狀態的邏輯電路,二是儲存狀態機當前狀態的時序邏輯電路,三是輸出組合邏輯電路。通常,狀態機的狀態數量有限,成為有限狀態機(fsm)。由於狀態機的所有觸發器的時鐘由同一脈衝邊沿觸發,故也稱之位有限狀態機。
根據狀態機的輸出訊號是否與電路的輸入有關分為mealy型狀態機和moore型狀態機。電路的輸出訊號不僅與電路的當前狀態有關,還與電路的輸入有關,稱為mealy型狀態機。相反,電路的輸出僅僅與各觸發器的狀態有關,不受電路輸入訊號的影響,稱為moore型狀態機。其標準模型如下所示:
狀態機的狀態轉移圖,通常可以根據輸入和內部條件畫出。一般來說,狀態機的設計包括以下設計步驟:
狀態機的描述通常由三種描述方法,稱為一段式狀態,二段式狀態機和三段式狀態機。狀態機的描述通常包括以下四個部分:
下面根據狀態機的三種方法,來比較各種方法的優劣。
`timescale 1ns / 1ps
module detect_1(
input clk_i,
input rst_n_i,
output out_o
);reg out_r;
//狀態宣告和狀態編碼
reg [1:0] state;
parameter [1:0] s0 = 2'b00;
parameter [1:0] s1 = 2'b01;
parameter [1:0] s2 = 2'b10;
parameter [1:0] s3 = 2'b11;
//一段式狀態機
always @(posedge clk_i)
begin
if(!rst_n_i) begin
state <= s0;
out_r <= 1'b0;
end
else
case(state)
s0:begin
out_r <= 1'b0;
state <= s1;
ends1:
begin
out_r <= 1'b1;
state <= s2;
end
s2:begin
out_r <= 1'b0;
state <= s3;
end
s3:begin
out_r <=1'b1;
state <= s0;
endendcase
endassign out_o = out_r;
endmodule
`timescale 1ns / 1ps
//兩段式狀態機
module detect_2(
input clk_i,
input rst_n_i,
output out_o
);reg out_r;
//狀態宣告和狀態編碼
reg [1:0] current_state;
reg [1:0] next_state;
parameter [1:0] s0 = 2'b00;
parameter [1:0] s1 = 2'b01;
parameter [1:0] s2 = 2'b10;
parameter [1:0] s3 = 2'b11;
//時序邏輯:描述狀態轉換
always @(posedge clk_i)
begin
if(!rst_n_i)
current_state <= 0;
else
current_state <= next_state;
endalways @(*)
begin
out_r =1'b0;
case(current_state)
s0:begin
out_r = 1'b0;
next_state = s1;
ends1:
begin
out_r = 1'b1;
next_state = s2;
ends2:
begin
out_r =1'b0;
next_state = s3;
ends3:
begin
out_r = 1'b0;
next_state = next_state;
enddefault:
begin
out_r =1'b0;
next_state = s0;
endendcase
endendmodule
`timescale 1ns / 1ps
module detect_3(
input clk_i,
input rst_n_i,
output out_o
);reg out_r;
//狀態宣告和狀態編碼
reg [1:0] current_state;
reg [1:0] next_state;
parameter [1:0] s0 = 2'b00;
parameter [1:0] s1 = 2'b01;
parameter [1:0] s2 = 2'b10;
parameter [1:0] s3 = 2'b11;
//時序邏輯:描述狀態轉換
always @(posedge clk_i)
begin
if(!rst_n_i)
current_state <= 0 ;
else
current_state <= next_state;
endalways @(*)
begin
case(current_state)
s0:begin
next_state <= s1;
ends1:
begin
next_state <= s2;
ends2:
begin
next_state <= s3;
ends3:
begin
next_state <= next_state;
enddefault:
next_state = s0;
endcase
end//輸出邏輯
always @(posedge clk_i)
begin
if(!rst_n_i)
out_r <= 1'b0;
else
begin
case(current_state)
s0,s2:
out_r <= 1'b0;
s1,s3:
out_r <= 1'b1;
default:
out_r <= out_r;
endcase
endend
endmodule
FPGA實戰 verilog設計規範及要點
以下為建議規範,可以增強 的閱讀性和可觀性,並不是強制的規範 1.只有三種邏輯電路 組合邏輯,同步復位的時序邏輯電路,非同步復位的時序邏輯電路 2.乙個always只產生乙個訊號 方便除錯,但是可以有多個輸入 3.乙個訊號只能在乙個always產生 4.always是描述乙個訊號產生的方法,即在什麼...
FPGA按鍵防抖動程式 Verilog
module fangdoudong clk,reset,key in 1,key in 2,key in 3,led 1,led 2,led 3 input clk 50mhz input reset 高電平有效 input key in 1,key in 2,key in 3 開關key in ...
FPGA中用verilog分頻實現方法
分頻器是fpga設計中使用頻率非常高的基本設計之一,儘管在目前大部分設計中,廣泛使用晶元廠家整合的鎖相環資源,如altera 的pll,xilinx的dll.來進行時鐘的分頻,倍頻以及相移。但是對於時鐘要求不高的基本設計,通過語言進行時鐘的分頻相移仍然非常流行,首先這種方法可以節省晶元內部的鎖相環資...