从 verilog 开始,并试图了解这段模块实例化代码中发生了什么

问题描述

clock #(.N(N))  //-- N parameter
Pres1(
.CLK(clk),.O_SPI_CLK(clk_out) );

我不明白的是 #(.N(N) 和 pres1() 的使用;

解决方法

这意味着在某处有一个名为 clock 的模块,并且您想在代码中创建它的一个实例,将其想象为 int x,这意味着变量 x 是type int 和 x 是该变量的名称,这里 pres1 是类型 clock 的实例,模块 clock 内部有一个名为 N 的参数,这意味着每个实例都可以调用模块 clock 但每个实例都可以有不同的值 N,名为 clock 的模块有 2 个端口,一个名为 CLK,另一个是命名为 O_SPI_CLK 所以在你的实例中你必须连接它们,在你的情况下你用 2 根电线(或 reg)连接它们,一根名为 clk 的它连接到端口 CLK 和 {{ 1}} 连接到端口 clk_out

,

Verilog 使用模块以分层方式定义一组设备。模块实例定义了一个硬件设备。每个模块实例都有一个名称。

   moddedf modinst(params);

其中 moddef 是模块定义的名称(类似于通用编程语言中的过程函数)。 'modinst' 是模块实例的名称(在通用编程语言中不常见)。实例用于表达硬件设计的层次结构。

所以,就你而言

clock Pres1(...);

模块 'clock' 使用实例名称 'Pres1' 进行初始化。

实例参数(在模块定义中定义)表示硬件设备(模块实例)之间的连接。

clock Pres1(.CLK(clk),.O_SPI_CLK(clk_out) );

在上面,模块'clock'的端口CLK连接到电线'clk',端口O_SPI_CLK连接到电线clk_out。端口的类型(net、variabel)应该在模块定义中定义,并且在实例化模块“clock”(父模块)的模块中连接到它的信号的类型。

显然,模块 'clock' 也使用参数 N。参数类似于通用语言中的常量。参数N也在父模块中定义。

clock#(.N(N1)) Pres1(.CLK(clk),.O_SPI_CLK(clk_out) );

在上面的父模块中定义的参数(常量)N1 的值被分配给模块“时钟”中的参数N。我特意把 N 改成了 N1 让它更清楚一点。否则无需更改。

所以,

clock#(.N(N)) Pres1(.CLK(clk),.O_SPI_CLK(clk_out) );

将模块 clock 实例化为实例 Pres1,将其 CLKO_SPI_CLK 端口连接到信号 clkclk_out 并传递参数 { {1}} 到模块的参数 N