FPGA 學習之路(八)深入理解狀態機

2021-07-26 11:31:08 字數 3013 閱讀 8449

什麼是狀態機:狀態機通過不同的狀態遷移來完成特定的邏輯操作(時序操作)

狀態機的分類:moore型狀態機和mealy型狀態機

moore型:狀態機的變化只與當前的狀態有關

mealy型:狀態機的變化不僅與當前的狀態有關,還與輸入有關

如何建立狀態機:狀態機的建立可以分為一段式,兩段式和三段式:

一段式:所有的狀態變化以及導致的輸出變化都寫在了乙個always快中。在該模組中既描述狀態轉移,又描述狀態的輸入和輸出。

兩段式:用兩個always模組來描述狀態機。其中乙個模組採用同步時序邏輯電路描述狀態轉移,另乙個模組採用組合邏輯判斷狀態轉移條件。它需要兩個狀態——現態和次態,然後通過現態和次態的轉換來實現時序邏輯。

三段式:用三個always模組來描述狀態機。其中乙個模組採用同步時序邏輯電路描述狀態轉移,另乙個模組採用組合邏輯判斷狀態轉移條件(注意和兩段式的區別)。第三個模組描述狀態的輸出(既可以用組合邏輯也可以用時序邏輯)

為了說明這個問題,我們先來看另外乙個問題:

(1)組合電路中的競爭與冒險

1、競爭與冒險產生的原因:在組合電路中訊號的高低變化是需要一定的過渡時間的。當多路訊號的電平發生變化時,在訊號變化的瞬間,組合邏輯的輸出也有先後順序,並不是同步變化。比如000101要變化到00100 在變化的過程中可能會出現00110訊號,被稱為尖峰訊號「毛刺」。時鐘埠、清零和置位埠對毛刺訊號十分敏感。(在數位電路中,訊號由於經由不同路徑傳輸達到某一匯合點的時間有先有後的現象,就稱之為競爭;由於競爭現象所引起的電路輸出發生瞬間錯誤的現象,就稱之為冒險;)

2、解決競爭與冒險的方案

(1)採用格雷碼取代普通的二進位制計數器

(2) d觸發器是一種比較傳統的去除毛刺的方法。利用d觸發器對輸入訊號的毛刺不敏感的特點(只要毛刺不出現在上公升沿並且滿足資料的建立和保持時間就不會對系統造成傷害),從而去除訊號中的毛刺。

(2)三段式狀態機的優點

1、一段式狀態機只涉及時序電路,沒有競爭與冒險,同時消耗邏輯比較少。但是如果狀態非常多,一段式狀態機顯得比較臃腫,不利於維護。

2、兩段式狀態機:當乙個模組採用時序(狀態轉移),乙個模組採用組合時候(狀態機輸出),組合邏輯電路容易造成競爭與冒險;當兩個模組都採用時序,可以避免競爭與冒險的存在,但是整個狀態機的時序上會延時乙個週期。

3、三段式狀態機:三段式狀態機在狀態轉移時採用組合邏輯電路+格雷碼,避免了組合邏輯的競爭與冒險;狀態機輸出採用了同步暫存器輸出,也可以避免組合邏輯電路的競爭與冒險;採用這兩種方法極大的降低了競爭冒險。並且在狀態機的採用這種組合邏輯電路+次態暫存器輸出,避免了兩段式狀態機的延時乙個週期(三段式狀態機在上一狀態中根據輸入條件判斷當前狀態的輸出,從而在不插入額外時鐘節拍的前提下,實現暫存器的輸出)。

靈活選擇狀態機,不一定要拘泥理論,怎樣方面怎樣來

module three_fsm(clk,rst_n,a,z);  

input clk;

input rst_n;

input a;

output reg z;

reg [5:0] current_state;

reg [5:0] next_state;

parameter s0 = 6

'b00_0001;

parameter s1 = 6

'b00_0010;

parameter s2 = 6

'b00_0100;

parameter s3 = 6

'b00_1000;

parameter s4 = 6

'b01_0000;

parameter s5 = 6

'b10_0000;

//第乙個程序,同步時序always模組,格式化描述次態暫存器遷移到現態暫存器

//相當於是乙個d觸發器

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

current_state <= s0;

else

current_state <= next_state;

end

//第二個程序,組合邏輯always模組,描述狀態轉移條件判斷

always@(*)

begin

case(current_state)

s0: next_state = (a==1)?s1:s0;

s1: next_state = (a==0)?s2:s1;

s2: next_state = (a==0)?s3:s1;

s3: next_state = (a==1)?s4:s0;

s4: next_state = (a==0)?s5:s1;

s5: next_state = (a==0)?s3:s1;

default: next_state = s0;

endcase

end

//第三個程序,同步時序always模組,格式化描述次態暫存器輸出

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

z = 0;

else

case(next_state)

s0: z = 0;

s1: z = 0;

s2: z = 0;

s3: z = 0;

s4: z = 0;

s5: z = 1;

default: z = 0;

endcase

end

endmodule

FPGA之IO訊號型別深入理解

在fpga設計開發中,很多場合會遇到同一根訊號既可以是輸入訊號,又可以是輸出訊號,即io型別 verilog定義成inout 對於inout型的訊號,我們既可以使用fpga原語來實現,也可以使用verilog 來實現。下面將介紹在xilinx 7系列fpga上兩種實現方式的差別和注意點。不管哪種方式...

深入理解抽象工廠模式 狀態模式

提供給客戶端一系列與需求相關的,相互依賴的介面,通過介面的呼叫的可變性來提高 的適用性。舉個例子,在開發中,我們使用不同的資料庫的語法不一樣,oracle與mysql例如分頁上語法不一,mongodb操作為指令性操作,後台通過getcommand 方法來操作mongodb,因為需求的對資料庫型別的改...

WebRTC學習之ICE深入理解

ice 互動式連線建立 interactive connectivity establishment 是一種標準穿透協議。它利用stun和turn伺服器來幫助端點建立連線。下圖顯示了ice的基本步驟 其中傳輸位址是ip位址和埠號的組合。1.收集候選傳輸位址 2.在信令通道中交換候選項 3.執行連線檢...