Menu
CoddyTech

输入和输出端口

本课属于 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 每个端口的三项信息:

  1. 方向:它是输入、输出还是双向输入输出?
  2. 大小:它有多少位宽?
  3. 名称:它叫什么?
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
challenge icon

挑战

完成端口声明

要做什么:

  1. 添加一个 8 位输入,名为 data_in
  2. 添加一个单比特输入,名为 clk
  3. 添加一个 4 位输出,名为 result(使用 reg:将在 always 块中赋值)
  4. 添加一个单比特输出,名为 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
quiz icon自我测试

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

基础知识中的所有课

自己练习: Verilog 在线编译器