FPGA設計 狀態機構架

2021-08-29 02:21:43 字數 3334 閱讀 7024

在複雜的流程控制中,控制狀態是亂序的,使用狀態機構架進行設計,可以很清晰的設計出複雜的狀態轉換關係,從而可以提高fpga的設計效率,減少出錯的可能。

狀態機設計規則1:四段式寫法

第一段:同步時序邏輯設計,次態到現態的遷移。

第二段:組合邏輯設計:狀態轉移轉移條件判斷。

第三段:定義轉移新增。

第四段:根據狀態設計輸出。

狀態機設計規則2:四段式狀態機的第一段寫法不變。

狀態機設計規則3:狀態機轉移條件的命名規則是xx_to_xx_start形式,表示從某個狀態轉換到另乙個狀態。

狀態機設計規則4:狀態轉移條件,用assign產生變換條件時,必須加上當前狀態。

狀態機設計規則5:狀態機不變保持時使用 state_n = state_c。

verilog實現四個狀態控制兩個led的狀態機設計如下:

第一段:

module ztj( clk , rst_n , 

led1 , led2

);input clk;

input rst_n;

output reg led1;

output reg led2;

parameter s0 = 3'd0,

s1 = 3'd1,

s2 = 3'd2,

s3 = 3'd3;

//狀態碼

reg [2:0] state_c; //現態

reg [2:0] state_n; //次態

always @( posedge clk or negedge rst_n ) begin

if( !rst_n )

state_c <= s0; //預設狀態

else

state_c <= state_n; //次態轉換到現態

end

第二段:

always @( * ) begin

case( state_c )

s0 : begin

if( s0_to_s1_start)

state_n = s1;

else

state_n = state_c;

ends1 : begin

if( s1_to_s2_start)

state_n = s2;

else

state_n = state_c;

ends2 : begin

if( s2_to_s3_start)

state_n = s3;

else

state_n = state_c;

ends3 : begin

if( s3_to_s0_start)

state_n = s0;

else

state_n = state_c;

enddefault :

state_n = s0;

endcase

end

第三段:

wire s0_to_s1_start;

wire s1_to_s2_start;

wire s2_to_s3_start;

wire s3_to_s0_start;

assign s0_to_s1_start = (state_c == s0) && end_cnt1;

assign s1_to_s2_start = (state_c == s1) && end_cnt1;

assign s2_to_s3_start = (state_c == s2) && end_cnt1;

assign s3_to_s0_start = (state_c == s3) && end_cnt1;

第四段:

always @( posedge clk or negedge rst_n ) begin

if( !rst_n )

led1 <= 0;

else if( state_c == s0 )

led1 <= 0;

else if( state_c == s1 )

led1 <= 1;

else if( state_c == s2 )

led1 <= 0;

else if( state_c == s3 )

led1 <= 1;

endalways @( posedge clk or negedge rst_n ) begin

if( !rst_n )

led2 <= 0;

else if( state_c == s0 )

led2 <= 0;

else if( state_c == s1 )

led2 <= 0;

else if( state_c == s2 )

led2 <= 1;

else if( state_c == s3 )

led2 <= 1;

end

//計數器

reg [15:0] cnt0; //計數器

wire add_cnt0; //加1條件

wire end_cnt0; //結束條件

always @( posedge clk or negedge rst_n ) begin

if( !rst_n )

cnt0 <= 16'd0;

else if( add_cnt0 ) begin

if( end_cnt0 )

cnt0 <= 16'd0;

else

cnt0 <= cnt0 +1'b1;

endendassign add_cnt0 = 1'b1;

assign end_cnt0 = add_cnt0 && cnt0 == 50000-1;

//------------

reg [7:0] cnt1;

wire add_cnt1;

wire end_cnt1;

always @( posedge clk or negedge rst_n ) begin

if( !rst_n )

cnt1 <= 8'd0;

else if( add_cnt1 ) begin

if( end_cnt1 )

cnt1 <= 8'd0;

else

cnt1 <= cnt1 + 1'b1;

endend

assign add_cnt1 = end_cnt0;

assign end_cnt1 = add_cnt1 && cnt1 == 10-1;

FPGA狀態機設計

一 狀態機應用設計 一 狀態機基本概念 1.狀態機的描述方法 狀態機描述時關鍵是要描述清楚幾個狀態機的要素,即如何進行狀態轉移,每個狀態的輸出是什麼,狀態轉移的條件等。具體描述時方法各種各樣,最常見的有三種描述方式 1 一段式 整個狀態機寫到乙個always模組裡面,在該模組中既描述狀態轉移,又描述...

FPGA 常用 狀態機

1,單always塊結構 一段式 always posedge clk begin case fsm st0 begin out0 輸出 if case0 fsm st1 狀態轉移 endst1 begin out1 輸出 if case0 fsm st2 狀態轉移 end default endc...

FPGA狀態機總結

1.狀態機的結構 1 邏輯表示式 下乙個狀態 f 當前狀態,輸入訊號 輸出訊號 g 當前狀態,輸入訊號 2 mealy狀態機 時序邏輯的輸出取決於狀態與輸入 3 moore狀態機 時序邏輯的輸出取決於狀態 2.狀態編碼的型別 1 獨熱編碼 乙個bit代表乙個狀態 4中狀態的編碼有 4 b0001,4...