VHDL: последовательное или параллельное выполнение?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Добрый вечер.
Предположим есть код

process(CLK) begin
if rising_edge(CLK) then
--тут код
end if;
end process;

Вопрос такой, правильно ли я понял, что код вида
A<=B+C;
D<=E+F;
синтезируется в схему, выполняющую эти операции параллельно (то есть одновременно сигнал пойдет через два сумматора, первый будет складывать A+B, второй E+F) и A и D примерно одновременно получат новое значение, а код

A<=B+C;
D<=A+E;

Синтезируется в последовательную схему, где сначала суммируются B+C, потом к сумме прибавится E, и потом запишется в D?
Я прав? Или же во втором случае опять таки синтезируется параллельная схема и в D<=A+E; будет просто взято старое значение A?
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Внутри процессов, насколько помню, это будет последовательная обработка, вне процессов -- параллельная (там каждый оператор является параллельным по сути).
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7366
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

process как раз и означает параллельную обработку.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

И все же, каков ответ?
Вне процессов, как я понял, суть та же что и внутри процесса, просто альтернативная форма записи.

Но в данном случае, как это будет функционировать, расскажите?
Во втором случае, синтезируется ли ожидаемая схема где сначала вычислится новое значение А, потом вычислится значение для D с использованием новго значения А?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7366
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Я так понял, что этот вариант и вызывает интерес...
Ra писал(а):A<=B+C;
D<=A+E;
Сигналу D присвоится значение A+E, при этом значение A будет равно не тому, что получилось в предыдущей строчке, а то, которое было присвоено в предыдущем цикле. Вы это хотели услышать?

альтернативно: вне процесса D<=A+E эквивалентно D<=B+C+E, внутри - нет!
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

uldemir, огромное спасибо, именно это и хотел.
Ну в смысле, рад бы был услышать что синтезатор сам сгенерит последовательную схему, но увы)
То есть, необходимо самому разделить эти вычисления, вычисляя A по фронту, а D по спаду, допустим, так?
Реклама
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

>вне процесса D<=A+E эквивалентно D<=B+C+E, внутри - нет!

Меня скорее интересует такой вариант как
A<=A+B*C;
Умножение с накоплением. Это валидная запись?
То есть если я по фронту клока выполняю такую вот операцию A<=A+B*C; я в итоге получу умножитель-с-накопителем?
Друг Кота
Аватара пользователя
Сообщения: 7366
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Ну, что насинтезит синтезатор... это зависит от синтезатора. Я, к сожалению, не эксперт в языке VHDL в общем случае, а только в конкретном применении для CPLD Xilinx, а это накладывает еще дополнительные ограничения на синтезируемость определенных конструкций, которые я стараюсь не переходить и ими не увлекаюсь. Может кто умнее подскажет.
Если надо разграничить, можно сделать два процесса по rising_egde и по falling_edge (хотя я точно знаю, что для тех кристаллов которые я использую - синтезатор меня пошлёт куда подальше. Хотя Orcad-овский наверняка такое насинтезировать и с'ъэмулировать сможет).
Умножение с накоплением. Это валидная запись?
Да.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Что ж, спасибо, буду дальше эксперементировать.
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Не самое лучшее генерить по обоим фронтам. Не синтезируют синхронные триггеры работающие как по переднему так и по заднему фронтам, даже в рамках разных функционалов. Можно попытаться "обмануть" за счет применения прямого и инверсного клока, но это тоже неправильно.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Meteor
Ну я сейчас проверил код в железе, где по переднему фронту выполняется одно действие, по заднему другое - заработало.
А про сдвинутые на 180 градусов клоки я в книге прочитал, вроде бы так советовали - почему это неправильно?

Upd:
В принципе, послушал умных людей, начал более менее вникать. Как я понял, вместо этих извращений реализуется (при необходимости такого разделения состояний) конечный автомат, и, если скорость его работы позволяет, поднимается тактовая частота.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»