我在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])
其他问题出现了,我无法解决。
答案 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,因此每按一次按钮只会改变一次状态。