Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AHDL. Непонятное поведение output сигнала.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Grenka
Добрый день,

я столкнулся с такой проблемой. Разработал в Quartus II state machine (конечный автомат). Провёл Vector wafeform Simulation. Всё работает правильно, т.е. переход от состояния к состоянию согласно плану и выходные сигналы соответствуют состояниям. Создаю Symbol File для использощания автомата в другом проекте. Делаю графический дизайн с этим символом. И в Vector wafeform Simulation для графического дизайна замечаю, что один из выходных сигналов ведущих от автомата к другому элементу не изменяется как надо. Хотя все остальные сигналы и состояния автомата меняются правильно.
Посоветуйте, пожалуйста, что это могло бы быть. help.gif 1111493779.gif
CaPpuCcino
код проекта - в студию. (скорее всего при синтезе происходит упрощение)
ЗЫ: слезали бы вы с АХДЛя. это рудимент, скоро отсохнет и совсем отвалится.
Kuzmi4
2 Grenka - похожая фигня как раз недавно у меня была - квартус соптимизировал как мог и в результате получил каку.
Хотя отдельно компонент когда проверял - идеальная диаграммка получалась.
Подход там поменять пришлось, чтоб заработало корректно..
smile.gif
Grenka
@CaPpuCcino, @Kuzmi4 огромное спасибо. a14.gif Хорошо знать, что такая хрень произошла не только со мной и имеет конкретную причину. А то я пол дня убил на то что бы найти ошибку в коде, и всё без результатно. wacko.gif
Цитата(Kuzmi4 @ Jul 21 2008, 17:25) *
2 Grenka - похожая фигня как раз недавно у меня была - квартус соптимизировал как мог и в результате получил каку.
Хотя отдельно компонент когда проверял - идеальная диаграммка получалась.
Подход там поменять пришлось, чтоб заработало корректно..
smile.gif


Подход поменять? При компилировании или при написании? А можно эту оптимизацию отключить нафиг?

Цитата(CaPpuCcino @ Jul 20 2008, 23:46) *
код проекта - в студию. (скорее всего при синтезе происходит упрощение)


SUBDESIGN stateMachineIEEE1284

(

Clk, HostClk, HostAck, nReverseRequest, Zaehler0 : INPUT;

EnableADC, EnableDAC, ErrorS, Multipl, nAckReverse : OUTPUT;

PeriphAck, PeriphClk, ZaehlerReset, ZaehlerZaehlen : OUTPUT;

%Data[7..0] : BIDIR;%

)



VARIABLE

stateMachine : MACHINE

OF BITS (EnableADC, EnableDAC, ErrorS, Multipl, nAckReverse, PeriphAck, PeriphClk, ZaehlerReset, ZaehlerZaehlen)

WITH STATES (

Q0 = B"000110110",

Q1 = B"010111101",

Q2 = B"000110110",

Q3 = B"100001110",

Q4 = B"000001001",

Q5 = B"000001110",

Q6 = B"000001101",

Q7 = B"000001110",

Q8 = B"001100010");

BEGIN

stateMachine.clk=Clk;



CASE stateMachine IS

WHEN Q0 =>

% Из Q0 в Q1. PC - передатчик. Он сигнализирует, что данные выставлвны.%

IF (nReverseRequest & !HostClk & HostAck) THEN

stateMachine = Q1;

END IF;



% Из Q0 в Q3. PC запрашивает данные.%

IF (!nReverseRequest & !HostAck) THEN

stateMachine = Q3;

END IF;



% Q1 Запуск счётчика.%

WHEN Q1 =>

% Из Q1 в Q2. Если счётчик не досчитал и PC считает, что данные переданы.%

IF (HostClk & HostAck & !Zaehler0) THEN

stateMachine = Q2;

END IF;



% Из Q1 в Q8. Счётчик досчитал до нуля и PC не ответил.%

IF (Zaehler0) THEN

stateMachine = Q8;

END IF;



WHEN Q2 =>

% Из Q2 в Q0. Передача PC к устойству закончена.%

IF (1) THEN

stateMachine = Q0;

END IF;



%Q3 посылаем сигнал к ADC%

WHEN Q3 =>

% Из Q3 в Q4. Если PC ещё в режиме приёма (!nReverseRequest).%

IF (!nReverseRequest) THEN

stateMachine = Q4;

END IF;



%Данные от ADC получены. Запуск счётчика.%

WHEN Q4 =>

% Из Q4 в Q5. Если счётчик не досчитал и PC подтверждает приём.%

IF (!nReverseRequest & HostAck & !Zaehler0) THEN

stateMachine = Q5;

END IF;



% Из Q4 в Q8. Счётчик досчитал до нуля и PC не ответил.%

IF (Zaehler0) THEN

stateMachine = Q8;

END IF;



% Q5 - вспомогательное состояние, для перезапуска счётчика.%

WHEN Q5 =>

% Из Q5 в Q6. Если PC ещё в режиме приёма (!nReverseRequest).%

IF (!nReverseRequest) THEN

stateMachine = Q6;

END IF;



%Устройство считает, что данные были переданы, снимает сигнал PeriphClk и запускает счётчик.%

WHEN Q6 =>

% Из Q6 в Q7. Счётчик не досчитал до нуля и PC сообщает о готовности принять новые данные.%

IF (!HostAck & !Zaehler0) THEN

stateMachine = Q7;

END IF;



% Из Q6 в Q8. Счётчик досчитал до нуля и PC не ответил.%

IF (Zaehler0) THEN

stateMachine = Q8;

END IF;



WHEN Q7 =>

% Из Q7 в Q0. Передача от устройства к PC закончена.%

IF (nReverseRequest) THEN

stateMachine = Q0;

END IF;



WHEN Q8 =>

% Из Q8 в Q0.%

IF (!nReverseRequest) THEN

stateMachine = Q0;

END IF;

% WHEN OTHERS =>

__statement;

__statement; %

END CASE;





END;

Хорошего всем времени суток. smile3046.gif

Ах да забыл написать. Глючит Выходной сигнал Multipl. Графический дизайн был прицеплен к сообщению открывающему тему.
EvgenyNik
У Вас сигналы Multipl, nAckReverse принимают почти во всех стадиях (кроме Q8) одинаковое значение.
Вполне возможно, что проанализировав переходы автомата с учётом внешних цепей, Quartus определил, что Q8 не наступит никогда. Тогда он просто избавился от дублирующего сигнала.
Я обычно тактирую управляющее устройство (в вашем случае - автомат) и периферию, если она должна подхватывать его состояния, со сдвигом фронта - инверсным clk, например. Может быть, потому у Вас сигнал, переводящий в Q8 и не видится автомату...
з.ы.: простенькая на пару цветов картинка в .bmp на 1.2МБ это солидно :-)
Kuzmi4
2 Grenka - при написании.
Чем больше прожект тем больше связей можно замуксить, соптимизировать - тут аккуратней надо.
На сколько я знаю убрать оптимизацию невозможно.
Квартус подгоняет под свои синхронные мерки..
CaPpuCcino
Цитата(Евгений Николаев @ Jul 22 2008, 17:10) *
Вполне возможно, что проанализировав переходы автомата с учётом внешних цепей, Quartus определил, что Q8 не наступит никогда.

тоже есть впечатление, что у вас где-то возникает логическая петля: вы уверены, что выход Null с элемента Zaehler вообще когда-либо меняет своё состояние(я просто не могу знать какое у него поведение, но присутствие сигнала сброса с отсутствующим сигналом установки, и всё это усугублено наличием разрешающего сигнала при отсутствующем тактирующем наводят на грустные мысли)? а ведь он единственный сигнал заставляющий переходить автомат в состояние Q8, где есть разница в состояниях выходов Multipl, nAckReverse
Grenka
Доброе время суток. Спасибо всем за ответы.

Цитата(CaPpuCcino @ Jul 22 2008, 18:38) *
вы уверены, что выход Null с элемента Zaehler вообще когда-либо меняет своё состояние

да уверен. наблюдал такое. При проведении Vector wafeform Simulation.
Цитата(CaPpuCcino @ Jul 22 2008, 18:38) *
я просто не могу знать какое у него поведение.
но присутствие сигнала сброса с отсутствующим сигналом установки, и всё это усугублено наличием разрешающего сигнала при отсутствующем тактирующем наводят на грустные мысли

Zaehler - это просто счётчик, который считает назад до нуля от определённого значения. Это начальное значение жёстко записано в счётчике и устанавливается при подаче сигнала "Reset". На рисунке просто криво получилось и не видно, что этот сигнал присоеденён к счётчику. Cчитает счётчик, толко когда подан сигнал "Enable". Такт (Clk) подан на все составные части схемы. При достижении нуля счётчик генерит 1 на выходе "Null". При его получении автомат stateMachine... переходит в состояние Q8.

логика автомата: state_maschine.jpg. заранее прошу прощения за язык используемый на картинке, но думаю логика понятна.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.