时序问题一直是一个难以理解的难点,这里通过一个简单的实际案例来学习下时序分析,以及解决的方案。

本博文使用Vivado来进行测试分析。

下面给出测试代码:

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2019/03/19 09:58:03
// Design Name:
// Module Name: time_analyze
//
//module time_analyze(input [4:0] data_in,input clk,input reset,output reg [4:0] data_out);reg [4:0] data_tmp_in;wire [4:0] data_tmp_out;wire [4:0] data_tmp2,data_tmp3,data_tmp4,data_tmp5,data_cal_out;always@ (posedge clk) beginif(reset) data_tmp_in <= 0;else data_tmp_in <= data_in;end//连续乘法,增加逻辑门数量assign data_tmp2 = data_tmp_in * 3;assign data_tmp3 = data_tmp2 * data_tmp_in;assign data_tmp4 = data_tmp3 * data_tmp2;assign data_tmp5 = data_tmp4 * data_tmp3;assign data_cal_out = data_tmp5;always@ (posedge clk) beginif(reset) data_out <= 0;else data_out <= data_cal_out;endendmodule

代码说明:

从测试代码可以看出,本测试故意使用多级乘法来增加逻辑延迟,故意让时序尽可能不满足。

assign data_tmp2 = data_tmp_in * 3;
    assign data_tmp3 = data_tmp2 * data_tmp_in;
    assign data_tmp4 = data_tmp3 * data_tmp2;
    assign data_tmp5 = data_tmp4 * data_tmp3;
    assign data_cal_out = data_tmp5;

对代码进行RTL分析,得原理图:

可见,两边为寄存器,中间为一系列的组合逻辑。

之后进行综合、实现:

如下图:

在Design Runs状态栏里,看到impl_1前面有一个感叹号,这就表示布线的时序不通过。

继续查看:

由以上信息可知,建立时间不满足,以路径1为例,裕量为-1.790ns。单击-1.790可见,弹出对话框表示,这条路径需要数据在9.422ns到达第二个触发器的输入,但实际消耗了11.212ns,导致建立时间不足。

数据到达时间太长,易知是逻辑延迟以及布线延迟等引起,下面我们提供几种方案解决本例中的时序不满足问题。


时序优化:

(1)简化逻辑

简单粗暴一点,通过减少器件的数目,来减少逻辑延迟,使之能够符合时序要求。

更改后代码如下:

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2019/03/19 09:58:03
// Design Name:
// Module Name: time_analyze
//module time_analyze(input [4:0] data_in,input clk,input reset,output reg [4:0] data_out);reg [4:0] data_tmp_in;wire [4:0] data_tmp_out;wire [4:0] data_tmp2,data_tmp3,data_tmp4,data_tmp5,data_cal_out;always@ (posedge clk) beginif(reset) data_tmp_in <= 0;else data_tmp_in <= data_in;end//连续乘法,增加逻辑门数量assign data_tmp2 = data_tmp_in * 3;
/*    assign data_tmp3 = data_tmp2 * data_tmp_in;assign data_tmp4 = data_tmp3 * data_tmp2;assign data_tmp5 = data_tmp4 * data_tmp3;*/assign data_cal_out = data_tmp2;always@ (posedge clk) beginif(reset) data_out <= 0;else data_out <= data_cal_out;endendmodule

RTL电路图如下:

可见:

时序便没有了问题。

(2)插入触发器

在组合逻辑中间插入触发器,将原本需要一个周期完成的逻辑转换成两个周期完成,分散了时序的压力,从而使时序达到要求。当然,这会使数据多出一个周期的延迟。

修改例子中的组合逻辑,插入以一级触发器,代码如下:

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2019/03/19 09:58:03
// Design Name:
// Module Name: time_analyze
//
//module time_analyze(input [4:0] data_in,input clk,input reset,output reg [4:0] data_out);reg [4:0] data_tmp_in;wire [4:0] data_tmp_out;wire [4:0] data_tmp2,data_tmp3,data_tmp5,data_cal_out;reg [4:0] data_tmp4;always@ (posedge clk) beginif(reset) data_tmp_in <= 0;else data_tmp_in <= data_in;end//连续乘法,增加逻辑门数量assign data_tmp2 = data_tmp_in * 3;assign data_tmp3 = data_tmp2 * data_tmp_in;always@ (posedge clk) beginif(reset) data_tmp4 <= 0;else data_tmp4 <= data_tmp3 * data_tmp2;endassign data_tmp5 = data_tmp4 * data_tmp3;assign data_cal_out = data_tmp5;always@ (posedge clk) beginif(reset) data_out <= 0;else data_out <= data_cal_out;endendmodule

RTL原理图如下:

实现后:

时序没有问题。

(3)用低频时钟

将时序约束的时钟改变如下:

create_clock -name clk -period 40.000 [get_ports clk]

Verilog HDL 代码用最原始的代码。

实现后:

可见时序余量很大了,没有问题。

这里只是一个例子,提供一种参考,时钟频率这里改的太低了。实际应用中,自己斟酌。

FPGA时序案例分析【Vivado版】相关推荐

  1. matlab 30案例 目录,MATLAB-智能算法30个案例分析-终极版(带目录).doc

    MATLAB-智能算法30个案例分析-终极版(带目录) MATLAB 智能算法30个案例分析(终极版) 1?基于遗传算法的TSP算法(王辉)? 2?基于遗传算法和非线性规划的函数寻优算法(史峰)? 3 ...

  2. MIPI DPHY接口(基于Xilinx FPGA实现)案例分析

    大家好,我是"FPGA功夫熊猫",这次分享一个在Xilinx FPGA实现MIPI DPHY接口的案例(包括CIS协议层).截止目前为止,Xilinx仅在Ultrascale+及其 ...

  3. 3 FPGA时序约束理论篇之IO约束

    I/O约束   I/O约束是必须要用的约束,又包括管脚约束和延迟约束. 管脚约束   管脚约束就是指管脚分配,我们要指定管脚的PACKAGE_PIN和IOSTANDARD两个属性的值,前者指定了管脚的 ...

  4. 5 FPGA时序约束理论篇之两种时序例外

    两种时序例外 多周期路径   上面我们讲的是时钟周期约束,默认按照单周期关系来分析数据路径,即数据的发起沿和捕获沿是最邻近的一对时钟沿.如下图所示.   默认情况下,保持时间的检查是以建立时间的检查为 ...

  5. 1 FPGA时序约束理论篇之建立保持时间

    读万卷书–时序约束理论篇 周期约束理论   首先来看什么是时序约束,泛泛来说,就是我们告诉软件(Vivado.ISE等)从哪个pin输入信号,输入信号要延迟多长时间,时钟周期是多少,让软件PAR(Pl ...

  6. 2 FPGA时序约束理论篇之时序路径与时序模型

    时序路径   典型的时序路径有4类,如下图所示,这4类路径可分为片间路径(标记①和标记③)和片内路径(标记②和标记④).   对于所有的时序路径,我们都要明确其起点和终点,这4类时序路径的起点和终点分 ...

  7. 4 FPGA时序约束理论篇之时钟周期约束

    时钟周期约束   时钟周期约束,顾名思义,就是我们对时钟的周期进行约束,这个约束是我们用的最多的约束了,也是最重要的约束.   下面我们讲一些Vivado中时钟约束指令. 1. Create_cloc ...

  8. 6 FPGA时序约束理论篇之xdc约束优先级

    xdc约束优先级   在xdc文件中,按约束的先后顺序依次被执行,因此,针对同一个时钟的不同约束,只有最后一条约束生效.   虽然执行顺序是从前到后,但优先级却不同:就像四则运算一样,±x÷都是按照从 ...

  9. 【蜂鸟E203的FPGA验证】Chap.8 Vivado综合与性能分析-Vivado性能分析

    [蜂鸟E203的FPGA验证]Chap.8 Vivado综合与性能分析-Vivado性能分析 综合后资源利用率分析 2. 综合后功耗与功耗优化 3. 综合后布局布线实现 4. 综合后静态时序分析 前言 ...

最新文章

  1. String性能提升10倍的几个方法!(源码+原理分析)
  2. 如何将OutputStream转换为InputStream?
  3. IJCAI 2021 ICAPS 2021自动强化学习挑战赛正式开赛
  4. 超越Swin,Transformer屠榜三大视觉任务!微软推出新作:Focal Self-Attention
  5. 转【微信小程序 四】二维码生成/扫描二维码
  6. 总共4行代码使用fastxml.json实现Java对象的序列化和反序列化
  7. php7.0 yield,PHP7中生成器的新特性 yield-from amp;amp; return-values
  8. 前后端分离Java后端跨越问题解决
  9. Intel 64/x86_64/x86/IA-32处理器的指令指针(IP/EIP/RIP)
  10. ionic云开发系列二之调用webservice
  11. 又见 Lucky Number
  12. JAVA 编程 练习题
  13. android 删除系统服务,不ROOT卸载系统自带应用
  14. 1384. 按年度列出销售总额
  15. 【Mapreduce】利用job嵌套,多重Mapreduce,求解二度人脉
  16. 码云webhook node版
  17. 计算机科学导论专业理解,浅析计算机专业_计算机科学导论_课程的现状及思考.doc...
  18. Python 修改python插件包的默认安装路径
  19. 《C程序设计》谭浩强
  20. RDKit | 基于RDKit和SMARTS的化学反应处理

热门文章

  1. Android拖拽图片的实现
  2. 电子与通信工程专硕考分_2021西安电子科技大学电子与通信工程考研经验分享...
  3. spark编程mysql数据源_Spark - 直接操作数据源 MySQL
  4. dockerfile php-fpm,1、使用dockerfile制作nginx+php-fpm镜像,实现lnmp。
  5. python opencv模板匹配多目标_基于opencv的多目标模板匹配
  6. win8无线网服务器,Win8连接wifi受限
  7. html需要电脑什么配置,配置一台电脑需要什么 选择配置一台好的台式电脑
  8. 数据库监听触发器java_SqlServer触发器监听数据调用存储器调用java接口
  9. 弹出框口登录php代码,如何用JQuery写出登录弹出框
  10. axure怎样24位bmp输出_平衡(非平衡)输入输出的无源变压器前级放大器