HDLBits (156) — 有限狀態(tài)機:完整的有限狀態(tài)機
本題鏈接:
https://hdlbits.01xz.net/wiki/Exams/review2015_fsm
這是一系列五個練習中的第四部分,這些練習由幾個較小的電路構(gòu)建一個復雜的計數(shù)器。 相關(guān)的整體設(shè)計,請參閱?the final exercise。
你可能希望先執(zhí)行 FSM: Enable shift register 和 FSM: Sequence recognizer。
我們想創(chuàng)建一個計時器:
?當檢測到特定模式 (1101) 時開始,
?再移 4 位以確定延遲的持續(xù)時間,
?等待計數(shù)器完成計數(shù),并且
?通知用戶并等待用戶確認計時器。
在這個問題中,只實現(xiàn)了控制定時器的有限狀態(tài)機。 此處不包括數(shù)據(jù)路徑(計數(shù)器和一些比較器)。
串行數(shù)據(jù)在數(shù)據(jù)輸入引腳上可用。 當接收到?1101 模式時,狀態(tài)機必須恰好在第?4 個時鐘周期斷言輸出 shift_ena 。
之后狀態(tài)機斷言其計數(shù)輸出,以指示它正在等待計數(shù)器,并一直等到輸入 done_counting 為高。
此時,狀態(tài)機必須斷言已經(jīng)完成并通知用戶定時器已超時,并等待直到輸入 ack 為 1,然后才被復位以尋找下一次出現(xiàn)的啟動序列 (1101)。
狀態(tài)機應(yīng)復位為開始搜索輸入序列 1101 的狀態(tài)。
這是預期的輸入和輸出的示例。? 'x' 狀態(tài)看起來可能有點混亂。 它們表明有限狀態(tài)機不用關(guān)注該周期中的特定輸入信號。 例如,一旦檢測到 1101 模式,有限狀態(tài)機將不再查看數(shù)據(jù)輸入,直到完成其他所有操作后再恢復搜索。


題目
提示:


答案

阻塞賦值屬于順序執(zhí)行,即下一條語句執(zhí)行前,當前語句一定會執(zhí)行完畢。阻塞賦值語句使用等號?=?作為賦值符。
非阻塞賦值屬于并行執(zhí)行語句,即下一條語句的執(zhí)行和當前語句的執(zhí)行是同時進行的,它不會阻塞位于同一個語句塊中后面語句的執(zhí)行。非阻塞賦值語句使用小于等于號?<=?作為賦值符。
條件(if)語句用于控制執(zhí)行語句要根據(jù)條件判斷來確定是否執(zhí)行。條件語句用關(guān)鍵字 if 和 else 來聲明,條件表達式必須在圓括號中。如果?if 條件每次執(zhí)行的語句只有一條,那么可以不使用 begin 與 end 關(guān)鍵字。但如果是 if-if-else 的形式,即便執(zhí)行語句只有一條,不使用 begin 與 end 關(guān)鍵字也會引起歧義。當然,編譯器一般按照就近原則,使 else 與最近的一個 if(例子中第二個 if)相對應(yīng)。但顯然這樣的寫法是不規(guī)范且不安全的。所以條件語句中加入 begin 與 and 關(guān)鍵字就是一個很好的習慣。
case 語句是一種多路條件分支的形式,可以解決 if 語句中有多個條件選項時使用不方便的問題。case 語句支持嵌套使用。case 語句中的條件選項表單式不必都是常量,也可以是 x 值或 z 值。當多個條件選項下需要執(zhí)行相同的語句時,多個條件選項可以用逗號分開,放在同一個語句塊的候選項中。但是 case 語句中的 x 或 z 的比較邏輯是不可綜合的,所以一般不建議在 case 語句中使用 x 或 z 作為比較值。
同步復位是指復位信號在時鐘有效邊沿到來時有效。如果沒有時鐘,無論復位信號怎樣變化,電路也不執(zhí)行復位操作。
該描述代碼常常會被綜合成如下電路:

同步復位的優(yōu)點:信號間是同步的,能濾除復位信號中的毛刺,有利于時序分析。
同步復位的缺點:大多數(shù)觸發(fā)器單元是沒有同步復位端的,采用同步復位會多消耗部分邏輯資源。且復位信號的寬度必須大于一個時鐘周期,否則可能會漏掉復位信號。
有限狀態(tài)機(Finite-State Machine,F(xiàn)SM),簡稱狀態(tài)機,是表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學模型。狀態(tài)機不僅是一種電路的描述工具,而且也是一種思想方法,在電路設(shè)計的系統(tǒng)級和 RTL 級有著廣泛的應(yīng)用。
Verilog 中狀態(tài)機主要用于同步時序邏輯的設(shè)計,能夠在有限個狀態(tài)之間按一定要求和規(guī)律切換時序電路的狀態(tài)。狀態(tài)的切換方向不但取決于各個輸入值,還取決于當前所在狀態(tài)。狀態(tài)機可分為 2 類:Moore?狀態(tài)機和?Mealy?狀態(tài)機。
參考內(nèi)容:
4.2 Verilog 過程賦值 | 菜鳥教程:
https://www.runoob.com/w3cnote/verilog-process-assign.html
4.5 Verilog 條件語句 | 菜鳥教程:
https://www.runoob.com/w3cnote/verilog-condition-statement.html
4.6 Verilog 多路分支語句 | 菜鳥教程:
https://www.runoob.com/w3cnote/verilog-case.html
5.1 Verilog 復位簡介 | 菜鳥教程:
https://www.runoob.com/w3cnote/verilog2-reset.html
6.3 Verilog 狀態(tài)機?| 菜鳥教程:
https://www.runoob.com/w3cnote/verilog-fsm.html