Verilog—顶层模块中调用子模块,及参数化设计

今天学习小梅哥的FPGA视频,现对知识点进行总结。
使用quartus ii的PLL(锁相环)进行时钟的分频和倍频。PLL的作用主要是为设计提供分频时钟和倍频时钟,以及相移。例如:系统时钟sclk=50MHZ,在系统时钟不满足我们的设计需求时,我们可以通过调用PLL的ip core产生clk1=20MHZ、clk2=75MHZ、clk3=100MHZ的时钟以满足设计需要。
在进行quartu和modelsim联合仿真时,需要在quartus中菜单栏正确选择使用的仿真软件的名字,并添加testbench。如下图所示。本人使用的是modelsim仿真。

其次,如果是直接使用modelsim进行仿真的话,需要在modelsim中把所调用的ip core文件加入编译,否则无法仿真。一般quartus 的ip core文件位置在安装目录下\quartus\eda\sim_lib文件夹内。例如,本次仿真中调用了PLL ip核,其ip core文件为altera_mf,v。位置如下图所示。

最后在进行板级验证,分配管脚后进行综合时遇到问题。软件报错如下。

查询结果如下:(看不太懂),不过给出了解决方法。
大意是說,每顆FPGA都有nCE與nCEO兩根pin,在多顆FPGA的系統中,第一顆FPGA的nCE接GND,而第一顆FPGA的nCEO將接到下一顆FPGA的nCE,如此這樣繼續接下去,而在最後一顆FPGA時,可以將nCEO floating或者當成普通I/O pin使用。而在單顆FPGA時,nCE直接接GND,nCEO可直接floating或者當普通I/O pin使用。
解决方案如下。
assignments>device>device and pin options>dual-purpose pins里面把nCEO设置成use as regular i/o就可以了

2.在顶层模块中调用底层模块。
底层模块如下:

底层模块调用格式如下:
<底层文件名> <底层模块名n> (
.<信号1>(<连接的pin1>),
.<信号2>(<连接的pin2>),
)

3.参数化设计
方法一:在子模块中定义了参数变量,然后顶层文件中可以直接在例化每个底层模块时,直接将所需修改的参数值通过例化的方法修改。

例化方式如下:

代码解读:23行是底层文件名,24-26行是对参数进行修改。格式为:
#(
.<参数名> (修改值),
)
方法二:使用关键字defparam来声明对某个参数的从新定义。例如下图。

格式如下:defparam <底层文件名> . <底层模块名> . <参数名> = <修改值>