出现时序违例怎么解决-VIVADO

2023-10-10 07:10

本文主要是介绍出现时序违例怎么解决-VIVADO,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


在工程应用中,经常会使用不同频率的时钟。
在不同条件下,出现时序违例。
在出现时序违例时,导致编译时间过长。

一、出现时序违例?

时序分析的测试程序:

`timescale 1ns/1ps
module test_top_1 (input pri_clock,    // 50M主时钟input sec_clk,input	A1,output	A2);//MMCM生成20M、30M、50M、100M、200M的衍生时钟
wire clk20m,clk30m,clk50m,clk100m,clk200m;
wire locked;clk_wiz_0 gen_clk(// Clock out ports.clk20m(clk20m),     // output clk20m.clk30m(clk30m),     // output clk30m.clk50m(clk50m),     // output clk50m.clk100m(clk100m),     // output clk100m.clk200m(clk200m),     // output clk200m// Status and control signals.reset(1'b0), // input reset.locked(locked),       // output locked// Clock in ports.clk_in1(pri_clock));      // input clk_in1//使用50M的时钟生成逻辑复位信号
reg rst_n;
reg [15:0] rstn_cnt=0;
always @(posedge clk50m) begin : proc_logic_rstif(~locked) beginrst_n <= 0;rstn_cnt<=0;end else if(rstn_cnt>=1000)beginrst_n <= 1;rstn_cnt<=rstn_cnt;end	else beginrst_n<=0;rstn_cnt<=rstn_cnt+1;end
endreg [31:0] cnt_1;
reg [31:0] cnt_2;
reg [31:0] cnt_3;
reg [31:0] cnt_4;
reg [31:0] cnt_5;//在20M的时钟域下,异步复位同步释放,计数器1增加
always @(posedge clk20m or negedge rst_n) begin : proc_cnt_1if(~rst_n) begincnt_1 <= 0;end else if(A1)beginif(cnt_5>=50000)cnt_1<=0;else cnt_1 <= cnt_1+1;end
end//在30M的时钟域下,异步复位同步释放,计数器2增加
always @(posedge clk30m or negedge rst_n) begin : proc_cnt_2if(~rst_n) begincnt_2 <= 0;end else if(cnt_1>31'hff)begincnt_2 <= cnt_2+1;end else cnt_2<=0;	
end//在50M的时钟域下,异步复位同步释放,计数器3增加
always @(posedge clk50m or negedge rst_n) begin : proc_cnt_3if(~rst_n) begincnt_3 <= 0;end else if(cnt_5>31'hffff)begincnt_3 <= cnt_3+1;end
end//在100M的时钟域下,异步复位同步释放,计数器4增加
always @(posedge clk100m or negedge rst_n) begin : proc_cnt_4if(~rst_n) begincnt_4 <= 0;end else if(cnt_3>32'hffffff)begincnt_4 <= cnt_4+1;end
end//在200M的时钟域下,异步复位同步释放,计数器5增加
always @(posedge clk200m or negedge rst_n) begin : proc_cnt_5if(~rst_n) begincnt_5 <= 0;end else if(cnt_1>=8933)begincnt_5 <= cnt_5+1;end
end//使用clk200m分频,得出40m时钟
localparam priod_cnt_40=200/40;
reg [7:0] div_cnt;
reg clk40m;
always @(posedge clk200m or negedge rst_n) begin : proc_div_cntif(~rst_n) begindiv_cnt <= 0;clk40m<=0;end else if(div_cnt>=(priod_cnt_40>>1)-1)begindiv_cnt<=0;clk40m<=~clk40m;	end else begin 	div_cnt <= div_cnt+1;clk40m<=clk40m;end 
endreg [15:0] cnt_6;
always @(posedge clk40m or negedge rst_n) begin : proc_cnt_6if(~rst_n) begincnt_6 <= 0;end else if(cnt_5==199)begincnt_6 <= 0;end else cnt_6<=cnt_6+1;
end//另一路输入时钟
//sec_clk
reg [15:0] cntx_1;
always @(posedge sec_clk or negedge rst_n) begin : proc_cntx_1if(~rst_n) begincntx_1<= 0;end else begincntx_1<= cntx_1+1;end
endassign A2=cnt_1[31]&cnt_2[31]&cnt_3[31]&cnt_4[31]&cnt_5[31]&cnt_6[15]&cntx_1[15];endmodule : test_top_1 

1.1编译过程中2.4节(布线初始化后)更新时序信息
图1:编译过程
1.2编译过程中2.4节中间时序总结
图2:编译过程
1.3编译过程中第5节更新时序
图3:编译过程
编译完成后时序总结
图4:总结
导致时序违例的原因
图5:警告
![图6:时序违例](https://img-blog.csdnimg.cn/d3eeab60f94549afa29da883f41bd84b.png细节

注:工程编译时间过长,也没有提示错误,可以看一下编译过程中的时序信息。如果负的太多,先分析一下,等的话不知道要等到什么时候…(千年等一回,啊 。 。 。。)

二、解决方法

1.编译过程中

如图1-图3所示,在编译过程中,出现负时序。
修改组合逻辑减小逻辑级数与扇出。
编译结果如图:
修改逻辑后

2.编译完

查看vavido工具罗列的时钟。
下图显示的时钟是由MMCM分频倍频得出(自动生成时序约束),没有给出程序中105行200M分频的40M。
时钟树
对生成的时钟重新命名,并对40M时钟进行约束。

#create_clock -name pri_clock -period 20 -waveform {0 10} [get_ports pri_clock]create_generated_clock -name clk20m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT0] 
create_generated_clock -name clk30m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT1]
create_generated_clock -name clk50m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT2]
create_generated_clock -name clk100m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT3]
create_generated_clock -name clk200m [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT4]create_generated_clock -name clk40m -source [get_pins gen_clk/inst/mmcm_adv_inst/CLKOUT4] -divide_by 5 [get_pins clk40m_reg/Q]create_clock -name sec_clk -period 100 -waveform {0 50} [get_ports sec_clk]
set_clock_groups -asynchronous -group [get_clocks clk200m] -group [get_clocks sec_clk]#min = -(保持时间)
#max = 建立时间 
set_input_delay -clock clk20m -max 2.0  [get_ports A1]
set_input_delay -clock clk20m -min -1.5  [get_ports A1]
set_output_delay -clock clk200m -max -4.167   [get_ports A2]
set_output_delay -clock clk200m -min -0.0  [get_ports A2]

重新编译后:
时钟约束
上图包括程序中出现的所有时钟。
时序总结如下图。
修改后总结

总结

从发现问题,到解决问题;
从vivado工具的警告和报错,提示需要关注时序分析;
从小工程发展成大工程,时序分析还是挺重要的一个环节。

这篇关于出现时序违例怎么解决-VIVADO的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/178822

相关文章

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

解决Entity Framework中自增主键的问题

《解决EntityFramework中自增主键的问题》:本文主要介绍解决EntityFramework中自增主键的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Entity Framework中自增主键问题解决办法1解决办法2解决办法3总结Entity Fram

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序