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

Многовходовый MUX в Спартане

На шину данных из FPGA в процессор выдается содержимое различных регистров, это всякие регистры состояний, управления и т.п., т.е. во внутреннюю память они не ложатся. Сейчас это сделано через Case, получился такой себе немаленький мультиплексор, просто пожирающий ячейки FPGA. Хотелось бы как-то сэкономить, вот я и прикидываю, как это красивее описать в VHDL?

Мысль крутится в сторону объединения всех выходов через OR, и неиспользуемые запрещать, чтобы 0 был на выходе. Но при этом надо, чтобы регистры управления продолжали выдавать сигналы... И сэкономлю ли я что-то при этом?

 

Короче, сумбурно получилось, но возможно кто-то меня понял и знает, как это правильно реализовать?

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


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

На шину данных из FPGA в процессор выдается содержимое различных регистров, это всякие регистры состояний, управления и т.п., т.е. во внутреннюю память они не ложатся. Сейчас это сделано через Case, получился такой себе немаленький мультиплексор, просто пожирающий ячейки FPGA. Хотелось бы как-то сэкономить, вот я и прикидываю, как это красивее описать в VHDL?

Мысль крутится в сторону объединения всех выходов через OR, и  неиспользуемые запрещать, чтобы 0  был на выходе. Но при этом надо, чтобы регистры управления продолжали выдавать сигналы... И сэкономлю ли я что-то при этом?

 

Короче, сумбурно получилось, но возможно кто-то меня понял и знает, как это правильно реализовать?

Можно попробовать мультиплексор на tristate логике:

 

mux_gen : FOR i IN mux_length-1 DOWNTO 0 GENERATE

data_bus <= mux_in(i*8+7 DOWNTO i*8) WHEN sel_bin(i) = '1' ELSE (OTHERS => 'Z');

END GENERATE mux_gen;

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


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

Я делаю так. Сначала объявляю константу BUS_PASSIVE, затем везде её использую, где надо объединять выходы блоков.

Блок объединения - через case. В зависимости от сигнала BUS_PASSIVE синтезатор Leonardo делает либо mux, либо, tristate, либо or логику.

Кажется так :).

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


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

Можно попробовать мультиплексор на tristate логике:

 

Не указано, какой именно спартан. В третьем спартане AFAIK нет тристабильных буферов внутри. "Вот уроды!"

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

 

Если интерфейс синхронный, можно разбить большой мультиплексор на несколько более мелких и запайплайнить это дело, а в проце или контроллере (или что там у вас) немного увеличить latency команды чтения.

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


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

Naskol'ko ya znayu, u Spartana u Altera Cyclon i tonu podobnoe vnutri vse odno net tristate i on etot MUX po LUT rastashit. Dlya timinga lu4she ispol'zovat' megafunction ili CoreGen i flooplaner dlya ego placementa

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


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

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

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

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

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

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

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

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

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

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