Verilog - 始终敏感度列表

标签 verilog

我希望将四种基本运算(乘法、加法、减法和除法)映射到 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/

相关文章:

verilog - 使用数组实例化接口(interface)时无法访问 Modport

verilog - 系统verilog结构如何在硬件中实现?成员是否被声明为电线?

verilog - 在verilog中使用for循环生成

verilog - 搭载 UVM 错误

vhdl - 优化 fpga 实现的流水线吞吐量的最佳实践是什么?

verilog - verilog中的这个错误 "invalid module item"是什么?

debugging - 如何在 Modelsim 中重新启动 Verilog 仿真

verilog - 如何在 Verilog 中初始化参数数组

function - 系统Verilog/Verilog : Is there a way to find the integer bit offset of a field of a packed struct?

verilog - ALU NOOP 案例推断出一个锁存器 0x​​104567911