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

Verilog ケース ステートメント

case ステートメントは、指定された式がリスト内の他の式のいずれかと一致するかどうかをチェックし、それに応じて分岐します。通常、マルチプレクサを実装するために使用されます。 if-else コンストラクトは、チェックする条件が多数あり、マルチプレクサではなくプライオリティ エンコーダに統合される場合には適していない可能性があります。

構文

Verilog ケース ステートメントは case で始まります キーワードであり、endcase で終わります キーワード。括弧内の式は 1 回だけ評価され、記述されている順序で代替のリストと比較され、代替が指定された式に一致するステートメントが実行されます。複数のステートメントのブロックはグループ化され、begin 内にある必要があります と end .

  
  
	// Here 'expression' should match one of the items (item 1,2,3 or 4)
	case (<expression>) 
		case_item1 : 	<single statement>
		case_item2,
		case_item3 : 	<single statement>
		case_item4 : 	begin
		          			<multiple statements>
		        			end
		default 	 : <statement>
	endcase

  

ケース項目のいずれも指定された式に一致しない場合、default 内のステートメント アイテムが実行されます。 default ステートメントはオプションであり、default は 1 つだけ存在できます case ステートメント内のステートメント。 Case ステートメントは入れ子にすることができます。

どのアイテムも式に一致せず、default

以下に示す設計モジュールには、他の 3 つの 3 ビット入力の 1 つを出力信号 out にルーティングするための 2 ビット選択信号があります。 case ステートメントは、sel の値に基づいて正しい入力を出力に割り当てるために使用されます。 sel は 2 ビット信号なので、2 2 を持つことができます。 組み合わせ、0 から 3。デフォルト ステートメントは、sel が 3 の場合に出力を 0 に設定するのに役立ちます。

  
  
module my_mux (input       [2:0] 	a, b, c, 		// Three 3-bit inputs
                           [1:0]	sel, 			  // 2-bit select signal to choose from a, b, c
               output reg  [2:0] 	out); 			// Output 3-bit signal 
  
  // This always block is executed whenever a, b, c or sel changes in value
  always @ (a, b, c, sel) begin 		
    case(sel)
      2'b00    : out = a; 		// If sel=0, output is a
      2'b01    : out = b; 		// If sel=1, output is b
      2'b10    : out = c; 		// If sel=2, output is c
      default  : out = 0; 		// If sel is anything else, out is always 0
    endcase
  end
endmodule

  

ハードウェア回路図

rtl コードは、4 対 1 のマルチプレクサを表すハードウェア回路図を取得するために作成されます。

sel が 3 の場合、出力はゼロであり、他の値の割り当てられた入力に対応することを確認してください。

シミュレーションログ
ncsim> run
[0]  a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0
[10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5
[20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5
[30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1
[40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

case ステートメントでは、式の各ビットが 0、1、x、z などの選択肢の 1 つと一致する場合にのみ、比較が成功します。上記の例では、sel のいずれかのビットが x または z の場合、default 他の選択肢が一致しなかったため、ステートメントが実行されます。このような場合、出力はすべてゼロになります。

シミュレーションログ
ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

設計のケース ステートメントのケース アイテムの選択肢に x と z がある場合、結果はまったく異なります。

  
  
module my_mux (input  		[2:0] 	a, b, c,
													[1:0]		sel,
							output reg	[2:0] 	out);
  
  // Case items have x and z and sel has to match the exact value for
  // output to be assigned with the corresponding input
  always @ (a, b, c, sel) begin
    case(sel)
      2'bxz			:	out = a;
      2'bzx			:	out = b;
      2'bxx			:	out = c;
      default 	:	out = 0;
    endcase
  end
endmodule

  
シミュレーションログ
ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5
ncsim: *W,RNQUIE: Simulation is complete.

ケースと if-else の違いは?

case ステートメントは if-else-if とは異なります 2 つの方法で:


Verilog

  1. Verilog の紹介
  2. C# switch ステートメント
  3. C# break ステートメント
  4. C# 継続ステートメント
  5. C++ Switch Case ステートメントと EXAMPLE
  6. Verilog チュートリアル
  7. Verilog 連結
  8. Verilog 割り当て
  9. Verilog ブロッキング &ノンブロッキング
  10. Verilog 関数
  11. Verilog タスク