以下是10.1版本所使用的BSB包。
http://www.xilinx.com/univ/xupv5-lx110t/design_files/EDK-XUPV5-LX110T-Pack.zip
但是这个包在做11.2时会遇到很多问题。
我这里根据我做实验时候碰到的问题,同时从walkie那儿和网络上提供的信息,总结了关于XUPV5-LX110T的DDR2 RAM和ll_temac硬核网卡的问题。也算是减轻各位查找的麻烦了。
一、DDR2 RAM的问题
如果用该包生成工程,在生成Bitstream的时候会出现类似如下错误:
ERROR:Map:10 - RLOC_ORIGIN attribute on FDRSE symbol
"DDR2_SDRAM/DDR2_SDRAM/mpmc_core_0/gen_v5_ddr2_phy.mpmc_phy_if_0/u_phy_io_0/g
en_dq[0].u_iob_dq/gen_stg2_sg1.u_ff_stg2a_rise" (output
signal=DDR2_SDRAM/DDR2_SDRAM/mpmc_core_0/gen_v5_ddr2_phy.mpmc_phy_if_0/u_phy_
io_0/gen_dq[0].u_iob_dq/stg2a_out_rise) must be on the start of a
set.
ERROR:Map:10 - RLOC_ORIGIN attribute on FDRSE symbol
"DDR2_SDRAM/DDR2_SDRAM/mpmc_core_0/gen_v5_ddr2_phy.mpmc_phy_if_0/u_phy_io_0/g
en_dq[1].u_iob_dq/gen_stg2_sg1.u_ff_stg2a_rise" (output
signal=DDR2_SDRAM/DDR2_SDRAM/mpmc_core_0/gen_v5_ddr2_phy.mpmc_phy_if_0/u_phy_
io_0/gen_dq[1].u_iob_dq/stg2a_out_rise) must be on the start of a
set.
ERROR:Map:11 - FDRSE symbol
"DDR2_SDRAM/DDR2_SDRAM/mpmc_core_0/gen_v5_ddr2_phy.mpmc_phy_if_0/u_phy_io_0/g
en_dq[1].u_iob_dq/gen_stg2_sg1.u_ff_stg2a_rise" (output
signal=DDR2_SDRAM/DDR2_SDRAM/mpmc_core_0/gen_v5_ddr2_phy.mpmc_phy_if_0/u_phy_
io_0/gen_dq[1].u_iob_dq/stg2a_out_rise) - more than one
RLOC_ORIGIN attribute
found within the RPM set "DDR2_SDRAM/hset".
完整的错误如下:
ERRORS.txt
后来Walkie改了支持包给了我一份,我比较了一下和原来的区别。最主要是其中的ucf文件DDR2_SDRAM_mpmc.ucf不同。
其中的不同为以下这段:
INST
"*/gen_dq[0].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y42;
# AF30 X0Y22 *
INST
"*/gen_dq[1].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y43;
# AK31 X0Y23
INST
"*/gen_dq[2].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y45;
# AF31 X0Y25
INST
"*/gen_dq[3].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y46;
# AD30 X0Y26
INST
"*/gen_dq[4].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y41;
# AJ30 X0Y21
INST
"*/gen_dq[5].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y42;
# AF29 X0Y22
***
INST
"*/gen_dq[6].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y44;
# AD29 X0Y24
INST
"*/gen_dq[7].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y44;
# AE29 X0Y24
INST
"*/gen_dq[8].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y28;
# AH27
X0Y8 ***
INST
"*/gen_dq[9].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y32;
# AF28 X0Y12
INST
"*/gen_dq[10].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y33;
# AH28
X0Y13
INST
"*/gen_dq[11].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y34;
# AA28 X0Y14
INST
"*/gen_dq[12].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y26;
# AG25
X0Y6
INST
"*/gen_dq[13].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y28;
# AJ26
X0Y8 *
INST
"*/gen_dq[14].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y33;
# AG28 X0Y13
INST
"*/gen_dq[15].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y34;
# AB28 X0Y14
INST
"*/gen_dq[16].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y35;
# AC28 X0Y15
INST
"*/gen_dq[17].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y36;
# AB25 X0Y16
***
INST
"*/gen_dq[18].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y38;
# AC27 X0Y18
INST
"*/gen_dq[19].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y39;
# AA26 X0Y19
INST
"*/gen_dq[20].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y36;
# AB26 X0Y16 *
INST
"*/gen_dq[21].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y37;
# AA24 X0Y17
INST
"*/gen_dq[22].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y38;
# AB27 X0Y18
INST
"*/gen_dq[23].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y39;
# AA25 X0Y19
INST
"*/gen_dq[24].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y46;
# AC29 X0Y26
INST
"*/gen_dq[25].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y49;
# AB30 X0Y29
***
INST
"*/gen_dq[26].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y53;
# W31
X0Y33
INST
"*/gen_dq[27].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y55;
# V30
X0Y35
INST
"*/gen_dq[28].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y49;
# AC30 X0Y29 *
INST
"*/gen_dq[29].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y52;
# W29
X0Y32
INST
"*/gen_dq[30].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y54;
# V27
X0Y34 ***
INST
"*/gen_dq[31].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y56;
# W27
X0Y36
INST
"*/gen_dq[32].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y52;
# V29
X0Y32
INST
"*/gen_dq[33].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y56;
# Y27
X0Y36
INST
"*/gen_dq[34].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y58;
# Y26
X0Y38
INST
"*/gen_dq[35].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y59;
# W24
X0Y39
INST
"*/gen_dq[36].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y54;
# V28 X0Y34 *
INST
"*/gen_dq[37].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y57;
# W25
X0Y37
INST
"*/gen_dq[38].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y58;
# W26
X0Y38
INST
"*/gen_dq[39].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
=
X0Y59;
# V24
X0Y39
INST
"*/gen_dq[40].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y120;
# R24 X0Y100
INST
"*/gen_dq[41].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y121;
# P25 X0Y101
INST
"*/gen_dq[42].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y122;
# N24 X0Y102
INST
"*/gen_dq[43].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y123;
# P26 X0Y103
INST
"*/gen_dq[44].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y120;
# T24 X0Y100
INST
"*/gen_dq[45].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y121;
# N25 X0Y101
INST
"*/gen_dq[46].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y123;
# P27 X0Y103
INST
"*/gen_dq[47].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y124;
# N28 X0Y104
INST
"*/gen_dq[48].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y124;
# M28 X0Y104
INST
"*/gen_dq[49].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y126;
# L28 X0Y106
INST
"*/gen_dq[50].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y132;
# F25 X0Y112
INST
"*/gen_dq[51].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y133;
# H25 X0Y113
INST
"*/gen_dq[52].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y125;
# K27 X0Y105
INST
"*/gen_dq[53].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y126;
# K28 X0Y106
INST
"*/gen_dq[54].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y133;
# H24 X0Y113
INST
"*/gen_dq[55].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y134;
# G26 X0Y114
INST
"*/gen_dq[56].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y134;
# G25
X0Y114
INST
"*/gen_dq[57].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y136;
# M26 X0Y116
INST
"*/gen_dq[58].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y137;
# J24 X0Y117
INST
"*/gen_dq[59].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y138;
# L26 X0Y118
INST
"*/gen_dq[60].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y135;
# J27 X0Y115
INST
"*/gen_dq[61].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y136;
# M25 X0Y116
INST
"*/gen_dq[62].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y138;
# L25 X0Y118
INST
"*/gen_dq[63].u_iob_dq/gen_stg2_*.u_ff_stg2a_rise" RLOC_ORIGIN
= X0Y139;
# L24 X0Y119
在新的UCF文件中,这一段被注销掉了,我上网查了一下,找到了这个文件:
该文件也可以在EDK目录下的hwXilinxProcessorIPLibpcoresmpmc_v5_02_adoc目录下找到。
在该文件中可以找到这样一段内容:
Migrating an MPMCv4 Virtex-5 DDR2 Design to MPMCv5
To migrate an existing Virtex-5 DDR2 design from MPMCv4 to MPMCv5,
the following steps are necessary.
All other MIG PHY types do not need special consideration to be
revised.
Note: Tool errors are reported if these steps are not performed.
1. In the MHS file, the C_MEM_DQS_IO_COL and C_MEM_DQ_IO_MS parameters are no longer used and
must be removed.
2. In the UCF file, MPMC specific constraints containing AREA_GROUP and RLOC_ORIGIN must be
removed.
从这段内容中可以看出,对于V5系列中的DDR2,在新的MPMCv5中,相对于MPMCv4需要作出如下修改:
1、.xbd文件中关于DDR2的参数设置中的C_MEM_DQS_IO_COL和C_MEM_DQ_IO_MS这两个参数必须删除。
2、ucf文件中的AREA_GROUP和RLOC_ORIGIN相关的引脚约束必须删除。
当然也可以在生成工程后,自己在MHS文件和ucf文件中做出相应的修改。
大家可以查看一下10.1生成的应该是4.03.a版本的,而11.2中的是5.02.a版本,所以相对于10.1版本中的文件也需要做这样的修改。
不过在做EDK实验时,修改一并没有修改,整个实验没有遇到问题。但是修改二必须修改,否则无法生成bitstream文件。
二、ll_temac硬核网卡问题
这个网卡也存在类似问题,我使用的是GMII模式,在生成比特文件时,出现如下错误:
"clk_client_tx0";> [system.ucf(203)]: NET
"*/tx_client_clk*" does not match
any design objects.
"clk_client_rx0";> [system.ucf(208)]: NET
"*/rx_client_clk*" does not match
any design objects.
"clk_phy_tx0";> [system.ucf(213)]: NET
"*/tx_gmii_mii_clk*" does not match
any design objects.
根据官方的回答作出如下修改。
原Ucf文件如下:
# EMAC0 TX Client Clock input from BUFG
NET "*/tx_client_clk*" TNM_NET = "clk_client_tx0";
TIMEGRP "v5_emac_v1_3_single_gmii_client_clk_tx0"
= "clk_client_tx0";
TIMESPEC "TS_v5_emac_v1_3_single_gmii_client_clk_tx0" = PERIOD
"v5_emac_v1_3_single_gmii_client_clk_tx0" 7700 ps HIGH 50 %;
# EMAC0 RX Client Clock input from BUFG
NET "*/rx_client_clk*" TNM_NET = "clk_client_rx0";
TIMEGRP "v5_emac_v1_3_single_gmii_client_clk_rx0"
= "clk_client_rx0";
TIMESPEC "TS_v5_emac_v1_3_single_gmii_client_clk_rx0" = PERIOD
"v5_emac_v1_3_single_gmii_client_clk_rx0" 7700 ps HIGH 50 %;
# EMAC0 TX PHY Clock input from BUFG
NET "*/tx_gmii_mii_clk*" TNM_NET = "clk_phy_tx0";
TIMEGRP "v5_emac_v1_3_single_gmii_phy_clk_tx0"
= "clk_phy_tx0";
TIMESPEC
"TS_v5_emac_v1_3_single_gmii_phy_clk_tx0" =
PERIOD "v5_emac_v1_3_single_gmii_phy_clk_tx0" 7700 ps HIGH 50 %;
# EMAC0 RX PHY Clock
NET "*/gmii_rx_clk*" TNM_NET = "phy_clk_rx0";
TIMEGRP "v5_emac_v1_3_single_gmii_clk_phy_rx0"
= "phy_clk_rx0";
TIMESPEC
"TS_v5_emac_v1_3_single_gmii_clk_phy_rx0" =
PERIOD "v5_emac_v1_3_single_gmii_clk_phy_rx0" 7700 ps HIGH 50 %;
修改后的ucf文件如下:
# EMAC0 TX Client Clock input from BUFG
NET "*/TxClientClk_0" TNM_NET = "clk_client_tx0";
TIMEGRP "v5_emac_v1_3_single_gmii_client_clk_tx0"
= "clk_client_tx0";
TIMESPEC "TS_v5_emac_v1_3_single_gmii_client_clk_tx0" = PERIOD
"v5_emac_v1_3_single_gmii_client_clk_tx0" 7700 ps HIGH 50 %;
# EMAC0 RX Client Clock input from BUFG
NET "*/RxClientClk_0" TNM_NET = "clk_client_rx0";
TIMEGRP "v5_emac_v1_3_single_gmii_client_clk_rx0"
= "clk_client_rx0";
TIMESPEC "TS_v5_emac_v1_3_single_gmii_client_clk_rx0" = PERIOD
"v5_emac_v1_3_single_gmii_client_clk_rx0" 7700 ps HIGH 50 %;
# EMAC0 TX PHY Clock input from BUFG
NET "*/GMII_TX_CLK_0*" TNM_NET = "clk_phy_tx0";
TIMEGRP "v5_emac_v1_3_single_gmii_phy_clk_tx0"
= "clk_phy_tx0";
TIMESPEC
"TS_v5_emac_v1_3_single_gmii_phy_clk_tx0" =
PERIOD "v5_emac_v1_3_single_gmii_phy_clk_tx0" 7700 ps HIGH 50 %;
# EMAC0 RX PHY Clock
NET "*/GMII_RX_CLK_0*" TNM_NET = "phy_clk_rx0";
TIMEGRP "v5_emac_v1_3_single_gmii_clk_phy_rx0"
= "phy_clk_rx0";
TIMESPEC
"TS_v5_emac_v1_3_single_gmii_clk_phy_rx0" =
PERIOD "v5_emac_v1_3_single_gmii_clk_phy_rx0" 7700 ps HIGH 50 %;
改完之后,bitstream文件可以生成了。不过我没有下到板子上试过。(上次试的时候插线弄错了。对自己非常无语。-_-! )