HDLBits (155) — 有限狀態(tài)機(jī):?jiǎn)⒂靡莆患拇嫫?/h1>
本題鏈接:
https://hdlbits.01xz.net/wiki/exams/review2015_fsmshift
這是一系列五個(gè)練習(xí)中的第三部分,這些練習(xí)由幾個(gè)較小的電路構(gòu)建一個(gè)復(fù)雜的計(jì)數(shù)器。 相關(guān)的整體設(shè)計(jì),請(qǐng)參閱?the final exercise。
作為用于控制移位寄存器的 有限狀態(tài)機(jī)?的一部分,我們希望能夠在檢測(cè)到正確的位模式時(shí)恰好啟用?4 個(gè)時(shí)鐘周期的移位寄存器。 我們?cè)?Exams/review2015_fsmseq 中處理序列檢測(cè),因此有限狀態(tài)機(jī)的這一部分僅處理啟用 4 個(gè)周期的移位寄存器。
每當(dāng)有限狀態(tài)機(jī)復(fù)位時(shí),將 shift_ena 拉高 4 個(gè)周期,然后永遠(yuǎn)為 0(直到復(fù)位)。


題目

答案

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

同步復(fù)位的優(yōu)點(diǎn):信號(hào)間是同步的,能濾除復(fù)位信號(hào)中的毛刺,有利于時(shí)序分析。
同步復(fù)位的缺點(diǎn):大多數(shù)觸發(fā)器單元是沒(méi)有同步復(fù)位端的,采用同步復(fù)位會(huì)多消耗部分邏輯資源。且復(fù)位信號(hào)的寬度必須大于一個(gè)時(shí)鐘周期,否則可能會(huì)漏掉復(fù)位信號(hào)。
有限狀態(tài)機(jī)(Finite-State Machine,F(xiàn)SM),簡(jiǎn)稱狀態(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 類(lèi):Moore?狀態(tài)機(jī)和?Mealy?狀態(tài)機(jī)。
參考內(nèi)容:
4.2 Verilog 過(guò)程賦值 | 菜鳥(niǎo)教程:
https://www.runoob.com/w3cnote/verilog-process-assign.html
4.5 Verilog 條件語(yǔ)句 | 菜鳥(niǎo)教程:
https://www.runoob.com/w3cnote/verilog-condition-statement.html
4.6 Verilog 多路分支語(yǔ)句 | 菜鳥(niǎo)教程:
https://www.runoob.com/w3cnote/verilog-case.html
5.1 Verilog 復(fù)位簡(jiǎn)介 | 菜鳥(niǎo)教程:
https://www.runoob.com/w3cnote/verilog2-reset.html
6.3 Verilog 狀態(tài)機(jī)?| 菜鳥(niǎo)教程:
https://www.runoob.com/w3cnote/verilog-fsm.html