HDLBits (33) — 多路分支语句
高冠避役
2022年02月08日 00:52
收录于文集
共184篇

本题链接:

https://hdlbits.01xz.net/wiki/Always_case

Verilog中的case语句几乎等同于多个if-elseif-else,它将一个表达式与其他表达式的列表进行比较。它的语法和功能于C中的switch语句

代码块
clike
自动换行
复制代码
always @(*) begin     // This is a combinational circuit
    case (in)
      1'b1: begin 
               out = 1'b1;  // begin-end if >1 statement
            end
      1'b0: out = 1'b0;
      default: out = 1'bx;
    endcase
end
复制成功
  • case语句以case开头,每个“case项”以冒号结尾而不是“switch”。

  • 每个case项只能执行一条语句,这使得C中使用的“break”变得不必要。但这意味着,如果在一个case项中执行多个语句,则必须使用begin ... end

  • 允许重复(部分重叠)case项,此时使用第一个匹配的。然而C不允许重复的case项。


题目

如果有大量的cases,case语句比if语句更方便。在本练习中你需要创建一个当sel在0和5之间时选择相应的数据输入的6:1多路复用器。如果sel不在0和5之间则输出0。数据输入和输出均为4位宽。注意可能会导致的锁存(请参阅always_if2​

代码块
clike
自动换行
复制代码
// synthesis verilog_input_version verilog_2001
module top_module ( 
    input [2:0] sel, 
    input [3:0] data0,
    input [3:0] data1,
    input [3:0] data2,
    input [3:0] data3,
    input [3:0] data4,
    input [3:0] data5,
    output reg [3:0] out   );
复制成功


答案

代码块
clike
自动换行
复制代码
// synthesis verilog_input_version verilog_2001
module top_module ( 
    input [2:0] sel, 
    input [3:0] data0,
    input [3:0] data1,
    input [3:0] data2,
    input [3:0] data3,
    input [3:0] data4,
    input [3:0] data5,
    output reg [3:0] out   );//

    always@(*) begin  // This is a combinational circuit
        case (sel)
            3'b000: begin 
                out = data0;  // begin-end if >1 statement
            end
            3'b001: begin 
                out = data1;  // begin-end if >1 statement
            end
            3'b010: begin 
                out = data2;  // begin-end if >1 statement
            end
            3'b011: begin 
                out = data3;  // begin-end if >1 statement
            end
            3'b100: begin 
                out = data4;  // begin-end if >1 statement
            end
            3'b101: begin 
                out = data5;  // begin-end if >1 statement
            end
            default: out = 0;
        endcase
    end

endmodule
复制成功


输出波形


case 语句是一种多路条件分支的形式,可以解决 if 语句中有多个条件选项时使用不方便的问题。

case 语句格式如下:

代码块
clike
自动换行
复制代码
case(case_expr)
    condition1     :             true_statement1 ;
    condition2     :             true_statement2 ;
    ……
    default        :             default_statement ;
endcase
复制成功

case 语句执行时,如果 condition1 为真,则执行 true_statement1 ; 如果 condition1 为假,condition2 为真,则执行 true_statement2;依次类推。如果各个 condition 都不为真,则执行 default_statement 语句。

default 语句是可选的,且在一个 case 语句中不能有多个 default 语句。

条件选项可以有多个,不仅限于 condition1、condition2 等,而且这些条件选项不要求互斥。虽然这些条件选项是并发比较的,但执行效果是谁在前且条件为真谁被执行。

ture_statement1 等执行语句可以是一条语句,也可以是多条。如果是多条执行语句,则需要用 begin 与 end 关键字进行说明。case 语句支持嵌套使用。

参考资料:

4.6 Verilog 条件语句 | 菜鸟教程: https://www.runoob.com/w3cnote/verilog-case.html