Golikov 0 September 2, 2006 Posted September 2, 2006 · Report post 2Postoroniy_V У меня получается такой код: (если я правильно вас понял) entity BTEST is port ( sele : in std_logic_vector (1 downto 0); portA_io : inout std_logic_vector (8 downto 0); portB_io : inout std_logic_vector (8 downto 0); portC_io : inout std_logic_vector (8 downto 0) ); end entity BTEST; architecture BEHAV of BTEST is begin process(sele, portA_io, portB_io, portC_io) begin case sele is when "00" => portB_io <= portA_io; when "01" => portA_io <= portB_io; when "10" => portC_io <= portA_io; when "11" => portA_io <= portC_io; when others => portA_io <= "ZZZZZZZZZ"; portB_io <= "ZZZZZZZZZ"; portC_io <= "ZZZZZZZZZ"; end case; end process; end architecture BEHAV; Не пашет. Дык, when others никогда не выполняется :). Еще к Вам вопрос что будет если на вашей схеме открыть самый верхний и самый нижний буфер?! Признайтесь, зачем вам такая схема? я бы еще заметил что a<=b when с='1' else 'Z' надо бы все таки писать вне процесса, не могу сформулировать почему не изучал вопрос, но работает лучше. А то что 3 стайт не моделируется нормально - это я тоже заметил, модел сим в 1 случае из 10 выдает правильно, а в железе все 10 случаев работают. Я даже стал проверять иноут по очереди, сначала моделил как ин, потом как оут, и только потом делал иноут и в железо заливал. Хотя это конечно может от неопытности. и кстати a<=b when с='1' else 'Z' и case c is when '1' => a<=b; when others => a<='Z' end case это, по моему, разные конструкции, по разному будут сентезиться... в некоторых плисах. и опять же действительно не понятно зачем вам такая схема, которая исходя из вашего описания и вправду никогда на оверс не переходит... А если это не происходит то вы просто передумали сами себя, какую то излишни хитрую логику заложили, настолько хитрую что даже сами не понимаете зачем... Quote Share this post Link to post Share on other sites More sharing options...
Postoroniy_V 0 September 4, 2006 Posted September 4, 2006 · Report post 2Postoroniy_V У меня получается такой код: (если я правильно вас понял) ... case sele is when "00" => portB_io <= portA_io; when "01" => portA_io <= portB_io; when "10" => portC_io <= portA_io; when "11" => portA_io <= portC_io; when others => portA_io <= "ZZZZZZZZZ"; portB_io <= "ZZZZZZZZZ"; portC_io <= "ZZZZZZZZZ"; end case; .... Не пашет. Вам уже написали что у Вас это неверно написано вот что я имеел ввиду library IEEE; use IEEE.std_logic_1164.all; entity Top is port ( portA_io : inout std_logic_vector (8 downto 0); portB_io : inout std_logic_vector (8 downto 0); portC_io : inout std_logic_vector (8 downto 0); sele: in std_logic_vector (1 downto 0) ); end Top; architecture structure of Top is begin portA_io <= portB_io when sele="01" else portC_io when sele="11" else (others=>'Z'); portB_io <= portA_io when sele="00" else (others=>'Z'); portC_io <= portA_io when sele="10" else (others=>'Z'); end structure; надеюсь это у вас "запашет" :) Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 September 4, 2006 Posted September 4, 2006 · Report post Такая реализация не имеет смысла. Человеку нужно: module ap6_ap6 ( inout [7:0] da, inout [7:0] db, inout [7:0] dc, input oe_a_n, oe_b_n, input dir ); assign db = (dir & !oe_a_n) ? da : 8'hzz; assign da = (!dir & !oe_a_n) ? db : 8'hzz; assign dc = (dir & !oe_b_n) ? da : 8'hzz; assign da = (!dir & !oe_b_n) ? dc : 8'hzz; endmodule Если конечно судить по результатам просмотра в RTL просмотрщике. Quote Share this post Link to post Share on other sites More sharing options...
Postoroniy_V 0 September 4, 2006 Posted September 4, 2006 · Report post Такая реализация не имеет смысла. Человеку нужно: module ap6_ap6 ( inout [7:0] da, inout [7:0] db, inout [7:0] dc, input oe_a_n, oe_b_n, input dir ); assign db = (dir & !oe_a_n) ? da : 8'hzz; assign da = (!dir & !oe_a_n) ? db : 8'hzz; assign dc = (dir & !oe_b_n) ? da : 8'hzz; assign da = (!dir & !oe_b_n) ? dc : 8'hzz; endmodule 0) человеку нужно на VHDL 1) почему не имеет смысла? аргументы? смотрите самое первое сообщение - там есть схема и выходит схема тоже не имеет смысла?:) и вообще эти все сообщения не нужны никому и бессмысленны :blink: 2) к тому же у вас ошибка есть :) дважды назначаете шину DA assign da = (!dir & !oe_a_n) ? db : 8'hzz; assign da = (!dir & !oe_b_n) ? dc : 8'hzz; Это по Вашему смысл имеет? Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 September 4, 2006 Posted September 4, 2006 · Report post Ошибки у меня нет. И у Вас тоже работает. Извините. Я хотел сказать, что увидеть в RTL просмотрщике между буферами по третьему состоянию мультиплексоры непривычно для глаза человека, работающего в графическом редакторе. Это моя реализация в RTL просмотрщике соответствует графическому представлению по соединению примитивов tri. Просто нагляднее. Но если посмотреть в technology Map просмотрщмке, то все равно lcell вставляет между двунаправленными выводами. Так что действительно, что влоб, что полбу. А оьсудение это отнюдь не бессмысленно. Вряд ли я буду терять свое время. Есть много причин использовать такую конструкцию. Например если узлов несколько и Вы хотите буферизовать через кристалл двунаправленную шину. Или поставлена задача перевести изделие из N узлов в один, и неочень хочется перерабатывать интерфейс управления. Quote Share this post Link to post Share on other sites More sharing options...
Postoroniy_V 0 September 4, 2006 Posted September 4, 2006 · Report post Ошибки у меня нет. И у Вас тоже работает. Извините. Я хотел сказать, что увидеть в RTL просмотрщике между буферами по третьему состоянию мультиплексоры непривычно для глаза человека, работающего в графическом редакторе. Это моя реализация в RTL просмотрщике соответствует графическому представлению по соединению примитивов tri. Просто нагляднее. Но если посмотреть в technology Map просмотрщмке, то все равно lcell вставляет между двунаправленными выводами. Так что действительно, что влоб, что полбу. А оьсудение это отнюдь не бессмысленно. Вряд ли я буду терять свое время. Есть много причин использовать такую конструкцию. Например если узлов несколько и Вы хотите буферизовать через кристалл двунаправленную шину. Или поставлена задача перевести изделие из N узлов в один, и неочень хочется перерабатывать интерфейс управления. Упс да ошибок нету извините :) но так бы назначать дважды я не стал бы Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 September 4, 2006 Posted September 4, 2006 · Report post Так ведь я всего два года как на буквы перешел. По другому пока не умею. Спасибо! Quote Share this post Link to post Share on other sites More sharing options...
Postoroniy_V 0 September 4, 2006 Posted September 4, 2006 · Report post Так ведь я всего два года как на буквы перешел. По другому пока не умею. Спасибо! а по другому видимо так assign da = (!dir & !oe_a_n) ? db : (!dir & !oe_b_n) ? dc : 8'hzz; Quote Share this post Link to post Share on other sites More sharing options...
Very_hard 0 September 5, 2006 Posted September 5, 2006 · Report post module ap6_ap6 ( inout [7:0] da, inout [7:0] db, inout [7:0] dc, input oe_a_n, oe_b_n, input dir ); assign db = (dir & !oe_a_n) ? da : 8'hzz; assign da = (!dir & !oe_a_n) ? db : 8'hzz; assign dc = (dir & !oe_b_n) ? da : 8'hzz; assign da = (!dir & !oe_b_n) ? dc : 8'hzz; endmodule Я хотел сказать, что увидеть в RTL просмотрщике между буферами по третьему состоянию мультиплексоры непривычно для глаза человека, работающего в графическом редакторе. Это моя реализация в RTL просмотрщике соответствует графическому представлению по соединению примитивов tri. Просто нагляднее. Честно говоря, у меня рука не поднимается объединять выходы напрямую, даже по третьему состоянию... Почему-то хочется сигнал на входы tri-буферов подать уже мультиплексированный. Чтобы наверняка... Такая вот привычка... :) Но действительно, схема, описанная на верилоге, в РТЛ-схематике дает исходную схему(без мультиплексоров). Хотя, похоже, после маппинга, все равно мультиплексоры ставятся... Вопрос: как повторить это на вхдл(получить РТЛ-схематик без мультиплексоров, с шинами, объединенными по третьему состоянию напрямую)? :) Quote Share this post Link to post Share on other sites More sharing options...
Oldring 0 September 5, 2006 Posted September 5, 2006 · Report post module ap6_ap6 ( inout [7:0] da, inout [7:0] db, inout [7:0] dc, input oe_a_n, oe_b_n, input dir ); assign db = (dir & !oe_a_n) ? da : 8'hzz; assign da = (!dir & !oe_a_n) ? db : 8'hzz; assign dc = (dir & !oe_b_n) ? da : 8'hzz; assign da = (!dir & !oe_b_n) ? dc : 8'hzz; endmodule Я хотел сказать, что увидеть в RTL просмотрщике между буферами по третьему состоянию мультиплексоры непривычно для глаза человека, работающего в графическом редакторе. Это моя реализация в RTL просмотрщике соответствует графическому представлению по соединению примитивов tri. Просто нагляднее. Честно говоря, у меня рука не поднимается объединять выходы напрямую, даже по третьему состоянию... Почему-то хочется сигнал на входы tri-буферов подать уже мультиплексированный. Чтобы наверняка... Такая вот привычка... :) Но действительно, схема, описанная на верилоге, в РТЛ-схематике дает исходную схему(без мультиплексоров). Хотя, похоже, после маппинга, все равно мультиплексоры ставятся... Вопрос: как повторить это на вхдл(получить РТЛ-схематик без мультиплексоров, с шинами, объединенными по третьему состоянию напрямую)? :) Точно так же. :) Присваивая da в нескольких параллельных конструкциях. Каждая такая конструкция является процессом со своим драйвером сигнала. Quote Share this post Link to post Share on other sites More sharing options...
Very_hard 0 September 5, 2006 Posted September 5, 2006 · Report post Oldring, cпасибо! Подводя итог теме, исходная схема на VHDL: library IEEE; use IEEE.std_logic_1164.all; entity Top is port ( portA_io : inout std_logic_vector (8 downto 0); portB_io : inout std_logic_vector (8 downto 0); portC_io : inout std_logic_vector (8 downto 0); enAB, enAC, enB, enC: in std_logic); end Top; architecture structure of Top is begin portA_io <= portB_io when enAB='1' else (others=>'Z'); portA_io <= portC_io when enAC='1' else (others=>'Z'); portB_io <= portA_io when enB='1' else (others=>'Z'); portC_io <= portA_io when enC='1' else (others=>'Z'); end structure; Quote Share this post Link to post Share on other sites More sharing options...
stssao 0 September 5, 2006 Posted September 5, 2006 · Report post Большое спасибо всем участникам обсуждения, для меня оно было очень полезным. Раньше не пользовался параллелным оператором присваивания, так что уж извините что сразу не сообразил про подсказку. :) Quote Share this post Link to post Share on other sites More sharing options...
klop 0 September 16, 2006 Posted September 16, 2006 · Report post В смысле в схематике предусмотрено - при попытке установить запрещённые комбинации соединения выходов все шины остаются в высокоимпедансном состоянии. А Вы уверены в правильности такого решения. Помнится в те времена когда Tri-State Buses активно использовались внутри чипов там принимались некоторые меры что бы линии не плавали. Quote Share this post Link to post Share on other sites More sharing options...