【技术分享】FPGA高级设计实例-时序优化之设计结构扁平化
0赞
发表于 12/16/2013 3:40:03 PM
阅读(2871)
翻译《Advanced FPGA Design Architecture, Implementation, and Optimization》一书部分章节,不是因为舍不得花钱买已出版的翻译版本,只是真心觉得翻译的很坑爹,所以把一些有用的章节按照自己的理解编译出来,一方面可以作为内部参考,另一个方面可以加深自己对原版的理解。对于翻译的问题,请大家多给出建议和意见。
对于速度优化这章,前面一篇博文已经贴出了时序优化的几个小节,原书作者给出的实例代码也有展示,由于原作者实例运行的平台是Xilinx器件,而综合工具使用的是Sycplify。笔者最近几年只是使用Altera的器件,综合工具多使用Quartus II自带的工具。所以前一篇博文的实例已经在其它网站都有重新经过Quartus II编译以后的结果展示,这里就不再重复展示了。
本文要展示原书中关于时序优化的第三个方法,即让设计结构扁平化。下述代码是作者举例的原始代码:
module regwritea( output reg[3:0]rout, input clk,in, input[3:0]ctrl); always@(posedge clk) if(ctrl[0]) rout[0]<=in; else if(ctrl[1]) rout[1]<=in; else if(ctrl[2]) rout[2]<=in; else if(ctrl[3]) rout[3]<=in; endmodule如果将上述代码在Quartus II中进行编译,那么编译的结果如图1所示:
图1:有优先级编码
如果根据原书将前面代码修改如下所示:
module regwriteb( output reg[3:0]rout, input clk,in, input[3:0]ctrl); always@(posedge clk)begin if(ctrl[0])rout[0]<=in; if(ctrl[1])rout[1]<=in; if(ctrl[2])rout[2]<=in; if(ctrl[3])rout[3]<=in; end endmodule再将上述代码在Quartus II中编译,那么编译结果如图2所示。
图2:无优先级编码
代码修改前后区别是if-else结构的差异,第一个是带有优先级的if-else结构,位置靠前的入口优先级更高一些,而第二个是没有优先级,所以说每个分支都是并行的关系。通过图1和图2的比较可以看到代码修改前后,关键路径的延时是不一样的,图2中所有路径都一样,即只有一级寄存器;而图1中关键路径上多了两级组合逻辑,即多路选择器。