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

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

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

三段式狀態(tài)機(jī)編寫(xiě)問(wèn)題及三段式狀態(tài)機(jī)各部分功能分析

冬至子 ? 來(lái)源:Bug記錄 ? 作者:woodfan ? 2023-06-20 10:35 ? 次閱讀

Verilog的江湖里,流傳著一段,兩段,三段式狀態(tài)機(jī)的傳說(shuō)。它們各有優(yōu)劣,本文就書(shū)寫(xiě)三段式狀態(tài)機(jī)的錯(cuò)誤原因進(jìn)行探尋。

本文會(huì)涉及到Verilog的基本語(yǔ)法,需要一定的Verilog基礎(chǔ),包括對(duì)reg,always,狀態(tài)機(jī)的一些認(rèn)識(shí),數(shù)字電路基礎(chǔ)。

三段式狀態(tài)機(jī),將狀態(tài)機(jī)分為三段,功能為狀態(tài)轉(zhuǎn)移,狀態(tài)轉(zhuǎn)移條件判斷,輸出邏輯等。

存在問(wèn)題的“三段式狀態(tài)機(jī)”代碼如下:

1.jpg

程序比較簡(jiǎn)單,于是直接上板驗(yàn)證。

經(jīng)過(guò)上板調(diào)試,發(fā)現(xiàn)問(wèn)題存在于當(dāng)empty為低時(shí),rd_en并沒(méi)有拉高。于是,我首先懷疑整個(gè)系統(tǒng)是不是一直處于復(fù)位狀態(tài)。

經(jīng)過(guò)查找,發(fā)現(xiàn)rst一直保持低電平,整個(gè)程序不在復(fù)位狀態(tài)。這就很神奇了。

后來(lái),經(jīng)過(guò)提醒和仔細(xì)查找原因,才發(fā)現(xiàn)這個(gè)狀態(tài)機(jī)寫(xiě)的其實(shí)存在問(wèn)題。狀態(tài)轉(zhuǎn)移條件判斷和狀態(tài)轉(zhuǎn)移都使用時(shí)序邏輯,兩者并行運(yùn)行,問(wèn)題就凸顯出來(lái)了。

舉例說(shuō)明,假設(shè)當(dāng)前狀態(tài)state, next_state都處于IDLE狀態(tài);

1.jpg

事實(shí)上,這么寫(xiě),造成的問(wèn)題是state相對(duì)其他信號(hào)可能會(huì)晚一節(jié)拍。狀態(tài)機(jī)晚一節(jié)拍,可能會(huì)導(dǎo)致時(shí)序錯(cuò)亂。

而事實(shí)上,三段式狀態(tài)機(jī)當(dāng)然不是這么寫(xiě)的。

首先,三段式狀態(tài)機(jī)由三部分(段)組成,前面也提到了,是狀態(tài)轉(zhuǎn)移,狀態(tài)轉(zhuǎn)移條件判斷,輸出邏輯等。

首先談到狀態(tài)轉(zhuǎn)移,三段式狀態(tài)機(jī)有state, next_state信號(hào)作為指示。兩者在位寬,信號(hào)類型上一模一樣,都是reg型變量。

狀態(tài)轉(zhuǎn)移很簡(jiǎn)單,大致如下:

1.jpg

其中,IDLE是預(yù)先定義的常量,使用localparam,parameter定義即可,或者可以使用`define定義宏變量參數(shù),然后放在一個(gè)通用的參數(shù)模塊文件里,供項(xiàng)目里所有文件調(diào)用,后續(xù)再詳細(xì)講解這塊吧。

這塊的內(nèi)容,僅僅是將next_state的值打一拍,通過(guò)了一個(gè)寄存器,意義何在呢,要結(jié)合狀態(tài)轉(zhuǎn)移條件判斷一起看。

狀態(tài)轉(zhuǎn)移條件判斷代碼大致如下:

1.jpg

這塊的內(nèi)容主要是做next_state值變更的條件判斷,結(jié)合功能來(lái)說(shuō),就是做狀態(tài)值的更新。

那可能有人會(huì)問(wèn):

  • always @ (*) 是什么意思

簡(jiǎn)單來(lái)說(shuō),always @ ( ) 意為每時(shí)每刻都在運(yùn)行,也就是組合邏輯,你也可以使用always @ (state, a, b)方式來(lái)代替always @ ( )。但是,假如always列表里的信號(hào)不全,可能造成的影響又是什么呢?

  • reg類型為什么放在組合邏輯里面做

reg型變量最后綜合的電路也可能是組合邏輯,也不是說(shuō)always塊一定綜合出時(shí)序邏輯,主要還是跟敏感列表有關(guān),其次always里只能使用reg型變量

  • 為什么你的if沒(méi)有補(bǔ)全else

對(duì)于時(shí)序邏輯來(lái)說(shuō),沒(méi)有補(bǔ)全else,default等不會(huì)生成鎖存器;對(duì)于組合邏輯來(lái)說(shuō),沒(méi)有else,default確實(shí)可能生成鎖存器,但是鎖存器生成的原因是因?yàn)樵O(shè)計(jì)代碼中要求組合邏輯去保持或者說(shuō)記憶住某個(gè)值,這本該是時(shí)序邏輯該干的事,組合邏輯干不了,所以生成鎖存器;而本段代碼,第一行代碼就相當(dāng)于已經(jīng)為所有無(wú)法進(jìn)入if條件的情況增加了默認(rèn)情況,就是賦值為state的狀態(tài)。

這兩塊內(nèi)容都跟狀態(tài)轉(zhuǎn)移有關(guān),第二塊進(jìn)行條件判斷,而判斷不僅要根據(jù)外部信號(hào),也要根據(jù)自身所在的狀態(tài),所以第一塊進(jìn)行狀態(tài)值的更新。

那么這么做的好處是什么呢?跟一段式狀態(tài)機(jī)相比,將狀態(tài)轉(zhuǎn)移與判斷和輸出邏輯分開(kāi)寫(xiě),方便后續(xù)的調(diào)試。

因?yàn)樵谡{(diào)試階段,查找問(wèn)題時(shí)會(huì)去查找問(wèn)題所在的狀態(tài),然后再比對(duì)代碼中該狀態(tài)的判斷條件,沒(méi)有錯(cuò)誤再比對(duì)該條件下問(wèn)題信號(hào)的輸出邏輯,調(diào)試更為方便。

那么第三段的輸出邏輯,代碼大致如下:

1.jpg

首先,輸出邏輯這段并不是要求只用一個(gè)always寫(xiě)完所有的輸出邏輯;其次,使用時(shí)序邏輯輸出,更利于信號(hào)的時(shí)序分析和時(shí)序收斂。

當(dāng)然,一段式狀態(tài)機(jī)也并不是一無(wú)是處,很多時(shí)候,在一些邏輯簡(jiǎn)單,功能簡(jiǎn)單的場(chǎng)景下,我也愿意使用一段式狀態(tài)機(jī)。兩段式狀態(tài)機(jī)用的比較少,感覺(jué)像是一段式和三段式狀態(tài)機(jī)的過(guò)渡狀態(tài),有點(diǎn)雞肋的感覺(jué)。

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

    關(guān)注

    8

    文章

    903

    瀏覽量

    41317
  • 時(shí)序邏輯電路
    +關(guān)注

    關(guān)注

    2

    文章

    94

    瀏覽量

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

    關(guān)注

    2

    文章

    489

    瀏覽量

    27394
  • Verilog語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8192
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    普通三段式充電原理

    普通三段式充電原理   普通三段式鉛酸蓄電池充電器,充電過(guò)程如下: ① 恒流充電階段,充電器充電電流保持恒定,充入
    發(fā)表于 11-16 14:24 ?2.8w次閱讀

    【Z-turn Board試用體驗(yàn)】有限狀態(tài)機(jī)三段式描述方法(轉(zhuǎn)載)

    ;(2)二段式:用兩個(gè)always模塊來(lái)描述狀態(tài)機(jī),其中一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移;另一個(gè)模塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述
    發(fā)表于 05-25 20:33

    徹底搞懂狀態(tài)機(jī)(一段式、兩段式、三段式)!一個(gè)實(shí)例,種方法對(duì)比看?。。。ǔ绦颍?/a>

    。三段式建模描述FSM的狀態(tài)機(jī)輸出時(shí),只需指定case敏感表為次態(tài)寄存器,然后直接在每個(gè)次態(tài)的case分支中描述該狀態(tài)的輸出即可,不用考慮狀態(tài)轉(zhuǎn)移條件。
    發(fā)表于 06-27 22:13

    關(guān)于三段式狀態(tài)機(jī)的疑惑,希望有人來(lái)為我解答。(新手求罩)

    本人在學(xué)習(xí)verilog 與狀態(tài)機(jī)時(shí)發(fā)現(xiàn)有如下疑惑,希望有人能為我解答。如下,是一部分三段式狀態(tài)機(jī)的代碼:always@(posedge clk or negedge rst_n)be
    發(fā)表于 11-21 10:57

    三段式過(guò)電流保護(hù)的模型

    我通過(guò)SIMULINK建立三段式過(guò)電流保護(hù)的模型,如下所示,但是仿真難結(jié)果不對(duì),請(qǐng)大神指點(diǎn)一下哪里錯(cuò)了。
    發(fā)表于 06-30 17:23

    Verilog三段式狀態(tài)機(jī)描述及模版

    個(gè)always完成。三段式建模描述FSM的狀態(tài)機(jī)輸出時(shí),只需指定case敏感表為次態(tài)寄存器, 然后直接在每個(gè)次態(tài)的case分支中描述該狀態(tài)
    發(fā)表于 07-03 10:13

    Verilog三段式狀態(tài)機(jī)描述及模版

    個(gè)always完成。三段式建模描述FSM的狀態(tài)機(jī)輸出時(shí),只需指定case敏感表為次態(tài)寄存器, 然后直接在每個(gè)次態(tài)的case分支中描述該狀態(tài)
    發(fā)表于 07-09 01:55

    三段式和四段式耳機(jī)的引腳定義

      耳機(jī)插座在我們?nèi)粘I钪惺潜容^常見(jiàn)的一種電子元件,其耳機(jī)插座的類型規(guī)格也區(qū)分有四段式耳機(jī)插座、三段式耳機(jī)插座等。三段式和四段式耳機(jī)的引腳定義如下:    四
    發(fā)表于 12-25 15:26

    Verilog三段式狀態(tài)機(jī)描述(轉(zhuǎn)載)

    時(shí)序電路的狀態(tài)是一個(gè)狀態(tài)變量集合,這些狀態(tài)變量在任意時(shí)刻的值都包含了為確定電路的未來(lái)行為而必需考慮的所有歷史信息。 狀態(tài)機(jī)采用VerilogHDL語(yǔ)言編碼,建議分為
    發(fā)表于 02-09 09:42 ?1088次閱讀

    關(guān)于使用FPGA三段式狀態(tài)機(jī)點(diǎn)好處,你有什么看法?

    三段式描述狀態(tài)機(jī)的好處,國(guó)內(nèi)外各位大牛都已經(jīng)說(shuō)的很多了,大致可歸為以下點(diǎn):
    發(fā)表于 08-17 11:43 ?1.6w次閱讀
    關(guān)于使用FPGA<b class='flag-5'>三段式</b><b class='flag-5'>狀態(tài)機(jī)</b>的<b class='flag-5'>三</b>點(diǎn)好處,你有什么看法?

    基于FPGA實(shí)現(xiàn)狀態(tài)機(jī)的設(shè)計(jì)

    狀態(tài)機(jī)種描述方式:一段式狀態(tài)機(jī)、兩段式狀態(tài)機(jī)三段式
    的頭像 發(fā)表于 08-29 06:09 ?2715次閱讀
    基于FPGA實(shí)現(xiàn)<b class='flag-5'>狀態(tài)機(jī)</b>的設(shè)計(jì)

    三段式充電器的主要參數(shù)有哪些

    下面以36V/lOAh蓄電池所用的三段式充電器為例,說(shuō)明三段式充電器的主要參數(shù)。
    發(fā)表于 04-05 16:49 ?5484次閱讀
    <b class='flag-5'>三段式</b>充電器的主要參數(shù)有哪些

    FPGA三段式描述狀態(tài)機(jī)的好處

    先談?wù)劦诙c(diǎn)關(guān)于思維習(xí)慣。我發(fā)現(xiàn)有些人會(huì)有這樣一種習(xí)慣,先用一段式狀態(tài)機(jī)實(shí)現(xiàn)功能,仿真ok后,再將其轉(zhuǎn)成三段式,他們對(duì)這種開(kāi)發(fā)方式的解釋是一段式
    發(fā)表于 07-14 14:59 ?1351次閱讀

    狀態(tài)機(jī)的一段式、二段式三段式的區(qū)別

    本篇文章描述狀態(tài)機(jī)的一段式、二段式、三段式區(qū)別.
    的頭像 發(fā)表于 08-21 09:25 ?6334次閱讀
    <b class='flag-5'>狀態(tài)機(jī)</b>的一<b class='flag-5'>段式</b>、二<b class='flag-5'>段式</b>、<b class='flag-5'>三段式</b>的區(qū)別

    三段式距離保護(hù)和三段式電流保護(hù)原理是相同的,它們有哪些區(qū)別?

    上也有著相似之處。但是它們?cè)趯?shí)際應(yīng)用中存在一些差異,下面我們將逐一分析它們的區(qū)別。 一、基本原理: 1. 三段式距離保護(hù) 三段式距離保護(hù)是一種基于測(cè)量線路電壓和電流來(lái)進(jìn)行保護(hù)的保護(hù)方式,其原理基于開(kāi)路電壓的測(cè)量。當(dāng)
    的頭像 發(fā)表于 09-18 09:57 ?4818次閱讀