按名称映射端口
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 34 课,共 90 课。
在上一课中,你学习了如何实例化模块,方法是按照端口在模块定义中出现的相同顺序传递信号。这种方法可行,但有一个问题:顺序很重要。
如果不小心弄错顺序,信号就会连接到错误的端口。这可能很难调试。
位置映射的问题
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
// 按顺序映射:顺序必须一致
or_gate or1 (input_a, input_b, output_y); // 正确
or_gate or1 (input_b, input_a, output_y); // 错误!输入顺序颠倒了第二行将 input_b 连接到 in1,并将 input_a 连接到 in2:这是一个不易察觉的小错误。
答案:按名称映射端口
按名称映射端口时,会使用端口名称建立连接。连接的顺序无关紧要,因为每个连接都明确标注了名称。
语法:
module_name instance_name (
.port_name(signal),
.port_name(signal)
);端口名称前的点 . 表示我们指的是模块内部的端口。括号内的信号就是我们连接到该端口的信号。
示例
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);这明确表示:
- 端口
in1接收信号input_a - 端口
in2接收信号input_b - 端口
result接收信号output_y
顺序不重要
使用名称进行端口映射时,你可以按任意顺序编写连接:
// 这三个完全相同
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);
or_gate or1 (
.result(output_y),
.in1(input_a),
.in2(input_b)
);
or_gate or1 (
.in2(input_b),
.result(output_y),
.in1(input_a)
);它们的功能完全相同,因为每个连接都标有名称。
挑战
通过按名称映射端口添加缺失的端口连接,完成实例化。
操作步骤:
- 将端口
clk连接到信号clock_signal - 将端口
data_in连接到信号input_data - 将端口
data_out连接到信号output_data
亲手试试
module register (
input clk,
input [7:0] data_in,
output reg [7:0] data_out
);
always @(posedge clk) begin
data_out <= data_in;
end
endmodule
module top (
input clock_signal,
input [7:0] input_data,
output [7:0] output_data
);
register reg1 (
// TODO:使用 .port(signal) 语法添加端口映射
);
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器