在verilog中减法

时间:2015-03-24 16:55:01

标签: verilog subtraction

我使用的代码如下:

reg [16:0] result;
reg gradient;

result = (gradient) ? (result+1) : (result-1);

我的问题在于 result = 7gradient = 0。然后我得到result = 4

它不会出现在result = 8gradient = 1 or 0以及任何其他组合中。但是在result = 13gradient = 1result = 18

二进制表示法

7-1 = 0111 - 0001 = 0110 = 6
7-1 = 0111 - 0001 = 0010 = 4

13+1 = 1101 + 0001 =   1110 = 14
13+1 = 1101 + 0001 = 1 0010 = 18

任何人都知道为什么会出现这种奇怪的行为? 我试图消除处理结果和渐变的所有其他代码行超过需要。

1 个答案:

答案 0 :(得分:1)

奇怪的行为来自您在代码中创建的组合循环。您有一个17位双通道多路复用器,它输出值gradient,后者又输出到增量器和减量器,其输出转到多路复用器的输入。这导致gradient非常快地改变其值,只有推断出的组合电路引入的延迟。在模拟中,没有延迟,这种组合环路的输出是不确定的。

要么使用另一个变量来保存多路复用器的输出......

reg [16:0] result, result2;
reg gradient;

always @* begin
  result2 = (gradient) ? (result+1) : (result-1);
end

或者你使用一个时钟寄存器来改变每个时钟周期的值(这很可能是你想要的),我猜:

reg [16:0] result;
reg gradient;

always @(posedge clk) begin
  result <= (gradient) ? (result+1) : (result-1);
end