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

    

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

День добрый всем.

Не пинайте сразу, только начал освоение VHDL, а спросить не у кого.

Работаю в Active HDL 10.2.

 

Проблема такая : создал компонент - синхронный счетверённый Д-триггер с общим клоком, всё компилируется и работает.

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

В чём может быть ошибка? вроде же создают многокомпонентные схемы? или надо другой проект создавать и в него добавлять компонент?

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


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

Телепаты уже в летних отпусках. Покажите код.

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


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

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

 

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

 

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

 

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

3REG.vhd.pdf

3REG_SCH.pdf

post-23439-1525783409_thumb.jpg

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


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

Приветствую!

 

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

 

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

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

 

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

 

Удачи! Rob.

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


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

 

 

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

 

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

 

Удачи! Rob.

 

Ресет отключен пока в процессе отладки, по логике схема должна работать примерно так:

с 1 тактом первый триггер принимает состояние 1

со 2 тактом - второй 1, первый ноль, и т.д.

бегающая единичка

 

Ресет отключен пока в процессе отладки, по логике схема должна работать примерно так:

с 1 тактом первый триггер принимает состояние 1

со 2 тактом - второй 1, первый ноль, и т.д.

бегающая единичка

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

post-23439-1525785002_thumb.jpg

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


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

Приветствую!

Ресет отключен пока в процессе отладки, по логике схема должна работать примерно так:

...

Это понятно что по логику - но по факту я вижу схему которая может работать (в симе) как минимум 17-ю разными вариантами в зависимости от того как изначально инициализируются регистры.

Один из этих вариантов Вы и видите.

 

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

 

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

 

Удачи! Rob.

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


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

Это понятно что по логику - но по факту я вижу схему которая может работать (в симе) как минимум 17-ю разными вариантами в зависимости от того как изначально инициализируются регистры.

Один из этих вариантов Вы и видите.

 

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

 

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

 

Удачи! Rob.

 

Простой триггер:

if ( RS='1') then

FF <= '0' ;

elsif ( CLK'event and CLK = '1' ) then

FF <= D after 1 ns ;

end if;

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


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

if ( RS='1') then

FF <= '0' ;

elsif ( CLK'event and CLK = '1' ) then

FF <= D after 1 ns ;

end if;

Во-первых

after 1 ns;

не синтезируется.

Во-вторых у вас триггер никак не инициализирован.

Либо вручную при объявлении сигнала (или порта) присвойте начальное значение, либо сначала сбрасывайте триггер. Хотя это Вам говорили. Что Вы ещё хотите услышать я не знаю.

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


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

Примерно понял.

Но, в примерах триггера не делают предварительную установку значения, и всё работает..

И получается что сигнал сброса, генерируемый в начале тестирования, не устанавливает в ноль, а надо делать заранее установку?

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


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

Приветстувую!

Примерно понял.

Но, в примерах триггера не делают предварительную установку значения, и всё работает..

И получается что сигнал сброса, генерируемый в начале тестирования, не устанавливает в ноль, а надо делать заранее установку?

Это значит что у Вас что то не так либо с сигналом сброса либо с описанием триггера.

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

 

Удачи! Rob.

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


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

Но, в примерах триггера не делают предварительную установку значения, и всё работает..

Потому-что многим триггерам предварительная установка не требуется.

Например есть выход 8-разрядного регистра data_out. И есть сигнал валидности этих данных data_valid.

Так вот начальная установка регистра data_out не требуется. А вот сигнал валидности data_valid желательно как-либо установить в начальное значение. Либо путем начального сброса, либо начальной установкой схемы.

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

 

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

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


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

Хорошо, но в данном случае что надо первоначально обнулять? D0...3? Q0...3? FF0...3?

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


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

Приветствую!

 

Хорошо, но в данном случае что надо первоначально обнулять? D0...3? Q0...3? FF0...3?

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

 

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

Просимулируйте один триггер - выведите на диаграмму все сигналы из с него (или изнутри 4DF) и посмотрите что и как.

 

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

 

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

 

Удачи! Rob.

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


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

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

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


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

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

image.jpg

 

 

Приветствую!

 

 

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

 

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

Просимулируйте один триггер - выведите на диаграмму все сигналы из с него (или изнутри 4DF) и посмотрите что и как.

 

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

 

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

 

Удачи! Rob.

 

image.jpg

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

 

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

 

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

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


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

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

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

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

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

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

Войти

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

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