Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ответить

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

Сб окт 25, 2014 02:06:02

Давайте поставим жирную точку в вопросе конфликтов, а именно как мыслить в момент написания 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

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

Сб окт 25, 2014 10:51:04

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

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

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

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

http://stackoverflow.com/questions/21061596/error-10028-cant-resolve-multiple-constant-drivers-for-net-vhdl-error

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

Сб окт 25, 2014 13:55:41

Не силен в верилоге, но насколько понимаю у вас напутанно с обработкой и на каждое действие делается свой алвайс.
Сделайте иначе: тактируйте алвайс от одной частоты, а внутри этого алвайса уже смотрите если кнопка нажата - инкрементируйте/декрементируйте счетчик.
Если нужно отработать именно фронты кнопок, то заведите несколько регистров, которые будут в алвайсе сдвигаться, и в последующем выявляться пары "01" для переднего фронта или "10" для заднего.

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

Сб окт 25, 2014 14:32:17

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

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

Уже 5 клоков насчитал с куево тучей независимых алвайс блоков. Как такое пишется?
И это еще не самая сложная затача, реализация цифрового фильтра с передискретизацией- ваще вырви мозг и положи под подушку. Допустим частота семплирования 48кГц. НАдо записать 6 точек, и по теореме Котельникова перерасчитать форму сигнала на 18 точек. (192 кГц)

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

Сб окт 25, 2014 14:45:18

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

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

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

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

Как-то так..

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

Сб окт 25, 2014 15:19:13

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

module AND_4 (input wire а1, а2, а3, а4, output [8:0] register);
.......assign if((а1 == 1) || (а2 == 1) итд...) register = register + 1;
endmodule

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

Сб окт 25, 2014 16:13:19

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

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

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

Внутри ПЛИС нет трехстабильных элементов, они только на выводах, внутри допускается только мультиплексор.
То есть если вдруг захотелось с нескольких счетчиков подавать сигналы на выход, то нужно использовать только мультиплексор, а после него, если надо то ставить трехстабильные элементы.

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

Вс окт 26, 2014 11:32:32

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

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

Сб апр 18, 2015 15:11:54

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

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

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

Программист должен решить этот конфликт - раздать приоритеты.
То есть внести все воздействия под один always.
А затем расставить воздействия в порядке приоритетов операторами if/else if
Это тоже не выход, так как создаются условия для "гонки" импульсов.

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

Вт ноя 17, 2015 17:09:41

кто нибудь научите verilog сам пытался не разобрался :cry:

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

Вт ноя 17, 2015 19:55:29

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


Что, есть для изучения кроме желания?

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

Чт ноя 19, 2015 15:36:54

интернет ,но ничего путнего нет. :dont_know: думал здесь кто подскажет

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

Чт ноя 19, 2015 18:13:08

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


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

А то получится "сферический конь в вакууме".

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

Сб ноя 21, 2015 09:24:33

JTAG ПОДОЙДЕТ ТАКОЙ
Вложения
GHJUHFVVFNJH GKBCRB.png
(16.8 KiB) Скачиваний: 348

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

Вс ноя 22, 2015 11:55:19

Вы откуда взяли эту схему?
С JTAG программатором лучше не спешить, а в начале определиться с производителем. Это может быть Altera, может Xilinx а может и Lattice. Когда разберетесь с тем как описывать аппаратуру, научитесь проводить функциональное моделирование, тогда уже купите себе плату с ПЛИС выбранного производителя, и в зависимости от насыщенности, либо докупите программатор, либо будете довольствоваться имеющимся на самой плате.

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

Вс ноя 22, 2015 12:17:28

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

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

Вс ноя 22, 2015 12:23:53

Хотелки приходят во время еды развития навыков. Можно начать с конца, я тоже сперва купил плис, затем программатор, затем учил ЯОА и уже в конце освоил моделирование.
Так что совет данный выше - сын ошибок трудных и парадоксов друг.

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

Вт дек 22, 2015 02:04:45

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

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

По поводу где почитать - я уважаю ресурс marsohod.org ресурс на русском... там много затронуто по поводу сопоставления частот.

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

Вт дек 22, 2015 18:31:24

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


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

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