我正在使用DE2-70板,我正在尝试使用它的一些按钮作为输入。按钮在0处激活,我需要检查特定的两个按钮是否分别按预先设定,以增加/减少数字。
我尝试了以下操作,其中iKEY是按钮,位置是我要修改的数字:
reg [4:0] position;
position = 5'b0;
output wire enable = !(iKEY[3] && iKEY[2]);
always @(posedge enable) begin
if(iKEY[3] == 0)
position = position + 5'b00001;
if(iKEY[2] == 0)
position = position - 5'b00001;
end
我尝试了这种实现的几个不同之处,例如在设置启用信号时改变ifs条件或更改逻辑功能,但我总是遇到一些问题。 我是硬件逻辑的新手,所以也许我用错误的方式思考它
编辑: 如果同时按下两个按钮,我希望硬件既不增加也不减少数量
答案 0 :(得分:2)
聊天讨论摘要:
iKEY
是4位有效低电平输入。输入源来自物理按钮,iKEY
,iCLK_50
解决方案用于意外执行的操作:
将所有iKEY
全部移动到一个始终阻止,并使用case语句解码操作。例如:
case(iKEY[3:0]) // one-cold, full-case
4'b1110: /* operation 0 */
4'b1101: /* operation 1 */
4'b1011: /* operation 2 */
4'b0111: /* operation 3 */
default: /* default behavior */
endcase
如果使用iKEY
作为时钟事件,则执行逐位NAND操作:
wire enable = ~&iKEY[3:0];
如果使用iCLK_50
时钟,则添加一个注册表以观察按钮释放,以确保每个按钮按下一个操作。例如:
if (allow_op) begin // value from past clock event
/* case statement defined above */
end
// value for next clock event
allow_op = &iKEY[4:0]; // bit-wise AND
答案 1 :(得分:0)
您可能应该在按下按钮时寻找更改。下面的代码查找iKEY [3]输入的下降沿。否则,只要按下IKEY,该计数器就会变为NUTS并开始像疯了一样递增或递减。
reg iKEY3_LAST;
output wire enable = !(iKEY[3] && iKEY[2]);
always @(posedge enable) begin
iKEY3_LAST = iKEY[3];
if(iKEY[3] == 0 && iKEY3_LAST == 1)
position = position + 5'b00001;
答案 2 :(得分:0)
首先,你有一个信号位置的组合循环。当enable = 1时,位置会改变,然后一次又一次地改变。模拟通常会陷入这种情况,就像现实世界一样,它取决于你的工具如何实现它;我猜他们中的大多数都会打破循环。查找日志中的任何错误或警告。 你希望position是一个翻牌,所以它不是一个循环,但每个时钟周期都会增加1:
always @(posedge clock or posedge reset)
if (reset)
position <= 5'h0;
else
position <= position + iKEY[3] - iKey[2];
现在你必须考虑按钮引入弹跳效果。查看here以获取更多信息。你可能想要实现数字交换机Debouncing。
正如拉塞尔写的那样,你可能会考虑仅在按钮的下降沿改变位置,否则计数器会像疯了一样上溢/下溢。