参考博文:https://www.cnblogs.com/sepeng/p/5578402.html

参考书目:英文版:《advanced FPGA design》    中文版:《高级FPGA设计,结构,实现,和优化》

衡量FPGA设计的两个重要指标是吞吐率和延迟。

吞吐率:指系统每一个时钟周期内能够处理的数据数量,为了获得更高的吞吐率就需要减少组合逻辑延迟,在组合逻辑中间插入寄存器,也就是流水线设计。

延迟:指数据从输入系统到输出系统总共需要的时间,为了获得更短的延迟,可以减少组合逻辑延迟,或者删减路径上的寄存器,第二种方法显然不利于系统获得更好的性能。

时序优化的几种方法

这里说的优化是让FPGA设计获得更高的工作频率,也就是通常说的性能和吞吐率。

1.插入寄存器(pipeline)

这种方式会增加设计的时滞(clock latency)。插入了几个寄存器,结果输出就会延长几个周期,在不违反设计规格(对clock latency有要求)以及功能没有影响的时滞情况之下可以这么做。举例说明,如果下面一个FIR滤波器的设计没能满足时序要求。

module fir(output [7:0] Y,input  [7:0] A,B,C,X,input        clk,input        validsample);always @(posedge clk)if(validsample) beginX1<=X;X2<=X1;Y<=A*X+B*X1+C*X2;end
endmodule

  从代码可以看出,X2这条路径过长,是整个设计的Critical Path,如果采用流水线设计可以用寄存器暂存自已在执行Y的运算,改进如下:

module fir(output   [7:0] Y,input    [7:0] A,B,C,X,input            clk,input            validsample);reg       [7:0] X1,X2,Y;reg       [7:0] prod1,prod2,prod3;always @(posedge clk) beginif(validsample) beginX1<=X;X2<=X1;prod1<=A*X;prod2<=B*X1;prod3<=C*X2;endY<=prod1+prod2+prod3;end
endmodule

2.并行化设计

  并行化设计的思想是将一个逻辑函数分解为几个小一些的逻辑函数并行计算,从而减少关键路径上的延迟 。

  例如计算两个8bits数的乘法,将8bits数分为两个4bits数,则乘法运算可以被分解为下面几个部分:

X∗X={A,B}∗{A,B}={(A∗A),(2∗A∗B),(B∗B)};X∗X={A,B}∗{A,B}={(A∗A),(2∗A∗B),(B∗B)};

  通过这种方法可以将设计简化为一系列4bits乘法器的实现。

module power3(output  [7:0] XPower,input   [7:0] X,input         clk);reg     [7:0] XPower1;//部分结果寄存器reg     [3:0] XPower2_ppAA,XPower2_ppAB,XPower2_ppBB;reg     [3:0] XPower3_ppAA,XPower3_ppAB,XPower3_ppBB;reg     [7:0] X1,X2;wire    [7:0] XPower2;wire    [3:0] XPower1_A = XPower1[7:4];wire    [3:0] XPower1_B = XPower1[3:0];wire    [3:0] X1_A      = X1[7:4];wire    [3:0] X1_B      = X1[3:0];wire    [3:0] XPower2_A = XPower2[7:4];wire    [3:0] XPower2_B = XPower2[3:0];wire    [3:0] X2_A      = X2[7:4];wire    [3:0] X2_B      = X2[3:0];assign XPower2 = (XPower2_ppAA << 8) + (2*XPower2_ppBB << 4) + XPower2_ppBB;assign XPower  = (XPower3_ppAA << 8) + (2*XPower3_ppBB << 4) + XPower3_ppBB;always @(posedge clk) begin//第一级流水线X1 <=X;XPower1 <= X;//第二级流水线X2 <= X1;XPower2_ppAA <= XPower1_A * X1_A;XPower2_ppAB <= XPower1_A * X1_B;XPower2_ppBB <= XPower1_B * X1_B;//第三级流水线XPower3_ppAA <= XPower2_A * X2_A;XPower3_ppAB <= XPower2_A * X2_B;XPower3_ppBB <= XPower2_B * X2_B;end
endmodule

3.逻辑展平

通过优化掉设计中的优先级译码电路,逻辑结构被展平,路径延迟得以缩短,优先级译码电路常出现在IF/ELSE结构语句中出现。

module regwrite(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

上面代码综合后就会产生优先级译码器,通过各项平级的if语句或者case语句可以避免这样的优先级译码设计

//改进后
module regwrite(output reg [3:0] rout,input            clk,in,input      [3:0] ctrl);always @(posedge clk) beginif(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

4.均衡设计

均衡设计的思想是把 Critical Path 上的组合逻辑拿出一部分放在 short path 上进行,从而缩短 Critical Path 的延迟。

下面举例一个8位加法器。

module adder(output reg [7:0] Sum,input      [7:0] A,B,C,input            clk);reg        [7:0] rA,rB,rC;always @(posedge clk) beginrA <= A;rB <= B;rC <= C;Sum <= rA+rB+rC;end
endmodule

可以看到,在寄存器rA,rB,rC之前的路径上没有组合逻辑,所以可以考虑把一部分计算拿到寄存器之前

//改进后
module adder(output reg [7:0] Sum,input      [7:0] A,B,C,input            clk);reg        [7:0] rABSum,rC;always @(posedge clk) beginrABSum <= A + B;rC     <= CSum    <= rABSum + rC;end
endmodule

5.优化路径

最后一种方法也是我认为最难的,通过优化数据流的路径来缩短 Critical Path ,提升系统性能。重新布局和 Critical Path 在一起的路径,从而 Critical Path上的逻辑门可以更靠近目标寄存器。举一个栗子:

module randomlogic(output reg [7:0] Out,input      [7:0] A,B,C,input            clk,input            Cond1,Cond2);always @(posedge clk)if(Cond1)Out <= A;else if(Cond2&&(C<8))Out <= B;elseOut <= C;
endmodule

可以看到C作为B的输出条件的路径最长,经过了一个比较器和两个逻辑门,是整个设计的 Critical Path ,可以做后续优化。

//改进后
module randomlogic(output reg [7:0] Out,input      [7:0] A,B,C,input            clk,input            Cond1,Cond2);wire CondB = (Cond2 &!Cond1);always @(posedge clk)if(CondB&& (C<8))Out <= b;else if(Cond1)Out <= A;elseOut <= C;
endmodule

【FPGA——时序篇】时序优化的几种方法相关推荐

  1. golang string 加号连接性能慢_面试必备:浅析C#性能优化的若干种方法

    浅析C#性能优化的若干种方法 1.1 垃圾回收 垃圾回收解放了手工管理对象的工作,提高了程序的健壮性,但副作用就是程序代码可能对于对象创建变得随意. 1.1.1 避免不必要的对象创建 由于垃圾回收的代 ...

  2. MySQL性能优化的9种方法

    MySQL性能优化的9种方法 1.选择最合适的字段属性 Mysql是一种关系型数据库,可以很好地支持大数据量的存储,但是一般来说,数据库中的表越小,在它上面执行的查询也就越快.因此,在创建表的时候,为 ...

  3. Java中性能优化的35种方法汇总

    原文地址:http://www.jb51.net/article/102831.htm 前言 对程序员们来说,代码优化是一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于 ...

  4. SQL语句优化的30种方法

    点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源! 上一篇:Alibaba开源内网高并发编程手册.pdf 作者:羋虹光 链接:https://www.jianshu.com/p/3ab1 ...

  5. Java实现数据批量导入数据库(优化速度-2种方法)

    目录 程序结构 连接数据程序 批量处理的两种方式 main方法 使用JDBC连接MySQL数据库进行数据插入的时候,经常会遇到数据量较大,插入数据库较慢,如何进行优化,加快导入数据库的速度,批量处理呢 ...

  6. 《转》sql优化的几种方法

    原文 在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ...

  7. 前端性能优化的七种方法

    前端性能优化主要有七种方法,包括减少请求数量.减少资源大小.优化网络连接.优化资源加载.减少重绘回流.使用性能更好的API和webpack优化 1.减少请求数量 1.1 图片处理 1.1.1 雪碧图 ...

  8. 关于数据库优化的几种方法

    首先,要讲清为什么要进行sql优化,sql的优化可能当你在写单个程序的时候,你的感触没有那么深,但是当程序中有很多sql的时候,你就会发现,sql的优化有多么重要.个别sql的查询数据量可能会很大,当 ...

  9. 第二十七篇 网页数据解析三种方法: 正则表达--BeautifulSoup--xpath 满满的干货

    心得: 生活不允许自己懈怠自己,革命尚未成功,同志还须努力,有句话说的好,你尽管努力,剩下的交给天意. 我们从网页上抓取的原始数据大多都是html的数据格式,那如何从html中提取想要的字符串,得需要 ...

最新文章

  1. Spring Boot 学习(1)
  2. boost::asio::streambuf 基本用法和注意事项
  3. 转:什么是即时编译(JIT)!?OpenJDK HotSpot VM剖析
  4. js url传值中文乱码之解决之道
  5. 努力≠上进!那些“熬夜”持续精进的人有多可怕!
  6. html div如何列对其,CSS:自适应N列布局如何解决两端对齐
  7. Python类的调用之同一个文件里面
  8. 僵尸 AI 来了,人类该怎么办?
  9. 【转】数据库常用面试题
  10. [转载] 全本张广泰——第十九回 御赐黄马褂 奉旨喜还乡
  11. 小米浏览器 解析html5,JavaScript - 判断当前用户使用的浏览器
  12. imagej得到灰度图数据_【原创】imagej使用达人指南,分享给大家!
  13. rabbitmq 消息确认机制ACK
  14. 春节假期 | 最强抢票攻略
  15. Linux中_countof函数,Linux电源管理(8)_Wakeup count功能
  16. mac chrome更新错误12
  17. Chapter5.1:频率响应法
  18. POJ 1606 Jugs
  19. 华为数字化转型之道 实践篇 第八章 数字化交易:让做生意简单、高效
  20. SBI集团向“Smart Card”钱包制造商投资1500万美元

热门文章

  1. 极光推送技术原理:移动无线网络长连接(转自eoe移动开发门户)
  2. 自行车头盔骑行必备的装备
  3. 2022-2028全球超强钢丝绳行业调研及趋势分析报告
  4. EA 显示 toolbox
  5. 『C/C++养成计划』C++中的双冒号::名解析(Scope Resolution Operator)
  6. 书法之美--篆书在线查询
  7. 班级页面设计——【1-登陆注册页面】
  8. HTTP连接方式阐述
  9. mapbox轨迹动画效果
  10. 在spring官网上下载spring的jar包及API文档