本帖最后由 mbutterfly 于 2024-9-14 08:31 编辑
顶层模块&子模块
在Verilog里面,有模块例化的功能(相当于在一个模块里面调用其它模块)。通常,实现某一个复杂功能,都需要把这一个复杂的功能分割成若干个简单的功能模块。通过例化,把这一些模块组合起来,实现复杂的功能。
顶层模块
就像单片机开发一样,在程序代码里面有一个main函数。同样地,在FPGA用Verilog开发的过程中,也需要有一个类似于“main函数”的顶层模块(Top-level entity),这个需要在工程里面设置和定义。如下图所示:
顶层模块的模块名需要和设定里面一致,否则编译工程会报错。同样,这一个顶层模块又可以被其他顶层模块调用,实现了多个模块包含的关系。
子模块
相当于软件代码里面的子函数。这一些模块往往是功能简单,或者很底层的模块,通过例化,被其他模块调用。需要把这一些写好子模块调用出来的时候,要往工程里面添加这一些写了子模块的文件。
模块例化
在一个顶层模块里面例化其他模块,通常需要使用以下的格式,对其他模块进行例化(伪代码):
注: < xxxx > 为命名
module <顶层模块名>(
input <输入端口1>,
input <输入端口2>,
input <输入端口3>,
output <输出端口1>
);
wire <用于连接的线网数据1>;
wire <用于连接的线网数据2>;
<被例化模块名1> <新建被例化模块1别名>(
.<被例化模块名1的输入端口1> (<输入端口1>),
.<被例化模块名1的输入端口2> (<输入端口2>),
.<被例化模块名1的输入端口3> (<输入端口3>),
.<被例化模块名1的输出端口1> (<用于连接的线网数据1>),
.<被例化模块名1的输出端口2> (<用于连接的线网数据2>)
);
<被例化模块名2> <新建被例化模块2别名>(
.<被例化模块名2的输入端口1> (<输入端口1>),
.<被例化模块名2的输入端口2> (<输入端口2>),
.<被例化模块名2的输入端口3> (<用于连接的线网数据1>),
.<被例化模块名2的输入端口4> (<用于连接的线网数据2>),
.<被例化模块名2的输出端口1> (<输出端口1>)
);
endmodule
这个就是通常例化模块的过程。需要注意的是,工程里面设定的顶层模块,必须是最顶层的模块。而不是中间部分的顶层模块,否则编译会出错。
|