如何快速学习FPGA之炼狱传奇层次化

2015年06月18日 10:21    发布者:zxopen09

  147549

本节我们通过驱动流水灯的不同方式来体现Fpga中的一个重要思想—层次化设计。首先介绍一下我所使用开发板的硬件资源,50MHZ时钟输入、4个低电平点亮的流水灯。然后通过两种不同驱动方式的对比使读者更加深层次的了解层次化设计        下图提供了一段流水灯代码,请问能够实现流水现象吗?
http://bbs.eeworld.com.cn/data/attachment/forum/201503/11/100629h77mjmyl73oknloy.png.thumb.jpghttp://bbs.eeworld.com.cn/data/attachment/forum/201503/11/100638d6p5og8aa63q8bby.png.thumb.jpghttp://bbs.eeworld.com.cn/data/attachment/forum/201503/11/100641bdwc3ktbrtbmd6dr.png.thumb.jpg
与上述代码所对应的波形图如下
http://bbs.eeworld.com.cn/data/attachment/forum/201503/11/100832dufaegzduvvewfsf.png.thumb.jpg
FPGA的时钟是50M,周期20ns,上述代码每隔20ns,流水灯的状态发生改变,即每个灯亮的状态是20ns,时间非常短,人的肉眼观察不到灯亮的状态。    由于周期特别短导致无法观察到灯亮,因此只要通过计数器将周期延长一定的时间,就可以看到“流水”现象。以下代码通过设计一个计数器count将周期延长到两秒,代码如下下面提供相对应的仿真代码,通过参数传递的方式将led_fsm1 中的NUM赋值为50,代替NUM=28'd100000000,提高仿真效率
具体解释如下,在led_fsm1中NUM 达到28'd100000000-1(NUM-1)时,才会产生时钟的跳转,但是在波形仿真中仿真时间长,效率低,通过参数传递将50传给NUM,这样在仿真中,NUM-1=49时,时钟发生翻转,提高仿真效率,参数传递时,将参数定义为parameter 类型,并且在文件中凡是能够用到参数的地方,尽量要用参数表示,比如用到28'd100000000-1,可以用NUM-1代替,否则会导致参数传递失败。具体参考给出的波形文件有以上波形可以看出,复位结束以后,流水灯的驱动端口led_out和状态机的状态寄存器state在时钟上升沿的驱动下有效配合,实现了数据的滚动赋值,可以正确实现流水灯设计。
下面编辑顶层模块,顶层模块的主要功能是将分频模块和流水灯控制模块连接起来,我们要求在顶层中只做端口连线,不做任何逻辑。顶层具体代码如下:Netlist Viewers->RTL Viewerhttp://bbs.eeworld.com.cn/data/attachment/forum/201503/11/102658nyo44x64s0lt1b1c.png.thumb.jpg查看结果如下http://bbs.eeworld.com.cn/data/attachment/forum/201503/11/102738bz5llxdkdgeurr5l.png.thumb.jpg>由上图可以说明,最终综合出来的电路和我们所设想的是完全一致的。
通过对比以上两种方法,可以很明显的发现层次化设计的RTL视图能够清晰的反映出模块之间的连接关系,在设计中可以独立的对每个模块进行设计,降低设计的复杂度,尤其是大规模的设计,也便于代码的调试,将一个复杂的系统转换为对每个独立模块的调试,所以层次化设计是一项非常重要的设计技巧

传奇
本主题由 梦翼师兄 于 2015-3-21 09:56 限时高亮
4.png (35.9 KB, 下载次数: 0)



该文章有附件资料,如需下载请访问 电脑版

网友评论

zxopen09 2015年06月25日
顶一下