Menu
Coddy logo textTech

Inout Ports

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

inoutポートは、信号を送信と受信の両方ができる双方向ポートです。異なるタイミングで入力または出力として動作できます。ほとんどのポートは、input(データが入ってくる)またはoutput(データが出ていく)のいずれかです。inoutポートはその両方を実行できます。状況に応じて、データを外部へ駆動したり、データを受信したりできます。

一方通行の道路ではなく、双方向の道路のようなものだと考えてください。

Inoutポートは次の用途に使用されます:

  • 共有bus:複数のデバイスが同じ配線に接続されます
  • メモリデータbus:データをreadまたは書き込めます
  • bidirectional通信:I2C、SPIなど

一度にバスを駆動するデバイスは1つだけです。他のデバイスはハイインピーダンス状態(Z)でなければなりません。

Inoutポートの宣言

inout [7:0] data_bus;   // 8ビット双方向バス
inout ready;             // 1ビット双方向信号

inout の仕組み

inout ポートには、それが input として動作するか output として動作するかを判断するための制御 signal が必要です。

module bidir (
  inout [7:0] bus,
  input [7:0] data_out,
  input enable,
  output [7:0] data_in
);
  
  assign bus = (enable) ? data_out : 8'bZ;  // Drive bus when enabled, else Z
  assign data_in = bus;                     // Always read the bus
  
endmodule
  • When enable = 1module は bus を drives(output モード)
  • When enable = 0module は bus を releases する(input モード、high-Z)

Inout の重要なルール

Z を使用して bus を解放する
ルール理由
wire として宣言する必要があるreg にすることは Cannot
同時に読み取りと書き込みを行うことはできない競合(X)が発生する
他のデバイスが drive できるようになる
一度にドライバは1つだけbus の競合を防ぐ

inout と input と output

ポートの種類方向駆動可能読み取り可能
input一方向(入力のみ)いいえはい
output一方向(出力のみ)はいいいえ
inout双方向(両方)はい(when enabled)はい(always)

よくある間違い

// WRONG: alwaysブロック内でinoutに代入できません
always @(posedge clk) begin
  data_bus <= something;   // Error! 条件付きでassignを使用してください
end

// CORRECT: enable条件付きでassignを使用してください
assign data_bus = (enable) ? something : 8'bZ;
challenge icon

チャレンジ

Add 不足している inout ポートと assign 文を追加して、この双方向バッファを動作させてください。

行うこと:

  1. 8ビットの inout ポート io_bus called を Add
  2. send_enable が 1 の when は send_valueio_bus を drives し、otherwise Z にする assign statement を Add
  3. io_busreceive_value に reads する assign statement を Add

自分で試してみよう

module bidir_buffer (
  // Task 1: ここに io_bus という8ビットの inout ポートを追加する
  
  
  input [7:0] send_value,
  input send_enable,
  output [7:0] receive_value
);

  // Task 2: send_enable が 1 のときに send_value で io_bus を駆動し、それ以外の場合は Z にする assign 文を追加する
  
  
  // Task 3: io_bus を receive_value に読み込む assign 文を追加する
  

endmodule
quiz icon腕試し

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

基礎のすべてのレッスン

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