FPGA 設計 Verilog 基礎 二

2021-08-29 15:54:09 字數 3604 閱讀 4218

狀態機是許多數字系統的核心部件,是一類重要的時序邏輯電路。通常包括三個部分:一是下乙個狀態的邏輯電路,二是儲存狀態機當前狀態的時序邏輯電路,三是輸出組合邏輯電路。通常,狀態機的狀態數量有限,成為有限狀態機(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.來進行時鐘的分頻,倍頻以及相移。但是對於時鐘要求不高的基本設計,通過語言進行時鐘的分頻相移仍然非常流行,首先這種方法可以節省晶元內部的鎖相環資...