Menu
CoddyTech

入力および出力ポート

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にできる

出力に関するルール:

  • wire(assignを使用)またはreg(alwaysを使用)にできます
  • モジュール内の何かによって駆動されている必要があります

ポート宣言の構文

ポート宣言の構文とは、モジュール内で入力ポートと出力ポートを記述する特定の方法です。各ポートについて、Verilogに3つのことを伝えます。

  1. 方向:入力、出力、または入出力のどれですか?
  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. 8ビットの入力 data_in を追加する
  2. 1ビットの入力 clk を追加する
  3. 4ビットの出力 result を追加する(regを使用:alwaysブロック内で代入される)
  4. 1ビットの出力 valid を追加する(wireを使用:assignで代入される)

自分で試してみよう

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腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ