2012-01-19 92 views
1

作爲一個大型程序的一部分,我想在DE2板上依次激活綠色LED(0到8),當我按下按鍵[1]時。當我按下按鍵[2]時,它們應該以相反的順序一次關閉一個。我很確定DE2板鍵是低電平有效的。這是我的代碼:始終阻止被忽略

[email protected](negedge KEY[1], negedge KEY[2]) 
begin 

    if(~KEY[1]) 
    begin 
     LEDGValue <= LEDGValue << 1; 
     LEDGValue[0] <= 1; 
    end 

    else if(~KEY[2]) 
     LEDGValue[0] <= LEDGValue >> 1; 

end 

而是所有的綠色LED指示燈一亮起來,只要我加載程序。此時KEY [1]和KEY [2]無效。任何人都看到我的代碼有問題嗎?

回答

2

下面是一個邊緣檢測器。

module edge_detector (
    input wire clk, 
    input wire in, 
    output wire negedge_out 
); 

reg in_reg= 1'b0; 

wire in_next = in; 

assign negedge_out = ({in_reg,in) == 2'b10); 

always @(posedge clk) in_reg <= in_next; 

endmodule 

下面介紹如何使用邊緣檢測器。

reg [8:0] LEDGValue = 0, LEDGValue_next; 

wire key1_edge; 
wire key2_edge; 

edge_detector 
key1_edge_detector_inst (
    .clk(clk), 
    .in(KEY[1]), 
    .negedge_out(key1_edge) 
); 

edge_detector 
key2_edge_detector_inst (
    .clk(clk), 
    .in(KEY[2]), 
    .negedge_out(key2_edge) 
); 

always @* begin : combinational_logic 
    LEDGValue_next = LEDGValue; 
    if (key1_edge) 
     LEDGValue_next = {LEDGValue[7:0], 1'b1}; 
    else if (key2_edge) 
     LEDGValue_next = {1'b0, LEDGValue[8:1]}; 
end 

always @(posedge clk) begin : sequential_logic 
    LEDGValue <= LEDGValue_next; 
end 

的關鍵是,key1_edgekey2_edge信號僅用於單個時鐘週期斷言。

+0

該代碼是非常有幫助的;它解決了這個問題。謝謝。 – Andrew 2012-01-21 21:01:55

+0

因爲沒有時鐘,所以你所要做的就是所謂的異步邏輯。事實證明,FPGA設計的假設是所有邏輯都是同步的並將使用時鐘。在FPGA上實現異步邏輯是可能的,但現在這是一場艱苦的戰鬥,最好還是留給專家。 – 2012-01-22 01:51:34

0

我不是Verilogger,但看起來好像你在要求代碼觸發兩個不同的信號的邊沿。這不是我可以合成的體驗,但合成器可能會嘗試,並警告(除了其他警告之外),它的做法並非你真正意義上的。


編輯:以下不適用於提及,因爲它已經消除抖動船上硬件(感謝NathanFarrington指出了這一點),但我離開這裏的情況下,它是使用於其他讀者的板:


即使合成成功,邊沿觸發的開關輸入是一種可怕的想法:the switch will bounce several times當你按下它,而FPGA很容易足夠快的看到所有的邊。

你需要的是一個從一個好的時鐘源(毫無疑問是一塊晶體)的時鐘來監控每個時鐘事件的開關信號。

爲每個信號保留一個計數器,每當信號爲1時遞增一次,每當信號爲0時遞減。將這些計數器鉗位在0處,並且允許有足夠的時間讓交換機穩定下來(一些毫秒可能就足夠了)。

一旦計數器達到其「旅行」的任何一端,只有然後你採取了一些行動(如移動你的LEDGValue)。記住等待開關被釋放後(等待計數到另一端)。

+0

此鏈接表示四個按鈕已經使用施密特觸發器進行了去抖動,因此在FPGA中無需執行任何操作:http://courses.engr.illinois.edu/ece385/documents/DE2_UserManual.pdf – 2012-01-19 12:08:59

+0

@NathanFarrington :謝謝,我沒有意識到董事會的細節......我會更新我的答案 – 2012-01-19 15:07:40

-1

它應該是

[email protected](negedge KEY[1] OR negedge KEY[2]) 
+1

2分:1. Verilog區分大小寫:'OR'應該是'or'。 2.逗號支持IEEE 1364-2001規範的語法。 – toolic 2012-01-19 14:46:38

+0

事實上,我還沒有使用Verilog的年齡 – xucheng 2012-01-19 15:48:21