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

Не работает схема верхнего уровня

День добрый всем.
Не пинайте сразу, только начал освоение VHDL, а спросить не у кого.
Работаю в Active HDL 10.2.

Проблема такая : создал компонент - синхронный счетверённый Д-триггер с общим клоком, всё компилируется и работает.
Создаю в том же проекте другой компонент - в основе тот-же 4-Д-триггер с обвеской простой логикой - всё компилится, но при симуляции - неопределённое состояние выходов, т.е. не работает.
В чём может быть ошибка? вроде же создают многокомпонентные схемы? или надо другой проект создавать и в него добавлять компонент?

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


Ссылка на сообщение
Поделиться на другие сайты
Телепаты уже в летних отпусках. Покажите код.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(andrew_b @ May 8 2018, 15:16) <{POST_SNAPBACK}>
Телепаты уже в летних отпусках. Покажите код.

Да там особо нет текста

Вот ещё схема для понимания

Цитата(призрак @ May 8 2018, 15:37) <{POST_SNAPBACK}>
Да там особо нет текста

Вот циклограмма

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


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

Цитата(призрак @ May 8 2018, 15:43) <{POST_SNAPBACK}>
Да там особо нет текста

Вот ещё схема для понимания

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

По умолчанию все регистры при старте симуляции ставятся в U состояние (в отличии от реального железа) - это помогает при разработку отслеживать некорректную инициализацию дизайна.

Удачи! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(RobFPGA @ May 8 2018, 15:51) <{POST_SNAPBACK}>
Приветствую!


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

По умолчанию все регистры при старте симуляции ставятся в U состояние (в отличии от реального железа) - это помогает при разработку отслеживать некорректную инициализацию дизайна.

Удачи! Rob.


Ресет отключен пока в процессе отладки, по логике схема должна работать примерно так:
с 1 тактом первый триггер принимает состояние 1
со 2 тактом - второй 1, первый ноль, и т.д.
бегающая единичка

Цитата(призрак @ May 8 2018, 15:55) <{POST_SNAPBACK}>
Ресет отключен пока в процессе отладки, по логике схема должна работать примерно так:
с 1 тактом первый триггер принимает состояние 1
со 2 тактом - второй 1, первый ноль, и т.д.
бегающая единичка

Добавил сброс вместо земли - не поменялось

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


Ссылка на сообщение
Поделиться на другие сайты
Приветствую!
Цитата(призрак @ May 8 2018, 15:55) <{POST_SNAPBACK}>
Ресет отключен пока в процессе отладки, по логике схема должна работать примерно так:
...
Это понятно что по логику - но по факту я вижу схему которая может работать (в симе) как минимум 17-ю разными вариантами в зависимости от того как изначально инициализируются регистры.
Один из этих вариантов Вы и видите.

Не надейтесь на удачу (даже наоборот - ожидайте неприятностей) - и делайте так чтобы всегда быть уверенным в контроле состояния дизайна.

P.S. Какой тощий сброс sad.gif аш жалко. На тригграх ресет какой ? асинхронный или синхронный?

Удачи! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(RobFPGA @ May 8 2018, 16:13) <{POST_SNAPBACK}>
Приветствую!
Это понятно что по логику - но по факту я вижу схему которая может работать (в симе) как минимум 17-ю разными вариантами в зависимости от того как изначально инициализируются регистры.
Один из этих вариантов Вы и видите.

Не надейтесь на удачу (даже наоборот - ожидайте неприятностей) - и делайте так чтобы всегда быть уверенным в контроле состояния дизайна.

P.S. Какой тощий сброс sad.gif аш жалко. На тригграх ресет какой ? асинхронный или синхронный?

Удачи! Rob.


Простой триггер:
if ( RS='1') then
FF <= '0' ;
elsif ( CLK'event and CLK = '1' ) then
FF <= D after 1 ns ;
end if;

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(призрак @ May 8 2018, 16:21) <{POST_SNAPBACK}>
Простой триггер:
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, 09:22) <{POST_SNAPBACK}>
Примерно понял.
Но, в примерах триггера не делают предварительную установку значения, и всё работает..
И получается что сигнал сброса, генерируемый в начале тестирования, не устанавливает в ноль, а надо делать заранее установку?

Это значит что у Вас что то не так либо с сигналом сброса либо с описанием триггера.
Попробуйте сделать сброс шириной в пару тактов CLK, Ну и описание триггера целиком покажите.

Удачи! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(призрак @ May 10 2018, 09:22) <{POST_SNAPBACK}>
Примерно понял.
Но, в примерах триггера не делают предварительную установку значения, и всё работает..

Потому-что многим триггерам предварительная установка не требуется.
Например есть выход 8-разрядного регистра data_out. И есть сигнал валидности этих данных data_valid.
Так вот начальная установка регистра data_out не требуется. А вот сигнал валидности data_valid желательно как-либо установить в начальное значение. Либо путем начального сброса, либо начальной установкой схемы.
Более того не все FPGA поддерживают возможность начальной установки значения, на сколько я помню FPGA фирмы Actel не умеют инициализировать триггеры каким-то значением. А некоторые FPGA могут затребовать дополнительных ресурсов для начальной установки значения. Например в чипах Altera cyclone C5SEMA5F31C6 установка начального значения триггера в нули - ресурсов не требует. А вот установка в единицы - требует дополнительный слой логики, что может иметь значение на проектах, критичных к максимальным частотам.

Цитата
И получается что сигнал сброса, генерируемый в начале тестирования, не устанавливает в ноль, а надо делать заранее установку?
Не так. Правильно сделанный сброс - устанавливает значение триггера в то значение, в которое Вы его сбрасываете. Ключевая фраза - правильно сделанный сброс. А как делать правильно - зависит от проекта. У меня обычно присутствует начальный сброс.

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


Ссылка на сообщение
Поделиться на другие сайты
Хорошо, но в данном случае что надо первоначально обнулять? D0...3? Q0...3? FF0...3?

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


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

Цитата(призрак @ May 10 2018, 11:26) <{POST_SNAPBACK}>
Хорошо, но в данном случае что надо первоначально обнулять? D0...3? Q0...3? FF0...3?

Ресетить всегда нужно источник сигнала. Что является источником в Вашей схеме? - выход триггеров.

Еще раз повторю - если при подачи на вход сброса RS Ваш триггер не сбрасывается - это значит что что то не так и дальнейшие гадания ни к чему не приведут. Надо для начала разобраться с одним триггером - почему он не сбрасывается?
Просимулируйте один триггер - выведите на диаграмму все сигналы из с него (или изнутри 4DF) и посмотрите что и как.

Судя по куску кода триггера он асинхронный - может Вы не добавили RS в список чувствительности процесса?

P.S. Ну и когда с триггером разберетесь - ресет дизайна нужно делать так чтобы всегда приводить схему в нужное состояние - в Вашей схеме это не так - от ширины импульса на входе RST будет зависть что запишется в регистр и соответственно бегущую единицу Вы получите не всегда.

Удачи! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(призрак @ May 10 2018, 11:26) <{POST_SNAPBACK}>
Хорошо, но в данном случае что надо первоначально обнулять? D0...3? Q0...3? FF0...3?

У вас внутренние состояния регистров U - т.е. неопределены, и из-за того, что на первый из регистров подается выход последнего прооренный со входным сигналом, это самое неопределенное состояние так и будет бесконечно на выходе каждого из регистров. Выше вам уже правильно посоветовали либо задать изначальные состояния этих самых регистров, либо устанавливать их по сбросу.

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


Ссылка на сообщение
Поделиться на другие сайты
И вопрос остался - надо делать отдельный проект для каждого уровня или в одном можно, сейчас вот так



Цитата(RobFPGA @ May 10 2018, 11:50) <{POST_SNAPBACK}>
Приветствую!


Ресетить всегда нужно источник сигнала. Что является источником в Вашей схеме? - выход триггеров.

Еще раз повторю - если при подачи на вход сброса RS Ваш триггер не сбрасывается - это значит что что то не так и дальнейшие гадания ни к чему не приведут. Надо для начала разобраться с одним триггером - почему он не сбрасывается?
Просимулируйте один триггер - выведите на диаграмму все сигналы из с него (или изнутри 4DF) и посмотрите что и как.

Судя по куску кода триггера он асинхронный - может Вы не добавили RS в список чувствительности процесса?

P.S. Ну и когда с триггером разберетесь - ресет дизайна нужно делать так чтобы всегда приводить схему в нужное состояние - в Вашей схеме это не так - от ширины импульса на входе RST будет зависть что запишется в регистр и соответственно бегущую единицу Вы получите не всегда.

Удачи! Rob.



Вот симуляция триггера - всё работает

Цитата(Tausinov @ May 10 2018, 11:51) <{POST_SNAPBACK}>
У вас внутренние состояния регистров U - т.е. неопределены, и из-за того, что на первый из регистров подается выход последнего прооренный со входным сигналом, это самое неопределенное состояние так и будет бесконечно на выходе каждого из регистров. Выше вам уже правильно посоветовали либо задать изначальные состояния этих самых регистров, либо устанавливать их по сбросу.


То есть если на элемент ИЛИ на один вход подаётся 1 а другой - неопределённый - логика не сработает?

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация