Menu
CoddyTech

按名称映射端口

本课属于 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)
);

它们的功能完全相同,因为每个连接都标有名称。

challenge icon

挑战

通过按名称映射端口添加缺失的端口连接,完成实例化。

操作步骤:

  1. 将端口 clk 连接到信号 clock_signal
  2. 将端口 data_in 连接到信号 input_data
  3. 将端口 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器