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 = 1、moduleは bus を drives(output モード) - When
enable = 0、moduleは bus を releases する(input モード、high-Z)
Inout の重要なルール
| ルール | 理由 |
|---|---|
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;チャレンジ
Add 不足している inout ポートと assign 文を追加して、この双方向バッファを動作させてください。
行うこと:
- 8ビットの
inoutポートio_buscalled を Add send_enableが 1 の when はsend_valueでio_busを drives し、otherwiseZにするassignstatement を Addio_busをreceive_valueに reads するassignstatement を 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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logic自分で練習してみよう: Verilogオンラインコンパイラ