Verilog语言之结构语句:if、case

本文详细介绍了Verilog语言中的if语句和case语句的使用,强调了在编写代码时避免产生锁存器的重要性。if语句用于创建2选1选择器,但需要注意始终为输出提供值以保持电路组合性。case语句则等同于一系列if-elseif-else,同时提到了casez和casex的用法,特别是在优先编码器中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

if语句

一个if语句通常可以创造出一个2选1选择器,当条件为真时选择一个输入,为假时选择另一个。

always @(*) begin
    if (condition) begin
        out = x;
    end
    else begin
        out = y;
    end
end

这等同于连续性赋值语句的条件运算符:

assign out = (condition) ? x : y;

然而if语句也增加了更多制造错误方式,只有当out总是被赋值时电路才是组合型的。~Always if - HDLBits


 一个普遍的错误来源:如何避免制造锁存器

当我们设计一个电路时,首先要考虑的应该是电路

  • 我想要一个逻辑门
  • 我想要一个三输入三输出的组合逻辑
  • 我想要一个有一系列触发器的组合逻辑电路

一定不要先写代码,然后希望由代码产生一个适当的电路。

  • If (cpu_overheated) then shut_off_computer = 1;
  • If (~arrived) then keep_driving = ~gas_tank_empty;

语法正确的代码不一定会产生一个合理的电路(组合逻辑+触发器)。通常的原因是:我们需要考虑在我们指定的情况之外发生了什么?Verilog的回答是:保持输出不变。

保持输出不变这个行为意味着当前状态需要被记住,因此就产生了一个锁存器。组合逻辑(比如逻辑门)不能记住任何状态。注意这条信息:Warning (10240): ... inferring latch(es),除非是我们有计划的产生一个锁存器,它通常意味着一个bug。组合电路必须在所有条件下都给输出信号赋一个值,这也就意味着我们必须写else从句,或者是在这个always过程块的第一句也就是case之前,就给输出信号提前赋一个默认值。case语句中同样要注意这个问题。

always @(*) begin
    up = 1'b0; down = 1'b0; left = 1'b0; right = 1'b0;
    case (scancode)
        ... // Set to 1 as necessary.
    endcase
end

Always if2 - HDLBits


case语句

在Verilog中case语句等同于一系列的if-elseif-else语句,在这些语句中把一个条件表达式和其他的相比较。它的语法和功能不同于c语言中的switch。

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可选项以冒号:结束。
  • 每个case选项可以准确地执行一条语句。这意味着如果你需要执行多条语句,那么你必须使用begin...end。
  • 重复(和部分重复)case选项是被允许的,将会执行第一个匹配的case选项。

casez、casex 

在优先编码器中经常会用到casez,case语句的行为就像是按顺序检查每一项(事实上,更像一个巨大的真值表),一旦第一项符合就不会再执行后面的可选项了,因此为了编码时缩短代码和编码后方便阅读,可选项可以部分重复。

always @(*) begin
    casez (in[3:0])
        4'bzzz1: out = 0;   // in[3:1] can be anything
        4'bzz1z: out = 1;
        4'bz1zz: out = 2;
        4'b1???: out = 3;
        default: out = 0;
    endcase
end
  • casex和casez类似,它把x和z都会当做don't care,其实casex并没有什么卵用,casez就足够用了。
  • 问号?是z的同义词,因此 2'bz0 和 2'b?0 是一样的。

Always casez - HDLBits

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值