入力および出力ポート
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つのことを伝えます。
- 方向:入力、出力、または入出力のどれですか?
- サイズ:何ビット幅ですか?
- 名前:何という名前ですか?
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チャレンジ
ポート宣言を完成させる
やること:
- 8ビットの入力
data_inを追加する - 1ビットの入力
clkを追加する - 4ビットの出力
resultを追加する(regを使用:alwaysブロック内で代入される) - 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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ