如何在 Verilog 中将 1 加到 4 位线

How do I add 1 to a 4 bit wire in Verilog

这看起来很简单,但我无法在任何地方找到如何做到这一点...我只想将 1 加到 4 位线。

总的来说,我想计算一个 8 位变量中 1 的个数。我们称此输入为 A。输出将是 outA。两者都定义为电线; inA 是 8 位,其中 outA 是 4 位。

wire[0:7] inA;
wire[0:3] outA;

我可以做一个 for 循环来遍历数组:

for (i = 0; i <= 7; i = i + 1) begin
    if (inA[i] == 1) begin
       outA <= outA + 1;
    end
end

但这不起作用。 有人可以帮忙吗?我对 Verilog(和 VHDL)非常陌生,所以我真的不知道我做错了什么。

有几种方法可以做到这一点,这里是一种选择:

  reg [0:3] ones;
  integer i;
  always @ (inA) begin
    ones = 0;
    for (i = 0; i < 8; i = i + 1) begin
      ones = ones + inA[i];
    end
  end
  assign outA = ones;

由于您没有提供完整的源代码(例如 for 循环的上下文),我们只能猜测问题所在。

请记住,像 outA <= outA + 1 这样的非阻塞赋值将 安排在 always 的末尾执行,这样最后一个分配将覆盖所有以前的分配。

因为 outA(顺便说一句,如果你的 for 循环嵌入在 always 块中,它必须是 reg),仅在之后更新always 块已完成 "executing",只有 inA[7] 可以导致增量到 outA

查看 my answer here 了解有关如何执行 always 块的更多信息。