我使用的代码如下:
reg [16:0] result;
reg gradient;
result = (gradient) ? (result+1) : (result-1);
我的问题在于
result = 7
和gradient = 0
。然后我得到result = 4
。
它不会出现在result = 8
和gradient = 1 or 0
以及任何其他组合中。但是在result = 13
和gradient = 1
到result = 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
任何人都知道为什么会出现这种奇怪的行为? 我试图消除处理结果和渐变的所有其他代码行超过需要。
答案 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