【问题标题】:Simple "Assign" Function简单的“分配”功能
【发布时间】:2013-09-22 14:23:25
【问题描述】:

我刚开始学习一些verilog,遇到了一个问题,在其他语言中通常可以使用for循环来解决。

s2 s1 s0 m
 0  0  0 u
 0  0  1 v
 0  1  0 w
 0  1  1 x
 1  0  0 y
 1  0  1 z

这是问题的真值表,其中 s2,s1,s0 是开关,(u,v,w,x,y,z) 是输入,如果设置了某些开关,则将设置输出 (m)作为输入之一。但是,这只有 1 位宽,如果 s0,s1,s2 匹配,我们可以将每个 m 分配为以下输入之一。如果它是 3 位宽输入和输出 ex:(u0,u1,u2),(m0,m1,m2) 但每个变量仍然遵循相同的逻辑(例如:u0,u1,u2 都将是如果所有开关均为 0,则输出 m0、m1、m2)如何缩短我的代码。我可以这样做吗:

assign m[3:0] = (~s0&~s1&~s2&u[3:0])

【问题讨论】:

    标签: verilog assign


    【解决方案1】:

    不,这不是一个好的解决方案。在执行& 操作之前,Verilog 会将您的选择信号扩展为与 m 相同的宽度,默认行为是在左侧添加零以扩展信号。如果您声明要签名的选择信号可能会起作用,但我认为您可以做得更好。

    此外,您提供的示例仅涉及真值表的第一行。对于s0s1s2 的其他七种组合,您将把所有零分配给m。如果您想在单个组合赋值中执行此操作,那么您将需要 8 个逻辑表达式,就像您所拥有的一样,全部 OR 运算得到最终结果。

    更简洁的方法是在 always 块中使用 if-then-elsecase 语句。

    【讨论】:

      【解决方案2】:

      尝试一个案例陈述:

      always @* begin
        case ({s2,s1,s0})
          3'b000 : m = u;
          3'b001 : m = v;
          3'b010 : m = w;
          3'b011 : m = x;
          3'b100 : m = y;
          3'b101 : m = z;
          default: m = 0; /* <-- catch all */
        endcase
      end
      

      注意:如果真值表不完整,请使用default。否则会推断出一个闩锁。

      工作示例:http://www.edaplayground.com/s/6/187

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-27
        • 2011-01-25
        • 2010-09-13
        • 1970-01-01
        相关资源
        最近更新 更多