1. 程式人生 > >使用ModelSim自動生成狀態機FSM的狀態轉換圖

使用ModelSim自動生成狀態機FSM的狀態轉換圖

HDL程式碼設計中重要的內容之一就是設計程式的狀態機FSM,狀態轉換控制著整個程式的流程,為了理解程式,我們經常需要把狀態機的狀態轉換圖畫出來,這樣看起來很直觀,但是,有沒有辦法自動生成狀態轉換圖呢?

在ISE或者ModelSim中有沒有這樣的工具呢?

答案是肯定的,ModelSim中即有這樣的工具,下面以ISE13.4和ModelSim6.5為例,使用一段最簡單的狀態機程式碼說明如何操作來自動生成狀態轉換圖。

程式碼如下:

module Top_fsm(
    input clk,
    input rst,
    output reg fsm_out
    );

parameter IDLE = 3'd0, S1 = 3'd1, S2 = 3'd2, S3 = 3'd3, S4 = 3'd4, S5 = 3'd5;
reg		[2:0]	status;
always @ (posedge clk)
	if(!rst)begin
		status <= IDLE;
	end
	else begin
		case(status)
			IDLE:begin
				fsm_out <= 1'b0;
				status <= S1;
			end
			S1:begin
				fsm_out <= 1'b1;
				status <= S2;
			end
			S2:begin
				fsm_out <= 1'b0;
				status <= S3;
			end
			S3:begin
				fsm_out <= 1'b1;
				status <= S4;
			end
			S4:begin
				fsm_out <= 1'b0;
				status <= S5;
			end
			S5:begin
				fsm_out <= 1'b1;
				status <= IDLE;
			end
			default:begin
				fsm_out <= 1'b0;
			end
		endcase
	end
endmodule

我們在ISE中直接切換到ModelSim模擬模式,如圖所示:


雙擊Simulate Behavioral Model,將開啟ModelSim。

在ModelSim中執行View---FSM list命令,如下圖所示:

然後就會發現ModelSim左邊這部分的標籤多了一項,如下面兩幅圖的對比:

未執行命令前是這樣子的:

執行完命令是這樣子的:

這時候在FSM List標籤下,可以看到如下內容,雙擊之:

於是出現了下面的狀態轉換圖:

這時觀察生成的狀態轉換圖發現,所有的狀態都在復位的情況下返回了狀態IDLE,這是我們不期望的,仔細觀察這時的選單欄可以發現,有一個FSM View項:

將Show Transitions to "Reset"項前面的對勾去掉,就會發現不顯示覆位情況下返回狀態IDLE了,如下圖所示:

細心的人會發現狀態到了S5並未返回IDLE,但在前面的狀態轉換圖中的確有Cond2:1這種狀態轉到狀態IDLE,這估計是軟體所導致的吧。

簡單的應用就這些,深一些的功能自己好好探索吧。

最後說一下這種自動生成的狀態轉換圖的缺點:因為它預設生成的狀態轉換圖一定是一個圓,所以當你的狀態比較複雜時,並非是一個簡單的切換時,生成的狀態轉換圖也就會很亂很亂,可讀性直接下降,不知道是可以可調節或者有什麼更好的生成工具?