入出力ポート
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つの事項を伝えます:
- 方向 — 入力、出力、またはinoutですか?
- サイズ — 何ビット幅ですか?
- 名前 — 何と呼ばれますか?
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チャレンジ
ポート宣言を完成させてください
実施事項:
data_inという名前の8ビット入力を追加してくださいclkという名前の1ビット入力を追加してくださいresultという名前の4ビット出力を追加してください (regを使用してください —alwaysブロック内で代入されます)validという名前の1ビット出力を追加してください (wireを使用してください —assignで代入されます)
チートシート
ポートは、モジュールと外部との間のインターフェースです。
入力ポート
入力は常に wire であり、モジュール内では読み取り専用です:
input clk; // Single-bit
input [7:0] data; // 8-bit vector
input a, b; // Multiple inputs出力ポート
出力は、wire(assign によって駆動)または reg(always によって駆動)のいずれかになります:
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。