【问题标题】:How do I add 1 to a 4 bit wire in Verilog如何在 Verilog 中将 1 添加到 4 位线
【发布时间】:2015-09-25 00:38:02
【问题描述】:

这似乎很简单,但我无法在任何地方找到如何做到这一点......我想要做的就是将 1 添加到 4 位线。

总的来说,我想计算一个 8 位变量中 1 的数量。让我们将此输入称为inA。输出将是 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)非常陌生,所以我真的不知道我做错了什么。

【问题讨论】:

    标签: verilog


    【解决方案1】:

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

      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 &lt;= outA + 1 这样的非阻塞赋值将安排在always 块的末尾执行,这样最后一个赋值将覆盖 所有以前的。

    由于outA(顺便说一下,如果您的for 循环嵌入在always 块中,则它必须是reg),仅在always 块完成“执行”后更新,只有inA[7] 可以导致增加到outA

    查看my answer here 以获取有关如何执行always 块的更多信息。

    【讨论】:

    • 这太完美了,谢谢!我假设添加一个,然后为输出分配一个的值是我所缺少的。再次感谢您!
    • @Apolymoxic 为什么需要wire 的值?
    • @Morgan 我认为这不是绝对需要的......这只是我开始的地方。它应该模拟一个输出,而在一个真正运行的硬件程序中,它不是一根电线吗?
    • 不,reg 与 wire 是语言语法与硬件无关,reg 并不意味着触发器寄存器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2021-07-24
    相关资源
    最近更新 更多