Перейти к содержанию
    

Как описать двунаправленный порт на VHDL

Проблема, наверное, и выеденного яйца не стоит, но вот уже часа 4 мучаюсь :(

Есть модуль, который описывает работу с памятью. У этого модуля один из портов описан как inout. В основном модуле для всех портов генерятся буферные элементы (ibuf, obug, ibufg, bufg). Очевидно, что для дунаправленного порта необходим такой же буфер: iobuf. Как выглядит его описание я знаю.

Вопрос: КАК связать io порт модуля памяти с io портом основного модуля через этот iobuf?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема, наверное, и выеденного яйца не стоит, но вот уже часа 4 мучаюсь  :(

Есть модуль, который описывает работу с памятью. У этого модуля один из портов описан как inout. В основном модуле для всех портов генерятся буферные элементы (ibuf, obug, ibufg, bufg). Очевидно, что для дунаправленного порта необходим такой же буфер: iobuf. Как выглядит его описание я знаю.

Вопрос: КАК связать io порт модуля памяти с io портом основного модуля через этот iobuf?

 

Если под модулями подразумевается vhdl модули одного проекта, то, если я правильно понимаю, никаких iobuf не нужно. Т.к. эти буфера нужны только для общения с внешним миром. И даже в этом случае iobuf - это макрос, который состоит из ibuf и какого-нибудь буфера типа obuft или obufe.

 

А вообще - приведи пример кода, тогда будет гораздо понятнее, в чем проблема. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все верно. Нужно описать этот io порт во внешнем мире.

Основной модуль, в который входит модуль для работы с памятью, как раз и должен общаться с внешнем миром. Все сигналы описал, а вот с этим двунаправлнным проблема! Причем, я предстваляю как выглядит этот iobuf (в хелпе все расписано), но не понимаю, как связать io порт модуля памяти (входит в состав основного модуля) и io порт основного модуля (будет физически связан с соотв. ногами микросхемы памяти).

Какой фрагмент кода привести для более полного понимания ситуации просто не представляю :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну если я правильно понял твою проблему и у модуля верхнего уровня этот порт описан как inout, и у модуля памяти он тоже inout, то можно просто внутри архитектуры верхнего модуля объявить некоторый сигнал, с помощью которого и port map связать требуемые порты (модуля верхнего уровня и модуля памяти). А синтезатор должен будет сам правильно синтезировать требуемые буфера ввода-вывода...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

entity test is

port(

sel : in STD_LOGIC;

data : inout STD_LOGIC_VECTOR(7 downto 0)

);

end test;

 

architecture test of test is

signal a, b: std_logic_vector(7 downto 0);

begin

 

a <= data;

 

data <= b when sel = '0' else

"ZZZZZZZZ";

 

end test;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

to makc

Максим, ты все понял правильно. А я попытаюсь еще больше конкретизировать задачу, что бы получить более конкретный овет :)

Несколько упрощенный случай представил k2i.

Итак, пусть в основном модуле описан порт:

 

data : inout std_logic_vector(15 downto 0);

 

В модуле памяти, который входит в основной модуль, то же есть подобный порт, скажем:

 

sdata: data : inout std_logic_vector(15 downto 0);

 

То, что было написано k2i входит в логику управления портом в модуле памяти.

 

Я не пойму как связать между собой порты data (физически будет подключен к микросхеме памяти) и sdata через примитив iobuf.

Можно ли не использовать какие-либо примитивы и напрямую соединить sdata и data (с этим у меня проблем нет :))? Но это будет выбиваться и общей логики буферизации входных и выходных сигналов. Да и программе PACE это не понраву.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

to TriD:

 

Случай, хоть и упрощенный, зато по существу. ;)

 

Теперь я понял твою проблему. В общем случае нужно "протаскивать" двунаправленную шину из внутреннего модуля во внешний. В этой цепи можно поставить соответсвующий буфер ввода-вывода, но можно воспользоваться возможностью автоматического добавления нужного буфера ввода-вывода, которую нам предоставляет синтезатор (опция Add I/O Buffers) в параметрах XST.

 

Прикладываю пример того, что тебе нужно. Правда там реализован счетчик, но это не принципиально. ;)

 

Теперь что касается IOBUF: это буфер ввода вывода, который позволяет от одной двунаправленной линии перейти к двум (линии ввода и линии вывода). Таким образом, в твоей задаче модуль для работы с памятью должен иметь два разных порта - in и out, а не один inout для того чтобы правильно воспользоваться IOBUF, если сам IOBUF расположен в архитектуре модуля верхнего уровня.

 

Можно ли не использовать какие-либо примитивы и напрямую соединить sdata и data (с этим у меня проблем нет :))? Но это будет выбиваться и общей логики буферизации входных и выходных сигналов. Да и программе PACE это не понраву.

 

В моем примере так и сделано. А что должно не понравиться PACE?

sample.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Маским, спасибо за помощь :)

Буду разбираться.

А PACE выдавал какие-то предупреждения (сейчас, правда, помалкивает :))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...