热度 16
2010-10-15 18:22
2864 次阅读|
1 个评论
Xilinx EPLD/FPGA设计工具ISE6.3i是目前国内用户用的最多的一个版本(尽管现在已出10.0、12.0版本,但这些高版本对一些常用的“老”器件已不支持,且其文本编辑器对汉字注释支持有点小问题),在我们使用过程中,发现布局布线(PlaceRoute)经常出现如下几个错误: 1、如果将一个时钟信号与一个非时钟信号用在同一个逻辑表达式中,布局布线通不过,会提示“全局变量分配出错”。 解决办法是定义一个中间信号变量,例如: WE=CCD_HS_CK or CCD_VS_CK or (not PA7); 改为: CK_Buf=CCD_HS_CK or CCD_VS_CK; WE=CK_Buf or (not PA7); 其中CK_Buf为中间信号。 2、ERROR Place:249 - Automatic Clock Placement Failed.....,即自动时钟布局失败,同时出现如下警告: WARINNG:Place:413 - This design either uses more then 8 clock buffers or clock buffers locked into primary/secondary sites.....,意即本工程使用8个以上时钟缓冲器。 原因分析: ISE的综合工具XST或Symplify都具有自动推断功能,在用户不进行任何约束的情况下,综合时当遇到扇出数目较大(驱动负载多-即VHDL代码引用次数多)的钟控信号(时钟信号)时,会自动地将该信号分配到全局时钟IOB上(尽管该信号可能不是从FPGA专用时钟引脚输入的)。当这种信号数量较多时,而FPGA的全局时钟资源有限(Virtex2有16个),就会导致在映射和布局布线1时出现上述错误,编译无法通过。 出现这种错误有两种情况: (1)全局时钟资源不够,待分配的信息过多。 (2)因全局时钟要走遍FPGA内部每个地方,工程复杂时布线无法走通。 解决办法: (1)如果是上述第(2)种情况,可以人工优化工程设计,删除不不必要的模块及资源定义(引脚与信号定义)。 (2)采用高版本的综合工具或ISE(含布局布线、XST)也有可能解决第(2)种情况。 (3)采用手工布局(Floorplanner)和布线(FPGA Editor)工具调整设计。由于FPGA逻辑密度高、内部结构复杂,用此方法必须对所用FPGA内部结构, Floorplanner与FPGA Editor工具等相当熟悉,难度较高。 (4)最有效的办法是约束设置: 方法1:在VHDL的"...Behavioral of ... is"与"begin"语句之间插入如下命令(自定义属性约束): attribute clk_buf : string; attribute clk_buf of xxx:signal is "ibuf"; 其中"xxx"是扇出数较大的信号(变量或引脚)。上述命令会强制"xxx"不会被自动分配为全局时钟缓冲器(IBUFG)。 方法2:在用户约束文件(.ucf)中给扇出数较大的费关键时钟信号加上约束,例如: NET "xxx" LOG="yyy"|USELOWSKEWLINES; 其中"xxx"是被约束信号,"yyy"是FPGA引脚,“USELOWSKEWLINES”意指强制分配到第二全局时钟资源。 值得注意的是,约束设置不是一次就能解决问题,可能要反复多次才能成功。 3、ERROR:1018错误 在ISE工程设计中,如果某个信号(如地址锁存AE)是从非专用时钟引脚输入的,但在设计时又是作为时钟使用的,ISE布局布线时也会自动将该信号作为全局时钟信号来布线,因其不是从全局时钟脚接入,故出现上述错误,无法布线成功。 由于这些信号频率不高、负载不重,故在实际应用中不一定非要使用全局网络,这时可在约束文件(.ucf)中加上如下约束: NET "AE" CLOCK_DEDICATED_ROUTE=FLASE; 这样做是强制ISE不分配全局时钟网络给AE,布线就能成功了。