2017-05-07 113 views
0

我的Verilog代碼有問題。我有2個時鐘 - 一個100kHz,第二個10kHz。只有當10kHz爲高電平時,我纔想用100kHz頻率切換LED。但是我的產量仍然很低。這是我的代碼:Verilog等待函數說明

module LED_toggle(
    input clock_100kHz, 
    input clock_10kHz, 

    output reg LED_PIN, 
); 
    initial begin   
     LED_PIN <= 1'b0; 
    end 

    always begin 
     if(clock_10kHz) begin 
      LED_PIN = 1'b1; 
      @(posedge clock_100kHz);    
      LED_PIN = 1'b0; 
      @(posedge clock_100kHz); 
     end 
     else begin 
      LED_PIN = 1'b0; 
     end 
    end 

endmodule 

我知道我可以在其他的方式(在100kHz的邊緣像觸發器和檢查狀態OT 10kHz時)做到這一點,但我試着去理解爲什麼@(posedge clock_100kHz);不要像我所期望的那樣行事。我也嘗試等待(clock_100kHz)insted,但這也不起作用。

我敢肯定,我的時鐘都配置正確,因爲這個代碼工作像我期望:

module LED_toggle (
    input clock_100kHz, 
    input clock_10kHz, 

    output reg LED_PIN, 
); 
    initial begin   
     LED_PIN <= 1'b0; 
    end 

    always begin 
     if(clock_10kHz) begin 
      LED_PIN = ~LED_PIN; 
     end 
     else begin 
      LED_PIN = 1'b0; 
     end 
    end 

endmodule 

,但我試着去了解什麼是錯的我等待條件。

回答

2

這可能是最好的,如果你建立這個更像HW而不是SW。你的總是起始塊更像是一個行爲模型而不是硬件表示。

看起來,基於第一個片段,您實際上希望LED以50kHz的頻率運行(因爲您在100kHz的每個邊界上切換LED輸出)?這將是我會做什麼,爲100kHz的:

assign LED_PIN = clock_10kHz & clock_100Hz; 

對於50kHz的

always @(posedge clock_100kHz) begin 
    if(clock_10kHz) LED_PIN <= ~LED_PIN 
    else   LED_PIN <= 1'b0; 
end 

什麼第一個片段不只是用在10kHz時鐘作爲柵極和基本100kHz的時鐘直接驅動LED 。

第二個片段仍然使用10kHz時鐘作爲門,但是有一個寄存器內置了驅動LED_PIN輸出的100kHz時鐘。這將使LED 50kHz有效切換,而不是您所描述/要求的100kHz,但這與您的第一個片段中的行爲相符。我假設這些時鐘是同步的,但真正的門應該同步到100kHZ時鐘域,但這是一個不同的話題。

總是開始真的是一個行爲構造。它基本上是說「總是這樣做,並且像我說的那樣儘快地完成」。在你的例子中,我不確定模擬器在clock_10kHz低時不會跑掉。許多模擬器不會看到時間語句(例如#delay或@()),並嘗試儘可能多地計算它,或者如果它足夠聰明以至於看到無限循環,那麼只是錯誤。請記住,verilog是一種基於事件的語言。在你的代碼中,有些情況下你沒有任何「事件」,只是應該發生的行爲。這可以,並會導致你一些悲傷。如果你已經完成了其他編程語言並開始使用verilog,這通常是最難掌握的部分,但是當你這樣做時,它就更有意義了。

希望這有助於!