HDLBits (154) — 有限狀態(tài)機(jī):序列 1101 識(shí)別器
本題鏈接:
https://hdlbits.01xz.net/wiki/Exams/review2015_fsmseq
這是一系列五個(gè)練習(xí)中的第二部分,這些練習(xí)由幾個(gè)較小的電路構(gòu)建一個(gè)復(fù)雜的計(jì)數(shù)器。 相關(guān)的整體設(shè)計(jì),請(qǐng)參閱 the final exercise。
構(gòu)建一個(gè)有限狀態(tài)機(jī),在輸入比特流中尋找序列 1101。 找到序列后,直到復(fù)位前都應(yīng)將 start_shifting 設(shè)為 1。 而保持最終狀態(tài)旨在模擬在尚未實(shí)現(xiàn)的更大的有限狀態(tài)機(jī)中進(jìn)入其他狀態(tài)。 我們將在接下來的幾個(gè)練習(xí)中繼續(xù)擴(kuò)展這個(gè)有限狀態(tài)機(jī)。


題目

答案

輸出波形
復(fù)位和序列檢測


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

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