Verilog Multiple如果没有按预期工作

时间:2014-04-05 18:59:15

标签: verilog fpga

我在Altera DE0板上使用了三个按钮。

我将其声明为

    input [2:0] Button;
    reg [2:0] y;
    parameter [2:0] S0 = 3'b000, S1 = 3'b001, S2 = 3'b010, S3 = 3'b011, S4 = 3'b100, S5 = 3'b101;

我有一个基于三个按钮值的嵌套if-else语句

always@(negedge (&Button))
//if(&Button == 0)
begin
if(Button == 3'b011)   // Button 2 is pressed
begin
if(y == S0)
    begin
    y = S1;
    end
end
else if(Button == 3'b101)  // Button 1 is pressed
begin
if (y == S1)
    begin
    y = S2;
    end
else if (y == S2)
    begin
    y = S3;
    end
end
else if(Button == 3'b110)  //This is the check on button 0, but this conditional statement does not work. 
begin
if(y == S2)
    begin
    y = S3;
    end
end
end

assign z =  (y == S0);     // z,z1,z2,z3 are LED's on the board
assign z1 = (y == S1);
assign z2 = (y == S2);
assign z3 = (y == S3);

当我在DE0板上使用if-else语句的前两个按钮(按钮== 3'b011和按钮== 3'b101)标记为BUTTON2和BUTTON1时,代码正常工作并且y变为正确的值如预期的那样。

但是当我在if-else中尝试第三个按钮时,按钮== 3'b011,在DE0上标记为BUTTON0,没有任何反应,y没有得到预期的值。我使用了2个不同的DE0板,出现了同样的问题。

我认为这与

有关
always@(negedge (&button))

因为没有检测到第三次按下按钮。但是当我使用像

这样的代码时
always@(negedge button[0] or negedge button[1] or negedge button[2])

其他问题出现了,我无法解决。

1 个答案:

答案 0 :(得分:2)

您需要考虑要尝试建模的硬件。 always @(negedge或更一般地,边沿触发的始终块,用于暗示通常由时钟驱动并重置的触发器。

数据信号可以像Frequency Divider中一样用作时钟。但是,使用一元&组合减少运算符会导致实际硬件出现故障。

我提到过你想要的硬件,因为你有这个结构:

always@(negedge button[0] or negedge button[1] or negedge button[2])

在硬件上没有相应的东西。

您可能会发现此Altera FSM example有用。您可能会implement edge detection from this question,因此每按一次按钮只会改变一次状态。