Delsian 0 9 марта, 2005 Опубликовано 9 марта, 2005 · Жалоба На шину данных из FPGA в процессор выдается содержимое различных регистров, это всякие регистры состояний, управления и т.п., т.е. во внутреннюю память они не ложатся. Сейчас это сделано через Case, получился такой себе немаленький мультиплексор, просто пожирающий ячейки FPGA. Хотелось бы как-то сэкономить, вот я и прикидываю, как это красивее описать в VHDL? Мысль крутится в сторону объединения всех выходов через OR, и неиспользуемые запрещать, чтобы 0 был на выходе. Но при этом надо, чтобы регистры управления продолжали выдавать сигналы... И сэкономлю ли я что-то при этом? Короче, сумбурно получилось, но возможно кто-то меня понял и знает, как это правильно реализовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dmitry-tomsk 0 9 марта, 2005 Опубликовано 9 марта, 2005 · Жалоба На шину данных из FPGA в процессор выдается содержимое различных регистров, это всякие регистры состояний, управления и т.п., т.е. во внутреннюю память они не ложатся. Сейчас это сделано через Case, получился такой себе немаленький мультиплексор, просто пожирающий ячейки FPGA. Хотелось бы как-то сэкономить, вот я и прикидываю, как это красивее описать в VHDL? Мысль крутится в сторону объединения всех выходов через OR, и неиспользуемые запрещать, чтобы 0 был на выходе. Но при этом надо, чтобы регистры управления продолжали выдавать сигналы... И сэкономлю ли я что-то при этом? Короче, сумбурно получилось, но возможно кто-то меня понял и знает, как это правильно реализовать? <{POST_SNAPBACK}> Можно попробовать мультиплексор на 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ASN 0 9 марта, 2005 Опубликовано 9 марта, 2005 · Жалоба Я делаю так. Сначала объявляю константу BUS_PASSIVE, затем везде её использую, где надо объединять выходы блоков. Блок объединения - через case. В зависимости от сигнала BUS_PASSIVE синтезатор Leonardo делает либо mux, либо, tristate, либо or логику. Кажется так :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 9 марта, 2005 Опубликовано 9 марта, 2005 · Жалоба Можно попробовать мультиплексор на tristate логике: Не указано, какой именно спартан. В третьем спартане AFAIK нет тристабильных буферов внутри. "Вот уроды!" Вообще если мультеплексор сильно развесистый, то тут уже не о красоте кода приходится думать, а о том как в таймингах шины уместиться. Если интерфейс синхронный, можно разбить большой мультиплексор на несколько более мелких и запайплайнить это дело, а в проце или контроллере (или что там у вас) немного увеличить latency команды чтения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
belena7 0 17 марта, 2005 Опубликовано 17 марта, 2005 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться