2013-05-01 59 views
1

我正在寻找映射四个基本操作(乘法,加法,减法和除法)到位于我的FPGA板上的四个键之一。我有一个if语句来检查哪个键被按下并执行相应的语句。但是,无论我在块中放置什么,在编写always block sensitivity列表时,它都不会识别所有四个密钥。如果我将灵敏度块留空,则它将识别所有的键,但将执行第一个键的操作并等待其他键被按下以执行这些操作。Verilog - 总是敏感列表

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的操作。其余的按键就好像它们没有被编程一样。有没有解决这个小烦恼的方法?

谢谢!

回答

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

+2

我大部分都同意@ Tim的回答,但是想补充一点,'@negedge signal'只是意味着一个带时钟'信号'的触发器。但是,你所拥有的并不是一个单一的东西,而是一个4位总线。甚至不知道什么时候真的会触发,可能是4'b0000? – Morgan 2013-05-01 07:00:44

0

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

如果这只是一个模拟模型,有多种方法可以解决这个问题。 always @(negedge KEY[0], negedge KEY[1], negedge KEY[2], negedge KEY[3])可以完成这项工作,always @*也是如此。如果你正在综合,你应该使用一个时钟来采样4位。

+0

您能否扩展您的答案以涵盖为什么您认为应该对4位进行采样,并猜测您正在考虑元稳定性,因为它们是异步输入。 – Morgan 2013-05-01 12:54:37