按顺序映射端口
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 35 课,共 90 课。
在上一课中,你学习了按名称映射端口,也就是用 .port(signal) 明确标记每个连接。现在我们来学习另一种方法:按顺序映射端口。
它会根据信号在模块定义中出现的顺序将信号连接到模块的端口。你只需在括号中列出信号,Verilog 就会逐个匹配它们。
语法:
module_name instance_name (signal1, signal2, signal3);第一个信号连接到第一个端口,第二个信号连接到第二个端口,依此类推。
示例
模块定义:
module or_gate (
input in1, // 第一个端口
input in2, // 第二个端口
output result // 第三个端口
);
assign result = in1 | in2;
endmodule按顺序进行端口映射的实例化:
or_gate or1 (input_a, input_b, output_y);这会连接:
- 第一个信号
input_a→ 第一个端口in1 - 第二个信号
input_b→ 第二个端口in2 - 第三个信号
output_y→ 第三个端口result
顺序很重要
使用按顺序进行端口映射时,顺序至关重要:
// 顺序正确
or_gate or1 (input_a, input_b, output_y);
// 顺序错误:信号连接到了错误的端口!
or_gate or1 (input_b, input_a, output_y);
or_gate or1 (output_y, input_a, input_b);如果顺序弄错,连接就会接到错误的端口上。这可能很难调试,因为乍一看代码似乎是正确的。
按名称映射端口与按顺序映射端口
| 特点 | 按名称 | 按顺序 |
|---|---|---|
| 语法 | .port(signal) | signal1, signal2 |
| 顺序重要吗? | 不重要 | 重要 |
| 是否能自我说明? | 是 | 否 |
| 出错风险 | 低 | 高 |
| 推荐用于 | 大多数设计 | 仅限简单情况 |
何时使用按顺序映射端口
在以下情况下,可以按顺序映射端口:
- 模块的端口很少(2-3 个)
- 端口顺序一目了然,而且不太可能改变
- 你正在编写快速测试平台
对于大多数设计,按名称映射端口更受推荐,因为这样更清晰,也不容易出错。
挑战
按端口顺序映射,按正确顺序列出信号,完成实例化。
要做什么:
模块端口(按此顺序):
input en(使能)input [7:0] d(数据输入)output [7:0] q(数据输出)
要连接的信号:
enable_signal→ 连接到endata_input→ 连接到ddata_output→ 连接到q
亲手试试
module register (
input en,
input [7:0] d,
output [7:0] q
);
assign q = en ? d : q;
endmodule
module top (
input enable_signal,
input [7:0] data_input,
output [7:0] data_output
);
// TODO: 使用 ORDER 映射实例化 register,并将实例命名为 reg1
// 按正确顺序列出信号:enable_signal, data_input, data_output
// 不要使用 .port(signal) 语法
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器