(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门,作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。如需整个工程请留言(WX:Blue23Light),不收任何费用,但是仅供参考,不建议大家获得资料后从事一些商业活动!)
前面几节课讲解的乘法和除法运算都需要一定的系统时钟来处理,以十七课的无符号位的乘法器为例,从数据输入乘法器到结果输出需要9个时钟周期,如果系统时钟是100MHz,那这个乘法器的处理速度也就是11MHz。那如果实际工程要求这个乘法器的处理速度和系统时钟100MHz一样,能不能实现呢?
要回答上面的问题,我们就要先熟悉一下流水线。流水线,又称装配线,工业上的一种生产方式,指每一个生产单位只专注处理某一个片段的工作,以提高工作效率及产量。笔者曾经在工厂里指导过工人的装配,对流水线操作还是深有感悟的。比如有1个产品的装配需要10个串行的步骤,每个步骤需要5分钟,那组装一个产品需要50分钟,如果只有1个流水线,那1天下来也就只能装配10几个产品。有时候产品的需求量增大,1天只装配10几个产品赶不上供货,那工厂就会增加人手多几个流水线,其实就是对第1个流水线的完整复制。那2个流水线1天就能装配20多个产品,3个流水线1天就能装配30多个产品......如果一天需要装配100个产品,那就需要10条流水线即可。
如果用1条流水线上的10个人生产100个产品,大约需要10天的时间;如果改成10条流水线的100人生产100个产品,那用1天的时间就可以完成!所以增加流水线可以节省大量的时间,但是同时要消耗大量的人力资源!把流水线用到FPGA开发上,比如上面说到的乘法器,增加乘法器的流水线操作,可以加快乘法器的处理速度,但是以前用一个乘法器,现在要用多个乘法器,很明显会成倍的消耗FPGA的逻辑资源!
如下所示,假如系统时钟是100MHz,一条流水线的操作流程需要5个时钟周期,在第5个时钟周期输出结果。如果系统采用1个流水线就像操作,那系统的处理速度就是20MHz。如果采用5个流水线进行同步操作,那系统的处理速度就可以达到100MHz!看看图中最后的输出,除了前4个时钟周期无数据输出,后面是每个时钟周期有一个数据输出。
下面我们来设计十七课无符号位乘法器的流水线操作,让乘法器的处理速度到达系统时钟100MHz。由于一个乘法器处理需要9个系统时钟,那就需要使用9个乘法器组成9个流水线,控制输入的数据分别进入这9个流水线,最后控制9个流水线的输出统一进行输出。
新建pipeline文件,定义流水线的参数PIPELINE_CNT=9,同时使用计数器cnt控制数据的输出和输出。
实现了计数器cnt,同时根据cnt的值控制输入的数据进入第1级流水线,后面的8级流水线类似。
例化了8个乘法器,形成8级流水线。
最后根据流水线的输出完成系统数据的数据即可。
在仿真tb文件中产生随机的数据,双击sim文件夹下的top_tb.bat文件,完成自动化的仿真。
moselsim的仿真结果如下所示,刚开始的12个时钟无数据输出(包括产生标志信号进行的延迟),后面是每个系统时钟都要一个乘法器的输出,验证一下128*42=5376;232*92=21344;72*77=5544......,仿真功能正常!
从流水线的操作,这里说明一下FPGA设计中的一个重要原则,就是面积和时间互换原则。面积反应的是FPGA内部的资源,时间反应的是FPGA处理的速度。我们要根据时间的情况来选择到底是面积优先还是速度有效,如果FPGA的资源足够,那就可以用更大的面积来换取更快的处理速度,如果FPGA的资源比较紧张,那就只好牺牲一定的处理速度了,也就是降低性能。