本文研究含有LPM_PIPELINE参数的LPM函数(如:LPM_ADD_SUB、LPM_MULT等),对LPM_PIPELINE参数的作用做了一些探讨。
LPM_PIPELINE参数的说明是:“Specifies the number of clock cycles of latency associated with the result [] output. The default value of zero indicates that no latency exists, and that a purely combinatorial function will be instantiated. The default value is zero (non-pipelined).”——from 《LPM quick reference guide》。翻译过来就是:“(此参数)指定了输出值result []的时钟延时周期。缺省值是0,也就是没有延时,是纯粹的组合逻辑电路。缺省值是0,即流水线级数为0。”
那么,该参数除了能使输出结果延时,对提升系统整体处理速率还有什么帮助呢?今天hustzq就利用LPM_MULT函数做了这样的实验。实验程序是利用3次乘法和3次加/减法完成一次复数乘:R+jI=(x+jy)(c+js)。将此等式化成:R=(c-s)y+c(x-y)和I=(c+s)x-c(x-y)。在Quartus II中使用Cyclone III芯片仿真。LPM_MULT的LPM_PIPELINE参数设为3。
第一组实验:clk=50ns。不使用LPM_PIPELINE参数和使用LPM_PIPELINE参数的对比:
图1 不使用LPM_PIPELINE参数,clk=50ns
图2 使用LPM_PIPELINE参数,clk=50ns
第二组实验:clk=5ns。不使用LPM_PIPELINE参数和使用LPM_PIPELINE参数的对比:
图3 不使用LPM_PIPELINE参数,clk=5ns
图4 使用LPM_PIPELINE参数,clk=5ns
分析第一组实验:图2比图1输出延时3个clk,计算速度并没有增加,实际计算耗时都是6ns左右。
分析第二组实验:两个图的计算结果不同。第二个才是正确的按照时钟输出的结果。
结论:如果时钟周期比计算过程本身所耗费时间大很多,即计算、处理的时间很小、可忽略不计,则在一个时钟内完全可以完成计算,pipeline的作用仅仅是延时输出结果。如果计算处理的时间和时钟周期相当,在一个时钟内不能完成计算,则必须使用pipeline,否则前一次计算还没完成,又有新数据输入要求计算,此时输出是错误结果。
原来在一个时钟内不能完成运算,现在加入pipeline,虽然输出延迟几个clk周期,但可以正确的完成计算,如果把系统作为一个“黑盒”,设置pipeline “加快”了运算速度。这也就是pipeline的最终作用。
参考文献:
1. Altera公司:《LPM quick reference guide》
2. Uwe Meyer-Baese著 刘凌 胡永生 译:《数字信号处理的FPGA实现》
ilove314_323192455 2009-2-3 18:38
ash_riple_768180695 2008-3-15 08:13