Jump to content
    

как соединить несколько двунаправленных шин на VHDL?

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

это, по моему, разные конструкции, по разному будут сентезиться... в некоторых плисах.

 

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

Share this post


Link to post
Share on other sites

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;

надеюсь это у вас "запашет" :)

Share this post


Link to post
Share on other sites

Такая реализация не имеет смысла. Человеку нужно:

 

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 просмотрщике.

Share this post


Link to post
Share on other sites

Такая реализация не имеет смысла. Человеку нужно:

 

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;

Это по Вашему смысл имеет?

Share this post


Link to post
Share on other sites

Ошибки у меня нет. И у Вас тоже работает. Извините. Я хотел сказать, что увидеть в RTL просмотрщике между буферами по третьему состоянию мультиплексоры непривычно для глаза человека, работающего в графическом редакторе. Это моя реализация в RTL просмотрщике соответствует графическому представлению по соединению примитивов tri. Просто нагляднее. Но если посмотреть в technology Map просмотрщмке, то все равно lcell вставляет между двунаправленными выводами. Так что действительно, что влоб, что полбу.

 

А оьсудение это отнюдь не бессмысленно. Вряд ли я буду терять свое время. Есть много причин использовать такую конструкцию. Например если узлов несколько и Вы хотите буферизовать через кристалл двунаправленную шину. Или поставлена задача перевести изделие из N узлов в один, и неочень хочется перерабатывать интерфейс управления.

Share this post


Link to post
Share on other sites

Ошибки у меня нет. И у Вас тоже работает. Извините. Я хотел сказать, что увидеть в RTL просмотрщике между буферами по третьему состоянию мультиплексоры непривычно для глаза человека, работающего в графическом редакторе. Это моя реализация в RTL просмотрщике соответствует графическому представлению по соединению примитивов tri. Просто нагляднее. Но если посмотреть в technology Map просмотрщмке, то все равно lcell вставляет между двунаправленными выводами. Так что действительно, что влоб, что полбу.

 

А оьсудение это отнюдь не бессмысленно. Вряд ли я буду терять свое время. Есть много причин использовать такую конструкцию. Например если узлов несколько и Вы хотите буферизовать через кристалл двунаправленную шину. Или поставлена задача перевести изделие из N узлов в один, и неочень хочется перерабатывать интерфейс управления.

Упс да ошибок нету извините :)

но так бы назначать дважды я не стал бы

Share this post


Link to post
Share on other sites

Так ведь я всего два года как на буквы перешел. По другому пока не умею. Спасибо!

Share this post


Link to post
Share on other sites

Так ведь я всего два года как на буквы перешел. По другому пока не умею. Спасибо!

а по другому видимо так

assign da = (!dir & !oe_a_n) ? db : (!dir & !oe_b_n) ? dc : 8'hzz;

Share this post


Link to post
Share on other sites

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-буферов подать уже мультиплексированный. Чтобы наверняка... Такая вот привычка... :)

Но действительно, схема, описанная на верилоге, в РТЛ-схематике дает исходную схему(без мультиплексоров). Хотя, похоже, после маппинга, все равно мультиплексоры ставятся... Вопрос: как повторить это на вхдл(получить РТЛ-схематик без мультиплексоров, с шинами, объединенными по третьему состоянию напрямую)? :)

Share this post


Link to post
Share on other sites

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 в нескольких параллельных конструкциях. Каждая такая конструкция является процессом со своим драйвером сигнала.

Share this post


Link to post
Share on other sites

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;

Share this post


Link to post
Share on other sites

Большое спасибо всем участникам обсуждения, для меня оно было очень полезным. Раньше не пользовался параллелным оператором присваивания, так что уж извините что сразу не сообразил про подсказку. :)

Share this post


Link to post
Share on other sites

В смысле в схематике предусмотрено - при попытке установить запрещённые комбинации соединения выходов все шины остаются в высокоимпедансном состоянии.

А Вы уверены в правильности такого решения. Помнится в те времена когда Tri-State Buses активно использовались внутри чипов там принимались некоторые меры что бы линии не плавали.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...