问题描述
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
,将其 CLK
和 O_SPI_CLK
端口连接到信号 clk
和 clk_out
并传递参数 { {1}} 到模块的参数 N
。