Страница 1 из 1
VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 17:29:56
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?
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 18:03:09
SII
Внутри процессов, насколько помню, это будет последовательная обработка, вне процессов -- параллельная (там каждый оператор является параллельным по сути).
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 18:12:07
uldemir
process как раз и означает параллельную обработку.
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 18:15:39
Ra
И все же, каков ответ?
Вне процессов, как я понял, суть та же что и внутри процесса, просто альтернативная форма записи.
Но в данном случае, как это будет функционировать, расскажите?
Во втором случае, синтезируется ли ожидаемая схема где сначала вычислится новое значение А, потом вычислится значение для D с использованием новго значения А?
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 18:21:22
uldemir
Я так понял, что этот вариант и вызывает интерес...
Ra писал(а):A<=B+C;
D<=A+E;
Сигналу D присвоится значение A+E, при этом значение A будет равно не тому, что получилось в предыдущей строчке, а то, которое было присвоено в предыдущем цикле. Вы это хотели услышать?
альтернативно: вне процесса D<=A+E эквивалентно D<=B+C+E, внутри - нет!
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 18:24:37
Ra
uldemir, огромное спасибо, именно это и хотел.
Ну в смысле, рад бы был услышать что синтезатор сам сгенерит последовательную схему, но увы)
То есть, необходимо самому разделить эти вычисления, вычисляя A по фронту, а D по спаду, допустим, так?
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 18:34:21
Ra
>вне процесса D<=A+E эквивалентно D<=B+C+E, внутри - нет!
Меня скорее интересует такой вариант как
A<=A+B*C;
Умножение с накоплением. Это валидная запись?
То есть если я по фронту клока выполняю такую вот операцию A<=A+B*C; я в итоге получу умножитель-с-накопителем?
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 18:35:57
uldemir
Ну, что насинтезит синтезатор... это зависит от синтезатора. Я, к сожалению, не эксперт в языке VHDL в общем случае, а только в конкретном применении для CPLD Xilinx, а это накладывает еще дополнительные ограничения на синтезируемость определенных конструкций, которые я стараюсь не переходить и ими не увлекаюсь. Может кто умнее подскажет.
Если надо разграничить, можно сделать два процесса по rising_egde и по falling_edge (хотя я точно знаю, что для тех кристаллов которые я использую - синтезатор меня пошлёт куда подальше. Хотя Orcad-овский наверняка такое насинтезировать и с'ъэмулировать сможет).
Умножение с накоплением. Это валидная запись?
Да.
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 18:38:00
Ra
Что ж, спасибо, буду дальше эксперементировать.
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 19:03:59
Meteor
Не самое лучшее генерить по обоим фронтам. Не синтезируют синхронные триггеры работающие как по переднему так и по заднему фронтам, даже в рамках разных функционалов. Можно попытаться "обмануть" за счет применения прямого и инверсного клока, но это тоже неправильно.
Re: VHDL: последовательное или параллельное выполнение?
Добавлено: Пт окт 29, 2010 19:13:31
Ra
Meteor
Ну я сейчас проверил код в железе, где по переднему фронту выполняется одно действие, по заднему другое - заработало.
А про сдвинутые на 180 градусов клоки я в книге прочитал, вроде бы так советовали - почему это неправильно?
Upd:
В принципе, послушал умных людей, начал более менее вникать. Как я понял, вместо этих извращений реализуется (при необходимости такого разделения состояний) конечный автомат, и, если скорость его работы позволяет, поднимается тактовая частота.