在开始学习FPGA的时候,各个模块的代码都会编写,但是将几个模块组合要在一起使用的时候就比较容易犯迷糊,不清楚每个模块都有哪些端口,各个端口该怎么连接。
下面用一个简单的示例来说明一下,如何利用Quartus II的模块框图功能帮助初学者更好的理解模块间的连接关系。
现在有一个按键模块,一个LED显示模块,现在要通过按键控制LED灯的亮灭。就需要用一个顶层模块将按键和LED模块连接起来。连接完成后的RTL视图如下:
将按键模块的按键输出值送入到LED模块的输入中,然后LED模块根据按键的输入值,控制输出LED指示灯的亮灭。
这个是工程完成后生成的RTL视图,如果工程在设计顶层文件的之前,不清楚各个模块都有哪些端口,各个端口要如何连线时怎么办?模块的端口单独可以用RTL视图观看吗?
现在单独看一下按键模块的RTL框图
由于按键模块中使用了寄存器对系统时钟计数,进行20ms消抖。生成的RTL视图中就有好多寄存器,虽然按键模块用的端口比较少,但是生成的RTL视图中好多东西。对于初学者来说,这些寄存器各个模块内部是怎么连线的并不关心,只想知道按键模块中有几个端口,输入输出端口有哪些?而生成的RTL视图中东西太多,看起来不方便。
下面在看看 LED模块生成的RTL视图
LED模块的RTL视图虽然比起按键模块的RTL视图简单了一点,但是依然有好多寄存器。看起来不方便。
如果只想看到类似于下面这种简单的模块框图怎么办?
好像只能自己手动画出来,然后在考虑在顶层模块中如何将这两个独立模块的输入输出端口连接起来。
如果模块的输入输出端口比较多,手动画的时候不仅浪费时间,还容易出错。这时就可以利用Quartus II自带的框图输出功能,将各个独立模块输出为一个整体框图。
具体操作方法如下:
在工程中打开文件列表,然后在按键模块 key_debounce.v文件上单击鼠标右键,选择Creat Symbol Files for Current File
这时会在工程目录下生成一个 key_debounce.bsf文件。
双击打开新生成的这个文件
这时就可以看到系统自动生成了按键模块的框图,左边为输入端口,右边为输出端口。
用同样的方法对LED模块也生成框图
这样分别生成了按键模块和LED模块的模块框图,那能不能将这两个框图放到一个文件中?这样看起来的就更加直观了。
当然是可以的
在工程中选择新建文件
让选择 Block Diagram /Schematic File文件,点OK按钮。
然后在空白处双击鼠标
在左边点3个点的按钮,打开刚才生成的模块框图文件。
这时在右边的预览框中就可以看到led模块的框图,
点OK按钮,然后将led模块框图放在图中任意的位置。
用同样的方法,双击空白处,添加按键模块框图。
这时候系统会自动将刚才的文件夹添加进来,直接在上面选择按键模块就可以了,然后点OK按钮。将按键模块也放在图纸中。
按键模块右上角还显示了一个参数列表,这是在按键模块中定义的延时参数。这个可以不用关心。这样在一个文件中就可以看到各个模块的输入输出端口了。这个文件中还可以使用连线工具将各个模块的端口连接起来。
通过最上方的工具栏选择接口和连线工具,将两个模块连接起来。
将按键模块的按键输出和led模块的按键值输入直接连接起来,按键的输入口作为顶层文件的输入,led的输出口作为顶层文件的输出口,时钟和复位为所有模块共用。
这样通过模块框图和连线关系,就可以很清楚的明白,顶层模块要怎么设计,子模块之间的连线关系是怎样的。
利用Quartus II生成输入输出框图这个功能,每设计一个子模块就能清晰的看出模块接口。比直接在代码中看要直观的多。在新手编写代码的时候有助于理清思路。
要注意一个问题,在工程编译的时候记得要将新建的这个.bdf文件从工程中删除,否则工程会报错。
在top_key_led.bdf文件上单击鼠标右键,选择Remove File from Project。
这个文件删除后在重新编译工程,就不会报错了。
当工程比较小的时候这个框图的作用不太明显,当工程比较大的时候,这个框图的优势就会体现出来。
比如在SDRAM读写测试的工程中,通过写FIFO将数据写入到SDRAM中,然后在通过一个读FIFO将数据从SDRAM中读出来。
整体的RTL视图如下:
这个工程通过RTL视图就很难看清楚各个模块之间的连接关系。
这时通过Quartus II生成输入输出框图这个功能,将顶层模块和各个子模块连接起来,通过这个框图就能很清楚的看出来模块间的关系。在阅读程序或者维护程序的时候就会比较方便。