入力および出力ポート
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 31/90。
Input ポートと output ポートは、モジュールが外部と通信できるようにする接続です。チップ上のピンのようなものです。ポートは、モジュールと設計の他の部分との間のインターフェースです。
すべてのmoduleには次のものがあります:
- Input ports:module に入ってくる信号
- Output ports:module から出ていく信号
入力ポート
入力ポートは外部からデータを受け取ります。モジュール内部で変更することはできず、read のみ可能です。
input clk; // 単ビット入力
input [7:0] data; // 8ビット入力ベクトル
input a, b; // 1行に複数の入力inputs のルール:
- module 内で値を割り当てることはできません
regとして宣言することはできません- 常に
wire(デフォルト)
出力ポート
出力ポートはデータを外部に送信します。assign または always ブロックによって駆動できます。
output out; // 1ビット出力
output [3:0] result; // 4ビット出力
output reg busy; // 出力は reg にできる
output wire ready; // 出力は wire にできるoutput の規則:
wire(assignを使用)またはreg(alwaysを使用)にできます- module 内の何かによって駆動される必要があります
ポート宣言の構文
ポート宣言の構文とは、モジュール内でinput ポートと output ポートを記述する具体的な方法です。各ポートについて、Verilog に3つのことを伝えます:
- 方向:input、output、またはinoutのどれですか?
- サイズ:何ビット幅ですか?
- 名前:何と呼ばれていますか?
module example (
input [7:0] data_in, // 入力ベクトル
input clk, // 単一入力
input enable, // 単一入力
output reg [7:0] out, // 出力 reg
output busy // 出力 wire
);ポートの方向が重要な理由
方向はVerilogに次のことを伝えます:
- モジュールが can read できる信号(inputs)
- モジュールが can write できる信号(outputs)
- 許可される接続の種類
誤った方向を使用すると、コンパイルエラーが発生します。
コード例
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チャレンジ
ポート宣言を完成させる
実行すること:
- Add 8ビットの input(
data_in) - Add 単一ビットの input(
clk) - Add 4ビットの output(
result)(reg を使用: always ブロック内で代入されます) - Add 単一ビットの output(
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オンラインコンパイラ