|
Не работает схема верхнего уровня, Помощь в освоении VHDL |
|
|
|
 |
Ответов
(1 - 76)
|
May 8 2018, 12:43
|

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

|
Цитата(andrew_b @ May 8 2018, 15:16)  Телепаты уже в летних отпусках. Покажите код. Да там особо нет текста Вот ещё схема для понимания Цитата(призрак @ May 8 2018, 15:37)  Да там особо нет текста
Вот циклограмма
Эскизы прикрепленных изображений
|
|
|
|
|
May 8 2018, 12:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(призрак @ May 8 2018, 15:43)  Да там особо нет текста
Вот ещё схема для понимания Ну и кто за Вас будет ресетить логику в начале симуляции?. По умолчанию все регистры при старте симуляции ставятся в U состояние (в отличии от реального железа) - это помогает при разработку отслеживать некорректную инициализацию дизайна. Удачи! Rob.
|
|
|
|
|
May 8 2018, 13:10
|

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

|
Цитата(RobFPGA @ May 8 2018, 15:51)  Приветствую!
Ну и кто за Вас будет ресетить логику в начале симуляции?. По умолчанию все регистры при старте симуляции ставятся в U состояние (в отличии от реального железа) - это помогает при разработку отслеживать некорректную инициализацию дизайна.
Удачи! Rob. Ресет отключен пока в процессе отладки, по логике схема должна работать примерно так: с 1 тактом первый триггер принимает состояние 1 со 2 тактом - второй 1, первый ноль, и т.д. бегающая единичка Цитата(призрак @ May 8 2018, 15:55)  Ресет отключен пока в процессе отладки, по логике схема должна работать примерно так: с 1 тактом первый триггер принимает состояние 1 со 2 тактом - второй 1, первый ноль, и т.д. бегающая единичка Добавил сброс вместо земли - не поменялось
Эскизы прикрепленных изображений
|
|
|
|
|
May 8 2018, 13:13
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(призрак @ May 8 2018, 15:55)  Ресет отключен пока в процессе отладки, по логике схема должна работать примерно так: ... Это понятно что по логику - но по факту я вижу схему которая может работать (в симе) как минимум 17-ю разными вариантами в зависимости от того как изначально инициализируются регистры. Один из этих вариантов Вы и видите. Не надейтесь на удачу (даже наоборот - ожидайте неприятностей) - и делайте так чтобы всегда быть уверенным в контроле состояния дизайна. P.S. Какой тощий сброс  аш жалко. На тригграх ресет какой ? асинхронный или синхронный? Удачи! Rob.
|
|
|
|
|
May 8 2018, 13:21
|

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

|
Цитата(RobFPGA @ May 8 2018, 16:13)  Приветствую! Это понятно что по логику - но по факту я вижу схему которая может работать (в симе) как минимум 17-ю разными вариантами в зависимости от того как изначально инициализируются регистры. Один из этих вариантов Вы и видите. Не надейтесь на удачу (даже наоборот - ожидайте неприятностей) - и делайте так чтобы всегда быть уверенным в контроле состояния дизайна. P.S. Какой тощий сброс  аш жалко. На тригграх ресет какой ? асинхронный или синхронный? Удачи! Rob. Простой триггер: if ( RS='1') then FF <= '0' ; elsif ( CLK'event and CLK = '1' ) then FF <= D after 1 ns ; end if;
|
|
|
|
|
May 8 2018, 14:53
|

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

|
Цитата(призрак @ May 8 2018, 16:21)  Простой триггер: if ( RS='1') then FF <= '0' ; elsif ( CLK'event and CLK = '1' ) then FF <= D after 1 ns ; end if; Во-первых Код after 1 ns; не синтезируется. Во-вторых у вас триггер никак не инициализирован. Либо вручную при объявлении сигнала (или порта) присвойте начальное значение, либо сначала сбрасывайте триггер. Хотя это Вам говорили. Что Вы ещё хотите услышать я не знаю.
|
|
|
|
|
May 10 2018, 06:37
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветстувую! Цитата(призрак @ May 10 2018, 09:22)  Примерно понял. Но, в примерах триггера не делают предварительную установку значения, и всё работает.. И получается что сигнал сброса, генерируемый в начале тестирования, не устанавливает в ноль, а надо делать заранее установку? Это значит что у Вас что то не так либо с сигналом сброса либо с описанием триггера. Попробуйте сделать сброс шириной в пару тактов CLK, Ну и описание триггера целиком покажите. Удачи! Rob.
|
|
|
|
|
May 10 2018, 06:42
|

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

|
Цитата(призрак @ May 10 2018, 09:22)  Примерно понял. Но, в примерах триггера не делают предварительную установку значения, и всё работает.. Потому-что многим триггерам предварительная установка не требуется. Например есть выход 8-разрядного регистра data_out. И есть сигнал валидности этих данных data_valid. Так вот начальная установка регистра data_out не требуется. А вот сигнал валидности data_valid желательно как-либо установить в начальное значение. Либо путем начального сброса, либо начальной установкой схемы. Более того не все FPGA поддерживают возможность начальной установки значения, на сколько я помню FPGA фирмы Actel не умеют инициализировать триггеры каким-то значением. А некоторые FPGA могут затребовать дополнительных ресурсов для начальной установки значения. Например в чипах Altera cyclone C5SEMA5F31C6 установка начального значения триггера в нули - ресурсов не требует. А вот установка в единицы - требует дополнительный слой логики, что может иметь значение на проектах, критичных к максимальным частотам. Цитата И получается что сигнал сброса, генерируемый в начале тестирования, не устанавливает в ноль, а надо делать заранее установку? Не так. Правильно сделанный сброс - устанавливает значение триггера в то значение, в которое Вы его сбрасываете. Ключевая фраза - правильно сделанный сброс. А как делать правильно - зависит от проекта. У меня обычно присутствует начальный сброс.
|
|
|
|
|
May 10 2018, 08:50
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(призрак @ May 10 2018, 11:26)  Хорошо, но в данном случае что надо первоначально обнулять? D0...3? Q0...3? FF0...3? Ресетить всегда нужно источник сигнала. Что является источником в Вашей схеме? - выход триггеров. Еще раз повторю - если при подачи на вход сброса RS Ваш триггер не сбрасывается - это значит что что то не так и дальнейшие гадания ни к чему не приведут. Надо для начала разобраться с одним триггером - почему он не сбрасывается? Просимулируйте один триггер - выведите на диаграмму все сигналы из с него (или изнутри 4DF) и посмотрите что и как. Судя по куску кода триггера он асинхронный - может Вы не добавили RS в список чувствительности процесса? P.S. Ну и когда с триггером разберетесь - ресет дизайна нужно делать так чтобы всегда приводить схему в нужное состояние - в Вашей схеме это не так - от ширины импульса на входе RST будет зависть что запишется в регистр и соответственно бегущую единицу Вы получите не всегда. Удачи! Rob.
|
|
|
|
|
May 10 2018, 08:51
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(призрак @ May 10 2018, 11:26)  Хорошо, но в данном случае что надо первоначально обнулять? D0...3? Q0...3? FF0...3? У вас внутренние состояния регистров U - т.е. неопределены, и из-за того, что на первый из регистров подается выход последнего прооренный со входным сигналом, это самое неопределенное состояние так и будет бесконечно на выходе каждого из регистров. Выше вам уже правильно посоветовали либо задать изначальные состояния этих самых регистров, либо устанавливать их по сбросу.
|
|
|
|
|
May 10 2018, 09:06
|

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

|
И вопрос остался - надо делать отдельный проект для каждого уровня или в одном можно, сейчас вот так  Цитата(RobFPGA @ May 10 2018, 11:50)  Приветствую!
Ресетить всегда нужно источник сигнала. Что является источником в Вашей схеме? - выход триггеров.
Еще раз повторю - если при подачи на вход сброса RS Ваш триггер не сбрасывается - это значит что что то не так и дальнейшие гадания ни к чему не приведут. Надо для начала разобраться с одним триггером - почему он не сбрасывается? Просимулируйте один триггер - выведите на диаграмму все сигналы из с него (или изнутри 4DF) и посмотрите что и как. Судя по куску кода триггера он асинхронный - может Вы не добавили RS в список чувствительности процесса?
P.S. Ну и когда с триггером разберетесь - ресет дизайна нужно делать так чтобы всегда приводить схему в нужное состояние - в Вашей схеме это не так - от ширины импульса на входе RST будет зависть что запишется в регистр и соответственно бегущую единицу Вы получите не всегда.
Удачи! Rob.  Вот симуляция триггера - всё работает Цитата(Tausinov @ May 10 2018, 11:51)  У вас внутренние состояния регистров U - т.е. неопределены, и из-за того, что на первый из регистров подается выход последнего прооренный со входным сигналом, это самое неопределенное состояние так и будет бесконечно на выходе каждого из регистров. Выше вам уже правильно посоветовали либо задать изначальные состояния этих самых регистров, либо устанавливать их по сбросу. То есть если на элемент ИЛИ на один вход подаётся 1 а другой - неопределённый - логика не сработает?
|
|
|
|
|
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; И опять же. В такое описание легко добавить параметры для задания разрядности регистра.
|
|
|
|
|
May 11 2018, 09:18
|

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

|
Код library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_signed.all; use IEEE.std_logic_unsigned.all;
entity \3REG\ is port( CLKT : in STD_LOGIC; RS : in STD_LOGIC; RST : in STD_LOGIC; Q : out STD_LOGIC_VECTOR(0 to 3):= (others => '0') ); end \3REG\;
architecture \3REG\ of \3REG\ is
component \4DFF\ port ( CLK : in STD_LOGIC; D0,D1,D2,D3 : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC ); end component;
signal D0 : STD_LOGIC; signal QT0,QT1,QT2,QT3 : STD_LOGIC := '0';
begin U10 : \4DFF\ port map( CLK => CLKT, D0 => D0, D1 => QT0, D2 => QT1, D3 => QT2, Q0 => QT0, Q1 => QT1, Q2 => QT2, Q3 => QT3, RS0 => RST, RS1 => RST, RS2 => RST, RS3 => RST );
Q(3) <= QT3; Q(2) <= QT2; Q(1) <= QT1; Q(0) <= QT0; D0 <= RS or QT3;
end \3REG\; и исправленный тригер Код library IEEE; use IEEE.STD_LOGIC_1164.all;
entity \4DFF\ is port( D0,D1,D2,D3 : in STD_LOGIC; CLK : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC := '0' ); end \4DFF\;
architecture \4DFF\ of \4DFF\ is begin process( CLK,RS0,RS1,RS2,RS3 ) begin if ( RS0='1') then Q0 <= '0'; elsif ( rising_edge (CLK)) then Q0 <= D0; end if; if ( RS1='1') then Q1 <= '0'; elsif ( rising_edge (CLK)) then Q1 <= D1; end if; if ( RS2='1') then Q2 <= '0'; elsif ( rising_edge (CLK)) then Q2 <= D2; end if; if ( RS3='1') then Q3 <= '0'; elsif ( rising_edge (CLK) ) then Q3 <= D3; end if; end process; end \4DFF\;
|
|
|
|
|
May 11 2018, 09:39
|

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

|
Запустил на Modelsim 1. Пока не убрал слеши из названия модулей не работало. Теперь файлы регистра выглядит так: CODE library ieee; use ieee.std_logic_1164.all;
entity DFF_aclr is port ( D0,D1,D2,D3 : in STD_LOGIC; CLK : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC := '0' ); end DFF_aclr;
architecture DFF_aclr of DFF_aclr is begin process ( CLK, RS0, RS1, RS2, RS3 ) begin if (RS0='1') then Q0 <= '0'; elsif (rising_edge (CLK)) then Q0 <= D0; end if;
if (RS1='1') then Q1 <= '0'; elsif (rising_edge (CLK)) then Q1 <= D1; end if;
if (RS2='1') then Q2 <= '0'; elsif (rising_edge (CLK)) then Q2 <= D2; end if;
if (RS3='1') then Q3 <= '0'; elsif (rising_edge (CLK)) then Q3 <= D3; end if; end process; end DFF_aclr; 2. Убрал ненужные библиотеки. Зачем Вы их подключали я не знаю. Но в принципе они не влияли никак. CODE library IEEE; use IEEE.std_logic_1164.all; entity reg_aclr is port( CLKT : in STD_LOGIC; RS : in STD_LOGIC; RST : in STD_LOGIC; Q : out STD_LOGIC_VECTOR(0 to 3):= (others => '0') ); end reg_aclr;
architecture reg_aclr of reg_aclr is
component DFF_aclr port ( CLK : in STD_LOGIC; D0,D1,D2,D3 : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC ); end component;
signal D0 : STD_LOGIC; signal QT0,QT1,QT2,QT3 : STD_LOGIC := '0';
begin U10 : DFF_aclr port map( CLK => CLKT, D0 => D0, D1 => QT0, D2 => QT1, D3 => QT2, Q0 => QT0, Q1 => QT1, Q2 => QT2, Q3 => QT3, RS0 => RST, RS1 => RST, RS2 => RST, RS3 => RST );
Q(3) <= QT3; Q(2) <= QT2; Q(1) <= QT1; Q(0) <= QT0; D0 <= RS or QT3; end reg_aclr; С таким тестбенчем все работает как и должно: CODE LIBRARY ieee; USE ieee.std_logic_1164.all;
ENTITY reg_aclr_vhd_tst IS END reg_aclr_vhd_tst; ARCHITECTURE reg_aclr_arch OF reg_aclr_vhd_tst IS -- constants -- signals SIGNAL CLKT : STD_LOGIC; SIGNAL Q : STD_LOGIC_VECTOR(0 TO 3); SIGNAL RS : STD_LOGIC := '0'; SIGNAL RST : STD_LOGIC := '0'; COMPONENT reg_aclr PORT ( CLKT : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(0 TO 3); RS : IN STD_LOGIC; RST : IN STD_LOGIC ); END COMPONENT; --▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ --======================================================================== -- Формирование констант для вычисления периодв CLK от частоты работы --======================================================================== constant clk_freq : real := 100.0; -- MHz constant clk_prd : time := (1000.0/clk_freq) * 1.0 ns; -- Вычисление периода CLK BEGIN i1 : reg_aclr PORT MAP ( -- list connections between master ports and signals CLKT => CLKT, Q => Q, RS => RS, RST => RST ); --========================================== -- Задание тактовой частоты проекта --========================================== process begin CLKT <= '0'; wait for clk_prd/2; CLKT <= '1'; wait for clk_prd/2; end process; process begin wait for 15*clk_prd; RS <= '1'; wait for clk_prd; RS <= '0'; wait; end process; process begin wait for 50*clk_prd; RST <= '1'; wait for 3*clk_prd; RST <= '0'; wait; end process;
END reg_aclr_arch; Вывод : я предполагаю, что некорректные имена вида \name\
|
|
|
|
|
May 11 2018, 09:39
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
А в чем проблема теперь? Подайте сброс, подайте ваш RS меньше чем на такт, на такт, два, четыре. Посмотрите, как именно у вас не работает. Подскажу, если подадите на один такт, работать будет, но, скорее всего, только один раз. А потом послушайте совета, сбрасывайте один из тригеров в '1' и используйте для перезапуска сигнал RST.
|
|
|
|
|
May 11 2018, 09:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(призрак @ May 11 2018, 12:18)  use IEEE.std_logic_arith.all; use IEEE.std_logic_signed.all; use IEEE.std_logic_unsigned.all; Во-первых, эти библиотеки вам не нужны, если вы не используете математические функции. В-вторых, использование std_logic_signed и std_logic_unsigned в одном модуле несколько странно. В-третьих, не используйте их вообще. Используйте стандартную библиотеку numeric_std Цитата(Flip-fl0p @ May 11 2018, 12:39)  Пока не убрал слеши из названия модулей не работало. Там имя архитектуры совпадает с именем модуля. Почему-то.
|
|
|
|
|
May 11 2018, 10:03
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
Цитата(andrew_b @ May 11 2018, 12:45)  Там имя архитектуры совпадает с именем модуля. Почему-то. Я практически всегда так пишу, еще никто не ругался  .
|
|
|
|
|
May 11 2018, 10:49
|

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

|
Цитата(andrew_b @ May 11 2018, 13:40)  С именами \name\ всё нормально. Это расширенные идентификаторы, появившиеся в VHDL'93. А вот Modelsim ALTERA STARTER EDITION 10.1d не нравится. Сейчас специально проверил. Пишет что : Цитата Component instance "U10 : DFF_aclr" is not bound.
|
|
|
|
|
May 11 2018, 12:09
|

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

|
Переписал проект Код library IEEE; use IEEE.STD_LOGIC_1164.all;
entity REG30 is port( CLKR : in STD_LOGIC; RS0 : in STD_LOGIC; RST : in STD_LOGIC; Q : out STD_LOGIC_VECTOR(0 to 3) := (others => '0') ); end REG30;
architecture RTL of REG30 is component DFF4 port ( CLK : in STD_LOGIC; D0,D1,D2,D3 : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC ); end component;
signal D0 : STD_LOGIC; signal QT0,QT1,QT2,QT3 : STD_LOGIC := '0';
begin
U1 : DFF4 port map( CLK => CLKR, D0 => D0, D1 => QT0, D2 => QT1, D3 => QT2, Q0 => QT0, Q1 => QT1, Q2 => QT2, Q3 => QT3, RS0 => RS0, RS1 => RS0, RS2 => RS0, RS3 => RS0 );
Q(3) <= QT3; Q(2) <= QT2; Q(1) <= QT1; Q(0) <= QT0; D0 <= RST or QT3;
end architecture;  Тестбенч генерил методами синтезатора, не знаю как текст такой ввести, вот результат - тот же самый, тригеры не переключаются. На совпадение имён не обращайте внимания, заметил, поправил, ничего не изменилось
|
|
|
|
|
May 11 2018, 13:19
|

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

|
Цитата(KalashKS @ May 11 2018, 15:25)  У меня ваш код промоделировался так, как должен. Посмотрите внутрь блока DFF4. Может у вас по какой-то причине сигналы в него не заходят. Хорошо, а я не вижу где в этом десятке строк кода теряется сигнал. Код library IEEE; use IEEE.STD_LOGIC_1164.all;
entity DFF4 is port( D0,D1,D2,D3 : in STD_LOGIC; CLK : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC := '0' ); end DFF4;
architecture RTL of DFF4 is begin process( CLK,RS0,RS1,RS2,RS3 ) begin if ( RS0='1') then Q0 <= '0'; elsif ( rising_edge (CLK)) then Q0 <= D0; end if; if ( RS1='1') then Q1 <= '0'; elsif ( rising_edge (CLK)) then Q1 <= D1; end if; if ( RS2='1') then Q2 <= '0'; elsif ( rising_edge (CLK)) then Q2 <= D2; end if; if ( RS3='1') then Q3 <= '0'; elsif ( rising_edge (CLK) ) then Q3 <= D3; end if; end process; end architecture;
|
|
|
|
|
May 11 2018, 14:32
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
Это несколько сбивает с толку. У вас вашего DFF4 в иерархии нет вообще, как будто его нет в коде. Даже если он не подцепился, в иерархии должен присутствовать модуль U1 хотя бы в сером цвете. Изучите лог компиляции и моделирования на предмет варнингов. А так, как есть, получается, что DFF4 отсутствует, а QT0...QT1 драйвятся дефолтными нулями из объявления и никогда не меняются. То, что раньше при моделировании у вас были иксы, говорит о том, что вы что-то сломали.
Сообщение отредактировал KalashKS - May 11 2018, 14:41
|
|
|
|
|
May 14 2018, 08:03
|

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

|
Цитата(KalashKS @ May 11 2018, 17:32)  Это несколько сбивает с толку. У вас вашего DFF4 в иерархии нет вообще, как будто его нет в коде. Даже если он не подцепился, в иерархии должен присутствовать модуль U1 хотя бы в сером цвете. Изучите лог компиляции и моделирования на предмет варнингов. А так, как есть, получается, что DFF4 отсутствует, а QT0...QT1 драйвятся дефолтными нулями из объявления и никогда не меняются. То, что раньше при моделировании у вас были иксы, говорит о том, что вы что-то сломали. У меня х не было, было неопределённые значения. А может повлиять версия симуляции, я задавал как квартус 9.1??
|
|
|
|
|
May 14 2018, 08:16
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
Цитата(призрак @ May 14 2018, 11:03)  У меня х не было, было неопределённые значения. Было. На первой странице в последнем посте. Цитата(призрак @ May 14 2018, 11:03)  А может повлиять версия симуляции, я задавал как квартус 9.1?? Теоретически, может быть всякое. Только при чем здусь квартус, если вы в альдеке моделируете? И что значит "задавал"? Если что я моделировал в Active-HDL 10.3.
Сообщение отредактировал KalashKS - May 14 2018, 08:19
|
|
|
|
|
May 14 2018, 10:18
|

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

|
Цитата(KalashKS @ May 14 2018, 11:16)  Было. На первой странице в последнем посте.
Теоретически, может быть всякое. Только при чем здусь квартус, если вы в альдеке моделируете? И что значит "задавал"? Если что я моделировал в Active-HDL 10.3. При формировании воркспейса можно выбрать симуляцию под конкретное семейство микросхем. там можно выбрать и моделирование под конкретную версию ПО Создал новый проект с настройками по умолчанию для версии 10.1.3088 - то же самое (( может вложение как-то не так делаю?
|
|
|
|
|
May 14 2018, 11:06
|

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

|
Цитата(KalashKS @ May 14 2018, 13:53)  Логи компиляции и запуска моделирования смотрели? Ошибок нет Есть вот такая запись: Warning: DAGGEN_0523: The source is compiled without the -dbg switch. Line breakpoints and assertion debug will not be available.
|
|
|
|
|
May 14 2018, 12:26
|

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

|
Цитата(Flip-fl0p @ May 14 2018, 15:07)  А Вы попробуйте мои файлы просимулировать. Принципиальное отличие это то, что у меня другие имена, и они не являются расширенными. А вдруг поможет ? Первая скомпилилась и отработала как надо Во второй выдала ошибку # Error: COMP96_0115: REG30.vhd : (31, 20): Actual is not a globally static expression. на строчку D => D or iq(3),
|
|
|
|
|
May 14 2018, 16:01
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
Цитата(Flip-fl0p @ May 14 2018, 18:30)  ActiveHDL глючная фигня. Нельзя не согласиться. Особенно после больших апдейтов. Поэтому попробовать другой софт или даже другую версию альдека - вполне рабочий вариант.
|
|
|
|
|
May 15 2018, 10:32
|

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

|
Цитата(KalashKS @ May 15 2018, 11:54)  Вспомнил, что аналогичную проблему встречал в Riviera-PRO того же альдека. Сунул туда ваш код и получил один в один ваш результат. Как это побеждать, не придумал. Поэтому настоятельно рекомендую попробовать сменить хотя бы версию Active-HDL. У меня наиболее стабильно работали 9.3 и 10.3. 9.1 - точно глючная, хотя не помню, в каких местах, 10.4 по слухам тоже не очень, 10.1 ваш код съела без проблем до 10.5 руки не дошли. Так у меня 10.1. а не подскажите, где можно апдейты качнуть, если знаете?
|
|
|
|
|
May 15 2018, 10:41
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
Цитата(призрак @ May 15 2018, 13:32)  Так у меня 10.1. а не подскажите, где можно апдейты качнуть, если знаете? На местном FTP можно поискать. А по поводу версий у меня есть гипотеза, что могут быть проблемы с лицензией, но я ее не проверял.
|
|
|
|
|
May 21 2018, 12:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(призрак @ May 21 2018, 15:34)  Пишет #Compile of DFF.vhd failed with 1 errors. Там должно быть кое-что ещё быть написано. Ну каков глубокий смысл показывать код в виде скриншота? Просто копировать текст уже не модно? Цитата(призрак @ May 21 2018, 15:34)  А нет какого-нибудь руководства по ModelSim? Вся документация в дистрибутиве. Есть также специальный пункт в меню.
|
|
|
|
|
May 21 2018, 13:04
|

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

|
Код Пишет #Compile of DFF.vhd failed with 1 errors. Очень жаль, что Вы читаете поверхностно. Зачем же тогда на форуме вопросы задавать ? Я же говорил, что имя DFF запрещено ! Код Warning (12018): Entity "DFF" will be ignored because it conflicts with Quartus II primitive name Error (12007): Top-level design entity "DFF" is undefined
|
|
|
|
|
May 22 2018, 06:24
|

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

|
Цитата(Flip-fl0p @ May 21 2018, 16:04)  Код Пишет #Compile of DFF.vhd failed with 1 errors. Очень жаль, что Вы читаете поверхностно. Зачем же тогда на форуме вопросы задавать ? Я же говорил, что имя DFF запрещено ! Код Warning (12018): Entity "DFF" will be ignored because it conflicts with Quartus II primitive name Error (12007): Top-level design entity "DFF" is undefined Нет, там всё заработало, на имя не ругается, ошибка оказалась -вместо ; поставил : слишком мелкий шрифт и не сразу заметил. Просто для первичного ознакомления пользуюсь http://we.easyelectronics.ru/plis/modelsim...ego-nachat.html а когда стал работать с ModelSim SE-64 10.5 то столкнулся с тем что не совпадают менюшки и тулбоксы, никак не мог начать создание тестбенча. Что-то нашёл методом тыка, но не до конца. А по поводу встроенной справки - у меня раб.место без доступа к инету, соответственно ограниченно работает, HTML-справка работает, но там не всё просто. В этом ActiveHDL более прозрачен в управлении.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|