Jump to content
    

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

Подскажите плиз как описать на vhdl такую схему:

post-11054-1157013117_thumb.jpg

ну типа что то в таком стиле

DOUT0 <= DIN0 when ENABLE0='1' else DIN1 when ENABLE1 else 'Z';

 

 

p.s. народ ваще книжек не читает...кирдык

Share this post


Link to post
Share on other sites

Postoroniy_V,

 

Для двунаправленных шин у меня код наподобие вашего не работает. Нарисовал в схематике - получается.

 

 

> p.s. народ ваще книжек не читает...кирдык

 

Что конкретно посоветуете почитать по этому вопросу?

Share this post


Link to post
Share on other sites

Postoroniy_V,

 

Для двунаправленных шин у меня код наподобие вашего не работает. Нарисовал в схематике - получается.

 

 

> p.s. народ ваще книжек не читает...кирдык

 

Что конкретно посоветуете почитать по этому вопросу?

Ваш код в студию плиз!

и что значит не пашет?

посоветовать могу книжки :) всё тут

Share this post


Link to post
Share on other sites

entity BTEST is

port

(

clk : inout std_logic;

en_AB : in std_logic;

en_AC : in std_logic;

portA_io : in std_logic_vector (8 downto 0);

portB_io : out std_logic_vector (8 downto 0);

portC_io : out std_logic_vector (8 downto 0)

);

end entity BTEST;

 

architecture BEHAV of BTEST is

begin

process(clk)

begin

if en_AB='0' then portB_io <= portA_io;

elsif en_AC='0' then portC_io <= portA_io;

else

portB_io <= (others => 'Z');

portC_io <= (others => 'Z');

end if;

end process;

end architecture BEHAV;

 

Например этот код для однонаправленных шин работает, но если заменить определение портов на inout, то в симуляторе не вижу нормальной работы. Читал книжки - не нашёл примеров обьединения именно двух и более двунаправленных шин. Если знаете где конкретно написано по моему вопросу, то буду благодарен за ссылку.

Share this post


Link to post
Share on other sites

Например этот код для однонаправленных шин работает

Не знаю-не знаю... По моему, этот код не должен работать. Во всяком случае синтезируется из него хрен знает что...

Почему процесс чувствителен к clk? Почему clk - inout?

Но это - неважно...

Для "однонаправленных" шин :) по-моему правильно процесс писать так:

process(en_AB, en_AC, portA_io, )
begin
    if en_AB='0' then portB_io <= portA_io;
        else portB_io <= (others => 'Z');
    end if;
    if en_AC='0' then portC_io <= portA_io;
        else portC_io <= (others => 'Z');
    end if;
end process;

Share this post


Link to post
Share on other sites

entity BTEST is

port

(

clk : inout std_logic;

en_AB : in std_logic;

en_AC : in std_logic;

portA_io : in std_logic_vector (8 downto 0);

portB_io : out std_logic_vector (8 downto 0);

portC_io : out std_logic_vector (8 downto 0)

);

end entity BTEST;

 

architecture BEHAV of BTEST is

begin

process(clk)

begin

if en_AB='0' then portB_io <= portA_io;

elsif en_AC='0' then portC_io <= portA_io;

else

portB_io <= (others => 'Z');

portC_io <= (others => 'Z');

end if;

end process;

end architecture BEHAV;

 

У Вас в списке чувствительности процесса один сигнал - clk - это что за зверь? где он на приведенной схеме?

 

Если у Вас асинхронный дизайн - уберите из списка чувствительности этот clk и добавьте в него ваши сигналы: portA_io, en_AB, en_AC

Share this post


Link to post
Share on other sites

> Почему процесс чувствителен к clk? Почему clk - inout?

 

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

 

 

> Для однонаправленных шин по-моему правильно процесс писать так:

 

И всё-таки вопрос про двунаправленные шины...

 

 

> У Вас в списке чувствительности процесса один сигнал - clk - это что за зверь? где он на

> приведенной схеме?

 

На схеме одна сигнальная линия, для иллюстрации как надо соединить шины. Как формируются сигналы разрешения портов с тремя состояниями вынесем за скобки.

 

 

> Если у Вас асинхронный дизайн - уберите из списка чувствительности этот clk и добавьте в него

> ваши сигналы: portA_io, en_AB, en_AC

 

Схема синхронная, клок внешний. Изменение списка чувствительности ничего не изменило.

 

 

зы: перед тем как задать вопрос я просмотрел книги+яндекс+гугль+comp.lang.vhdl

Share this post


Link to post
Share on other sites

Для двунаправленных шин у меня код наподобие вашего не работает. Нарисовал в схематике - получается.

 

 

> p.s. народ ваще книжек не читает...кирдык

 

Что конкретно посоветуете почитать по этому вопросу?

 

Да ничего читать не надо. Нарисовали в схематике. Сделайте File - Create/update и получите схему в VHDL

Там 4 процесса получается. а по большому счету наверно надо реализовывать как АП6.

Один вход - направление передачи. Второй вход - перевод двунаправленной шины в третье состояние.

И вешайте эти АП6 друг на друга.

Share this post


Link to post
Share on other sites

> Нарисовали в схематике. Сделайте File - Create/update и получите схему в VHDL

 

Не знал, спасибо. С квартусом я пока на вы :)

 

 

> Там 4 процесса получается. а по большому счету наверно надо реализовывать как АП6.

> Один вход - направление передачи. Второй вход - перевод двунаправленной шины в третье

> состояние. И вешайте эти АП6 друг на друга.

 

Ну так я и сделал в схематике, но хотелось перенести это чудо на vhdl. Теперь всё ОК, вопрос снимается.

Share this post


Link to post
Share on other sites

Интересно, в приведенной схематике, получается, есть возможность драйвить один выход сразу двумя сигналами(при условии, что разрешен выход для обоих)? Как-то неправильно это, имхо. Или я не прав?

Я бы сделал как-нибудь так:

process(en_AB, en_AC, portB_io, portC_io)
begin
    if en_AB='1' and en_AC='0' then portA_io <= portB_io;
    elsif en_AB='0' and en_AC='1' then 
        portA_io <= portC_io;
    else 
        portA_io <= (others => 'Z');
    end if;
end process;

process(en_C, portA_io)
begin
    if en_C='0' then portC_io <= portA_io;
        else portC_io <= (others => 'Z');
    end if;
end process;

process(en_B, portA_io)
begin
    if en_B='0' then portB_io <= portA_io;
        else portB_io <= (others => 'Z');
    end if;
end process;

Тут, правда, дополнительная логика есть, кроме буферов...

Share this post


Link to post
Share on other sites

Для двунаправленных шин у меня код наподобие вашего не работает. Нарисовал в схематике - получается.

 

 

> p.s. народ ваще книжек не читает...кирдык

 

Что конкретно посоветуете почитать по этому вопросу?

 

Да ничего читать не надо. Нарисовали в схематике. Сделайте File - Create/update и получите схему в VHDL

Там 4 процесса получается. а по большому счету наверно надо реализовывать как АП6.

Один вход - направление передачи. Второй вход - перевод двунаправленной шины в третье состояние.

И вешайте эти АП6 друг на друга.

ага точно, читать ничего не надо! нафих? всегда можно в конфе спросить :blink:

а если бы инета не было?

и не понятно почему такая любовь к громоздким конструкциям?

можно ведь так

....
    DOUT0 <= DIN0 when ENABLE0='1' else DIN1 when ENABLE1='1' else 'Z';
    DIN0 <= DOUT0 when ENABLE2='1' else DIN1 when ENABLE3='1' else 'Z';
.....

и уж тем более не ясно почему она у вас "не пашет" :angry2:

Share this post


Link to post
Share on other sites

2Very_hard

 

> Интересно, в приведенной схематике, получается, есть возможность драйвить один выход сразу

> двумя сигналами(при условии, что разрешен выход для обоих)? Как-то неправильно это, имхо.

> Или я не прав?

 

Ага, прав. В схематике это состояние запрещается.

 

 

2Postoroniy_V

 

> ага точно, читать ничего не надо! нафих? всегда можно в конфе спросить

> а если бы инета не было?

 

Я задал вопрос, ответ на который не нашёл. Мне ответили - надо реализовывать каждую линию отдельным процессом. Где это написано в ваших книжках, покажите?

 

> и не понятно почему такая любовь к громоздким конструкциям?

> можно ведь так

>

> DOUT0 <= DIN0 when ENABLE0='1' else DIN1 when ENABLE1='1' else 'Z';

> DIN0 <= DOUT0 when ENABLE2='1' else DIN1 when ENABLE3='1' else 'Z';

 

Если вы не возражаете, я проверю ваш вариант немного позже.

Share this post


Link to post
Share on other sites

Ага, прав. В схематике это состояние запрещается
Так что, Ваша схематика все-таки не работает? В смысле не синтезируется?

Share this post


Link to post
Share on other sites

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

Edited by zaratustra

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...