我希望将四个基本操作(乘法,加法,减法和除法)映射到位于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的操作。其余的键就好像没有编程一样。这有什么小麻烦吗?
谢谢!
答案 0 :(得分: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语句,因为这将在第一个真实语句之后停止检查。只需写下四个if语句。
答案 1 :(得分:0)
您的具体问题是事件控制表达式仅在多位表达式的最低有效位上进行计算。因此,always块只等待KEY [0]的下降沿。
如果这只是一个模拟模型,有多种方法可以解决这个问题。 always @(negedge KEY[0], negedge KEY[1], negedge KEY[2], negedge KEY[3])
会像always @*
一样完成这项工作。如果您正在合成,则应使用时钟对4位进行采样。