FPGA之三段式狀態機

三段式狀態機

有限狀態機(FiniteStateMachine, FSM),是由寄存器組合組合邏輯構成的硬件時序電路。FSM的狀態只可能在同一時鐘跳變沿的情況下才能從一個狀態轉向另一個狀態。
根據狀態機的輸出是否與輸入有關,可分爲Moore型狀態機和Mealy型狀態機。Moore型狀態機輸出僅僅與現態有關,而Mealy型狀態機不僅與現態有關,也與輸入有關,所以會受到輸入的干擾,可能會產生毛刺(Glith)的現象,所以我們通常使用的是Moore型狀態機。
Moore狀態機Mealy狀態機
狀態機的編碼,二進制編碼(Binary),格雷碼編碼(Gray-code),獨熱碼(One-hot)。不同的編碼方式是防止在狀態轉移中發生突變,使得狀態轉移更爲穩定,系統更加可靠,對於用FPGA實現的FSM建議採用獨熱碼。因爲採用獨熱碼可省下許多組合電路的使用,提高電路的速度和可靠性,且總的單元數並無顯著增加。

寫法

三段式狀態機的基本格式是:

  1. 第一個always語句實現同步狀態跳轉;
  2. 第二個always語句採用組合邏輯判斷狀態轉移條件;
  3. 第三個always語句描述狀態輸出(可以用組合電路輸出,也可以時序電路輸出)。

下面以一個7分頻爲例(對於分頻等較簡單的功能,可以不使用狀態機,這裏只是演示狀態機編寫的方法)

1、通過parameter來定義各個不同狀態的參數,這裏是使用獨熱碼的方式來定義狀態機,每個狀態只有一位爲1,當然也可以直接定義成十進制的0, 1, 2……7。因爲我們定義成獨熱碼的方式,每一個狀態的位寬爲7位,接下來還需要定義兩個7位的寄存器,一個用來表示當前狀態,另一個用來表示下一個狀態,如下所示:

//獨熱碼定義方式
parameter S0 = 7'b0000001;
parameter S1 = 7'b0000010;
parameter S2 = 7'b0000100;
parameter S3 = 7'b0001000;
parameter S4 = 7'b0010000;
parameter S5 = 7'b0100000;
parameter S6 = 7'b1000000;

//reg define
reg [6:0] curr_st ; //當前狀態
reg [6:0] next_st ; //下一狀態

2、使用三個always語句來開始編寫狀態機的代碼,第一個always採用同步時序描述狀態轉移, 第二個always採用組合邏輯判斷狀態轉移條件, 第三個always是描述狀態輸出。

//第一段採用同步時序描述狀態轉移
always @(posedge sys_clk or negedge sys_rst_n) begin
	if (!sys_rst_n)
		curr_st <= S0;
	else
		curr_st <= next_st;
end

//第二段採用組合邏輯判斷狀態轉移條件
always @(*) begin
	case (curr_st)
		S0: next_st = S1;
		S1: next_st = S2;
		S2: next_st = S3;
		S3: next_st = S4;
		S4: next_st = S5;
		S5: next_st = S6;
		S6: next_st = S0;
		default: next_st = S0;
	endcase
end

//第三段描述狀態輸出(這裏採用時序電路輸出)
always @(posedge sys_clk or negedge sys_rst_n) begin
	if (!sys_rst_n)
		clk_divide_7 <= 1'b0;
	else if ((curr_st == S0) | (curr_st == S1) | (curr_st == S2) | (curr_st == S3))
		clk_divide_7 <= 1'b0;
	else if ((curr_st == S4) | (curr_st == S5) | (curr_st == S6))
		clk_divide_7 <= 1'b1;
	else
		;
end

  1. 第二個always採用組合邏輯判斷狀態轉移條件,這裏每一個狀態只保持一個時鐘週期,也就是直接跳轉到下一個狀態,在實際應用中,一般根據輸入的條件來判斷是否跳轉到其它狀態或者停留在當前轉態。
  2. 狀態機的第三段可以使用組合邏輯電路輸出,也可以使用時序邏輯電路輸出,一般推薦使用時序電路輸出,因爲狀態機的設計和其它設計一樣,最好使用同步時序方式設計,以提高設計的穩定性,消除毛刺。

*整理用於學習,侵即刪。本文參考自開拓者 FPGA 開發指南 *

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章