Menu
Coddy logo textTech

演算子を用いた Assign

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 38/90。

継続的代入(continuous assignment)を理解すれば、それを演算子と組み合わせて、有用なロジックを作成できます。assign文は、任意の演算子を使用してワイヤを駆動できます。

基本構文

assign wire_name = expression;

式には以下を含めることができます:

  • 算術演算子 (+, -, *, /)
  • ビット演算子 (&, |, ^, ~)
  • 論理演算子 (&&, ||, !)
  • 比較演算子 (>, <, ==, !=)
  • シフト演算子 (<<, >>)
  • 条件演算子 (? :)

異なる演算子を使用した例

ビット演算 AND:

assign out = a & b;

加算:

assign sum = a + b;

比較:

assign is_greater = (a > b);

条件演算 (マルチプレクサ):

assign out = sel ? a : b;

シフト:

assign shifted = data << 2;

連結:

assign bus = {high_byte, low_byte};

コード例

module assign_operators (
  input [3:0] a, b,
  input sel,
  output [3:0] and_out,
  output [4:0] sum_out,
  output is_equal,
  output mux_out
);
  
  assign and_out = a & b;           // ビット単位の論理積 (AND)
  assign sum_out = a + b;           // 加算
  assign is_equal = (a == b);       // 比較
  assign mux_out = sel ? a : b;     // 条件演算 (マルチプレクサ)
  
endmodule

1つの代入文での複数の演算子

1つの式の中で演算子を組み合わせることができます:

assign result = (a & b) | (c ^ d);
assign final = (a + b) > (c - d);
assign parity = ^data;   // リダクションXOR(1の数が奇数個)

演算子の優先順位

Verilogは標準的な演算子の優先順位に従います。意図を明確にするために、括弧 ( ) を使用してください:

// 不明瞭
assign out = a & b | c;

// 明確
assign out = (a & b) | c;
challenge icon

チャレンジ

タスクに基づいて、不足している assign 文を追加してください。

行うべきこと:

  1. and_resultinput_a AND input_b (ビット単位)と等しくします
  2. or_resultinput_a OR input_b (ビット単位)と等しくします
  3. xor_resultinput_a XOR input_b (ビット単位)と等しくします
  4. not_resultNOT input_a (ビット単位)と等しくします

チートシート

assign ステートメントは、組み合わせ回路のためのさまざまな演算子をサポートしています。

assign wire_name = expression;

演算子の種類:

  • ビット演算: &, |, ^, ~
  • 算術演算: +, -, *, /
  • 論理演算: &&, ||, !
  • 比較演算: >, <, ==, !=
  • シフト演算: <<, >>
  • 条件演算: ? :
  • 結合演算: { }
assign and_out  = a & b;          // ビット AND
assign sum_out  = a + b;          // 加算
assign is_equal = (a == b);       // 比較
assign mux_out  = sel ? a : b;    // マルチプレクサ
assign bus      = {high, low};    // 結合
assign parity   = ^data;          // リダクション XOR

優先順位を明確にするために括弧を使用してください:

assign out = (a & b) | c;

自分で試してみよう

module assign_challenge (
  input input_a,
  input input_b,
  output and_result,
  output or_result,
  output xor_result,
  output not_result
);
  
  // TODO: 以下の代入文を追加してください:
  // and_result = input_a & input_b
  // or_result  = input_a | input_b
  // xor_result = input_a ^ input_b
  // not_result = ~input_a

endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン