HDLBits (32) — 條件判斷語句鎖存
本題鏈接:
https://hdlbits.01xz.net/wiki/Always_if2
一個(gè)常見錯(cuò)誤:如何避免被鎖
設(shè)計(jì)電路時(shí),必須首先考慮電路:
我想要這個(gè)邏輯門
我想要一個(gè)邏輯的組合塊,它有這些輸入并產(chǎn)生這些輸出
我想要一個(gè)邏輯的組合斑點(diǎn)后面跟著一組觸發(fā)器
你不能先寫代碼,然后希望它生成一個(gè)正確的電路
如果?(cpu_overheated)?那么shut_off_computer = 1;
如果?(~arrived)?,那么keep_driving = ~gas_tank_empty;
語法正確的代碼不一定會(huì)產(chǎn)生合理的電路(組合邏輯+觸發(fā)器)。通常的原因是:“除了你指定的人之外的情況下會(huì)發(fā)生什么?”。Verilog的回答是:保持輸出不變。
這種“保持輸出不變”的行為意味著需要記住當(dāng)前狀態(tài),從而產(chǎn)生鎖存。組合邏輯電路(例如邏輯門)不能記住任何狀態(tài)。留意 Warning (10240): ... inferring latch(es)"? 消息。除非鎖存是有意的,否則它幾乎總是意味著出現(xiàn)了錯(cuò)誤。組合電路必須在所有條件下為所有輸出分配一個(gè)值,所以通常來說你始終需要else子句或指定輸出默認(rèn)值。
示例
以下代碼包含導(dǎo)致鎖存的錯(cuò)誤行為。修復(fù)這些錯(cuò)誤,最后的結(jié)果是你只有在電腦過熱時(shí)才會(huì)關(guān)閉電腦,如果你到達(dá)目的地或需要加油時(shí)停止開車。


題目

答案

輸出波形


條件(if)語句用于控制執(zhí)行語句要根據(jù)條件判斷來確定是否執(zhí)行。
條件語句用關(guān)鍵字 if 和 else 來聲明,條件表達(dá)式必須在圓括號(hào)中。
條件語句使用結(jié)構(gòu)說明如下:
if 語句執(zhí)行時(shí),如果 condition1 為真,則執(zhí)行 true_statement1 ;如果 condition1 為假,condition2 為真,則執(zhí)行 true_statement2;依次類推。
else if 與 else 結(jié)構(gòu)可以省略,即可以只有一個(gè) if 條件判斷和一組執(zhí)行語句 ture_statement1 就可以構(gòu)成一個(gè)執(zhí)行過程。
else if 可以疊加多個(gè),不僅限于 1 或 2 個(gè)。
ture_statement1 等執(zhí)行語句可以是一條語句,也可以是多條。如果是多條執(zhí)行語句,則需要用 begin 與 end 關(guān)鍵字進(jì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í)慣。
參考資料:
4.5 Verilog 條件語句 | 菜鳥教程:
https://www.runoob.com/w3cnote/verilog-condition-statement.html