2013-05-01 263 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