热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ise时钟约束_ISE时钟约束

本文使用 Zhihu On VSCode 创作并发布ISE 时钟约束记录一下项目中用到的知识,之前从来没用过ISE,由于目前公司原型验证的平台采用了较老的Vitex-6系列芯片,不得不学习下ISE的u

6e5f1526ba11c17435ca469b18ea683f.png

本文使用 Zhihu On VSCode 创作并发布

ISE 时钟约束

记录一下项目中用到的知识,之前从来没用过ISE,由于目前公司原型验证的平台采用了较老的Vitex-6系列芯片,不得不学习下ISE的ucf约束,如有错误望指正~
系统架构如图所示:

b9c914ff8582e83c26b4294f60a14d47.png
Image


系统的输入时钟有两个,一个板级的晶振为FPGA提供40M的时钟,另外射频SOC为FPGA提供一个16M的时钟,该时钟和送入FPGA的IQ ADC数据是同步的,因此在ISE中首先要对这两个时钟进行约束:

NET "Board_clk_40M" LOC PIN1;
NET "Board_clk_40M" TNM_NET = Board_clk_40M;
TIMESPEC TS_Board_clk_40M = PERIOD "Board_clk_40M" 25 ns HIGH 50%;

TNM/TNM_NET 在ISE的UCF约束文件中的语法表示分组约束,语法为{NET|INST|PIN}"ob_name" TNM_NET =“ New_group";其中NET表示从该ob_name的NET相连的所有时钟元素放入组New_group中,是比较常用的时钟约束,INST表示例化该模块上的时钟元素放在改组中,PIN就表示能够从该PIN访问的所有时钟元素放入组中。TNM_NET和TNM的区别大致就在于TNM_NET是可以穿过IBUF进行约束的,TNM则不行。TIMESPEC表示时序规范。
这里外部的40M时钟和16M时钟衍生了后面需要一系列时钟,UG612中推荐对每个使用的时钟进行周期约束,如下图所示:

d2e0bc544aed3439f6ab6c3cde88046e.png
Image


因此,最保险的时钟周期约束可以写为:

NET "Board_clk_40M" LOC PIN1;
NET "Board_clk_40M" TNM_NET = Board_clk_40M;
TIMESPEC TS_Board_clk_40M = PERIOD "Board_clk_40M" 25 ns HIGH 50%;
NET "CLK_480M" TNM_NET = CLK_480M;
TIMESPEC TS_CLK_480M = PERIOD "CLK_480M" 2 ns HIGH 50%;
NET "CLK_32M" TNM_NET = CLK_32M;
TIMESPEC TS_CLK_32M = PERIOD "CLK_32M" 31.25 ns HIGH 50%;
NET "CLK_64M" TNM_NET = CLK_64M;
TIMESPEC TS_CLK_64M = PERIOD "CLK_64M" 15.625 ns HIGH 50%;
NET "CLK_32k" TNM_NET = CLK_32k;
TIMESPEC TS_CLK_32k = PERIOD "CLK_32k" 31250 ns HIGH 50%;
NET "Top/System/lat_sys_clock" TNM_NET = Top/System/lat_sys_clock;
TIMESPEC TS_Top_System_lat_sys_clock = PERIOD "Top/System/lat_sys_clock" 25 ns HIGH 50%;
NET "Top/RF_module/reg_CLK_16M" TNM_NET = Top/RF_module/reg_CLK_16M;
TIMESPEC TS_Top_RF_module_reg_CLK_16M = PERIOD "Top/RF_module/reg_CLK_16M" 62.5 ns HIGH 50%;
NET "Top/RF_module/reg_CLK_16M_rx" TNM_NET = Top/RF_module/reg_CLK_16M_rx;
TIMESPEC TS_Top_RF_module_reg_CLK_16M_rx = PERIOD "Top/RF_module/reg_CLK_16M_rx" 62.5 ns HIGH 50%;
NET "Top/RF_module/CLK_32M_sync" TNM_NET = Top/RF_module/CLK_32M_sync;
TIMESPEC TS_Top_RF_module_CLK_32M_sync = PERIOD "Top/RF_module/CLK_32M_sync" 31.25 ns HIGH 50%;

在Vivado的时钟约束中有一个衍生时钟的概念,不需要像ISE中的UCF约束写的这么乱。
在XDC或者SDC约束中,STA工具会对每条时序路径进行分析,无论异步路径还是同步路径,但是这里很多的时序路径我们已经在内部做了同步或者使其满足setup/hold的处理,所以为了加快布局布线的时间,有些同步路径也可以忽略掉,当然异步路径是一定要去忽略的。语法如下:

7139a36e9fb76415c2c70de986360e7f.png
Image


这里我选择需要忽略时序检查的路径:

TIMESPEC TS_TIG1 = FROM "Top/System/lat_sys_clock" TO "Board_clk_40M" TIG;
TIMESPEC TS_TIG2 = FROM "Board_clk_40M" TO "Top/System/lat_sys_clock" TIG; # 注意反向路径也要约束
TIMESPEC TS_TIG3 = FROM "Top/System/lat_sys_clock" TO "CLK_480M" TIG;
TIMESPEC TS_TIG4 = FROM "CLK_480M" TO "Top/System/lat_sys_clock" TIG;
TIMESPEC TS_TIG5 = FROM "Top/System/lat_sys_clock" TO "CLK_32M" TIG;
TIMESPEC TS_TIG6 = FROM "CLK_32M" TO "Top/System/lat_sys_clock" TIG;
TIMESPEC TS_TIG7 = FROM "Top/System/lat_sys_clock" TO "CLK_64M" TIG;
TIMESPEC TS_TIG8 = FROM "CLK_64M" TO "Top/System/lat_sys_clock" TIG;
TIMESPEC TS_TIG9 = FROM "Top/System/lat_sys_clock" TO "CLK_32k" TIG;
TIMESPEC TS_TIG10 = FROM "CLK_32k" TO "Top/System/lat_sys_clock" TIG;
TIMESPEC TS_TIG11 = FROM "Top/System/lat_sys_clock" TO "Top/RF_module/reg_CLK_16M_rx" TIG;
TIMESPEC TS_TIG12 = FROM "Top/RF_module/reg_CLK_16M_rx" TO "Top/System/lat_sys_clock" TIG;
TIMESPEC TS_TIG13 = FROM "Top/System/lat_sys_clock" TO "Top/RF_module/reg_CLK_16M" TIG;
TIMESPEC TS_TIG14 = FROM "Top/RF_module/reg_CLK_16M" TO "Top/System/lat_sys_clock" TIG;
TIMESPEC TS_TIG13 = FROM "Top/System/lat_sys_clock" TO "Top/RF_module/CLK_32M_sync" TIG;
TIMESPEC TS_TIG14 = FROM "Top/RF_module/CLK_32M_sync" TO "Top/System/lat_sys_clock" TIG;

这里的16M的RF时钟源是由这个CLK_480M来分频得到的,因此属于同步电路,需要让STA对其进行分析,而后面的Top/System/lat_sys_clock时钟和RF_module有着一些数据的交互,但这两个时钟源属于异步路径,所以需要对其忽略。


推荐阅读
author-avatar
zh1234之歌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有