ISE约束--UCF编辑的入门介绍.doc

上传人:hw****26 文档编号:2420662 上传时间:2019-05-12 格式:DOC 页数:13 大小:643.50KB
下载 相关 举报
ISE约束--UCF编辑的入门介绍.doc_第1页
第1页 / 共13页
ISE约束--UCF编辑的入门介绍.doc_第2页
第2页 / 共13页
ISE约束--UCF编辑的入门介绍.doc_第3页
第3页 / 共13页
ISE约束--UCF编辑的入门介绍.doc_第4页
第4页 / 共13页
ISE约束--UCF编辑的入门介绍.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、摘要:本文主要通过一个实例具体介绍 ISE中通过编辑 UCF文件来对 FPGA设计进行约束,主要涉及到的约束包括时钟约束、群组约束、逻辑管脚约束以及物理属性约束。 Xilinx FPGA设计约束的分类 Xilinx定义了如下几种约束类型: “Attributes and Constraints” “CPLD Fitter” “Grouping Constraints” “Logical Constraints” “Physical Constraints” “Mapping Directives” “Placement Constraints” “Routing Directives” “Sy

2、nthesis Constraints” “Timing Constraints” “Configuration Constraints” 通过编译 UCF( user constraints file)文件可以完成上述的功能。 还是用实例来讲 UCF的语法是如何的。 图 1 RTL Schematic 图 1 是顶层文件 RTL图,左侧一列输入,右侧为输出,这些端口需要分配相应的FPGA管脚。 1: NET “pin_sysclk_i“ LOC = AD12 | TNM_NET = pin_sysclk_i; 2: TIMESPEC TS_pin_sysclk_i = PERIOD “pin

3、_sysclk_i“ 15 ns HIGH 50 %; 3: # 4: NET “pin_plx_lreset_n_i“ LOC = B18; 5: # 6: NET “pin_plx_lhold_i“ LOC = C17; 7: NET “pin_plx_lholda_o“ LOC = D17 | SLEW = FAST; 8: # 9: NET “pin_plx_ads_n_i“ LOC = E18; 10: NET “pin_plx_ads_n_i“ OFFSET = IN 6.3 ns AFTER “pin_sysclk_i“ HIGH; 11: # 12: NET “pin_plx_

4、lw_r_n_i“ LOC = E9; 13: NET “pin_plx_lw_r_n_i“ OFFSET = IN 6.3 ns AFTER “pin_sysclk_i“ HIGH; 14: # 15: NET “pin_plx_blast_n_i“ LOC = D18; 16: NET “pin_plx_blast_n_i“ OFFSET = IN 6.3 ns AFTER “pin_sysclk_i“ HIGH; 17: # 18: NET “pin_plx_lad_io“ LOC = AD13 | SLEW = FAST | TNM = LAD; 19: NET “pin_plx_la

5、d_io“ LOC = AC13 | SLEW = FAST | TNM = LAD; 20: NET “pin_plx_lad_io“ LOC = AC15 | SLEW = FAST | TNM = LAD; 21: NET “pin_plx_lad_io“ LOC = AC16 | SLEW = FAST | TNM = LAD; 22: NET “pin_plx_lad_io“ LOC = AA11 | SLEW = FAST | TNM = LAD; 23: NET “pin_plx_lad_io“ LOC = AA12 | SLEW = FAST | TNM = LAD; 24:

6、NET “pin_plx_lad_io“ LOC = AD14 | SLEW = FAST | TNM = LAD; 25: NET “pin_plx_lad_io“ LOC = AC14 | SLEW = FAST | TNM = LAD; 26: NET “pin_plx_lad_io“ LOC = AA13 | SLEW = FAST | TNM = LAD; 27: NET “pin_plx_lad_io“ LOC = AB13 | SLEW = FAST | TNM = LAD; 28: NET “pin_plx_lad_io“ LOC = AA15 | SLEW = FAST |

7、TNM = LAD; 29: NET “pin_plx_lad_io“ LOC = AA16 | SLEW = FAST | TNM = LAD; 30: NET “pin_plx_lad_io“ LOC = AC11 | SLEW = FAST | TNM = LAD; 31: NET “pin_plx_lad_io“ LOC = AC12 | SLEW = FAST | TNM = LAD; 32: NET “pin_plx_lad_io“ LOC = AB14 | SLEW = FAST | TNM = LAD; 33: NET “pin_plx_lad_io“ LOC = AA14 |

8、 SLEW = FAST | TNM = LAD; 34: NET “pin_plx_lad_io“ LOC = D12 | SLEW = FAST | TNM = LAD; 35: NET “pin_plx_lad_io“ LOC = E13 | SLEW = FAST | TNM = LAD; 36: NET “pin_plx_lad_io“ LOC = C16 | SLEW = FAST | TNM = LAD; 37: NET “pin_plx_lad_io“ LOC = D16 | SLEW = FAST | TNM = LAD; 38: NET “pin_plx_lad_io“ L

9、OC = D11 | SLEW = FAST | TNM = LAD; 39: NET “pin_plx_lad_io“ LOC = C11 | SLEW = FAST | TNM = LAD; 40: NET “pin_plx_lad_io“ LOC = E14 | SLEW = FAST | TNM = LAD; 41: NET “pin_plx_lad_io“ LOC = D15 | SLEW = FAST | TNM = LAD; 42: NET “pin_plx_lad_io“ LOC = D13 | SLEW = FAST | TNM = LAD; 43: NET “pin_plx

10、_lad_io“ LOC = D14 | SLEW = FAST | TNM = LAD; 44: NET “pin_plx_lad_io“ LOC = F15 | SLEW = FAST | TNM = LAD; 45: NET “pin_plx_lad_io“ LOC = F16 | SLEW = FAST | TNM = LAD; 46: NET “pin_plx_lad_io“ LOC = F11 | SLEW = FAST | TNM = LAD; 47: NET “pin_plx_lad_io“ LOC = F12 | SLEW = FAST | TNM = LAD; 48: NE

11、T “pin_plx_lad_io“ LOC = F13 | SLEW = FAST | TNM = LAD; 49: NET “pin_plx_lad_io“ LOC = F14 | SLEW = FAST | TNM = LAD; 50: TIMEGRP “LAD“ OFFSET = IN 6.4 ns AFTER “pin_sysclk_i“ HIGH; 51: TIMEGRP “LAD“ OFFSET = OUT 3.1 ns BEFORE “pin_sysclk_i“ HIGH; 52: # 53: NET “pin_plx_ready_n_o“ LOC = F18 | SLEW =

12、 FAST; 54: NET “pin_plx_ready_n_o“ OFFSET = OUT 4.2 ns BEFORE “pin_sysclk_i“ HIGH; 55: # 56: NET “pin_plx_bterm_n_o“ LOC = D10 | SLEW = FAST; 57: NET “pin_plx_bterm_n_o“ OFFSET = OUT 4.2 ns BEFORE “pin_sysclk_i“ HIGH; 58: # 59: NET “pin_led_o“ LOC = D22; 60: NET “pin_led_o“ LOC = C22; 61: NET “pin_l

13、ed_o“ LOC = E21; 62: NET “pin_led_o“ LOC = D21; 63: NET “pin_led_o“ LOC = C21; 64: NET “pin_led_o“ LOC = B24; 65: NET “pin_led_o“ LOC = C20; 66: NET “pin_led_o“ LOC = B23; 表 1. UCF example 对上面的 UCF文件进行一些注释: 该 UCF文件主要是完成了管脚的约束、时钟的约束,以及组的约束。 第一、二行:主要定义了时钟以及对应的物理管脚。 第一行,端口 pin_sysclk_i 分配到 FPGA管脚 AD12,

14、并放到了 pin_sysclk_i group中。那如何得知是 AD12的管脚呢,请看图 2, FPGA管脚 AD12 是一个66MHz的外部时钟。 FPGA的开发板肯定有电路原理图供你分配外部管脚。 图 2,电路原理图 第二行:时钟说明:周期 15ns,占空比 50%。关键词 TIMESPEC( Timing Specifications),即时钟说明。一般的语法是: TIMESPEC “TSidentifier“=PERIOD “timegroup_name“ value units; 其中 TSidentifier用来指定 TS(时钟说明)的唯一的名称。 第七行: pin_plx_lho

15、lda_o 连接至物理管脚 D17,并配置该管脚电平变化的速率。关键词: SLEW,用来定义电平变化的 速率的,一般语法是: NET “top_level_port_name“ SLEW=“value“; 其中 value = FAST|SLOW|QUIETIO, QUIETIO仅用在 Spartan-3A。 第十行:定义 pin_plx_ads_n_i 输入跟时钟的关系。 OFFSET IN和 OFFSET OUT的约束。 OFFSET IN 定义了数据输入的时间和接收数据时钟沿( capture Edge)的关系。 一般的语法是: OFFSET = IN value VALID value

16、 BEFORE clock OFFSET = OUT value VALID value AFTER clock 图 3 时序图( OFFSET IN) 例子: NET “SysCLk“ TNM_NET = “SysClk“; TIMESPEC “TS_SysClk“ = PERIOD “SysClk“ 5 ns HIGH 50%; OFFSET = IN 5 ns VALID 5 ns BEFORE “SysClk“; 上面的定义了基于 SysClk的全局 OFFSET IN的属性。时序可看图 3. 图 4 时序图( OFFSET OUT) 例子: NET “ClkIn“ TNM_NET =

17、 “ClkIn“; OFFSET = OUT 5 ns AFTER “ClkIn“; 上面设置主要是定了了时钟跟数据的时间关系,时序图 4。可以看到这时一种全局定义, Data1 和 Data2输出时间都受到 OFFSET = OUT 5 ns AFTER “ClkIn“ 的约束。如果需要单独定义输出端口的 OFFSET OUT的,需要制定相应的 NET,可参考表 1中的第 57行。 第 18至 49 行: pin_plx_lad_io 被归到了名称为 LAD的 TMN(Timing name),这个可以说是 GROUP的约束。这样往往给约束带来方便,不用一个一个的 NET 或者 INST进行

18、约束。 第 50至 51 行:对 TIMEGRP 是 LAD进行 OFFSET IN和 OUT的定义。 在时序约束中,在这里还未提及 FROM TO的约束。 FROM TO的约束主要是用来两个同步模块之间的时间关系的约束。在这里不做深入的讨论。 至此,基本上把一般的 UCF文件的作用进行了注释。 注:一般的时间的约束需要通过静态的时序分析,然后再设定相应 PERIOD,OFFSET IN 以及 OFFEET OUT等的时间参数。 当然在例子中还没有涉及到区域的约束。下面会试图说一下。 ISE进行综合后会将设计代码生成相应的逻辑网表,然后经过 translate过程,转换到 Xilinx特定的底

19、层结构和硬件原语, MAP过程就是将映射到具体型号的器件上,最后就是就是布线和布局的操作了。 区域的约束相当于将布局过程中指定特定型号的器件的位置,这完全可以通过FloorPlanner的 GUI界面进行设置,用图形界面设置完后,配置信息会放到 UCF中,这里只介绍 UCF的使用。 例如: INST “Done“ LOC = “SLICE_X32Y163“ ; #Done映射为一个寄存器,映射到 SLICE_X32Y163的位置上。( 32, 163)相当于一个坐标,可以用FloorPlanner进行查看。 INST“BRAM4/BU2/U0/blk_mem_generator/valid.c

20、str/ramloop0.ram.r/v4_init.ram/TRUE_DP.SINGLE_PRIM.TDP“LOC = “RAMB16_X2Y22“ ; #RAM16的一个映射。 又例如, X,Y,Z是对应的是寄存器。 现在想把它们放在一个指定的区域中 ,我可以这样写, INST “X” AREA_GROUP = reg; INST “X” AREA_GROUP = reg; INST “X” AREA_GROUP = reg; AREA_GROUP reg RANGE = SLICE_X1Y1 :SLICE_X1Y6; 注:如何查看 INST中的名称呢?在 ISE中 Timing cons

21、traints editor中可以查看。 注: NET, LOC, TNM_NET, TIMESPEC, PERIOD, OFFSET, IN, OUT, SLEW,HIGH等都是关键字, UCF文件是大小敏感的,端口名称必须和源代码中的名字一致,且端口名字不能和关键字一样。但是关键字 NET是不区分大小写的。 其实上述都是约束的入门的内容,如果要想深入的了解的话,请参考 Ref1。 笔者也是初学者,如果有什么不对的地方,请批评指正。 ISE 约束文件的基本操作 1约束文件的概念 FPGA设计中的约束文件有 3类:用户设计文件( .UCF文件)、网表约束文件( .NCF文件)以及物理约束文件(

22、 .PCF文件),可以完成时序约束、管脚约束以及区域约束。 3类约束文件的关系为:用户在设计输入阶段编写 UCF 文件,然后 UCF文件和设计综合后生成 NCF文件,最后再经过实现后生成 PCF 文件。本节主要介绍 UCF 文件的使用方法。 UCF文件是 ASC 2码文件,描述了逻辑设计的约束,可以用文本编辑器和 Xilinx约束文件编辑器进行编辑。 NCF 约束文件的语法和 UCF 文件相同,二者的区别在于: UCF文件由用户输入, NCF文件由综合工具自动生成,当二者发生冲突时,以 UCF 文件为准,这是因为 UCF 的优先级最高。 PCF文件可以分为两个部分:一部分是映射产生的物理约束,

23、另一部分是用户输入的约束,同样用户约束输入的优先级最高。一般情况下,用户约束都应在 UCF文件中完成,不建议直接修改 NCF 文件和 PCF文件。 2创建约束文件 约束文件的后缀是 .ucf,所以一般也被称为 UCF文件。创建约束文件有两种方法,一种是通过新建方式,另一种则是利用过程管理器来完成。 第一种方法:新建一个源文件,在代码类型中选取 “Implementation Constrains File”,在 “File Name”中输入 “one2two_ucf”。单击 “Next”按键进入模块选择对话框,选择模块 “one2two”,然后单击 “Next”进入下一页,再单击 “Finis

24、h”按键完成约束文件的创建。 第二种方法:在工程管理区中,将 “Source for”设置为 “Synthesis/Implementation”。 “Constrains Editor”是一个专用的约束文件编辑器,双击过程管理区中 “User Constrains”下的 “Create Timing Constrains”就可以打开 “Constrains Editor”,其界面如图所示 : 图 启动 Constrains Editor 引脚约束编辑 在 “Ports”选项卡中可以看到,所有的端口 都已经罗列出来了,如果要修改端口和FPGA管脚的对应关系,只需要在每个端口的 “Locatio

25、n”列中填入管脚的编号即可。例如在 UCF文件中描述管脚分配的语法为: NET “端口名称 ” LOC = 引脚编号 ; 需要注意的是, UCF文件是大小敏感的,端口名称必须和源代码中的名字一致,且端口名字不能和关键字一样。但是关键字 NET是不区分大小写的。 3编辑约束文件 在工程管理区中,将 “Source for”设置为 “Synthesis/Implementation”,然后双击过程管理区 中 “User Constrains”下的 “Edit Constraints (Text)”就可以打开约束文件编辑器,如下图所示,就会新建当前工程的约束文件。 图 用户约束管理窗口 UCF文件的

26、语法说明 1语法 UCF 文件的语法为: NET|INST|PIN “signal_name“ Attribute; 其中, “signal_name”是指所约束对象的名字,包含了对象所在层次的描述; “Attribute”为约束的具体描述;语句必须以分号 “; ”结束。可以用 “#”或 “/* */”添加注释。需要注意的是: UCF文件是大小写敏感的,信号名必须和设计中保持大小写一致,但约束的关键字可以是大写、小写甚至大小写混合。例如: NET “CLK“ LOC = P30; “CLK”就是所约束信号名, LOC = P30;是约束具体的含义,将 CLK信号分配到 FPGA的 P30管 脚

27、上。 对于所有的约束文件,使用与约束关键字或设计环境保留字相同的信号名会产生错误信息,除非将其用 “ “括起来,因此在输入约束文件时,最好用 “ “将所有的信号名括起来。 2通配符 在 UCF文件中,通配符指的是 “*”和 “?”。 “*”可以代表任何字符串以及空, “?”则代表一个字符。在编辑约束文件时,使用通配符可以快速选择一组信号,当然这些信号都要包含部分共有的字符串。例如: NET “*CLK?“ FAST; 将包含 “CLK”字符并以一个字符结尾的所有信号,并提高了其速率。 在位置约束中,可以 在行号和列号中使用通配符。例如: INST “/CLK_logic/*“ LOC = CLB_r*c7; 把 CLK_logic层次中所有的实例放在第 7列的 CLB中。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。