从 verilog 开始,试图了解这段模块实例化代码中发生了什么
started with verilog and trying to understand what is happening in this piece of code of module instantiation
clock #(.N(N)) //-- N parameter
Pres1(
.CLK(clk),
.O_SPI_CLK(clk_out) );
我不明白的是#(.N(N) 和 pres1() 的使用;
这意味着某处有一个名为 clock
的模块,你想在你的代码中创建它的一个实例,把它想象成 int x
这意味着变量 x 是一个int 类型的实例,x 是该变量的名称,同样这里 pres1
是类型 clock
的实例,模块 clock
内部有一个名为 N
的参数这意味着每个实例都可以调用模块 clock
但每个实例都可以有不同的 N
值,名为 clock
的模块有 2 个端口,一个名为 CLK
和另一个被命名为 O_SPI_CLK
所以在你的例子中你必须连接它们并且在你的情况下你用 2 根线(或 reg)连接它们一个名为 clk
连接到端口 CLK
和clk_out
连接到端口 O_SPI_CLK
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
的值被分配给模块 'clock' 中的参数 N
。我故意将 N 更改为 N1 以使其更加清晰。其他的就不用改了。
所以,
clock#(.N(N)) Pres1(.CLK(clk),.O_SPI_CLK(clk_out) );
将模块 clock
实例化为实例 Pres1
,将其 CLK
和 O_SPI_CLK
端口连接到信号 clk
和 clk_out
并传递参数N
到模块的参数N
。
clock #(.N(N)) //-- N parameter
Pres1(
.CLK(clk),
.O_SPI_CLK(clk_out) );
我不明白的是#(.N(N) 和 pres1() 的使用;
这意味着某处有一个名为 clock
的模块,你想在你的代码中创建它的一个实例,把它想象成 int x
这意味着变量 x 是一个int 类型的实例,x 是该变量的名称,同样这里 pres1
是类型 clock
的实例,模块 clock
内部有一个名为 N
的参数这意味着每个实例都可以调用模块 clock
但每个实例都可以有不同的 N
值,名为 clock
的模块有 2 个端口,一个名为 CLK
和另一个被命名为 O_SPI_CLK
所以在你的例子中你必须连接它们并且在你的情况下你用 2 根线(或 reg)连接它们一个名为 clk
连接到端口 CLK
和clk_out
连接到端口 O_SPI_CLK
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
的值被分配给模块 'clock' 中的参数 N
。我故意将 N 更改为 N1 以使其更加清晰。其他的就不用改了。
所以,
clock#(.N(N)) Pres1(.CLK(clk),.O_SPI_CLK(clk_out) );
将模块 clock
实例化为实例 Pres1
,将其 CLK
和 O_SPI_CLK
端口连接到信号 clk
和 clk_out
并传递参数N
到模块的参数N
。