在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的狀態(tài)機(jī)設(shè)計(jì)

CHANBAEK ? 來源:小小研究生 ? 作者:xxyjs2020 ? 2023-07-28 10:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

數(shù)電基礎(chǔ)

狀態(tài)機(jī)的基礎(chǔ)知識(shí)依然強(qiáng)烈推薦mooc上華科的數(shù)字電路與邏輯設(shè)計(jì),yyds!但是數(shù)電基礎(chǔ)一定要和實(shí)際應(yīng)用結(jié)合起來,理論才能發(fā)揮真正的價(jià)值。我們知道FPGA是并行執(zhí)行的,如果我們想要處理具有前后順序的事件就需要引入狀態(tài)機(jī)。

狀態(tài)機(jī)有同步異步之分,同步是指狀態(tài)機(jī)的狀態(tài)跳轉(zhuǎn)是在時(shí)鐘的作用下進(jìn)行的,異步是指狀態(tài)跳轉(zhuǎn)不是由統(tǒng)一的時(shí)鐘控制。同步有限狀態(tài)機(jī)分為Moore型Mealy型 ,Moore型的輸出只與當(dāng)前狀態(tài)有關(guān),而Mealy型的輸出與當(dāng)前狀態(tài)和輸入有關(guān)。

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

設(shè)計(jì)規(guī)劃

我們的目標(biāo)是用狀態(tài)機(jī)實(shí)現(xiàn)一個(gè)簡單的可樂販賣機(jī)系統(tǒng)。具體功能是:可樂機(jī)每次只能投入1枚1元硬幣,且每瓶可樂賣3元錢,即投入3個(gè)硬幣就可以讓可樂機(jī)出可樂,如果投幣不夠3元想放棄投幣需要按復(fù)位鍵,否則之前投入的錢不能退回。

Moore型用狀態(tài)圖來表示:

圖片

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

Mealy型用狀態(tài)圖來表示:

圖片

有四種狀態(tài),到TWO狀態(tài)都與前面一致,TWO狀態(tài)時(shí)投1枚跳轉(zhuǎn)到THREE狀態(tài),THREE狀態(tài)如果輸入0枚就售出可樂且跳轉(zhuǎn)到初始狀態(tài),輸入1枚就售出可樂且跳轉(zhuǎn)到ONE狀態(tài)。

圖片

編寫代碼

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 ;


 //第一段狀態(tài)機(jī),描述當(dāng)前狀態(tài)state如何根據(jù)輸入跳轉(zhuǎn)到下一狀態(tài)
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 state <= IDLE; //任何情況下只要按復(fù)位就回到初始狀態(tài)
 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


 //第二段狀態(tài)機(jī),描述當(dāng)前狀態(tài)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

輸入輸出定義

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

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

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

定義輸出 :復(fù)位有效時(shí),輸出為0;只有一種情況輸出為1,就是有足夠買到可樂的錢時(shí),也就是狀態(tài)為TWO且投入1塊錢;其他時(shí)候輸出為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:模擬系統(tǒng)時(shí)鐘,每10ns電平翻轉(zhuǎn)一次,周期為20ns,頻率為50MHz
 always #10 sys_clk = ~sys_clk;


 //pi_money:產(chǎn)生輸入隨機(jī)數(shù),模擬投幣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; //取模求余數(shù),產(chǎn)生非負(fù)隨機(jī)數(shù)0、1


 //將RTL模塊中的內(nèi)部信號(hào)引入到Testbench模塊中進(jìn)行觀察
 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

輸入輸出定義、初始化、時(shí)鐘產(chǎn)生、隨機(jī)數(shù)產(chǎn)生、打印結(jié)果、實(shí)例化都是我們非常熟悉的內(nèi)容了。需要補(bǔ)充說明的是第29行,重新定義了一個(gè)state(名稱盡量與rtl中一致),將實(shí)例化模塊中的state與其等效,這樣就可以在transcript中打印并觀察到。因?yàn)閠ranscript中觀察到打印信息只能是RTL的端口信號(hào),而state是內(nèi)部信號(hào)(端口信號(hào)是輸入輸出時(shí)鐘復(fù)位,中間信號(hào)是內(nèi)部信號(hào))。

對(duì)比波形

圖片

圖片

狀態(tài)跳轉(zhuǎn)與預(yù)期一致

應(yīng)用拓展

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1644

    文章

    22009

    瀏覽量

    616566
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    493

    瀏覽量

    28155
  • 狀態(tài)圖
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    7425
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    FPGA工程師:如何在FPGA中實(shí)現(xiàn)狀態(tài)機(jī)

    安全高效的狀態(tài)機(jī)設(shè)計(jì)對(duì)于任何使用FPGA的工程師而言都是一項(xiàng)重要技能。選擇Moore狀態(tài)機(jī)、Mealy狀態(tài)機(jī)還是混合機(jī)取決于整個(gè)系統(tǒng)的需求。無論選擇哪種類型的
    發(fā)表于 03-29 15:02 ?1.4w次閱讀
    <b class='flag-5'>FPGA</b>工程師:如何在<b class='flag-5'>FPGA</b>中實(shí)現(xiàn)<b class='flag-5'>狀態(tài)機(jī)</b>?

    高效安全的狀態(tài)機(jī)設(shè)計(jì)

    本帖最后由 eehome 于 2013-1-5 09:56 編輯 高效安全的狀態(tài)機(jī)設(shè)計(jì)
    發(fā)表于 08-13 17:53

    狀態(tài)機(jī)設(shè)計(jì)的例子

    本帖最后由 eehome 于 2013-1-5 09:56 編輯 狀態(tài)機(jī)設(shè)計(jì)的例子
    發(fā)表于 08-19 23:01

    狀態(tài)機(jī)設(shè)計(jì)指導(dǎo)

    狀態(tài)機(jī)設(shè)計(jì)指導(dǎo)
    發(fā)表于 08-20 23:45

    狀態(tài)機(jī)設(shè)計(jì)問題

    狀態(tài)機(jī)設(shè)計(jì)中always @(*) beginnext = 2'bx;case (state)idle: next=s1;s1: next=s2;s2: next=idle;end以上代碼先給
    發(fā)表于 10-06 18:49

    如何寫好狀態(tài)機(jī)

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

    狀態(tài)機(jī)設(shè)計(jì)

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

    高速環(huán)境下FPGA或CPLD中的狀態(tài)機(jī)設(shè)計(jì)

        本文給出了采用這些技術(shù)的高速環(huán)境狀態(tài)機(jī)設(shè)計(jì)的規(guī)范及分析方法和優(yōu)化方法,并給出了相應(yīng)的示例。       為了使FPGA或CPLD中的狀態(tài)機(jī)設(shè)
    發(fā)表于 04-15 11:27 ?741次閱讀
    高速環(huán)境下<b class='flag-5'>FPGA</b>或CPLD中的<b class='flag-5'>狀態(tài)機(jī)設(shè)</b>計(jì)

    VHDL有限狀態(tài)機(jī)設(shè)計(jì)-ST

    EDA的有限狀態(tài)機(jī),廣義而言是指只要涉及觸發(fā)器的電路,無論電路大小都可以歸結(jié)為狀態(tài)機(jī)。有限狀態(tài)機(jī)設(shè)計(jì)在學(xué)習(xí)EDA時(shí)是很重要的一章。
    發(fā)表于 06-08 16:46 ?3次下載

    華清遠(yuǎn)見FPGA代碼-狀態(tài)機(jī)

    FPGA學(xué)習(xí)資料教程——華清遠(yuǎn)見FPGA代碼-狀態(tài)機(jī)
    發(fā)表于 10-27 18:07 ?9次下載

    基于FPGA狀態(tài)機(jī)設(shè)計(jì)實(shí)現(xiàn)EtherCAT從站基本通信鏈路并驗(yàn)證

    狀態(tài)機(jī),并通過解析各階段數(shù)據(jù)狀態(tài)變化,驗(yàn)證了各節(jié)點(diǎn)通信數(shù)據(jù)的正確性。實(shí)驗(yàn)結(jié)果表明,基于上述狀態(tài)機(jī)FPGA實(shí)現(xiàn)EtherCAT從站基本通信鏈路是完全可行的。
    發(fā)表于 11-15 12:04 ?1.9w次閱讀
    基于<b class='flag-5'>FPGA</b><b class='flag-5'>狀態(tài)機(jī)設(shè)</b>計(jì)實(shí)現(xiàn)EtherCAT從站基本通信鏈路并驗(yàn)證

    FPGA狀態(tài)機(jī)設(shè)計(jì)原則

    狀態(tài)機(jī)狀態(tài)寄存器和組合邏輯電路構(gòu)成,能夠根據(jù)控制信號(hào)按照預(yù)先設(shè)定的狀態(tài)進(jìn)行狀態(tài)轉(zhuǎn)移,是協(xié)調(diào)相關(guān)信號(hào)動(dòng)作、完成特定操作的控制中心。
    的頭像 發(fā)表于 10-09 07:02 ?2582次閱讀

    FPGA狀態(tài)機(jī)簡述

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

    FPGA狀態(tài)機(jī)設(shè)計(jì)思想

    硬件電路設(shè)計(jì)通常以并行方式實(shí)現(xiàn),但是在實(shí)際工程中經(jīng)常會(huì)存在系統(tǒng)按照順序邏輯執(zhí)行的需求。
    發(fā)表于 07-17 09:42 ?1183次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>狀態(tài)機(jī)設(shè)</b>計(jì)思想

    如何在FPGA中實(shí)現(xiàn)狀態(tài)機(jī)

    FPGA(現(xiàn)場可編程門陣列)中實(shí)現(xiàn)狀態(tài)機(jī)是一種常見的做法,用于控制復(fù)雜的數(shù)字系統(tǒng)行為。狀態(tài)機(jī)能夠根據(jù)當(dāng)前的輸入和系統(tǒng)狀態(tài),決定下一步的動(dòng)作和新的
    的頭像 發(fā)表于 07-18 15:57 ?1177次閱讀
    主站蜘蛛池模板: h在线观看免费 | 特级无码毛片免费视频尤物 | 你懂的在线看 | 国产精品免费观看网站 | 亚洲综合激情六月婷婷在线观看 | 国产欧美综合在线 | 夜夜操夜夜摸 | 一级毛片免费不卡直观看 | 欧美性白人极品1819hd | 亚洲色图20p | 成年人黄色免费网站 | 人人做人人爽人人爱秋霞影视 | 天天摸天天澡天天碰天天弄 | 日韩一级片在线观看 | 亚洲一区二区三区电影 | 欧美电影一区二区 | 日本三级香港三级人妇99 | 俄罗斯久久 | 久久午夜精品 | 国产伦理一区二区三区 | tube4欧美最新69 | 国产精品理论片在线观看 | h视频在线播放 | 伊人久久成人 | 在线观看成人网 | 亚洲综合久久久久久888 | 天天操夜夜欢 | 久久青草国产免费观看 | 天天色综合天天 | 日日夜夜天天操 | 欧美精品啪啪 | 欧美成人伊人久久综合网 | 日本色频| 天天做天天爱天天操 | 手机在线播放视频 | 性欧美高清 | 成人黄色在线 | avtt加勒比手机版天堂网 | 国产3p在线播放 | 色先锋av资源中文字幕 | 天天射天天干天天插 |