输入和输出端口
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 31 课,共 90 课。
输入端口和输出端口是让模块与外部世界通信的连接。它们就像芯片上的引脚。端口是模块与设计其余部分之间的接口。
每个模块都有:
- 输入端口:进入模块的信号
- 输出端口:从模块输出的信号
输入端口
输入端口接收来自外部的数据。你不能在模块内部修改它们,只能读取。
input clk; // 单比特输入
input [7:0] data; // 8 比特输入向量
input a, b; // 一行中的多个输入输入的规则:
- 不能在模块内部赋值
- 不能声明为
reg - 始终是
wire(默认情况下)
输出端口
输出端口将数据发送到外部。它们可以由 assign 或 always 块驱动。
output out; // 单比特输出
output [3:0] result; // 4 比特输出
output reg busy; // 输出可以是 reg 类型
output wire ready; // 输出可以是 wire 类型输出规则:
- 可以是
wire(搭配assign)或reg(搭配always) - 必须由模块内部的某个内容驱动
端口声明语法
端口声明语法是你在模块中编写输入和输出端口的特定方式。它会告诉 Verilog 每个端口的三项信息:
- 方向:它是输入、输出还是双向输入输出?
- 大小:它有多少位宽?
- 名称:它叫什么?
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; // 写入 output reg
end
assign diff = a - b; // 写入 output wire
endmodule挑战
完成端口声明
要做什么:
- 添加一个 8 位输入,名为
data_in - 添加一个单比特输入,名为
clk - 添加一个 4 位输出,名为
result(使用 reg:将在 always 块中赋值) - 添加一个单比特输出,名为
valid(使用 wire:将通过 assign 赋值)
亲手试试
module port_challenge (
// 任务 1:添加一个名为 data_in 的 8 位输入
// 任务 2:添加一个名为 clk 的单比特输入
// 任务 3:添加一个名为 result 的 4 位输出(使用 reg)
// 任务 4:添加一个名为 valid 的单比特输出(使用 wire)
);
reg [3:0] counter;
always @(posedge clk) begin
counter <= counter + 1;
result <= counter;
end
assign valid = (counter > 8);
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器