作者:zh1234之歌 | 来源:互联网 | 2023-10-10 15:21
本文使用 Zhihu On VSCode 创作并发布ISE 时钟约束记录一下项目中用到的知识,之前从来没用过ISE,由于目前公司原型验证的平台采用了较老的Vitex-6系列芯片,不得不学习下ISE的u
本文使用 Zhihu On VSCode 创作并发布
ISE 时钟约束
记录一下项目中用到的知识,之前从来没用过ISE,由于目前公司原型验证的平台采用了较老的Vitex-6系列芯片,不得不学习下ISE的ucf约束,如有错误望指正~
系统架构如图所示:
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中推荐对每个使用的时钟进行周期约束,如下图所示:
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的处理,所以为了加快布局布线的时间,有些同步路径也可以忽略掉,当然异步路径是一定要去忽略的。语法如下:
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有着一些数据的交互,但这两个时钟源属于异步路径,所以需要对其忽略。