|
|
  |
Не работает схема верхнего уровня, Помощь в освоении VHDL |
|
|
|
May 10 2018, 09:12
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(призрак @ May 10 2018, 12:06)  То есть если на элемент ИЛИ на один вход подаётся 1 а другой - неопределённый - логика не сработает? Выход просто окажется в том же самом неопределенном состоянии.
|
|
|
|
|
May 10 2018, 09:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(призрак @ May 10 2018, 12:06)  И вопрос остался - надо делать отдельный проект для каждого уровня или в одном можно, сейчас вот так ... Вот симуляция триггера - всё работает ... То есть если на элемент ИЛИ на один вход подаётся 1 а другой - неопределённый - логика не сработает? Ну теперь понятнее - судя по всему у Вас что то с выходами Q - как они в TB подключенны ? Поэтому вместо 1 выход триггеров в X переключается - кофликтует с другим источником на Q. Давно в Aledc не работал - но насколько помню можете выбрать любой файл в иерархии и сгенерировать для него TB в том же самом проекте. В доке Aldec или в сети можно (и нужно) найти табличку результата логических операций в зависимости от типа сигналов (0,1,X,U...). Удачи! Rob.
|
|
|
|
|
May 10 2018, 10:59
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Потому-что начальное значение задается в области декларации сигнала Например: Код architecture RTL of testing signal shreg : std_logic_vector(2 downto 0) := (others => '0'); -- вот тут задаем начальное значние ! begin И вообще. Я боюсь представить себе, как бы у Вас выглядел 256 битный регистр...
|
|
|
|
|
May 10 2018, 11:15
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(призрак @ May 10 2018, 13:52)  Потому что не повлияло на работу обнуление триггера в правой. Если сигналу в процессе значение присваивается несколько раз, то актуальным окажется самое последнее из выполненных присвоений, поэтому ничего и не изменилось.
|
|
|
|
|
May 10 2018, 11:17
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(призрак @ May 10 2018, 13:52)  Добавил установку в триггер, но теперь вопрос - где делать установку в правой программе? Потому что не повлияло на работу обнуление триггера в правой. ... Правая часть генерируется автоматом из вашей схемы. Там нет сигналов из которых получается "триггеры" - только соединения - Добавлять какую либо инициализацию туда бессмыслено. Покажите лучше TB для модуля 3REG Удачи! Rob.
|
|
|
|
|
May 10 2018, 11:31
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 12-12-06
Из: Москва
Пользователь №: 23 439

|
Цитата(Flip-fl0p @ May 10 2018, 13:59)  Потому-что начальное значение задается в области декларации сигнала Например: Код architecture RTL of testing signal shreg : std_logic_vector(2 downto 0) := (others => '0'); -- вот тут задаем начальное значние ! begin И вообще. Я боюсь представить себе, как бы у Вас выглядел 256 битный регистр...  Регистры инициализировались.но ..не работают.. А разработка планируется чтобы не использовать 3 1024-битных регистра))) Цитата(RobFPGA @ May 10 2018, 14:17)  Приветствую!
Правая часть генерируется автоматом из вашей схемы. Там нет сигналов из которых получается "триггеры" - только соединения - Добавлять какую либо инициализацию туда бессмыслено.
Покажите лучше TB для модуля 3REG
Удачи! Rob. А разве вставленный блок 4DFF не должен выполнять функцию логики?
|
|
|
|
|
May 10 2018, 14:14
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 12-12-06
Из: Москва
Пользователь №: 23 439

|
Цитата(KalashKS @ May 10 2018, 16:57)  Внесу свои пять копеек. Первое, из-за чего код нерабочий: сигналы Q0...Q3 присваиваются одновременно внутри процесса и вне его. Симулятор создаст для них по два драйвера один - в '0' по изменению любого сигнала из списка чувствительности, второй - в значение сигналов FF0...FF3. В результате при моделировании получите либо '0', либо 'X'. Про синтез пока даже говорить не стоит. Cудя по коду вы хотите сделать схему, в которой '1' циклически бегает по выхохам Q0...Q3. Сдвиг вы описали, зацикливание тоже. Осталось задать то, что должно там крутиться. Например, сразу по сбросу выставить схему в одно из устраивающих вас состояний. Потом посмОтрите, как вы будете это все рушить своим входным сигналом. Да, предполагается потом на логике реализовать чтобы при сбросе всё выставлялось в ноль, а младший регистр в 1, которая при каждом следующем клоке будет сдвигаться в следующий разряд и переходить в нулевой через или, при этом схема не будет зависеть от количества триггеров (сейчас 4 потом хоть 10) а обнуление приходится делать чтобы не было неопределённых значений. И можжно ссылку на номера строк листинга где двойное присваивание?
|
|
|
|
|
May 10 2018, 14:31
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
Цитата(призрак @ May 10 2018, 17:14)  младший регистр в 1 Вот этого пока не описано. А стоило бы. Цитата(призрак @ May 10 2018, 17:14)  а обнуление приходится делать чтобы не было неопределённых значений. Необязательно обнулять. Достаточно чтобы были какие-либо определенные значения. В вашем случае "0001". Цитата(призрак @ May 10 2018, 17:14)  И можжно ссылку на номера строк листинга где двойное присваивание? 30-я строка блока 4DFF и строки 56-59. Цитата(призрак @ May 10 2018, 17:14)  при этом схема не будет зависеть от количества триггеров (сейчас 4 потом хоть 10). Почитайте, как пишутся сдвиговые регистры на VHDL, про тип std_logic_vector и про generic. Как уже намекали выше, ваш код можно сделать параметризируемым и сжать его до нескольких строк (без учета заголовков и объявлений).
Сообщение отредактировал KalashKS - May 10 2018, 14:31
|
|
|
|
|
May 10 2018, 15:07
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 12-12-06
Из: Москва
Пользователь №: 23 439

|
Цитата(KalashKS @ May 10 2018, 17:31)  Вот этого пока не описано. А стоило бы.
Необязательно обнулять. Достаточно чтобы были какие-либо определенные значения. В вашем случае "0001".
30-я строка блока 4DFF и строки 56-59.
Почитайте, как пишутся сдвиговые регистры на VHDL, про тип std_logic_vector и про generic. Как уже намекали выше, ваш код можно сделать параметризируемым и сжать его до нескольких строк (без учета заголовков и объявлений). 1. Для этого я пока ввёл промежуточный сигнал и 1 генерю им 2. Без обнулений были неопределённые значения 3. 56-59 - почему? это же просто сброс, он может потом раздельным быть, да и на не подключенные выводы ругается симулятор, до этого просто на земле сидел. 4. до generic я ещё не дошёл, мне бы простую схему запустить чтобы с ней разобраться
|
|
|
|
|
May 10 2018, 16:25
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(призрак @ May 10 2018, 18:07)  1. Для этого я пока ввёл промежуточный сигнал и 1 генерю им 2. Без обнулений были неопределённые значения Если все равно уже добавлен ресет, то можно устанавливать начальное значение по нему, без всяких промежуточных сигналов. Еще раз - дело не в обнулении, а в присвоении конкретных значений вместо дефолтных U, а нулевые они или нет - роли не играет. Цитата 3. 56-59 - почему? это же просто сброс, он может потом раздельным быть, да и на не подключенные выводы ругается симулятор, до этого просто на земле сидел. Не важно, что это в вашем или чьем-либо другом понимании, с точки зрения языка сигнал может иметь несколько драйверов только в одном процессе. Из приведенного описания получается, что Qi ВСЕГДА равен FFi, но при этом по любому изменению сигналов из списка чувствительности еще и оказывается равен нулю - так не бывает.
|
|
|
|
|
May 11 2018, 05:25
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Вообще я бы посоветовал автору делать сразу правильно. Всё Ваше устройство легко уместить в такой код: CODE library ieee; use ieee.std_logic_1164.all;
entity reg_aclr is port ( clk : in std_logic; aclr : in std_logic; D : in std_logic; Q : out std_logic_vector(3 downto 0) ); end entity;
architecture RTL of reg_aclr is signal shreg: std_logic_vector(3 downto 0) := (others => '0'); begin process(aclr, clk) begin if (aclr = '1') then shreg <= (others => '0'); elsif (rising_edge(clk)) then shreg <= shreg(2 downto 0) & (D or shreg(3)); end if; end process; Q <= shreg; end architecture; Более того, при необходимости можно добавить параметры для настройки разрядности такого регистра и хоть 1000 разрядов делайте Если цель состоит описать именно из отдельных триггеров (правда зачем ?) то можно: 1. Описать отдельно DFF с асинхронным сбросом : CODE library ieee; use ieee.std_logic_1164.all;
entity DFF_aclr is port ( clk : in std_logic; aclr : in std_logic; D : in std_logic; Q : out std_logic := '0' ); end entity; architecture RTL of DFF_aclr is begin reg_proc : process(aclr, clk) begin if (aclr = '1') then Q <= '0'; elsif (rising_edge(clk)) then Q <= D; end if; end process; end architecture; 2. И описать соединение триггеров между собой: CODE library ieee; use ieee.std_logic_1164.all;
entity reg_aclr is port ( clk : in std_logic; aclr : in std_logic; D : in std_logic; Q : out std_logic_vector(3 downto 0) ); end entity;
architecture RTL of reg_aclr is signal iQ: std_logic_vector(3 downto 0) := (others => '0'); begin --=============================================== -- Первый триггер в цепочке сдвигового регистра --=============================================== DFF0_aclr_comp : entity work.DFF_aclr port map ( clk => clk, aclr => aclr, D => D or iq(3), Q => iQ(0) ); --=============================================== -- Остальные триггера --=============================================== reg_3to1generate : for i in 0 to 2 generate DFF_aclr_comp : entity work.DFF_aclr port map ( clk => clk, aclr => aclr, D => iQ(i), Q => iQ(i + 1) ); end generate; Q <= iQ; end architecture; И опять же. В такое описание легко добавить параметры для задания разрядности регистра.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|