2017-05-07 45 views
0

Verilogコードに問題があります。私は2つのクロックを持っています - 100kHz、2番目の10kHz。私は、10kHzがHIGHの時に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)が、これも動作しません。

私は期待のように、このコードが動作するので、私は、私の時計が正しく設定されていることを確信している:

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

これをSWの代わりにHWのように構築した方がよいでしょう。あなたのいつもの開始ブロックは、HW表現よりも行動モデルのように機能します。

実際にLEDを50kHzで動作させる最初のスニペットに基づいています(100kHzの各出力にLED出力を切り替えているので)。最初のスニペットは基本的に100kHzのクロックは直接LEDを駆動するだけのゲートとして10kHzのクロックを使用されず、どのような50kHzの

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

について

assign LED_PIN = clock_10kHz & clock_100Hz; 

:これは私が100kHzのために、何をするのかだろう。

2番目のスニペットは10kHzクロックをゲートとして使用しますが、LED_PIN出力を駆動する100kHzクロックでクロックされるレジスタが構築されています。これはあなたが記述した100kHzの代わりに50kHzのLEDを効果的にトグルさせますが、これはあなたの最初のスニペットでのあなたの行動にマッチします。私はこれらのクロックが同期していると仮定していますが、本当にそのゲートは100kHzのクロックドメインに同期する必要がありますが、これは別のトピックです。

常に始まるのは、実際には動作の構成です。それは本質的に「いつもこれを行い、私が言うように速く行う」ということです。あなたの例では、clock_10kHzが低いときにシミュレータがどのように逃げなかったのか分かりません。多くのシミュレータでは(#delayや@()などの)時間記述がなく、できるだけ多くの時間を計算しようとします。無限ループを見るには十分スマートだったらエラーになります。 Verilogはイベントベースの言語であることを忘れないでください。あなたのコードでは、「イベント」がなく、起こるべきアクションだけがあるケースがあります。これは、あなたに悲しみを引き起こします。他のプログラミング言語を実行してVerilogを起動した場合、これは通常最も難しい部分ですが、そうすることでははるかに意味があります。

うまくいけば、これが役に立ちます。