Menu
Coddy logo textTech

入出力ポート

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

入出力ポートは、モジュールが外部と通信できるようにするための接続です。これらはチップ上のピンのようなものです。ポートは、モジュールと設計の他の部分との間のインターフェースです。

すべてのモジュールには以下があります:

  • 入力ポート — モジュールの中へ入ってくる信号
  • 出力ポート — モジュールの外へ出ていく信号

入力ポート

入力ポートは外部からデータを受け取ります。これらはモジュール内では変更できず、読み取りのみ可能です。

input clk;        // 1ビット入力
input [7:0] data; // 8ビット入力ベクトル
input a, b;       // 1行に複数の入力

入力に関するルール:

  • モジュール内で値を代入することはできません
  • reg として宣言することはできません
  • 常に wire です(デフォルト)

出力ポート

出力ポートは外部へデータを送信します。これらは assign または always ブロックによって駆動されます。

output out;           // 1ビット出力
output [3:0] result;  // 4ビット出力
output reg busy;      // 出力は reg にできます
output wire ready;    // 出力は wire にできます

出力に関するルール:

  • wireassignを使用)またはregalwaysを使用)にすることができます
  • モジュール内部の何かによって駆動されなければなりません

ポート宣言の構文

ポート宣言の構文とは、モジュール内で入力ポートと出力ポートを記述する具体的な方法です。これはVerilogに対して、各ポートに関する3つの事項を伝えます:

  1. 方向 — 入力、出力、またはinoutですか?
  2. サイズ — 何ビット幅ですか?
  3. 名前 — 何と呼ばれますか?
module example (
  input [7:0] data_in,    // 入力ベクトル
  input clk,              // 単一入力
  input enable,           // 単一入力
  output reg [7:0] out,   // 出力レジスタ
  output busy             // 出力ワイヤ
);

ポートの方向が重要な理由

方向はVerilogに以下のことを伝えます:

  • モジュールが読み取ることができる信号(入力)
  • モジュールが書き込むことができる信号(出力)
  • どのような種類の接続が許可されているか

誤った方向を使用すると、コンパイルエラーが発生します。

コード例

module port_demo (
  input [3:0] a,        // 読み取りのみ可能
  input [3:0] b,        // 読み取りのみ可能
  output reg [3:0] sum, // 書き込み可能 (reg)
  output [3:0] diff     // 書き込み可能 (wire)
);
  always @(*) begin
    sum = a + b;        // 出力regへの書き込み
  end
  
  assign diff = a - b;   // 出力wireへの書き込み
endmodule
challenge icon

チャレンジ

ポート宣言を完成させてください

実施事項:

  1. data_in という名前の8ビット入力を追加してください
  2. clk という名前の1ビット入力を追加してください
  3. result という名前の4ビット出力を追加してください (reg を使用してください — always ブロック内で代入されます)
  4. valid という名前の1ビット出力を追加してください (wire を使用してください — assign で代入されます)

チートシート

ポートは、モジュールと外部との間のインターフェースです。

入力ポート

入力は常に wire であり、モジュール内では読み取り専用です:

input clk;        // Single-bit
input [7:0] data; // 8-bit vector
input a, b;       // Multiple inputs

出力ポート

出力は、wireassign によって駆動)または regalways によって駆動)のいずれかになります:

output wire ready;    // Use with assign
output reg busy;      // Use with always

モジュールヘッダーでのポート宣言

各ポート宣言では、方向サイズ、および名前を指定します:

module example (
  input [7:0] data_in,   // 8-bit input
  input clk,             // single-bit input
  output reg [3:0] sum,  // 4-bit output reg
  output diff            // single-bit output wire
);
  always @(*) sum = data_in[3:0] + 1;
  assign diff = data_in[0];
endmodule

自分で試してみよう

module port_challenge (
  // タスク 1: data_in という名前の 8 ビット入力を追加してください
  
  
  // タスク 2: clk という名前の 1 ビット入力を追加してください
  
  
  // タスク 3: result という名前の 4 ビット出力を追加してください (reg を使用)
  
  
  // タスク 4: valid という名前の 1 ビット出力を追加してください (wire を使用)
  
  
);

  reg [3:0] counter;
  
  always @(posedge clk) begin
    counter <= counter + 1;
    result <= counter;
  end
  
  assign valid = (counter > 8);
  
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン