тоже с таким столкнулся, даже пытал FPGA кодера по этому поводу, но видать они мыслят как то по FPGA'шному, потому что объяснение до меня дошло не полностью
примерно так... если не писать таким образом, что в один момент времени возможно (именно возможно, а не обязательно произойдет) изменение состояния одного и того же регистра по разным always @ - этой ошибки нет, я бы один always на клок написал, а в нем все кнопки по if ... else - это не эквивалент вашего кода, но кнопки обрабатывать будет
сейчас попробую откопать ответ FPGA'шника... упс, сейчас перечитал - кажется мы там друг друга не поняли просто
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Не силен в верилоге, но насколько понимаю у вас напутанно с обработкой и на каждое действие делается свой алвайс. Сделайте иначе: тактируйте алвайс от одной частоты, а внутри этого алвайса уже смотрите если кнопка нажата - инкрементируйте/декрементируйте счетчик. Если нужно отработать именно фронты кнопок, то заведите несколько регистров, которые будут в алвайсе сдвигаться, и в последующем выявляться пары "01" для переднего фронта или "10" для заднего.
_________________ Загружая на вход компьютера "мусор", на выходе получим "мусор^32". PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Так нельзя! Суть не в кнопках, код кнопок приведен всего лишь как упрощеный пример. Суть вопроса в конфликте драйверов. Как правильно думать при написания кода. Вот более сложная задача: этап 1 - записать звук с АЦП wm8731 в SDRAM этап2 - воспроизвести звук из SDRAM в ЦАП wm8731.
Уже 5 клоков насчитал с куево тучей независимых алвайс блоков. Как такое пишется? И это еще не самая сложная затача, реализация цифрового фильтра с передискретизацией- ваще вырви мозг и положи под подушку. Допустим частота семплирования 48кГц. НАдо записать 6 точек, и по теореме Котельникова перерасчитать форму сигнала на 18 точек. (192 кГц)
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Давайте поставим жирную точку в вопросе конфликтов, а именно как мыслить в момент написания Verilog кода.
Давайте поставим.
Объяснение на уровне дедовской схемотехники. Выходы цифровых схем НЕЛЬЗЯ соединять между собой напрямую!!! С одной схемы выход, допустим, логический 0, с другой логическая 1. При их соединении вы увидите дымок))
Объяснение на уровне FPGA-кодера. Я как и предыдущий комментатор совсем не силён в верилоге, но попробую объяснить в терминах vhdl. Каждому сигналу ставится в соответствие драйвер. Один единственный. В случае, если нам необходимо осуществлять многократное назначение одному и тому же сигналу мы должны использовать сигнал соответствующего типа. Данный сигнал называют "разрешаемымым", в vhdl это тип std_logic и для него задана соответствующая таблица разрешения.
Переводя вышесказанное для verilog-кодера можно резюмировать: мужики, юзайте тристейты или мультиплексоры (хотя mux'ы - это не множественное назначение сигналу, а множество сигналов).
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Осталось увидеть это в коде, то не очень понимаю как реализовать муксер. Как отдельный модуль, или еще как? лезть из верилога в схемотехнику не очень хочется. Чето в мыслях проясняется: написать отдельный модуль (или както таким образом вывернуться).
ак нельзя! Суть не в кнопках, код кнопок приведен всего лишь как упрощеный пример. Суть вопроса в конфликте драйверов. Как правильно думать при написания кода. Вот более сложная задача: этап 1 - записать звук с АЦП wm8731 в SDRAM этап2 - воспроизвести звук из SDRAM в ЦАП wm8731.
Уже 5 клоков насчитал с куево тучей независимых алвайс блоков. Как такое пишется?
Я описываю на vhdl, но сути не меняет. Подход такой. Есть одна системная частота, например 200 МГц. Из нее формируются сигналы управления АЦП, управления процессами записи во внутреннюю/внешнюю память, она же используется для формирования таймерных меток при опросе кнопок, все сигналы требующие анализа фронтов проводятся через триггерные цепи тактированные этой системной частотой. В вашем примере получилось так процесс 1 - инкремент счетчика процесс 2 - декремент счетчика при этом реакция на кнопки по сути равноценна подачи нескольких тактовых импульсов. Как правильно делать - я написал, одна переменная для счетчика и триггера для формирования разрешения счета.
bfgroup писал(а):
юзайте тристейты или мультиплексоры
Внутри ПЛИС нет трехстабильных элементов, они только на выводах, внутри допускается только мультиплексор. То есть если вдруг захотелось с нескольких счетчиков подавать сигналы на выход, то нужно использовать только мультиплексор, а после него, если надо то ставить трехстабильные элементы.
_________________ Загружая на вход компьютера "мусор", на выходе получим "мусор^32". PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Уже 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
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Не знаю, поставлена ли жирная точка, по этому вставлю свои 5 копеек.
Топик стартер поставил регистр "summa" в позу буриданова осла только "травы" в 4 раза больше.
Все always синтезатор рассматривает параллельно, а не последовательно как компилятор С. В результате 4 воздействия пытаются присвоить выходному регистру "summa" 4 разных значения.
Программист должен решить этот конфликт - раздать приоритеты. То есть внести все воздействия под один always. А затем расставить воздействия в порядке приоритетов операторами if/else if Это тоже не выход, так как создаются условия для "гонки" импульсов.
Вы откуда взяли эту схему? С JTAG программатором лучше не спешить, а в начале определиться с производителем. Это может быть Altera, может Xilinx а может и Lattice. Когда разберетесь с тем как описывать аппаратуру, научитесь проводить функциональное моделирование, тогда уже купите себе плату с ПЛИС выбранного производителя, и в зависимости от насыщенности, либо докупите программатор, либо будете довольствоваться имеющимся на самой плате.
_________________ Загружая на вход компьютера "мусор", на выходе получим "мусор^32". PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
А я с конца начал - взял рабочий девайс, исходники, заказал у китайцев программатор и давай мигать светодиодами. Что понравилось - все мои мигания светодиодами и эксперименты с реализацией SPI интерфейса никак не влияли собственно на работу девайса (SDR приемник), ну т.е. даже при грубых косяках - все ведь параллельно работает.
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Хотелки приходят во время еды развития навыков. Можно начать с конца, я тоже сперва купил плис, затем программатор, затем учил ЯОА и уже в конце освоил моделирование. Так что совет данный выше - сын ошибок трудных и парадоксов друг.
_________________ Загружая на вход компьютера "мусор", на выходе получим "мусор^32". PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Собственно по теме, вставлю и свои пять копеек : Подход в ПЛИС не такой как в МК, и соответственно все описания стремятся к одновременному выполнению. То есть и подходить надо с пониманием что все кнопки могут быть нажаты разом и как же тогда реагировать всем действиям ?? Ответ - Никак ! Тобишь реакция (always) - должна быть по максимальной частоте (clk), ну и сбросу (rst) , остальные все входные рассматриваем как стационарные (стабильные) значения в данный момент времени. Если же надо реагировать на фронты, то как уже здесь писалось, берём предъидущие стационарные значения и сравниваем с текущими, в случае наиденных изменений - производим действия, но опять таки рассматриваем совокупность изменений, т.к. все могут произойти разом. Ну и сами выбираем приоритеты.
По вопросу если много входных частот - Надо прибегать к понятии синхронизации - т.е. или математически соотносить частоты и по параметрам выявлять - когда оба значения стационарны , или с помощью регистров стопить значения. И обрабатывать базируясь на четкие стабильные сигналы(значения).
По поводу где почитать - я уважаю ресурс marsohod.org ресурс на русском... там много затронуто по поводу сопоставления частот.
Подход в ПЛИС не такой как в МК, и соответственно все описания стремятся к одновременному выполнению. То есть и подходить надо с пониманием что все кнопки могут быть нажаты разом и как же тогда реагировать всем действиям ?? Ответ - Никак ! ...
Слово "одновременному выполнению" не подходит - лучше "Все описания рассматриваются параллельно."
Если все кнопки нажаты "одновременно" - можно использовать приоритетный шифратор.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения