官术网_书友最值得收藏!

2.3 i f-else 與case 語句實戰演練

在Verilog HDL 語言中存在如下兩種分支語句。

● if-else:條件分支語句。

● case:分支控制語句。

看到它們兩個,小芯總能想起一個成語:歡喜冤家。很多人問我:“在編寫代碼時,if-else語句和case 語句,哪個更好用呢?” 同樣的邏輯,既可以通過if-else 語句實現,也可以通過case 語句實現。從這個角度來看,它們的功能好像是重復的,是 “職業競爭” 的關系,但是在很多場合,case 語句和if-else 語句總是同時出現,互相嵌套,密切配合。

2.3.1 if-else 條件分支語句

if-else 條件分支語句的作用是根據指定的判斷條件是否滿足來確定下一步要執行的操作。它在使用時可以采用如下三種形式。

1.第一種形式

if-else 條件分支語句的第一種形式如下:

img

在這種形式中沒有出現else 語句,此時,if-else 條件分支語句的執行過程如下。

● 如果指定的<條件表達式>成立(也就是這個條件表達式的邏輯值為1),則執行if-else 條件分支語句內的 “語句或語句塊”,并退出if-else 條件分支語句。

● 如果<條件表達式>不成立(也就是條件表達式的邏輯值為0),則不執行if-else 條件分支語句內的 “語句或語句塊”,直接退出if-else 條件分支語句。

例如,編寫程序1,代碼如下。

img
img

得到的仿真波形如圖2.3 所示。

img

圖2.3

在執行程序1 中的代碼時,會根據條件表達式 “sel==1” 是否成立來決定是否執行賦值語句 “out=a;”:如果 “sel==1” 成立,則執行賦值語句 “out=a;”,即輸出信號out 得到a 的值;如果“sel==1”不成立,則不執行賦值語句 “out=a;”,即輸出信號out 保持原有值不變。

2.第二種形式

if-else 條件分支語句的第二種形式如下:

img

第二種形式的if-else 條件分支語句將以如下方式執行。

● 如果指定的<條件表達式>成立(條件表達式的邏輯值為1),則執行if-else 條件分支語句內的 “語句或語句塊1”,并退出if-else 條件分支語句。

● 如果指定的<條件表達式>不成立(條件表達式的邏輯值為0),則執行if-else 條件分支語句內的 “語句或語句塊2”,并退出if-else 條件分支語句。

例如,編寫程序2,代碼如下。

img

得到的仿真波形如圖2.4 所示。

img

圖2.4

在執行程序2 中的代碼時,會根據條件表達式 “sel==1” 是否成立來決定執行哪條賦值語句。

● 如果 “sel==1” 成立,則執行賦值語句 “out=a;”,將a 的值賦給輸出信號out。

● 如果 “sel==1” 不成立,則執行賦值語句 “out=b;”,將b 的值賦給輸出信號out。

3.第三種形式

if-else 條件分支語句的第三種形式如下:

img

在執行這種形式的if-else 條件分支語句時,將按照各分支語句的排列順序對各個條件表達式是否成立做出判斷,當遇到某一項的條件表達式成立時,則執行這一項所指定的語句或語句塊;如果所有的條件表達式都不成立,則執行else 后的語句或語句塊n。

第三種形式的if-else 條件分支語句實現了多路分支的選擇、控制功能。例如,編寫程序3,代碼如下。

img
img

得到的仿真波形如圖2.5 所示。

img

圖2.5

如果 “sel1==1” 成立,則第一個分支項的條件表達式成立,執行 “out=a; ”語句,即將將a 的值賦給輸出信號out;如果 “sel1==1” 不成立,“sel2==1” 成立,則第二個分支項的條件表達式成立,執行 “out=b;” 語句,即將b 的值賦給輸出信號out;如果 “sel1==1” 不成立,“sel2==1” 也不成立,則執行 “out=c;” 語句,即將c 的值賦給輸出信號out。

4.if-else 條件分支語句的嵌套使用

if-else 條件分支語句的嵌套使用方法如下:

img

2.3.2 case 分支控制語句

case 分支控制語句是一種用來實現多路分支控制的語句。與使用if-else 條件分支語句相比,通過case 分支控制語句實現多路分支控制顯得更加方便和直觀。

case 分支控制語句通常用于對微處理器指令譯碼功能的描述,以及對有限狀態機的描述。

case 分支控制語句的示意代碼如下:

img

控制表達式是對程序流向進行控制的信號;分支語句用于控制表達式的具體取值,在實際使用中,分支語句通常是一些常量表達式;語句塊是在各個分支語句下所要執行的操作,可由單條語句構成;以關鍵詞default 開頭的語句塊被稱為default 分支項,是可以省略的。

Case 分支控制語句的執行過程如下:

● 若控制表達式的值等于分支語句1,則執行語句塊1。

● 若控制表達式的值等于分支語句2,則執行語句塊2。

● ……

● 若控制表達式的值等于分支語句n,則執行語句塊n。

● 若控制表達式的值不等于任何分支語句,則執行語句塊n+1。

小芯溫馨提示

在執行了某一分支語句后,將會退出case 分支控制語句,終止case 分支控制語句的執行。case 分支控制語句中的各個分支語句的值必須互不相同,否則就會出現矛盾現象。

例如,編寫程序4,代碼如下。

img
img

得到的仿真波形如圖2.6 所示。

img

圖2.6

在執行case 分支控制語句時,控制表達式的值和分支語句之間的比較是一種 “全等比較”,也就是說,只有在分支語句和控制表達式的值完全相同(對應的每一位完全相同)的情況下,才能認為分支語句和控制表達式的值相等,對應的語句塊才會被執行。

小芯溫馨提示

在執行if-else 條件分支語句時,會按照優先級的順序執行語句;在執行case 分支控制語句時,各分支語句之間無優先級之分,只要控制表達式的值和分支語句相等,就能執行對應的語句塊。

主站蜘蛛池模板: 廉江市| 望谟县| 玉环县| 青河县| 静海县| 佛坪县| 旅游| 永吉县| 黎平县| 永兴县| 泗水县| 玛沁县| 白玉县| 年辖:市辖区| 镇坪县| 桦南县| 盐城市| 兴海县| 哈密市| 南充市| 和静县| 都江堰市| 乌拉特前旗| 安宁市| 永丰县| 鲁山县| 定陶县| 名山县| 罗定市| 南平市| 鄄城县| 长兴县| 道真| 韩城市| 延长县| 普安县| 太仓市| 和林格尔县| 黄龙县| 扎兰屯市| 敖汉旗|