Menu
Coddy logo textTech

入出力ポート

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

Input および output ポートは、module が外部の世界と通信できるようにする接続です。これらはチップ上のピンのようなものです。ポートは、module と設計の残りの部分との間のインターフェースです。

すべての module には以下が存在します:

  • 入力ポートmodule内側へ入ってくる信号
  • 出力ポートmodule外へ出ていく信号

Input Ports

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

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

入力のルール:

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

Output Ports

Output portsは外部にデータを送信します。これらは assign または always ブロックによって駆動できます。

output out;           // シングルビット出力
output [3:0] result;  // 4ビット出力
output reg busy;      // 出力は reg にできる
output wire ready;    // 出力は wire にできる

Output のルール:

  • wire (assign を使用) または reg (always を使用) にできます
  • module 内部の何かによってドライブされる必要があります

Port Declaration Syntax

Port declaration syntax(ポート宣言の構文)は、モジュール内で入力および出力ポートを記述する特定の記述方法です。 Verilogに対して各ポートに関する3つの情報を伝えます:

  1. 方向inputoutput、それとも inout ですか?
  2. サイズ — 何 bit 幅ですか?
  3. 名前 — 何と called (命名)されていますか?
module example (
  input [7:0] data_in,    // 入力ベクトル
  input clk,              // 単一入力
  input enable,           // 単一入力
  output reg [7:0] out,   // 出力 reg
  output busy             // 出力 wire
);

ポートの方向(Port Direction)が重要な理由

方向は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-bit の input を追加する
  2. clk という名前の single-bitinput を追加する
  3. result という名前の 4-bit の output を追加する (reg を使用 — always ブロック内で代入されます)
  4. valid という名前の single-bitoutput を追加する (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腕試し

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

基礎のすべてのレッスン