-1

我刚刚开始学习一些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])
4

2 回答 2

0

尝试一个案例陈述:

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

于 2013-09-26T18:28:30.277 回答
0

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

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

一种更简洁的方法是在块中使用if-then-elseorcase语句always

于 2013-09-22T16:40:10.903 回答