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,布线就能成功了。