Страница 1 из 1
Verilog конфликт драйвера
Добавлено: Сб окт 25, 2014 02:06:02
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
Re: Verilog конфликт драйвера
Добавлено: Сб окт 25, 2014 10:51:04
Morroc
тоже с таким столкнулся, даже пытал FPGA кодера по этому поводу, но видать они мыслят как то по FPGA'шному, потому что объяснение до меня дошло не полностью
примерно так... если не писать таким образом, что в один момент времени возможно (именно возможно, а не обязательно произойдет) изменение состояния одного и того же регистра по разным always @ - этой ошибки нет, я бы один always на клок написал, а в нем все кнопки по if ... else - это не эквивалент вашего кода, но кнопки обрабатывать будет
сейчас попробую откопать ответ FPGA'шника... упс, сейчас перечитал - кажется мы там друг друга не поняли просто
вот тут более менее понятно вроде
http://stackoverflow.com/questions/2106 ... vhdl-error
Re: Verilog конфликт драйвера
Добавлено: Сб окт 25, 2014 13:55:41
Meteor
Не силен в верилоге, но насколько понимаю у вас напутанно с обработкой и на каждое действие делается свой алвайс.
Сделайте иначе: тактируйте алвайс от одной частоты, а внутри этого алвайса уже смотрите если кнопка нажата - инкрементируйте/декрементируйте счетчик.
Если нужно отработать именно фронты кнопок, то заведите несколько регистров, которые будут в алвайсе сдвигаться, и в последующем выявляться пары "01" для переднего фронта или "10" для заднего.
Re: Verilog конфликт драйвера
Добавлено: Сб окт 25, 2014 14:32:17
WolfTheGrey
тактируйте алвайс от одной частоты
Так нельзя! Суть не в кнопках, код кнопок приведен всего лишь как упрощеный пример. Суть вопроса в конфликте драйверов. Как правильно думать при написания кода.
Вот более сложная задача:
этап 1 - записать звук с АЦП wm8731 в SDRAM
этап2 - воспроизвести звук из SDRAM в ЦАП wm8731.
Уже 5 клоков насчитал с куево тучей независимых алвайс блоков. Как такое пишется?
И это еще не самая сложная затача, реализация цифрового фильтра с передискретизацией- ваще вырви мозг и положи под подушку. Допустим частота семплирования 48кГц. НАдо записать 6 точек, и по теореме Котельникова перерасчитать форму сигнала на 18 точек. (192 кГц)
Re: Verilog конфликт драйвера
Добавлено: Сб окт 25, 2014 14:45:18
bfgroup
WolfTheGrey писал(а):Давайте поставим жирную точку в вопросе конфликтов, а именно как мыслить в момент написания Verilog кода.
Давайте поставим.
Объяснение на уровне дедовской схемотехники.
Выходы цифровых схем НЕЛЬЗЯ соединять между собой напрямую!!! С одной схемы выход, допустим, логический 0, с другой логическая 1. При их соединении вы увидите дымок))
Объяснение на уровне FPGA-кодера. Я как и предыдущий комментатор совсем не силён в верилоге, но попробую объяснить в терминах vhdl. Каждому сигналу ставится в соответствие драйвер. Один единственный. В случае, если нам необходимо осуществлять многократное назначение одному и тому же сигналу мы должны использовать сигнал соответствующего типа. Данный сигнал называют "разрешаемымым", в vhdl это тип std_logic и для него задана соответствующая таблица разрешения.
Переводя вышесказанное для verilog-кодера можно резюмировать: мужики, юзайте тристейты или мультиплексоры (хотя mux'ы - это не множественное назначение сигналу, а множество сигналов).
Как-то так..
Re: Verilog конфликт драйвера
Добавлено: Сб окт 25, 2014 15:19:13
WolfTheGrey
Осталось увидеть это в коде, то не очень понимаю как реализовать муксер. Как отдельный модуль, или еще как? лезть из верилога в схемотехнику не очень хочется.
Чето в мыслях проясняется: написать отдельный модуль (или както таким образом вывернуться).
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
Meteor
WolfTheGrey писал(а):ак нельзя! Суть не в кнопках, код кнопок приведен всего лишь как упрощеный пример. Суть вопроса в конфликте драйверов. Как правильно думать при написания кода.
Вот более сложная задача:
этап 1 - записать звук с АЦП wm8731 в SDRAM
этап2 - воспроизвести звук из SDRAM в ЦАП wm8731.
Уже 5 клоков насчитал с куево тучей независимых алвайс блоков. Как такое пишется?
Я описываю на vhdl, но сути не меняет.
Подход такой. Есть одна системная частота, например 200 МГц. Из нее формируются сигналы управления АЦП, управления процессами записи во внутреннюю/внешнюю память, она же используется для формирования таймерных меток при опросе кнопок, все сигналы требующие анализа фронтов проводятся через триггерные цепи тактированные этой системной частотой.
В вашем примере получилось так
процесс 1 - инкремент счетчика
процесс 2 - декремент счетчика
при этом реакция на кнопки по сути равноценна подачи нескольких тактовых импульсов.
Как правильно делать - я написал, одна переменная для счетчика и триггера для формирования разрешения счета.
bfgroup писал(а):юзайте тристейты или мультиплексоры
Внутри ПЛИС нет трехстабильных элементов, они только на выводах, внутри допускается только мультиплексор.
То есть если вдруг захотелось с нескольких счетчиков подавать сигналы на выход, то нужно использовать только мультиплексор, а после него, если надо то ставить трехстабильные элементы.
Re: Verilog конфликт драйвера
Добавлено: Вс окт 26, 2014 11:32:32
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
Re: Verilog конфликт драйвера
Добавлено: Сб апр 18, 2015 15:11:54
misyachniy
Не знаю, поставлена ли жирная точка, по этому вставлю свои 5 копеек.
Топик стартер поставил регистр "summa" в позу буриданова осла только "травы" в 4 раза больше.
Все always синтезатор рассматривает параллельно, а не последовательно как компилятор С.
В результате 4 воздействия пытаются присвоить выходному регистру "summa" 4 разных значения.
Программист должен решить этот конфликт - раздать приоритеты.
То есть внести все воздействия под один always.
А затем расставить воздействия в порядке приоритетов операторами if/else if
Это тоже не выход, так как создаются условия для "гонки" импульсов.
Re: Verilog конфликт драйвера
Добавлено: Вт ноя 17, 2015 17:09:41
Взявший Паяльник
кто нибудь научите verilog сам пытался не разобрался

Re: Verilog конфликт драйвера
Добавлено: Вт ноя 17, 2015 19:55:29
misyachniy
Взявший Паяльник писал(а):кто нибудь научите verilog сам пытался не разобрался

Что, есть для изучения кроме желания?
Re: Verilog конфликт драйвера
Добавлено: Чт ноя 19, 2015 15:36:54
Взявший Паяльник
интернет ,но ничего путнего нет.

думал здесь кто подскажет
Re: Verilog конфликт драйвера
Добавлено: Чт ноя 19, 2015 18:13:08
misyachniy
Взявший Паяльник писал(а):интернет ,но ничего путнего нет.

думал здесь кто подскажет
Кроме интернета нужна конкретная задача.
Или хотя-бы платка с программатором.
А то получится "сферический конь в вакууме".
Re: Verilog конфликт драйвера
Добавлено: Сб ноя 21, 2015 09:24:33
Взявший Паяльник
JTAG ПОДОЙДЕТ ТАКОЙ
Re: Verilog конфликт драйвера
Добавлено: Вс ноя 22, 2015 11:55:19
Meteor
Вы откуда взяли эту схему?
С JTAG программатором лучше не спешить, а в начале определиться с производителем. Это может быть Altera, может Xilinx а может и Lattice. Когда разберетесь с тем как описывать аппаратуру, научитесь проводить функциональное моделирование, тогда уже купите себе плату с ПЛИС выбранного производителя, и в зависимости от насыщенности, либо докупите программатор, либо будете довольствоваться имеющимся на самой плате.
Re: Verilog конфликт драйвера
Добавлено: Вс ноя 22, 2015 12:17:28
Morroc
А я с конца начал - взял рабочий девайс, исходники, заказал у китайцев программатор и давай мигать светодиодами. Что понравилось - все мои мигания светодиодами и эксперименты с реализацией SPI интерфейса никак не влияли собственно на работу девайса (SDR приемник), ну т.е. даже при грубых косяках - все ведь параллельно работает.
Re: Verilog конфликт драйвера
Добавлено: Вс ноя 22, 2015 12:23:53
Meteor
Хотелки приходят во время еды развития навыков. Можно начать с конца, я тоже сперва купил плис, затем программатор, затем учил ЯОА и уже в конце освоил моделирование.
Так что совет данный выше - сын ошибок трудных и парадоксов друг.
Re: Verilog конфликт драйвера
Добавлено: Вт дек 22, 2015 02:04:45
Pe3ucTop
Собственно по теме, вставлю и свои пять копеек :
Подход в ПЛИС не такой как в МК, и соответственно все описания стремятся к одновременному выполнению.
То есть и подходить надо с пониманием что все кнопки могут быть нажаты разом

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

и как же тогда реагировать всем действиям ??
Ответ - Никак !
...
Слово "одновременному выполнению" не подходит - лучше "Все описания рассматриваются параллельно."
Если все кнопки нажаты "одновременно" - можно использовать приоритетный шифратор.