打印

xilinx的约束实现(1)

[复制链接]
1698|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shang651|  楼主 | 2012-10-11 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前一段时间调试了xilinx的板子上跑代码,自己加IP核,看了它的约束文件,在网上找了一些讲语法的资料,自己整理了一下,我感觉在你了解了语法之后,确实得好好看一下它自己给出的约束,有些我自己没用到,我就没整理了。
1.约束文件的概念
FPGA设计中的约束文件有3类:用户设计文件(.UCF文件)、网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),
可以完成时序约束、管脚约束以及区域约束。3类约束文件的关系为:
用户在设计输入阶段编写UCF文件,然后UCF文件和设计综合后生成NCF文件,最后再经过实现后生成PCF 文件。
本节主要介绍UCF文件的使用方法。
UCF文件是ASC 2码文件,描述了逻辑设计的约束,可以用文本编辑器和Xilinx约束文件编辑器进行编辑。
NCF约束文件的语法和UCF文件相同,二者的区别在于: UCF文件由用户输入,NCF文件由综合工具自动生成,
当二者发生冲突时,以UCF文件为准,这是因为UCF的优先级最高。PCF文件可以分为两个部分:
一部分是映射产生的物理约束,另一部分是用户输入的约束,同样用户约束输入的优先级最高。
一般情况下,用户约束都应在UCF文件中完成,不建议直接修改 NCF文件和PCF文件。
2.UCF文件的语法说明
UCF文件的语法为:
{NET|INST|PIN} "signal_name" Attribute; 其中,“signal_name”是指所约束对象的名字,包含了对象所在层次的描述;
“Attribute”为约束的具体描述;语句必须以分号“;”结束。可以用“#”或“/* */”添加注释。
需要注意的是:UCF文件是大小写敏感的,信号名必须和设计中保持大小写一致,但约束的关键字可以是大写、小写甚至大小写混合。
在UCF文件中描述管脚分配的语法为: NET “端口名称” LOC = 引脚编号;
NET "CLK" LOC = P30; “CLK”就是所约束信号名,LOC = P30;是约束具体的含义,将CLK信号分配到FPGA的P30管脚上。
通配符
在UCF文件中,通配符指的是“*”和“?”。“*”可以代表任何字符串以及空,“?”则代表一个字符。
在编辑约束文件时,使用通配符可以快速选择一组信号,当然这些信号都要包含部分共有的字符串。例如:
NET "*CLK?" FAST;
将包含“CLK”字符并以一个字符结尾的所有信号,并提高了其速率。
在位置约束中,可以在行号和列号中使用通配符。例如:
INST "/CLK_logic/*" LOC = CLB_r*c7;
把CLK_logic层次中所有的实例放在第7列的CLB中。
3.约束
3.1管脚约束:
最简单的应用主要是位置约束LOC,和电平标准IOSTANDARD
NET CLK_27MHZ_FPGA LOC="AG18"; # Bank 4, Vcco=3.3V, No DCI
NET CLK_33MHZ_FPGA LOC="AH17"; # Bank 4, Vcco=3.3V, No DCI
NET CLK_FPGA_N LOC="K19"; # Bank 3, Vcco=2.5V, No DCI

fpga_0_SysACE_CompactFlash_SysACE_MPA_pin<5> IOSTANDARD = LVCMOS33;
3.2时序约束:
1)周期约束

PERIOD约束是一个基本时序和综合约束,它附加在时钟网线上,时序分析工具根据PERIOD约束检查时钟域内所有同步元件的时序是否满足要求,
它将检查与同步时序约束端口相连接的所有路径的延迟,但是不会检查PAD到寄存器的路径。
附加时钟周期约束的首选方法(Preferred Method)语法如下:
TIMESPEC “TSidentifier” = PERIOD “TNM_reference” period {HIGH|LOW} [high_or_low_time]
其中“[]”内为可选项,“{}”为必选项,参数period为要求的时钟周期,可以使用ps、ns、us或者ms等单位,大小写都可以,缺省单位为ns。
HIGH|LOW关键词指出时钟周期里的第一个脉冲是高电平还是低电平,而high_or_low_time为脉冲的延续时间,缺省单位也是ns,如果不提供该项,
则缺省占空比为50%。
TIMESPEC是一个基本时序相关约束标识,表示本约束为时序规范。TSidentifier包括字母TS和一个标识符identifier(为ASCII码字符串)
共同组成一个时序规范。例如定义时钟周期约束时,首先在时钟网线clk上附加一个TNM_NET约束,把clk驱动的所有同步元件定义为一个名为sys_clk的分组,
然后使用TIMESPEC约束定义时钟周期。
NET “clk” TNM_NET=”sys_clk”;
TIMESPEC “TS_sys_clk”= PERIOD “sys_clk” 50 HIGH 30;
而定义派生时钟的语法如下:

TIMESPEC “TSidentifier_2”=PERIOD “timegroup_name” “TSidentifier_1” [*or/] factor PHASE [+|-] phase_value [units];
其中TSidentifier_2为要定义的派生时钟,TSidentifier_1为已经定义的时钟,factor指出两者周期的辈出关系,是一个浮点数。
phase_value指出两者之间的相位关系,为浮点数。例如:

定义主时钟clk0:
TIMESPEC “TS01” = PERIOD “clk0” 10.0 ns;

定义派生时钟clk180,其相位与主时钟相差180°:
TIMESPEC “TS02” = PERIOD “clk180” TS01 PHASE + 5.0 ns;

定义派生时钟clk180_2,其周期为主时钟的1/2,并延迟2.5ns:
TIMESPEC “TS03” = PERIOD “clk180_2” TS01 /2 PHASE + 2.5 ns;

相关帖子

沙发
GoldSunMonkey| | 2012-10-11 22:33 | 只看该作者
谢谢分享~

使用特权

评论回复
板凳
薇儿安蓝| | 2013-1-28 16:38 | 只看该作者
谢谢分享

使用特权

评论回复
地板
hawksabre| | 2013-1-28 20:57 | 只看该作者
资料很好   谢谢你的分享   谢谢了   呵呵   有空一定要好好钻一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

305

帖子

1

粉丝