Jump to content
    

Странные вопросы по VHDL

Стыдно даже такое спрашивать, но уже пол часа пытаюсь понять, и не могу ! Как в VHDL подключить std_logic к std_logic_vector, чтобы на каждом элементе vector'a оказалось то, что приходит с std_logic ???

 

Решил собраться с силами и перейти со схемного дизайна на VHDL, но мой мозг никак под это не заточен...

 

Share this post


Link to post
Share on other sites

Стыдно даже такое спрашивать, но уже пол часа пытаюсь понять, и не могу ! Как в VHDL подключить std_logic к std_logic_vector, чтобы на каждом элементе vector'a оказалось то, что приходит с std_logic ???

 

Решил собраться с силами и перейти со схемного дизайна на VHDL, но мой мозг никак под это не заточен...

ЕМНИП : можно воспользоваться агрегатами либо функцию сделать. И шли бы вы со схемного ввода в другое место (SV) ;)

Share this post


Link to post
Share on other sites

Как-то сложно звучит... Неужели нельзя просто присвоить одно значение целой группе сигналов (ну как к одному проводу десяток подключить) ??? Мне вообще кажется, что я такое видел, причем в крайне простом варианте (вроде там others использовалось)...

 

Кстати, а что такое SV - SystemVerilog ?

Edited by justontime

Share this post


Link to post
Share on other sites

в крайне простом варианте (вроде там others использовалось)...

дык это и есть агрегаты :)

Кстати, а что такое SV - SystemVerilog ?

да

 

Share this post


Link to post
Share on other sites

... Как в VHDL подключить std_logic к std_logic_vector, чтобы на каждом элементе vector'a оказалось то, что приходит с std_logic ???...

Делал так

...
Q:out std_logic_vector(7 downto 0)
...
signal data:std_logic;
....
D1:for i in 0 to 7 generate
Q(i)<=data;
end generate;

Share this post


Link to post
Share on other sites

дык это и есть агрегаты :)

 

Ага ! Узнал нужное слово, дальше было дело техники - посмотреть в нужном месте в книжке, спасибо !

 

Но от меня так просто не отделаться :) Итак, есть компонент, у которого есть выход Х std_logic. И есть top level entity с портом Y std_logic_vector. Мне нужно присоединить X к Y. Пока сделал просто - ввел промежуточный сигнал Z и написал:

 

Y <= (others => Z)

 

а в instantiation компонента в port map указал

 

X => Z

 

Вроде должно работать(как минимум, компилятор не ругался), но ведь не красиво ! Вопрос - можно ли обойтись без промежуточного сигнала, и сразу так связать в port map ?

 

Share this post


Link to post
Share on other sites

сделали проводок, и им соединили 2 компонента, что не красивого то?

 

только не называйте его Z , а то 'Z' - это битик 3 состояния, кто-то код будет читать, подумает ковычки збыли, поправит и начнется ад и израиль

Share this post


Link to post
Share on other sites

но ведь не красиво ! Вопрос - можно ли обойтись без промежуточного сигнала, и сразу так связать в port map ?
Можно. Ответ уже давали:
(SV) ;)
Ну или хотя бы просто V.

Share this post


Link to post
Share on other sites

сделали проводок, и им соединили 2 компонента, что не красивого то?

 

только не называйте его Z , а то 'Z' - это битик 3 состояния, кто-то код будет читать, подумает ковычки збыли, поправит и начнется ад и израиль

 

Просто не нравится промежуточный проводок, ведь его может и не быть... А насчет Z - это для примера, в проекте, естественно, другие имена.

 

 

Можно. Ответ уже давали:Ну или хотя бы просто V.

 

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

Share this post


Link to post
Share on other sites

Ну меня буквы не жмут.

 

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

 

А синтезатор это ни к чему не обязывает. Он все равно потом даже модули разберет и пересоединит все как посчитает лучше для оптимизации, эти прокинутые сигналы (проводки) не имеют физического воплощения, это просто языковые конструкции....

Share this post


Link to post
Share on other sites

Ну меня буквы не жмут.

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

+1!

Лучше напечатать 15 символов, но знать и иметь возможность быстро вспомнить о чем речь, чем обезличить шину/сигнал и спустя полгода долго чесать свою "тыковку" вспоминая откуда росли ноги :bb-offtopic:

Share this post


Link to post
Share on other sites

Очередной чайниковский вопрос... Перевожу свой схемный дизайн в VHDL, сейчас нужен двухнаправленный буфер с третьим состоянием. Написал следующее:

 

process (ENn, EnAn, EnBn)
begin

if ((ENn = '1') or (EnAn = EnBn)) then
    A <= "ZZZZZZZZ";
    B <= "ZZZZZZZZ";
        elsif EnAn = '0' then
            A <= B;
                else
                    B <= A;
end if;

end process;

 

Надеюсь, что смысл желаемого вроде понятен - высокий уровень на ENn или одинаковые уровни на EnAn или EnBn переводят A и B в третье состояние, в остальных (двух) случаях данные проходят либо от A к B, либо наоборот.

Quartus компилирует, но сильно ругается на latch'и и на то, что A и B отсутствуют в списке чувствительности процесса. Вопроса, собственно, два:

 

1. Ругань на latch - это общего плана, или же даже в данном конкретном случае я что-то неправильно сделал ?

 

2. Нужно ли включать A и B в список чувствительности ? Посмотрел RTL Viewer'ом оба варианта (с включением A и B, и без) - вроде индентичны...

Edited by justontime

Share this post


Link to post
Share on other sites

Очередной чайниковский вопрос... Перевожу свой схемный дизайн в VHDL, сейчас нужен двухнаправленный буфер с третьим состоянием. Написал следующее:

 

process (ENn, EnAn, EnBn)
begin

if ((ENn = '1') or (EnAn = EnBn)) then
    A <= "ZZZZZZZZ";
    B <= "ZZZZZZZZ";
        elsif EnAn = '0' then
            A <= B;
                else
                    B <= A;
end if;

end process;

 

Надеюсь, что смысл желаемого вроде понятен - высокий уровень на ENn или одинаковые уровни на EnAn или EnBn переводят A и B в третье состояние, в остальных (двух) случаях данные проходят либо от A к B, либо наоборот.

Quartus компилирует, но сильно ругается на latch'и и на то, что A и B отсутствуют в списке чувствительности процесса. Вопроса, собственно, два:

 

1. Ругань на latch - это общего плана, или же даже в данном конкретном случае я что-то неправильно сделал ?

 

2. Нужно ли включать A и B в список чувствительности ? Посмотрел RTL Viewer'ом оба варианта (с включением A и B, и без) - вроде индентичны...

если не секрет - буфер с третьим состоянием будет использоваться в IO порте?

Пояснение: Внутри ПЛИС использование логики с третьим состоянием не желателен, лучше использовать мультиплексоры. Логику с третьим состоянием можно использовать на входе/выходе ПЛИС

 

пример ниже

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity tri_state_buffer_top is
    Port ( A    : in  STD_LOGIC;    -- single buffer input
           EN   : in  STD_LOGIC;    -- single buffer enable
           Y    : out STD_LOGIC;    -- single buffer output
           -- 4 input / output buffer with one enable
           IN4  : in  STD_LOGIC_VECTOR (3 downto 0);
           EN4  : in  STD_LOGIC;
           OUT4 : out STD_LOGIC_VECTOR (3 downto 0));
end tri_state_buffer_top;

architecture Behavioral of tri_state_buffer_top is

begin

    -- single active low enabled tri-state buffer
    Y <= A when (EN = '0') else 'Z';
    
    -- 4 input/output active low enabled tri-state buffer
    OUT4 <= IN4 when (EN4 = '0') else "ZZZZ";

end Behavioral;

Share this post


Link to post
Share on other sites

если не секрет - буфер с третьим состоянием будет использоваться в IO порте?

 

К FPGA подключена SRAM, у которой входы и выходы данных объединены, плюс на эту же шину данных, возможно, еще и другие источники/потребители будут подключаться (в т.ч. работающие со SRAM).

 

Share this post


Link to post
Share on other sites

elsif EnAn = '0' then
            A <= B;
                else
                    B <= A;

 

вы же хотите чтобы А менялось в след за изменениями В и наоборот в случае елсе, так? Тогда логично предположить что процесс должен быть чувствителен к их изменению, и следовательно они должны быть в списке, да?

 

 

Но в целом странная конструкция А на Б, или Б на А, или оба в 3 состоянии... Что подключено к А, что к Б? Когда А идет на Б, в каком состоянии находиться выход А?

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