【问题标题】:Determine whether a binary number is of power of two in verilog code在verilog代码中确定二进制数是否是2的幂
【发布时间】:2019-09-30 13:28:33
【问题描述】:

我正在尝试确定一个二进制数是否为 2 的幂(换句话说,它是否为 one-hot 编码)。

我找到了一个 method 这样做,但它是整数。

谁能帮忙改造一下verilog中二进制数的使用方法?

【问题讨论】:

  • 想一想:整数是如何存储的?
  • @Oldfart 我也和你刚才的想法一样。但是,当您尝试在 verilog 中实现代码并将代码传递给 verilator 进行 linting 时,您就会明白我为什么要发布这个问题。
  • Verilator 抱怨什么?它可能是错误的,或者它可能不喜欢你使用'int'并想要'integer'。
  • 想想二进制位。如果 v 是 8 位怎么办? ! 和_&_ 是做什么的?在这种情况下 f 应该只有 1 位吗?
  • 发布您尝试过的内容以及遇到的错误。

标签: verilog fpga one-hot-encoding


【解决方案1】:

您的代码没有任何问题——这是您使用的工具的限制。
Verilator 需要带有输入和输出的代码,以便对其进行激励并显示结果。
它也不喜欢对多位操作数执行逻辑运算符。

module is_power_of_two(output reg f);

reg [7:0];
initial begin
   #1 v = 8'b11110000;
   #1;
end

always @(*) f = v != 0 && !((v & v - 1) != 0);

endmodule

【讨论】:

  • @Oldfart 有人建议我使用更简单的 power_of_two = ^v。有什么意见吗?
  • @kevin,减少异或将检查设置位计数奇偶校验,而不是两个属性的幂。比如说,对于数字 4 和 7,减少 xor 会报告为真,但 7 不是 2 的幂。
  • 好的,顺便说一句,always @(*) f = |v & (&(v & v - 1)); 也很好用
  • 归约或|v在逻辑上等同于不等于0 v!=0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多