2

我希望将四个基本操作(乘法、加法、减法和除法)映射到位于我的 FPGA 板上的四个键之一。我有一个 if 语句,它会检查按下哪个键并执行相应的语句。但是,在编写始终阻止敏感度列表时,无论我在块中放置什么,它都不会识别所有四个键。如果我将灵敏度块留空,那么它将识别所有键,但会执行第一个键的操作并等待按下其他键以执行这些操作。

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 的操作。其余键的作用就像它们没有被编程一样。有什么办法可以解决这个小烦恼吗?

谢谢!

4

2 回答 2

3

除非您正在对时钟触发器进行建模,否则您应该始终对组合块使用默认 (@*) 灵敏度列表。没有只对信号下降沿敏感的可合成组合电路。

如果您真的只想在最初按下某个键时才做某事,则将键状态与存储在寄存器中的前一个时钟沿的键值进行比较。

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 语句。

于 2013-05-01T03:18:28.007 回答
0

您的具体问题是事件控制表达式仅在多位表达式的最低有效位上进行评估。因此,always 块只等待 KEY[0] 的下降沿。

如果这只是一个仿真模型,则有多种方法可以解决此问题。always @(negedge KEY[0], negedge KEY[1], negedge KEY[2], negedge KEY[3])会完成这项工作,就像always @*. 如果您正在合成,则应使用时钟对 4 位进行采样。

于 2013-05-01T12:09:19.487 回答