作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 verilog 中,我有一个二进制值数组。如何取减去值的绝对值?
Verilog代码:
module aaa(clk);
input clk;
reg [7:0] a [1:9];
reg [7:0] s [1:9];
always@(posedge clk)
begin
s[1] = a[1] - a[2];
s[2] = a[2] - a[3];
s[3] = a[1] + a[3];
end
endmodule
我希望我的 s[1]
和 s[2]
值始终为正。我怎样才能在可综合的verilog中做到这一点?
我尝试使用signed reg
,但它显示错误。
最佳答案
无论号码是否signed
or not 仍然使用二进制补码,可以在位级别正确执行加法和减法。
如果要将数字解释为带符号的,则可以使用 MSB 来判断它是正数 (0) 还是负数 (1)
要绝对数字,只需根据 MSB 反转即可:
reg [31:0] ans ; // Something else drives this value
reg [31:0] abs_ans; // Absolute version of ans
// invert (absolute value)
always @* begin
if (ans[31] == 1'b1) begin
abs_ans = -ans;
end
else begin
abs_ans = ans;
end
end
注意:使用 =
因为它是一个组合 block ,如果使用触发器(边沿触发),请使用 <=
正如@TzachiNoy 所提到的。
关于Verilog:如何取绝对值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19423792/
我是一名优秀的程序员,十分优秀!