Перейти к содержанию
    

flammmable

Свой
  • Постов

    298
  • Зарегистрирован

  • Посещение

Весь контент flammmable


  1. Большое спасибо. Могли бы вы рассказать, где и как делается настройка переменных ModelSim-Altera в Quartus? Искал как задать/настроить define в ModelSim-Altera/Quartus по словам "quartus altera modelsim variable settings define ifdef" и их комбинациям - не нашел решения. Сделал, как вы советовали - работает. Спасибо, буду делать так. Хотя данные выражения звучат как заклинание.
  2. Возможно ли в verilog обозначить часть входов/выходов модуля только для симуляции? Что бы можно было один и тот же проект (не внося изменений) запустить как на симуляцию так и на сборку прошивки.
  3. Есть ли какое-то подобие MISRA-C, но только для Verilog? Пока нашел стандарт разработки от Freescale. Вообще, есть ли у вас корпоративные/личные правила разработки? Какие вы ставите префиксы у названий переменных регистров и цепей? Предпочитаете camelCase или under_score? Как размещаете состояния FSM внутри always? Предпочитаете FSM с одним или с двумя always? И т.д.
  4. Подумал, будет разумно оставить напоминание в Сети всем, кто будет работать по старым мануалам и не сможет найти этот пункт меню. С доказательствами и ссылками на документы. Типа "не ищите, его нет". Ну и на жизнь пожаловаться, чего уж ) А за ваши ссылки - большое спасибо.
  5. В том вся и проблема. По ссылке на версию 10.1c на 93 странице (по нумерации *.pdf-документа) изображена панель Source Toolbar c 5шт. кнопок. У меня таких кнопок - 4шт. При потере фокуса окном редактирования кода - все кнопки становятся серые. При обретении фокуса - парочка становится активна. Но! Их - 4шт! Нехватает кнопки Show Language Templates с желтой буквой "Т".
  6. Осваивал ModelSim-Altera (Quartus Prime 17.1, ModelSim 10.5b) по этой инструкции. Не нашел пункт меню Language Templates. Пока искал пункт меню - нашел документ "ModelSim® User’s Manual". Версия 10.1c содержит 4 совпадения "show lang". Версия 10.2c содержит 1 совпадение "show lang". Версия 10.4c содержит 0 совпадений "show lang" (редакция 2015 года). Похоже Language Templates - всё. Жизнь - боль.
  7. Отличный паттерн разработки! Спасибо! А не подскажите ли, как лучше по вашему опыту: все автоматы делать в одном блоке always - в разных case (я сейчас так сделал) или "один автомат - один модуль"?
  8. Т.к. я пишу и клиентскую часть и прошивку для FPGA, то протокол могу менять сам, подстраивая его под возможности и ограничения оборудования. Процесс итеративен - я смотрю что можно "выжать" из LabVIEW, FT2232H и MAX-10 по максимуму. И как это правильнее сделать, что бы это не был "write only code". Огромное спасибо, ув.iosifk за Ваши советы!
  9. Конкретная задача. FPGA соединена с PC при помощи моста "USB - что_угодно" FT2232H, который способен работать в режиме асинхронного FIFO. У моста есть два буфера - TX и RX. Для передачи данных в FPGA мосту надо стробировать nRD. Для отправки на PC (и захвата данных во входной буфер) этому мосту надо стробировать nWR. Правильнее было бы описать дергание стробов в состояниях конечного автомата? Добрый день! Про то, что с доп.регистром всё заработает - это да. Только этот же регистр всё равно не синтезируется. Всё сведется к XOR-у + лог.ИЛИ (как в первом примере). И это понятно по отсутствию posedge/negedge в списке чувствительности. Чем руководствовались пацаны в 1995 году, когда так договаривались? От чего они пытались оградить программистов? Не собираются ли пацаны выпустить новый стандарт? Ибо тернарный оператор выглядит костылеобразно (не круто). Спасибо! Спасибо за ценное замечание. Действительно, если клок управляется значением шины hAA и шина переключается из состояния h0F в hF0 не синхронно а как бы по пути h0F->h0A->hAA->hA0->hF0 может произойти неприятное. Точно. Ну в любом случае синтезатор не даст такой синтаксической конструкции собраться. Без обид, разумеется. Ув.iosifk мне кажется есть два (как минимум) случая, когда "ориентированность на результат" приведет к негативным последствиям: 1. Конструкция языка/библиотеки/устройства претерпела изменения за последнее время (или такое изменение напрашивается в ближайшем будущем). Пример: инициализация регистров при запуске ПЛИС "в железе". На сколько понял читая материалы в сети, в 90-е регистры инициализировались исключительно нулями. Сейчас ситуация поменялась, но ряд комментаторов по старой памяти утверждают, что это невозможно и сами не используют эту удобную опцию. 2. Хрестоматийный пример, на который нужно равняться, содержит незаметную ошибку. Пример: в LabVIEW есть пример работы с высокоскоростными модулями HSDIO. Коротко, работа с HSDIO представляет последовательность Init->Transmit/Receive->Close. Но Close может быть двух типов - "Закрыть по завершении Transmit/Receive" и "Закрыть немедленно". Так вот в официальном примере использовано "Закрыть немедленно". HSDIO в режиме Transmit/Receive работает автономно от PC и обычно гораздо быстрее. Так что программы на основе примера работают корректно. Но если забить буфер HSDIO под завязку, и выставить частоту работы по минимуму, "хвост" передачи будет обрублен. Причем без каких-либо эксепшенов. Таким образом, если времени нет, разумеется приходится "ориентироваться на результат". Но если оно есть, почему бы не выяснить как именно работает тот или иной подход и почему именно так. Кроме того есть замечательное руководство "Как правильно задавать вопросы на технических ресурсах". Надеюсь я правильно истолковываю данный кодекс, полагая что вопрос в духе "вот моя плата на 100 микросхем, вот мой код на 10.000 строк, тут что-то не работает" хуже, чем вопрос "Вот три строчки кода, которые не работают. Вот стремный воркэраунд на десять строчек, который работает. Можно ли написать красивее и правильнее?". И если у меня возникает вопрос первого типа, его нужно свести к вопросу второго типа и только потом обращаться за помощью.
  10. Предположим, есть конечный автомат, который в работе должен пробрасывать тактовую частоту через себя, а в состоянии IDLE установить выход тактовой частоты в единицу. Тогда код может быть следующий: wire clk_in; wire clk_out; reg state; assign clk_out = clk_in | ~(state^IDLE); Т.е. если state и IDLE совпадают бит-в-бит, то их побитовый XOR будет равен нулю. Инвертированный ноль - это единица. Единица или clk_in - единица. В противном случае, ноль или clk_in - это clk_in. Всё абсолютно прозрачно синтезируется. Или код может быть такой: wire clk_in; wire clk_out; reg state; assign clk_out = clk_in | (state == IDLE);//На месте синтезатора я заменил бы данную конструкцию на предыдущую Или такой: wire clk_in; wire clk_out; reg state; assign clk_out =(state == IDLE) ? 1 : clk_in; Но почему не прокатывает следующий вариант? wire clk_in; wire clk_out; reg state; always @(state) begin if(state == IDLE) begin clk_out = 1; end else begin clk_out = clk_in; end end В таком варианте Квартус ругается на то, что "10137: Object on left-hand side of assignment must have a variable data type". Не, ну нельзя, так - нельзя. Но эмм... в списке чувствительности отсутствуют posedge/negedge. В любом случае, синтезатор будет разворачивать эту конструкцию в комбинационную логику (причем, скорее всего в такую, как в первом примере). Так чего же он лезет на рожон (регистр ему подавай)? Какова логика языка? Почему так писать некорректно?
  11. Всем огромное спасибо! Интересно, как здесь поддерживается такой порядок, что участники обращаются на "Вы" и столь стремительно спешат на помощь по не слишком серьезному поводу?
  12. О, спасибо! Хорошая идея. Я, правда, надеялся, что есть способ элегантнее. В смысле, я надеялся что будет различие между кодом always @(posedge clock or posedge reset) begin if (reset) begin state <= 0; и кодом always @(posedge clock or reset) begin if (reset) begin state <= 0; а так же кодом always @(posedge clock) begin if (reset) begin state <= 0; Но видимо они все сработают одинаково.
  13. Перефразирую. Приведенный в первом посте код работает так: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется 3) отпускаем кнопку - ничего не происходит 4) следующий фронт clk запускает автомат т.к. работает условие по ветви else Почему я его привел? Потому, что таков пример сброса конечного автомата в руководствах, до которых я пока дотянулся - таков. Данный пример меня не устраивает. Хотелось бы: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) по следующему фронту clk автомат начинает работу Но я пока не пойму как такое реализовать. И возможно ли.
  14. input clk; input reset; reg [2:0]state; initial begin state <= 3; end always @(posedge clock or posedge reset) begin if (reset) begin state <= 0; end else begin case (state) 0: begin state <= 1; end 1: begin state <= 2; end 2: begin state <= 3; end 3: begin //Остановиться end end end Когда мы зажмем reset - конечный автомат переинициализируется (state сбросится в ноль по фронту reset-а). Но заработает автомат по первому фронту clk после того, как мы отпустим reset. Подскажите пожалуйста, возможно ли сделать так, что бы автомат сбросился по фронту reset-а и заработал бы по следующему фронту clk?
  15. Точно! Там прямо в IP Core можно выбрать или 55 или 116 мегагерц. Надо еще проверить, но сдается мне - это точные значения, а не крайние.
  16. Большое спасибо! P.S. Теперь у Гугла будет 3 ссылки на загадочное "fiftyfivenm_oscillator" :)
  17. Осваиваю Verilog и MAX-10. Захотел запустить внутренний тактовый генератор. Посмотрел в Tools->IP-catalog (Quartus prime 17.1.0) - в разделе Library->Clock;PLLs and Resets. Там - ALTCLKCTRL, ALTPLL и ALTPLL_RECONFIG. Интуитивно понятно, что всё не то. Полистал документ UG-M10CLKPLL (Intel® MAX® 10 Clocking and PLL User Guide). Там были в т.ч. четыре раздела: 1) ALTCLKCTRL IP Core References 2) ALTPLL IP Core References 3) ALTPLL_RECONFIG IP Core References 4) Internal Oscillator IP Core References "Номер четыре - это то, что нужно!" - подумал я. Заодно прочитал, что: Clock Frequency 10M02, 10M04, 10M08, 10M16, and 10M25: 55 MHz, 116 MHz. Отлично! Значит я смогу назначить своей 10M02 или 55МГц или 116МГц. Но где его взять, это IP Core? Начал гуглить по словам - на сочетание "Internal Oscillator IP Core References" попадался лишь этот самый раздел даташита. Начал рыться в папках Квартуса. Нашел altera_int_osc. Даже без глубокого знания Verilog было видно, что это обертка над функцией (мегафункцией? модулем?) "fiftyfivenm_oscillator". О!! fiftyfive - это же "пятьдесят пять" по английски. Как одна из двух возможных частот для 10M02. Загуглил "fiftyfivenm_oscillator" и получил от гугла... ровно две ссылки. Одну - на текст "altera_int_osc", вторую - на альтеровский форум где она вскользь упоминается в контексте невозможности на MAX-10 присоединить внутренний генератор к внутреннему PLL-у. Скопировал текст загадочной функции из altera_int_osc в свой модуль прописав свой проводок-выход clk_test в .clkout и лог.1 в .oscena fiftyfivenm_oscillator # ( .device_id("08"), .clock_frequency("dummy") ) oscillator_dut ( .clkout(clk_test), .clkout1(), .oscena(1'b1)); end На выходе появился меандр на частоте 80МГц. Это и не 55МГц и не 116МГц. Попробовал наугад поменять параметр .clock_frequency - без изменений, меандр 80МГц. Попробовал поменять параметры .clock_frequency и .device_id на откровенную белиберду. Без изменений, меандр на 80МГц. В общем. Что это за "fiftyfivenm_oscillator", где про нее прочитать, есть ли более правильный способ включения внутреннего тактового генератора, где мои 55МГц?
×
×
  • Создать...