如何实施inout参数?

时间:2015-01-02 09:21:34

标签: vhdl fpga xilinx

我知道inout参数是什么以及如何使用它们。假设我们有一个inout参数io并且想要创建一个双向静态RAM,如下面的代码:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY sram IS
    port(
        clk  : IN    std_logic;
        wr   : IN    std_logic;
        io   : INOUT std_logic;
        addr : IN    INTEGER RANGE 0 TO 7
    );
END sram;

ARCHITECTURE behavioral OF sram IS
    TYPE matrix IS ARRAY (0 TO 7) OF std_logic;
    SIGNAL mem : matrix;
BEGIN
    PROCESS(clk)
    BEGIN
        IF rising_edge(clk) THEN
            IF wr = '1' THEN
                mem(addr) <= io;
            END IF;
        END IF;
    END PROCESS;
    io <= mem(addr) WHEN wr = '0' ELSE 'Z';
END behavioral;

我们可以创建一个sram实例并在其上写,如下面的代码:

io <= '1' WHEN wr = '1' ELSE 'Z';

问题:综合工具如何控制多个分配并在多个驱动程序之间进行判断?实现了哪些硬件?


感谢您的评论和回答...

2 个答案:

答案 0 :(得分:2)

对于典型的FPGA和ASIC器件,三态功能的实现仅适用于IO,例如在Altera Arria 10 FPGA中:

enter image description here

因此,对于此类器件,内部RAM始终使用专用输入和输出端口实现,因此不使用任何内部三态功能。

即使RAM连接到支持三态的外部IO,内部RAM块通常仍然使用专用的输入和输出端口创建,因此通过输入输出来处理与设备上的三态引脚的连接具有输出使能和三态功能的缓冲器。

如果设备不支持内部设计尝试使用三态功能或多个驱动程序,那么综合工具将生成并出错,通常说同一网络不支持多个驱动程序。

答案 1 :(得分:2)

在Xilinx器件上,原理图类似。

这是原始IOBUF的图像:
IOBUF

绿色部分是三态控制的输出驱动器;蓝色部分是输入驱动程序。完整的IOB(输入/输出块)由几个原语组成:

  • IOB寄存器(输入,输出,三态控制)
  • 延迟链
  • 将两个IOB组合到差分IOB(** BUFDS)
  • 的电线
  • 驱动时钟网络的能力(CC-IOB - 支持时钟的IOB)
  • pullup,pulldown,...
  • 司机(IOBUF)
  • pin / ball(IPAD,OPAD,IOPAD) - 这包括ESD保护

如何合成?

  • Xilinx综合工具(XST / Synth)为顶级组件的端口描述中的每条线路添加IPAD或OPAD原语。焊盘只是表示FPGA封装下物理引脚或球的基元。
  • 如果您启用了自动添加I / O缓冲区,该工具将在每个PAD和顶级端口之间添加IBUF,OBUF,IOBUF,IBUFDS,...基元。它使用端口方向(in,out,inout)来推断正确的缓冲区类型。如果禁用此选项(默认=开),则必须为每个I / O引脚手动添加缓冲区。在某些情况下,XST会受到冒犯:我手动添加了一些带有三态控制的IOBUF,因此XST拒绝推断丢失的缓冲区。所以我必须手动添加所有缓冲区......

使用Xilinx XST时,可以在顶层下方使用三态总线(端口方向=输入)。 XST将报告它添加了(虚拟)三态缓冲区。如果总线的每个位的方向具有明显的方向且没有多个驱动器问题,则会对这些缓冲区进行修整。

这在iSim中不起作用。