工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

Verilog は常にブロックします

always ブロックは 手続き型 の 1 つです Verilog のブロック。 always ブロック内のステートメントは順番に実行されます。

構文

  
  
always @ (event)
	[statement]
	
always @ (event) begin
	[multiple statements]
end

  

always ブロックは特定のイベントで実行されます。イベントは機密リストによって定義されます。

機密リストとは?

感受性 list は、always ブロックをいつ実行するかを定義する式で、@ の後に指定します。 括弧内の演算子 ( ) .このリストには、値の変更によって常にブロックが実行されるシグナルの 1 つまたはグループが含まれる場合があります。

以下に示すコードでは、always 内のすべてのステートメントが シグナル a または b の値が変化するたびに、ブロック get が実行されます。

  
  
// Execute always block whenever value of "a" or "b" change
always @ (a or b) begin
	[statements]
end

  

Always ブロックは何に使用されますか?

always ブロックを使用して、組み合わせ要素または順次要素を実現できます。フリップフロップのようなシーケンシャル エレメントは、クロックとリセットが提供されるとアクティブになります。同様に、組み合わせブロックは、入力値の 1 つが変化するとアクティブになります。これらのハードウェア ブロックはすべて、互いに独立して同時に動作します。それぞれの間の接続は、データの流れを決定するものです。この動作をモデル化するには、always ブロックは、機密リスト内のシグナルがアクティブになったときにトリガーされ、何らかのアクションを実行する継続的なプロセスとして作成されます。

次の例では、always ブロック内のすべてのステートメントが、信号 clk のポジティブ エッジごとに実行されます。

  
  
// Execute always block at positive edge of signal "clk"
always @ (posedge clk) begin
	[statements]
end

  

機密リストがない場合はどうなりますか?

always ブロックは、シミュレーションの期間中、継続的に繰り返されます。感度リストは、特定のタイミング感覚をもたらします。つまり、感度リスト内のシグナルが変化するたびに、常にブロックがトリガーされます。 always ブロック内にタイミング制御ステートメントがない場合、ゼロ遅延の無限ループが原因でシミュレーションが停止します!

以下に示す例は、信号 clk の値を反転しようとする always ブロックです。ステートメントは、0 時間単位ごとに実行されます。したがって、ステートメントに遅延がないため、永久に実行されます。

  
  
// always block is started at time 0 units
// But when is it supposed to be repeated ?
// There is no time control, and hence it will stay and
// be repeated at 0 time units only. This continues
// in a loop and simulation will hang !
always clk = ~clk;

  

センシティビティ リストが空であっても、他の形式の時間遅延があるはずです。シミュレーション時間は、always 内の遅延ステートメントによって進められます 以下に示すように構築します。現在、時計の反転は 10 時間単位ごとに行われます。

  
  
	always #10 clk = ~clk;

  

注: 明示的な遅延は論理ゲートに合成できません!

したがって、実際の Verilog 設計コードには常に機密リストが必要です。

シーケンシャル エレメントの設計例

以下に示すコードは、データ入力、クロック、およびアクティブ LOW リセットを受け入れる tff というモジュールを定義します。クロックの正のエッジで d が 1 であることが判明するたびに、出力が反転します。ここでは、always ブロックは、clk のポジティブ エッジまたは rstn のネガティブ エッジのいずれかでトリガーされます。

クロックのポジティブ エッジで何が起こるか?

次のイベントは、クロックのポジティブ エッジで発生し、クロックのすべてのポジティブ エッジで繰り返されます。 <オール>

  • 最初の if ブロックはアクティブ LOW リセット rstn の値をチェックします
  • <オール>
  • rstn がゼロの場合、出力 q をデフォルト値の 0 にリセットする必要があります
  • rstn が 1 の場合は、リセットが適用されていないことを意味し、デフォルトの動作に従う必要があります
  • 前のステップが誤りの場合:
  • <オール>
  • d の値を確認し、1 であることが判明した場合は、q の値を反転します
  • d が 0 の場合、q の値を維持
  •   
      
    module tff (input  		d,
    						clk,
    						rstn,
    			output reg 	q);
    			
    	always @ (posedge clk or negedge rstn) begin
    		if (!rstn)
    			q <= 0;
    		else
    			if (d)
    				q <= ~q;
    			else
    				q <= q;
    	end
    endmodule
    
      
    

    リセットのネガティブ エッジで何が起こるか?

    次のイベントは rstn のネガティブ エッジで発生し、そのようなすべての発生時に発生します。

    <オール>
  • 最初の if ブロックは、アクティブ LOW リセット rstn の値をチェックします。信号の負のエッジでは、その値は 0 です。
  • <オール>
  • rstn の値が 0 の場合、リセットが適用され、出力をデフォルト値の 0 にリセットする必要があることを意味します
  • 現在のイベントが負のエッジであるため、rstn の値が 1 の場合は考慮されません。 最初の
  • 組み合わせ要素の設計例

    always ブロックは、組み合わせブロックの設計にも使用できます。たとえば、次のデジタル回路は、信号 o で特定の出力を提供する 3 つの異なる論理ゲートの組み合わせを表します。

    以下に示すコードは module です 4 つの入力ポートと、o と呼ばれる 1 つの出力ポートがあります。 always ブロックは、感度リスト内のいずれかのシグナルの値が変化するたびにトリガーされます。出力信号は reg 型として宣言されています 手続き型ブロックで使用されているため、モジュール ポート リストに含まれています。手続き型ブロックで使用されるすべてのシグナルは、型 reg として宣言する必要があります .

      
      
    module combo (	input 	a,
          			input	b,
                  	input	c,
                  	input	d,
      	            output reg o);
      
      always @ (a or b or c or d) begin
        o <= ~((a & b) | (c^d));
      end
      
    endmodule
    
      
    

    RHS の組み合わせ式が真になるたびに、信号 o が 1 になることを確認します。同様に、RHS が false の場合、o は 0 になります。

    シミュレーション出力

    シミュレーション例のスライドショーはここをクリック!


    Verilog

    1. Verilog チュートリアル
    2. Verilog 連結
    3. Verilog - ナットシェルで
    4. Verilog 割り当て
    5. Verilog ブロッキング &ノンブロッキング
    6. Verilog 関数
    7. Verilog タスク
    8. Verilog クロック ジェネレーター
    9. Verilog 数学関数
    10. Verilog タイムフォーマット
    11. Verilog タイムスケール スコープ