как реализуются параметры inout?


Я знаю, что такое параметры inout и как их использовать. Предположим, что у нас есть параметр inout io и мы хотим создать двунаправленную статическую оперативную память, такую как следующий код:

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 3

2 ответа:

Для типичных ПЛИС и ASIC устройств реализация возможностей tristate доступна только на IO, как, например, в ПЛИС Altera Arria 10:

Введите описание изображения здесь

Таким образом, для таких устройств внутренние Ram всегда реализуются с выделенными входными и выходными портами, таким образом, не используя никаких внутренних возможностей tristate.

Даже если ОЗУ подключено к внешним IOs, которые поддерживают tristate, то внутренний блок ОЗУ все равно обычно создается с выделенным входом и выходные порты, поэтому соединение с выводом tristate на устройстве обрабатывается через буфер in-out с возможностью включения вывода и tristate.

Если внутренний дизайн пытается использовать возможности tristate или несколько драйверов, когда это не поддерживается устройством, то инструмент синтеза будет генерировать и ошибку, обычно говоря, что несколько драйверов не поддерживаются для одной и той же сети.

На устройствах Xilinx схема аналогична.

Это образ примитивного ИОБУФА:
IOBUF

Зеленая часть-это выходной драйвер с управлением tristate; синяя часть-входной драйвер. Полный IOB (блок ввода/вывода) состоит из нескольких примитивов:

  • регистры IOB (input, output, tristate control)
  • цепи задержки
  • провода для объединения двух IOB в дифференциальный IOB (**BUFDS)
  • возможность управлять тактовыми сетями (CC-IOB - часы способны IOB)
  • pullup, pulldown, ...
  • драйвер (IOBUF)
  • pin / ball (IPAD, OPAD, IOPAD) - это включает защиту от ESD

Как работает синтез?

  • Xilinx synthesis tools (XST / Synth) добавляет примитивы IPAD или OPAD для каждого провода в описании порта компонента верхнего уровня. Pad - это всего лишь примитив для представления физического штыря или шарика под пакетом FPGA.
  • Если вы включили автоматическое добавление буферов ввода-вывода, инструмент добавит IBUF, OBUF, IOBUF, IBUFDS, ... примитивы между каждой панелью и портом верхнего уровня. Он использует направление порта (in, out, inout), чтобы определить правильный тип буфера. Если этот параметр отключен (по умолчанию = ВКЛ.), вам придется вручную добавлять буферы для каждого пин-кода ввода-вывода. В некоторых случаях XST обижается: я добавил несколько IOBUFs с контролем tristate вручную, поэтому XST отказался выводить недостающие буферы. Поэтому мне пришлось добавитьвсе буферы вручную ...

При использовании Xilinx XST это можно использовать шины tristate (направление порта = inout) ниже верхнего уровня. XST сообщит, что он добавил (виртуальные) буферы tristate. Эти буферы обрезаются, если направление каждого бита шины имеет очевидное направление и нет проблемы с несколькими драйверами.

Это не работает в iSim.