Перейти к содержанию
    

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

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем justontime

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

да

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Как в 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Y <= (others => Z)

 

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

 

X => Z

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

+1!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очередной чайниковский вопрос... Перевожу свой схемный дизайн в 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, и без) - вроде индентичны...

Изменено пользователем justontime

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очередной чайниковский вопрос... Перевожу свой схемный дизайн в 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...