Verilog конфликт драйвера

Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ответить
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

Verilog конфликт драйвера

Сообщение WolfTheGrey »

Давайте поставим жирную точку в вопросе конфликтов, а именно как мыслить в момент написания Verilog кода.

допустим имеем
1_пин входная частота 1с
2 - 5 пин кнопки.
Все эти модули изменяют число в одной переменной
reg summa

Вот на вскидку быстро набыдлокодил:

Код: Выделить всё


module summator (
input clock,
input button1, //+
input button2, //-
input button3, //<<
input button4, //>>
input button5, //

output reg[7:0] summa
);

always @(negedge button1 or posedge clock)
    begin
       summa = summa + 1;
    end

always @(negedge button2)
    begin
       summa = summa - 1;
    end

always @(negedge button3)
    begin
       summa = summa << 1;
    end

always @(negedge button4)
    begin
       summa = summa >> 1;
    end
endmodule
Morroc
Друг Кота
Сообщения: 19494
Зарегистрирован: Чт фев 20, 2014 18:57:55

Re: Verilog конфликт драйвера

Сообщение Morroc »

тоже с таким столкнулся, даже пытал FPGA кодера по этому поводу, но видать они мыслят как то по FPGA'шному, потому что объяснение до меня дошло не полностью :)

примерно так... если не писать таким образом, что в один момент времени возможно (именно возможно, а не обязательно произойдет) изменение состояния одного и того же регистра по разным always @ - этой ошибки нет, я бы один always на клок написал, а в нем все кнопки по if ... else - это не эквивалент вашего кода, но кнопки обрабатывать будет

сейчас попробую откопать ответ FPGA'шника... упс, сейчас перечитал - кажется мы там друг друга не поняли просто :)

вот тут более менее понятно вроде

http://stackoverflow.com/questions/21061596/error-10028-cant-resolve-multiple-constant-drivers-for-net-vhdl-error
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Verilog конфликт драйвера

Сообщение Meteor »

Не силен в верилоге, но насколько понимаю у вас напутанно с обработкой и на каждое действие делается свой алвайс.
Сделайте иначе: тактируйте алвайс от одной частоты, а внутри этого алвайса уже смотрите если кнопка нажата - инкрементируйте/декрементируйте счетчик.
Если нужно отработать именно фронты кнопок, то заведите несколько регистров, которые будут в алвайсе сдвигаться, и в последующем выявляться пары "01" для переднего фронта или "10" для заднего.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

Re: Verilog конфликт драйвера

Сообщение WolfTheGrey »

тактируйте алвайс от одной частоты

Так нельзя! Суть не в кнопках, код кнопок приведен всего лишь как упрощеный пример. Суть вопроса в конфликте драйверов. Как правильно думать при написания кода.
Вот более сложная задача:
этап 1 - записать звук с АЦП wm8731 в SDRAM
этап2 - воспроизвести звук из SDRAM в ЦАП wm8731.

Уже 5 клоков насчитал с куево тучей независимых алвайс блоков. Как такое пишется?
И это еще не самая сложная затача, реализация цифрового фильтра с передискретизацией- ваще вырви мозг и положи под подушку. Допустим частота семплирования 48кГц. НАдо записать 6 точек, и по теореме Котельникова перерасчитать форму сигнала на 18 точек. (192 кГц)
Аватара пользователя
bfgroup
Родился
Сообщения: 10
Зарегистрирован: Чт ноя 17, 2011 11:06:55
Откуда: Novosibirsk

Re: Verilog конфликт драйвера

Сообщение bfgroup »

WolfTheGrey писал(а):Давайте поставим жирную точку в вопросе конфликтов, а именно как мыслить в момент написания Verilog кода.
Давайте поставим.

Объяснение на уровне дедовской схемотехники. Выходы цифровых схем НЕЛЬЗЯ соединять между собой напрямую!!! С одной схемы выход, допустим, логический 0, с другой логическая 1. При их соединении вы увидите дымок))

Объяснение на уровне FPGA-кодера. Я как и предыдущий комментатор совсем не силён в верилоге, но попробую объяснить в терминах vhdl. Каждому сигналу ставится в соответствие драйвер. Один единственный. В случае, если нам необходимо осуществлять многократное назначение одному и тому же сигналу мы должны использовать сигнал соответствующего типа. Данный сигнал называют "разрешаемымым", в vhdl это тип std_logic и для него задана соответствующая таблица разрешения.

Переводя вышесказанное для verilog-кодера можно резюмировать: мужики, юзайте тристейты или мультиплексоры (хотя mux'ы - это не множественное назначение сигналу, а множество сигналов).

Как-то так..
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

Re: Verilog конфликт драйвера

Сообщение WolfTheGrey »

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

module AND_4 (input wire а1, а2, а3, а4, output [8:0] register);
.......assign if((а1 == 1) || (а2 == 1) итд...) register = register + 1;
endmodule
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Verilog конфликт драйвера

Сообщение Meteor »

WolfTheGrey писал(а):ак нельзя! Суть не в кнопках, код кнопок приведен всего лишь как упрощеный пример. Суть вопроса в конфликте драйверов. Как правильно думать при написания кода.
Вот более сложная задача:
этап 1 - записать звук с АЦП wm8731 в SDRAM
этап2 - воспроизвести звук из SDRAM в ЦАП wm8731.

Уже 5 клоков насчитал с куево тучей независимых алвайс блоков. Как такое пишется?

Я описываю на vhdl, но сути не меняет.
Подход такой. Есть одна системная частота, например 200 МГц. Из нее формируются сигналы управления АЦП, управления процессами записи во внутреннюю/внешнюю память, она же используется для формирования таймерных меток при опросе кнопок, все сигналы требующие анализа фронтов проводятся через триггерные цепи тактированные этой системной частотой.
В вашем примере получилось так
процесс 1 - инкремент счетчика
процесс 2 - декремент счетчика
при этом реакция на кнопки по сути равноценна подачи нескольких тактовых импульсов.
Как правильно делать - я написал, одна переменная для счетчика и триггера для формирования разрешения счета.
bfgroup писал(а):юзайте тристейты или мультиплексоры

Внутри ПЛИС нет трехстабильных элементов, они только на выводах, внутри допускается только мультиплексор.
То есть если вдруг захотелось с нескольких счетчиков подавать сигналы на выход, то нужно использовать только мультиплексор, а после него, если надо то ставить трехстабильные элементы.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Morroc
Друг Кота
Сообщения: 19494
Зарегистрирован: Чт фев 20, 2014 18:57:55

Re: Verilog конфликт драйвера

Сообщение Morroc »

WolfTheGrey писал(а):Уже 5 клоков насчитал с куево тучей независимых алвайс блоков. Как такое пишется?


А так и пишется - автоматами, вводя стадии обработки, но обработчик один - оно вроде кажется коряво, но так и пишут - поверьте, есть ли другой способ не знаю, видел довольно длинные коды по обработке сигналов (те самые цифровые фильтры) и работе с ethernet - все было написано в таком духе.

вот кусочек

Код: Выделить всё

   always @(posedge clock)
   begin
      case (rstate)
         rWait:
         begin
            if (we)      // Wait until a new sample is written to memory
            begin
               rstate <= rAddr;
               counter <= NTAPS[ADDRBITS:0] + 1'd1;   // count samples and pipeline latency
               raddr <= waddr;      // read address -> newest sample
               caddr <= 1'd0;      // start at coefficient zero
               Raccum <= 1'd0;
               Iaccum <= 1'd0;
               Rmult <= 1'd0;
               Imult <= 1'd0;
            end
         end
         rAddr:   // prime the memory pipeline
         begin
            rstate <= rAddrA;
            next_addr;
         end
         rAddrA:
         begin
            rstate <= rAddrB;
            next_addr;
         end
         rAddrB:
         begin
            rstate <= rRun;
            next_addr;
         end
         rRun:
         begin      // main pipeline here
            next_addr;
            Rmult <= q_real * reg_coef;
            Imult <= q_imag * reg_coef;
            // Raccum <= Raccum + Rmult[MBITS*2-1 -: ABITS];
            // Iaccum <= Iaccum + Imult[MBITS*2-1 -: ABITS];
            // Correction by Phil, VK6APH, to remove DC spur
            Raccum <= Raccum + Rmult[MBITS*2-1 -: ABITS] + Rmult[MBITS*2-1-ABITS];
            Iaccum <= Iaccum + Imult[MBITS*2-1 -: ABITS] + Imult[MBITS*2-1-ABITS];
            counter <= counter - 1'd1;
            if (counter == 0)
               rstate <= rWait;
         end
      endcase
   end
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
misyachniy
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт июл 02, 2013 09:17:49

Re: Verilog конфликт драйвера

Сообщение misyachniy »

Не знаю, поставлена ли жирная точка, по этому вставлю свои 5 копеек.

Топик стартер поставил регистр "summa" в позу буриданова осла только "травы" в 4 раза больше.

Все always синтезатор рассматривает параллельно, а не последовательно как компилятор С.
В результате 4 воздействия пытаются присвоить выходному регистру "summa" 4 разных значения.

Программист должен решить этот конфликт - раздать приоритеты.
То есть внести все воздействия под один always.
А затем расставить воздействия в порядке приоритетов операторами if/else if
Это тоже не выход, так как создаются условия для "гонки" импульсов.
Взявший Паяльник
Родился
Сообщения: 5
Зарегистрирован: Вт ноя 17, 2015 16:28:59

Re: Verilog конфликт драйвера

Сообщение Взявший Паяльник »

кто нибудь научите verilog сам пытался не разобрался :cry:
misyachniy
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт июл 02, 2013 09:17:49

Re: Verilog конфликт драйвера

Сообщение misyachniy »

Взявший Паяльник писал(а):кто нибудь научите verilog сам пытался не разобрался :cry:


Что, есть для изучения кроме желания?
Взявший Паяльник
Родился
Сообщения: 5
Зарегистрирован: Вт ноя 17, 2015 16:28:59

Re: Verilog конфликт драйвера

Сообщение Взявший Паяльник »

интернет ,но ничего путнего нет. :dont_know: думал здесь кто подскажет
misyachniy
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт июл 02, 2013 09:17:49

Re: Verilog конфликт драйвера

Сообщение misyachniy »

Взявший Паяльник писал(а):интернет ,но ничего путнего нет. :dont_know: думал здесь кто подскажет


Кроме интернета нужна конкретная задача.
Или хотя-бы платка с программатором.

А то получится "сферический конь в вакууме".
Взявший Паяльник
Родился
Сообщения: 5
Зарегистрирован: Вт ноя 17, 2015 16:28:59

Re: Verilog конфликт драйвера

Сообщение Взявший Паяльник »

JTAG ПОДОЙДЕТ ТАКОЙ
Вложения
GHJUHFVVFNJH GKBCRB.png
(16.8 КБ) 388 скачиваний
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Verilog конфликт драйвера

Сообщение Meteor »

Вы откуда взяли эту схему?
С JTAG программатором лучше не спешить, а в начале определиться с производителем. Это может быть Altera, может Xilinx а может и Lattice. Когда разберетесь с тем как описывать аппаратуру, научитесь проводить функциональное моделирование, тогда уже купите себе плату с ПЛИС выбранного производителя, и в зависимости от насыщенности, либо докупите программатор, либо будете довольствоваться имеющимся на самой плате.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Morroc
Друг Кота
Сообщения: 19494
Зарегистрирован: Чт фев 20, 2014 18:57:55

Re: Verilog конфликт драйвера

Сообщение Morroc »

А я с конца начал - взял рабочий девайс, исходники, заказал у китайцев программатор и давай мигать светодиодами. Что понравилось - все мои мигания светодиодами и эксперименты с реализацией SPI интерфейса никак не влияли собственно на работу девайса (SDR приемник), ну т.е. даже при грубых косяках - все ведь параллельно работает.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Verilog конфликт драйвера

Сообщение Meteor »

Хотелки приходят во время еды развития навыков. Можно начать с конца, я тоже сперва купил плис, затем программатор, затем учил ЯОА и уже в конце освоил моделирование.
Так что совет данный выше - сын ошибок трудных и парадоксов друг.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Pe3ucTop
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пт ноя 16, 2007 13:52:44
Откуда: Рига, Латвия

Re: Verilog конфликт драйвера

Сообщение Pe3ucTop »

Собственно по теме, вставлю и свои пять копеек :
Подход в ПЛИС не такой как в МК, и соответственно все описания стремятся к одновременному выполнению.
То есть и подходить надо с пониманием что все кнопки могут быть нажаты разом :) и как же тогда реагировать всем действиям ??
Ответ - Никак !
Тобишь реакция (always) - должна быть по максимальной частоте (clk), ну и сбросу (rst) , остальные все входные рассматриваем как стационарные (стабильные) значения в данный момент времени.
Если же надо реагировать на фронты, то как уже здесь писалось, берём предъидущие стационарные значения и сравниваем с текущими, в случае наиденных изменений - производим действия, но опять таки рассматриваем совокупность изменений, т.к. все могут произойти разом. Ну и сами выбираем приоритеты.

По вопросу если много входных частот - Надо прибегать к понятии синхронизации - т.е. или математически соотносить частоты и по параметрам выявлять - когда оба значения стационарны , или с помощью регистров стопить значения. И обрабатывать базируясь на четкие стабильные сигналы(значения).

По поводу где почитать - я уважаю ресурс marsohod.org ресурс на русском... там много затронуто по поводу сопоставления частот.
misyachniy
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт июл 02, 2013 09:17:49

Re: Verilog конфликт драйвера

Сообщение misyachniy »

Pe3ucTop писал(а):Подход в ПЛИС не такой как в МК, и соответственно все описания стремятся к одновременному выполнению.
То есть и подходить надо с пониманием что все кнопки могут быть нажаты разом :) и как же тогда реагировать всем действиям ??
Ответ - Никак !
...


Слово "одновременному выполнению" не подходит - лучше "Все описания рассматриваются параллельно."

Если все кнопки нажаты "одновременно" - можно использовать приоритетный шифратор.
Ответить

Вернуться в «ПЛИС»