如何在 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
块的更多信息。
这看起来很简单,但我无法在任何地方找到如何做到这一点...我只想将 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
块的更多信息。