色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于FPGA的狀態機設計

CHANBAEK ? 來源:小小研究生 ? 作者:xxyjs2020 ? 2023-07-28 10:02 ? 次閱讀

數電基礎

狀態機的基礎知識依然強烈推薦mooc上華科的數字電路與邏輯設計,yyds!但是數電基礎一定要和實際應用結合起來,理論才能發揮真正的價值。我們知道FPGA是并行執行的,如果我們想要處理具有前后順序的事件就需要引入狀態機。

狀態機有同步異步之分,同步是指狀態機的狀態跳轉是在時鐘的作用下進行的,異步是指狀態跳轉不是由統一的時鐘控制。同步有限狀態機分為Moore型Mealy型 ,Moore型的輸出只與當前狀態有關,而Mealy型的輸出與當前狀態和輸入有關。

每一個狀態都代表一個事件,從初始狀態出發,不同的輸入可能引發不同的下一個狀態,并獲得不同的輸出(輸出不是必須的,但一定有輸入)。

設計規劃

我們的目標是用狀態機實現一個簡單的可樂販賣機系統。具體功能是:可樂機每次只能投入1枚1元硬幣,且每瓶可樂賣3元錢,即投入3個硬幣就可以讓可樂機出可樂,如果投幣不夠3元想放棄投幣需要按復位鍵,否則之前投入的錢不能退回。

Moore型用狀態圖來表示:

圖片

初始狀態是IDLE,如果輸入0枚跳轉到自身狀態,輸入1枚跳轉到ONE狀態,跳轉到TWO狀態也是同理,再輸入0枚跳轉到自身狀態,輸入1枚跳轉到初始狀態并輸出1表示可樂售賣成功,其間任意狀態復位有效都要回到初始狀態并退錢。

Mealy型用狀態圖來表示:

圖片

有四種狀態,到TWO狀態都與前面一致,TWO狀態時投1枚跳轉到THREE狀態,THREE狀態如果輸入0枚就售出可樂且跳轉到初始狀態,輸入1枚就售出可樂且跳轉到ONE狀態。

圖片

編寫代碼

module simple_fsm
(
input wire sys_clk , 
input wire sys_rst_n , 
input wire pi_money , 
output reg po_cola 
);


 //parameter define
 parameter IDLE = 3'b001;
 parameter ONE = 3'b010;
 parameter TWO = 3'b100;


 //reg define
 reg [2:0] state ;


 //第一段狀態機,描述當前狀態state如何根據輸入跳轉到下一狀態
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 state <= IDLE; //任何情況下只要按復位就回到初始狀態
 else case(state)
 IDLE : if(pi_money == 1'b1) //判斷輸入情況
 state <= ONE;
 else
 state <= IDLE;


 ONE : if(pi_money == 1'b1)
 state <= TWO;
 else
 state <= ONE;


 TWO : if(pi_money == 1'b1)
 state <= IDLE;
 else
 state <= TWO;
 
 default: state <= IDLE;
 endcase


 //第二段狀態機,描述當前狀態state和輸入pi_money如何影響po_cola輸出
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 po_cola <= 1'b0;
 else if((state == TWO) && (pi_money == 1'b1))
 po_cola <= 1'b1;
 else
 po_cola <= 1'b0;


 endmodule

輸入輸出定義

參數定義:狀態要用參數來表示,為了區分不同的狀態,我們需要給 狀態編碼 ,這里使用了獨熱碼,只有一位為1其余位為0。事實上這里使用二進制或格雷碼也可以表示。二進制編碼使用2位位寬就可以表示4種狀態(有一種狀態未使用)。使用獨熱碼的原因是:獨熱碼每個狀態只有1bit是不同的,所以在執行(state == TWO)這條語句時,綜合器會識別出這是一個比較器,而因為只有1比特為1,所以綜合器會進行智能優化為(state[2] == 1’ b1),這就相當于把之前3比特的比較器變為了1比特的比較器,大大節省了組合邏輯資源。而我們FPGA中組合邏輯資源相對較少,而寄存器資源較多,所以犧牲寄存器資源來節省組合邏輯資源。狀態很多時可以采用格雷碼進行編碼,位數少,且相鄰狀態轉換時只有一位發生變化,相當于二進制和獨熱碼的折衷處理。

采用新兩段式,第一段用于定義狀態跳轉,第二段定義輸出。這種新的寫法現在在不同綜合器中都可以被識別出來,既消除了組合邏輯可能產生的毛刺,又減小了代碼量,僅僅根據狀態轉移圖就能實現。如果有多個輸出時第二段狀態機就可以分為多個always塊來表達,但理論上仍屬于新二段狀態機,所以幾段式狀態機并不是由always塊的數量簡單決定的)。

定義狀態跳轉 :狀態變化的條件是時鐘上升沿和復位。首先復位時,狀態恢復到初始狀態。沒有復位時,需要定義每個狀態的跳轉。這里采用了case語句,復習一下:case語句檢查表達式與列表中其他表達式是否匹配并對應分支。這里是檢查state與IDLE,ONE,TWO匹配,當處于三種狀態時,都有pi_money=0或1兩種情況,按照之前討論的跳轉狀態去設置。注意case語句如果不加default可能出現latch。

定義輸出 :復位有效時,輸出為0;只有一種情況輸出為1,就是有足夠買到可樂的錢時,也就是狀態為TWO且投入1塊錢;其他時候輸出為0。

圖片

圖片

編寫testbench

`timescale 1ns/1ns
module tb_simple_fsm();
//reg define
reg sys_clk ;
reg sys_rst_n ;
reg pi_money ;


//wire define
wire po_cola;


 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end


 //sys_clk:模擬系統時鐘,每10ns電平翻轉一次,周期為20ns,頻率為50MHz
 always #10 sys_clk = ~sys_clk;


 //pi_money:產生輸入隨機數,模擬投幣1元的情況
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 pi_money <= 1'b0;
 else
 pi_money <= {$random} % 2; //取模求余數,產生非負隨機數0、1


 //將RTL模塊中的內部信號引入到Testbench模塊中進行觀察
 wire [2:0] state = simple_fsm_inst.state;


 initial begin
 $timeformat(-9, 0, "ns", 6);
 $monitor("@time %t: pi_money=%b state=%b po_cola=%b",
 $time, pi_money, state, po_cola);
 end


 //------------------------simple_fsm_inst------------------------
 simple_fsm simple_fsm_inst(
 .sys_clk (sys_clk ), 
 .sys_rst_n (sys_rst_n ), 
 .pi_money (pi_money ),
 .po_cola (po_cola ) 
 );


 endmodule

輸入輸出定義、初始化、時鐘產生、隨機數產生、打印結果、實例化都是我們非常熟悉的內容了。需要補充說明的是第29行,重新定義了一個state(名稱盡量與rtl中一致),將實例化模塊中的state與其等效,這樣就可以在transcript中打印并觀察到。因為transcript中觀察到打印信息只能是RTL的端口信號,而state是內部信號(端口信號是輸入輸出時鐘復位,中間信號是內部信號)。

對比波形

圖片

圖片

狀態跳轉與預期一致

應用拓展

前面的可樂販賣機只能投1元的,我們來看看投0.5元的狀態機:可樂定價為2.5元一瓶,可投入0.5元、1元硬幣,投幣不夠2.5元需要按復位鍵退回錢款,投幣超過2.5元需找零。

看似很復雜,實際只是變成兩種輸入,三種輸出,五種狀態。輸入有0.5,1元;輸出有不找零不出可樂,不找零出可樂,找零并出可樂;狀態有0,0.5,1,1.5,2,到2塊之后輸入0.5就到0的狀態并出可樂,輸入1就到0的狀態出可樂并找零。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1629

    文章

    21759

    瀏覽量

    604283
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27576
  • 狀態圖
    +關注

    關注

    0

    文章

    11

    瀏覽量

    7341
收藏 人收藏

    評論

    相關推薦

    FPGA工程師:如何在FPGA中實現狀態機

    安全高效的狀態機設計對于任何使用FPGA的工程師而言都是一項重要技能。選擇Moore狀態機、Mealy狀態機還是混合機取決于整個系統的需求。無論選擇哪種類型的
    發表于 03-29 15:02 ?1.3w次閱讀
    <b class='flag-5'>FPGA</b>工程師:如何在<b class='flag-5'>FPGA</b>中實現<b class='flag-5'>狀態機</b>?

    高效安全的狀態機設

    本帖最后由 eehome 于 2013-1-5 09:56 編輯 高效安全的狀態機設
    發表于 08-13 17:53

    狀態機設計的例子

    本帖最后由 eehome 于 2013-1-5 09:56 編輯 狀態機設計的例子
    發表于 08-19 23:01

    狀態機設計指導

    狀態機設計指導
    發表于 08-20 23:45

    狀態機設計問題

    狀態機設計中always @(*) beginnext = 2'bx;case (state)idle: next=s1;s1: next=s2;s2: next=idle;end以上代碼先給
    發表于 10-06 18:49

    如何寫好狀態機

    如何寫好狀態機:狀態機是邏輯設計的重要內容,狀態機的設計水平直接反應工程師的邏輯功底,所以許多公司的硬件和邏輯工程師面試中,狀態機設計幾乎是必選題目。本章在引入
    發表于 06-14 19:24 ?97次下載

    狀態機設

    狀態機設計:8.1.1 數據類型定義語句TYPE語句的用法如下:TYPE 數據類型名IS 數據類型定義OF 基本數據類型;或TYPE 數據類型名IS 數據類型定義;TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_L
    發表于 08-09 23:07 ?36次下載

    高速環境下FPGA或CPLD中的狀態機設

        本文給出了采用這些技術的高速環境狀態機設計的規范及分析方法和優化方法,并給出了相應的示例。       為了使FPGA或CPLD中的狀態機設
    發表于 04-15 11:27 ?685次閱讀
    高速環境下<b class='flag-5'>FPGA</b>或CPLD中的<b class='flag-5'>狀態機設</b>計

    VHDL有限狀態機設計-ST

    EDA的有限狀態機,廣義而言是指只要涉及觸發器的電路,無論電路大小都可以歸結為狀態機。有限狀態機設計在學習EDA時是很重要的一章。
    發表于 06-08 16:46 ?3次下載

    華清遠見FPGA代碼-狀態機

    FPGA學習資料教程——華清遠見FPGA代碼-狀態機
    發表于 10-27 18:07 ?9次下載

    基于FPGA狀態機設計實現EtherCAT從站基本通信鏈路并驗證

    狀態機,并通過解析各階段數據狀態變化,驗證了各節點通信數據的正確性。實驗結果表明,基于上述狀態機FPGA實現EtherCAT從站基本通信鏈路是完全可行的。
    發表于 11-15 12:04 ?1.8w次閱讀
    基于<b class='flag-5'>FPGA</b><b class='flag-5'>狀態機設</b>計實現EtherCAT從站基本通信鏈路并驗證

    FPGA狀態機設計原則

    狀態機狀態寄存器和組合邏輯電路構成,能夠根據控制信號按照預先設定的狀態進行狀態轉移,是協調相關信號動作、完成特定操作的控制中心。
    的頭像 發表于 10-09 07:02 ?2389次閱讀

    FPGA狀態機簡述

    FPGA設計中一種非常重要、非常根基的設計思想,堪稱FPGA的靈魂,貫穿FPGA設計的始終。 02. 狀態機簡介 什么是狀態機
    的頭像 發表于 11-05 17:58 ?7454次閱讀
    <b class='flag-5'>FPGA</b>:<b class='flag-5'>狀態機</b>簡述

    FPGA狀態機設計思想

    硬件電路設計通常以并行方式實現,但是在實際工程中經常會存在系統按照順序邏輯執行的需求。
    發表于 07-17 09:42 ?960次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>狀態機設</b>計思想

    如何在FPGA中實現狀態機

    FPGA(現場可編程門陣列)中實現狀態機是一種常見的做法,用于控制復雜的數字系統行為。狀態機能夠根據當前的輸入和系統狀態,決定下一步的動作和新的
    的頭像 發表于 07-18 15:57 ?653次閱讀
    主站蜘蛛池模板: 亚洲精品一二三区区别在哪| 9420高清完整版在线电影免费观看 | 中文字幕欧美日韩VA免费视频| 久久只有这里有精品4| 中文字幕乱码一区AV久久| 欧美视频毛片在线播放| 国产 亚洲 中文在线 字幕| 亚洲色播永久网址大全| 免费高清在线影片一区| 国产不卡无码高清视频| 杨幂被视频在线观看| 胖老太与人牲交BBWBBW高潮| 国产老肥熟xxxx| 99精品在线看| 亚洲AV国产福利精品在现观看| 蜜臀AV999无码精品国产| 国产精品A久久777777| 中文字幕在线观看亚洲视频| 受坐在攻腿上H道具PLAY| 玖玖爱在线播放| 国产成人免费a在线视频app| 月夜直播免费看| 世界第一黄暴漫画家| 拉菲娱乐主管高工资q39709| 国产互换后人妻的疯狂VIDEO| 中文字幕A片视频一区二区| 天天操夜夜噜| 欧美亚洲曰韩一本道| 久久精品美女| 国产精品亚洲视频在线观看| 97人妻在线公开视频在线观看 | 伊人热人久久中文字幕| 色 花 堂 永久 网站| 美女被艹网站| 国产精品人妻无码免费A片导航| 57PAO强力打造高清免费| 亚洲精品久久久久AV无码| 日本综艺大尺度无删减版在线 | 日本 一二三 不卡 免费| 久久伊人青青| 狠日狠干日曰射|