在Xilinx的EDK下,Platform generator是不直接支持三态的inout端口的。意思说我在设计中定义了三态的inout端口,如果不经过特殊的配置话,是无法综合的。
例如:
我需要在总线上添加一个外围设备,该设备是通过IIC来配置板间设备,如CH7301(DVI输出芯片),AD9980(8bit 显示接口芯片)。这个时候我得定义IIC的两个接口:SCL和SDA;
一般的三态inout端口在VHDL下可以这样定义:
signal SCL : inout std_logic;
signal SDA : inout std_logic;
…..
SCL <= SCL_PAD_O when (SCL_OE='0’) else ‘Z’; -- ‘Z’必须大写,
SDA <= SDA_PAD_O when(SDA_OE=‘0’) else ‘Z’;
SCL_PAD_I <= SCL;
SDA_PAD_I <= SDA;

图1. SCL三态端口

图2.SDA三态端口 上面的定义在ISE工程下没有问题,会综合可以得到如图3的原理图。但是在EDK工程下需要做一定的修改。
首先在顶层中定义如下端口(以VHDL为例):
SDA_PAD_I : in std_logic;
SDA_PAD_O : out std_logic;
SDA_OE : out std_logic;
SCL_PAD_I : in std_logic;
SCL_PAD_O : out std_logic;
SCL_EN : out std_logic;
最终这6个逻辑上的端口需要定义到2个三态的INOUT端口上,那应该如何修改呢?这个时候就需要*.mpd文件,即Microprocessor Peripheral Description文件(详见参考2)。
自定义的IP core会在生成一个pcores 目录,下面一般有/data,/hdl,/netlist,*.mpd文件会在/data目录下面,需要添加的内容如下:
PORT SDA_PAD_I = "", DIR = I
PORT SDA_PAD_O = "", DIR = O
PORT SDA_OE = "", DIR = O
PORT SCL_PAD_I = "", DIR = I
PORT SCL_PAD_O = "", DIR = O
PORT SCL_PAD_T = "", DIR = O
PORT SDA = "", DIR = IO, THREE_STATE = TRUE, TRI_I = SDA_PAD_I, TRI_O = SDA_PAD_O, TRI_T = SDA_OE, ENABLE=SINGLE
PORT SCL = "", DIR = IO, THREE_STATE = TRUE, TRI_I = SCLK_PAD_I, TRI_O = SCL_PAD_O, TRI_T = SCLK_OE, ENABLE=SINGLE
然后将SDA和SCL端口设置为external port,即跟FPGA外部相连,最后的综合得到的物理端口为SDA和SCL,就是三态inout端口了。如图3 所示。

图3. 三态端口的BUF原理图 Ref:
Problems about Tri-state INOUT ports in user-created peripheral with virtex5
Platform Specification Fotmat Reference Manual, Xilinx
文章来源:KiKi的博客 |