跳转到内容

可编程逻辑/Verilog 模块结构

来自维基教科书,开放的书籍,为开放的世界

Verilog 模块

[编辑 | 编辑源代码]

模块是 Verilog HDL 中的基本描述单元。Verilog 模块,类似于其他编程语言中的函数,是可以在单个程序中使用和重复使用的代码段。Verilog 模块使用 module 关键字声明,并使用 endmodule 关键字结束。

模块格式

[编辑 | 编辑源代码]

基本模块的布局如下

module MyModule ([parameters]);
     inputs ...
     outputs ...
     internal variables ...
     ...
     Module Code ...
endmodule

模块使用模块名(在本例中为“MyModule”)声明,后面跟着参数列表。在本例中,参数是模块可以与其交互的输入和输出信号列表(也称为“端口列表”)。如果我们综合 Verilog 代码,这些参数将表示将我们的模块连接到微芯片其余部分的物理线连接。请注意,在参数列表中,我们不需要指定连接的类型,也不需要指定它是输入还是输出。我们将在接下来的几行中执行此操作。以下是一个带有参数的示例模块声明

module MyModule(a, b, c, clock);

输入和输出

[编辑 | 编辑源代码]

在 Verilog 中,所有输入和输出都通过参数列表传递。模块需要此输入和输出端口列表才能与环境交互。

模块不像 C 函数或 Java 函数那样返回值。因此,我们使用 inputoutput 关键字来指定哪些参数是哪个方向的

module MyModule(a, b, c, clock);
   input a, b, clock;
   output c;
   ...
endmodule

输出连接通常不会初始化,因此尝试从指定为输出的连接读取数据是一种不好的做法。

实例标识符

[编辑 | 编辑源代码]

当从更高级别的模块调用 Verilog 模块时,我们需要包含一个 实例标识符。这样做是因为当我们将代码综合到物理芯片上时,需要并行调用多次的函数实际上会创建多次!这意味着如果我们希望同一个模块并行地执行它本身,我们需要指示综合程序创建模块的多个物理副本。此外,使用实例标识符允许一个人将多个模块“连接”在一起(例如,如果我们希望一个模块的输出成为另一个模块的输入)。对于第一个示例定义,假设我们有一个定义如下所示的 AND 模块

module AND(a, b, c);
   input a, b;
   output c;
   assign c = a & b;
endmodule

如果我们想在另一个模块中使用 AND,我们需要像下面这样调用它

wire w, x, y, z;
...
AND A1(w, x, y);
AND A2(w, y, z);
AND A3(z, x, w);

请注意我们如何在模块名“AND”和参数列表之间放置一个标识符?这是一个实例标识符。请注意,我们正在定义 AND 模块的 3 个独立实例。

标识符可以由字母数字字符和下划线(_)组成,但不能以数字开头。

华夏公益教科书