我希望将四种基本运算(乘法、加法、减法和除法)映射到 FPGA 板上的四个键之一。我有一个 if 语句,它将检查按下了哪个键并执行适当的语句。但是,在编写始终 block 敏感度列表时,无论我在 block 中放置什么,它都不会识别所有四个键。如果我将灵敏度 block 留空,那么它将识别所有键,但将执行第一个键的操作,并等待按下其他键来执行这些操作。
always @(negedge KEY) begin
if (KEY[0] == 0) begin
...
end else if(KEY[1] == 0) begin
//Check for value for A and B
if(SW[15:8] < SW[7:0]) begin
...
end
end else if(KEY[2] == 0) begin
...
end
end
执行这样的代码将只计算连接到 KEY1 的操作。其余按键的作用就好像它们没有被编程一样。有什么办法可以解决这个小烦恼吗?
谢谢!
最佳答案
除非您正在对时钟触发器进行建模,否则应始终使用组合 block 的默认 (@*) 敏感度列表。不存在只对信号下降沿敏感的可合成组合电路。
如果您确实只想在最初按下某个键时执行某些操作,请将键状态与存储在寄存器中的上一个时钟沿的键值进行比较。
always @* begin
if(key[0] && !key_last[0]) begin
//assert some signal on key0 press
end
if(key[1] ...) begin
//assert on key1 press
end
end
always @(posedge clock) key_last <= key;
如果您打算检查多个键的状态,那么您不应该使用 if/else 语句,因为这将在第一个 true 语句之后停止检查。只需编写四个单独的 if 语句即可。
关于Verilog - 始终敏感度列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16312116/