FPGA學習筆記 狀態機的實現

2021-09-01 11:19:20 字數 2686 閱讀 6846

一、原理介紹

狀態機:乙個狀態機對應多種狀態,每個狀態由乙個觸發條件改變;

專案例子介紹:當檢測到測試資料中「fpga」四個字母連續出現,led狀態改變;

二、實驗** 

//專案檔案

module finitestatemachine(clk,rst_n,data,led);//檢測fpga

input clk;

input rst_n;

input [7:0]data;//輸入的資料

output reg led;

localparam

status_f = 4'b0001,

status_p = 4'b0010,

status_g = 4'b0100,

status_a = 4'b1000;

reg [3:0]check_status;

always@(posedge clk or negedge rst_n)

if(!rst_n)

begin

led <= 1'b1;

check_status = status_f;

end

else begin

case(check_status)

status_f:

if(check_status <= status_f)

check_status <= status_p;

else

check_status <= status_f;

status_p:

if(check_status <= status_p)

check_status <= status_g;

else

check_status <= status_f;

status_g:

if(check_status <= status_g)

check_status <= status_a;

else

check_status <= status_f;

status_a:

begin

check_status <= status_f;

if(data == "a")

led <= ~led;

else

led <= led;

end

default:check_status <= status_f;

endcase

endendmodule

//測試檔案

`timescale 1ns/1ns

`define timeperiod 20

module finitestatemachine_tb;

reg clk;

reg rst_n;

reg [7:0]ascii;

wire led;

finitestatemachine check0 (

.clk(clk),

.rst_n(rst_n),

.data(ascii),

.led(led)

); initial clk = 1;

always #(`timeperiod / 2) clk = ~clk;

initial begin

rst_n = 0;

ascii = 0;

#(`timeperiod*200);

rst_n = 1;

#(`timeperiod*200);

forever begin

ascii = "h";

#(`timeperiod);

ascii = "e";

#(`timeperiod);

ascii = "l";

#(`timeperiod);

ascii = "l";

#(`timeperiod);

ascii = "o";

#(`timeperiod);

ascii = "f";

#(`timeperiod);

ascii = "p";

#(`timeperiod);

ascii = "g";

#(`timeperiod);

ascii = "a";

#(`timeperiod);

ascii = "h";

#(`timeperiod);

ascii = "e";

#(`timeperiod);

ascii = "l";

#(`timeperiod);

ascii = "l";

#(`timeperiod);

ascii = "o";

#(`timeperiod);

ascii = "f";

#(`timeperiod);

ascii = "p";

#(`timeperiod);

ascii = "g";

#(`timeperiod);

ascii = "a";

#(`timeperiod);

endend

endmodule

三、專案總結

1、語法總結:

localparam:用於狀態機引數定義;定義狀態的先後。

2、注意點:在always塊語句中,注意對變數進行初始化;

學習筆記 FPGA基礎4 狀態機

狀態暫存器由一組觸發器組成,用來記憶狀態機當前所處的狀態,狀態的改變只發生在時鐘的跳變沿 狀態是否改變 如何改變,取決於組合邏輯f的輸出,f是當前狀態和輸入訊號的函式 狀態機的輸出由組合邏輯g提供,g是當前狀態和輸入訊號的函式 常規狀態機 狀態空間 獨熱碼 每個狀態只有乙個暫存器置位,解碼邏輯簡單 ...

FPGA 狀態機,FPGA的靈魂

有關狀態機的文章,事實上已經寫過很多了,可是即使如此,真的懂了嗎?真的能熟練應用嗎?未必吧。這篇博文 是 fpga之道 認真下看去收貨頗豐!借這個主題來梳理下狀態機 狀態機是fpga設計中一種非常重要 非常根基的設計思想,堪稱fpga的靈魂,貫穿fpga設計的始終。簡單地說,狀態機就是一副描繪著狀態...

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...