ПЛИС — мои первые шаги

    Недавно я все-таки сделал свой первый шаг к ПЛИС и призвал вас за собой. Мое фанатическое увлечение ПЛИС и идея о том, что ПЛИС является лучшей платформой для создания любых устройств приобрела религиозный характер. Моя секта ПЛИСоводов проповедует полный отказ от микроконтроллеров, а особо экстремистская ветвь проповедует отказ не только от софт процессоров, но и вообще от последовательных вычислений!

    Как всегда, постижению истин помогло решение реальных задач. В сегодняшней проповеди я хотел бы рассказать об испытаниях, которые выпадают на долю молодого ПЛИСовода. Преодолевая испытания мы постигаем истину. Но остаются вопросы, на которые я не нашел ответов. Поэтому я бы очень хотел, чтобы братья-хабровчане — ПЛИСоводы с опытом, поучаствовали в обсуждении, протянули руку помощи своим младшим собратьям.

    Эта статья для новичков. В ней я опишу типичные проблемы, вопросы, заблуждения, ошибки, которые могут появиться в самом начале обучения (потому что они появились у меня). Однако, контекст статьи ограничен тем, что разработка ведется на ПЛИС от Altera в среде Quartus на языке Verilog.


    Трудно жить ничего не делая, но мы не боимся трудностей!


    Одна из причин, по которой многие не начинают изучать Verilog вот прямо сейчас — это отсутствие реальной ПЛИС. Кто-то не может заказать, потому что дорого, а кто-то потому, что не знает, что именно взять (вопрос выбора рассмотрен в предыдущей статье). Кому-то ПЛИС пока еще едет по почте.

    Но в своих разработках я пришел к тому, что наличие реальной ПЛИС мне требуется уже на финальном этапе разработки, когда нужно протестировать проект «в железе». Речь о том, что бóльшую часть времени я провожу в отладке своего кода с помощью симуляторов.

    Поэтому мой совет: отсутствие ПЛИС — это не повод бездействовать. Пишите и отлаживайте модули для ПЛИС в симуляторах!

    Симулятор для Verilog


    Итак, чем же развлечь себя скучными длинными рабочими днями (если они таковыми являются)? Конечно же освоеним ПЛИС! Но как же затащить на работу целую среду разработки от Altera, если она весит 3 ежемесячных рабочих лимита интернета? Можно принести на флешке! Но если предметом изучения является Verilog, то можно ограничиться блокнотом, компилятором IcarusVerilog, а результат смотреть в GTK Wave.

    Попробовать прямо сейчас
    Для начала работы в среде Windows, достаточно скачать по ссылке http://bleyer.org/icarus/ файл установки iverilog-20130827_setup.exe (development snapshot) [11.2MB]

    Установка трудностей не вызывает. Теперь немного забежим вперед: создадим папку для проекта и в ней пару файлов с пока что не понятным содержимым:

    Файл-модуль с кодом для тестирования модулей - bench.v
    `timescale 1ns / 100 ps
    
    module testbench();
    
    reg clk;
    
    initial
    begin
        $display("start");
    
        $dumpfile("test.vcd");
        $dumpvars(0,testbench);
    
      clk <= 0;
      repeat (100) begin
    	#10;
    	clk <= 1;
    	#10;
    	clk <= 0; 
      end
    
        $display("finish");
    end

    В файле bench.v описан тестовый модуль testbench, в нем создан тестовый источник сигнала clk (меандр). Другие модули будут создаваться в отдельных файлах, либо логику можно протестировать сначала в этом модуле, а потом вынести в отдельный модуль. Потом в модуль testbench будут добавляться экземпляры этих модулей, где мы будем подавать на их входы тестовые сигналы и получать из них результаты. Из модулей мы можем строить иерархию, думаю это понятно всем.

    BAT Файл, который скомпилирует и просимулирует главный модуль, добавив другие модули из текущей папки - makev.bat
    iverilog -o test -I./ -y./ bench.v
    vvp test
    pause

    После запуска этого файла мы увидим на экране текст, заданный в $display (это отладочный вывод), значение же сигналов и регистров схемы будут находиться в файле test.vcd. Кликаем по файлу и выбираем программу для просмотра — GTKWave (в моем случае D:\iverilog\gtkwave\bin\gtkwave.exe). Еще пару кликов и мы увидим наш clk.



    Практически, каждый свой новый модуль я создаю в блокноте и отлаживаю IcarusVerilog. Следующим этапом после такой отладки идет проверка модулей в Quartus. Хотя в Quartus тоже есть свой симулятор, но я его использую реже. Причина в простоте обновления кода и просмотра результата в IcarusVerilog: сохранил изменения в файле, запустил BAT, нажал кнопку «обновить» в GTKWave — все! В ModelSim для этого требуется чуть больше движений, но он тоже не плох, особенно на данных сложных структур.

    После симуляции наступает пора запуска Quartus. Но загружать прошивку в ПЛИС пока еще рано. Нужно убедиться, что божественная вычислительная машина правильно поняла, какую схему мы хотим получить, изложив свои мысли в виде Verilog'а.

    Разница между симуляцией и работой в реальном железе


    Первое время я, подобно слепому котенку, бился головой об косяки. Казалось бы правильный код, не работает совсем, либо работает не так, как предполагаешь. Либо вот только что работал, а теперь внезапно перестал!

    Пытливый котенок, начинает искать взаимосвязь между своими действиями и результатом («голубиное суеверием»).

    Самая большая драма

    Ниже будет список странностей, но сначала самая большая драма, с которой я столкнулся: не все конструкции Verilog могут быть синтезированы в железе. Это связано с тем, что на Verilog описывается не только аппаратная логика, которая объединяется в модули и работает в железе. На том же Verilog описываются тестовые модули, которые объединяют тестируемые модули, подают на их входы тестовые сигналы и в целом существуют только для проверки на компьютере. Изменение значений сигналов во времени задается конструкциями, содержащим знак "#" в тексте Verilog. Такой знак означает задержку во времени. В примере выше именно так генерируется сигнал CLK. И я грешным делом думал, что таким же образом внутри настоящей ПЛИС можно генерировать, к примеру, последовательность бит для отправки сообщения по RS232. Ведь на вход ПЛИС подан сигнал от генератора 50 МГц! Может быть она как-то на него ориентируется. Как оказалось, я не единственный, кто надеялся на чудо: 1, 2, 3, 4, 5. Реальность как всегда оказывается более суровой: ПЛИС это набор логики и временная задержка в ней может появиться при использовании счетчика, значение которого увеличивается тактами от генератора до заданной величины, либо как-то иначе (но всегда аппаратно).

    Список найденных странностей

    Удивительные вещи, однако, прочтение книг [1,2] проливает свет на эту бесовщину. Более того, обретается благодать.

    Если обозначить reg, то не факт, что он будет создан

    Как я пришел к проблеме? Допустим есть один модуль, на вход которого я должен подавать значение (по типу параметра). В перспективе, этот параметр должен будет изменяться во времени в зависимости от каких-то внешних событий. Поэтому значение должно хранится в регистре (reg). Но реализация приема внешних событий пока не реализована, поэтому я регистр не меняю, а просто задаю ему изначальное значение, которое в дальнейшем не меняется.

    //задаю 8 битный регистр
    reg [7:0] val;
    
    //инициирую его значением
    initial val <= 8'd0240;
    
    //wire к которому подключим выход из модуля
    wire [7:0] out_data;
    
    //неведомый модуль, называется bbox
    //экземпляр этого модуля называется bb_01
    //будем считать, что в модуле есть входной порт in_data и выходной out_data
    //во входной порт подаем значение с регистра val, а выход подключаем к wire - out_data
    bbox bb_01(.in_data(val), .out_data(out_data));
    

    Казалось бы в чем подвох? В императивных ЯП мы часто задаем переменные в качестве констант и потом ни разу их не меняем и все работает. Что же мы видим в железе?

    Во-первых, мы не видим регистра. Во-вторых, на вход модуля подано 8'hFF вместо наших 8'd0240! И этого уже достаточно для того, чтобы схема заработала не так, как мы планировали. То, что регистра нет — это нормально. В Verilog можно описывать логику разными способами, в то же время, синтезатор всегда оптимизирует аппаратную реализацию. Даже если написать блок always и в нем работать с регистрами, но при этом выходное значение всегда будет определяться входными, то применение регистра тут окажется лишним и синтезатор его не поставит. И наоборот, если при каких то значениях входных данных выходное значение не меняется, то тут никак не обойтись без регистра-защелки и синтезатор его создаст. (Книга 1 стр. 88-89). Что из этого следует? Если мы начнем менять значение регистра, например, в зависимости от нажатии кнопок, то геристр уже будет создан и все будет работать так, как нужно. Если же окажется, что кнопки ничего не меняют, то синтезатор его опять же выкинет и опять все поломается. Что же делать с константой? Нужно подать ее напрямую на вход модуля:

    bbox bb_01(.in_data(8'd0240), .out_data(out_data));

    Теперь на входе модуля мы имеем правильное значение:


    Остается загадкой, почему при сокращении регистра, его значение в initial не подставляется на вход модуля.

    Размерность wire лучше задавать самому.

    При разработке в среде Quartus, допускается не задавать линии wire заранее. В этом случае они будут созданы автоматически, но об этом будет выдано предупреждение (warning). Проблема заключается в том, что разрядность wire будет 1-бит, а если порты будут иметь разрядность больше 1 бита, то значение не будет передано.

    bbox       bb_01(.in_data(8'd0240), .out_data(int_data));
    other_bbox bb_02(.in_data(int_data), .out_data(out_data));

    Предупреждение
    Warning (10236): Verilog HDL Implicit Net warning at test.v(15): created implicit net for "int_data"

    Результат:


    Как видим, один бит подключен, а остальные 7 бит получаются не подключены (NC). Чтобы такой проблемы не было — нужно создать wire самостоятельно. Не зря компилятор IcarusVerilog выдает не warning, а ошибку, если wire не задан заранее.

    wire [7:0] int_data;
    bbox       bb_01(.in_data(8'd0240), .out_data(int_data));
    other_bbox bb_02(.in_data(int_data), .out_data(out_data));




    Компьютер не будет лазать по модулям, смотреть, какая разрядность портов. К тому же, разрядность может оказаться разной, а на вход модуля или с выхода берутся не все биты, а какие-то определенные.

    Нельзя использовать выход логической функции, в качестве тактового сигнала

    Иногда в проекте требуется снизить тактовую частоту, либо ввести временную задержку в N тактов. Новичёк может применить счетчик и дополнительную схему определения достижения счетчиком определенного значения (схема сравнения). Однако, если напрямую использовать выход со схемы сравнения в качестве тактового, то могут возникнуть проблемы. Это связано с тем, что логической схеме требуется некоторое время для установки стабильного значения на выходе. Эта задержка смещает фронт сигнала, проходящего через разные части логической схемы относительно тактового, в итоге получаются гонки, метастабильность, асинхронщина. Даже довелось однажды услышать реплику об этом в качестве критики ПЛИС: «с ПЛИС постоянные проблемы — гонки сигналов».

    Если прочитать хотя бы парочку статей:
    Метастабильность триггера и межтактовая синхронизация
    Пару слов о конвейерах в FPGA

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

    Для полного понимания, стоит прочитать Altera handbook на предмет «clock domains», а так же разобраться с тем, как задавать параметры рассчета TimeQuest для проекта.

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

    А что, если я хочу пойти против системы?

    Порядок разработки и поведение синтезатора схем подводит нас к выводу о том, что же такое ПЛИС на аппаратном уровне. Это синхронные схемы. Поэтому, среди целей синтезатора — уложиться во временные интервалы. Для этого он, к примеру, упрощает логические выражения, выбрасывает из синтеза части схем, которые не используются другими схемами и не привязаны к физическим выводам ПЛИС. Асинхронные решения и аналоговые трюки не приветствуются, потому что их работа может быть непредсказуемой и зависеть от чего угодно (напряжение, температура, техпроцесс, партия, поколение ПЛИС), а поэтому не дает гарантированного, повторяемого, переносимого результата. А всем же нужен стабильный результат и общие подходы к проектированию!

    Но что же делать, если вы не согласны с мнением синтезатора о том, что нужно выкидывать неизменяемые регистры, сокращать логические схемы? Как быть, если хотите делать схемы с асинхронной логикой? Нужна тонкая настройка? А может быть вы сами хотите собрать схему на низкоуровневых компонентах ПЛИС? Легко! Спасибо разработчикам Altera за такую возможность и подробную документацию!

    Как это сделать? Можно попробовать графический редактор схем. Вы, возможно, слышали о том, что Quartus позволяет рисовать схемы? Можно самому выбрать стандартные блоки и соединить их. Но это не решение! Даже нарисованная схема будет оптимизирована синтезатором, если на это будет возможность.

    В итоге мы приходим к старой истине: если ничего не помогает — прочитайте инструкцию. А именно «Altera Handbook» часть под названием «Quartus II Synthesis Options».

    Начнем с того, что описывая архитектуру на Verilog определенным образом, можно получить определенный результат. Вот примеры кода для получения синхронного и асинхронного RS триггера:

    //модуль синхронного RS триггера
    module rs(clk, r, s, q);
    input wire clk, r,s;
    output reg q;
    
    always @(posedge clk) begin
      if (r) begin
        q <= 0;
      end else if (s) begin
        q <= 1;
      end
    end
    
    endmodule

    В этом случае получится синхронный триггер.


    Если не брать во внимание тактовый сигнал и переключаться в зависимости от любых изменений r и s, то в результате получится элемент с асинхронной установной значений — защелка (latch).

    //пример модуль асинхронного RS триггера
    module ModuleTester(clk, r, s, q);
    input wire clk, r,s;
    output reg q;
    
    always @(r or s) begin
      if (r) begin
        q <= 0;
      end else if (s) begin
        q <= 1;
      end
    end
    
    endmodule




    Но можно пойти еще дальше и самому создать защелку из примитива (примитивы доступны так же, как любой другой модуль Verilog):

    module ModuleTester(clk, r, s, q);
    input wire clk, r,s;
    output reg q;
    
    DLATCH lt(.q(q), .clrn(~r), .prn(~s));
    
    endmodule


    В итоге, весь «обвес» на входе защелки, который синтезатор посчитал нужным, исчезнет и мы получим именно то, что хотели:



    Список существующих примитивов можно посмотреть на сайте Altera.

    А теперь небольшой пример про асинхронность и сокращение. Задумал я, к примеру, сделать генератор по тому же принципу, как это было принято делать раньше, но только на ПЛИС:



    Но для увеличения периода я возьму 4 элемента, но только один из них будет с инверсией:

    module ModuleTester(q);
    output wire q;
    
    wire a,b,c,d;
    
    assign a = b;
    assign b = c;
    assign c = d;
    assign d = ~a;
    
    assign q = a;
    
    endmodule


    Но получается сокращение (1 элемент, вместо четырех). Что логично. Но мы то задумывали линию задержки.



    Но если поставить синтезатору условие, что линии a,b,c,d не сокращать, то получится то, что мы задумали. Для подсказки синтезатору применяются директивы. Один из способов указания — это текст в комментарии:

    module ModuleTester(q);
    output wire q;
    
    wire a,b,c,d  /* synthesis keep */; 
    //                       ^^^--- это директива для синтезатора
    
    assign a = b;
    assign b = c;
    assign c = d;
    assign d = ~a;
    
    assign q = a;
    
    endmodule

    А вот и результат — цепочка из четырех элементов:


    И это далеко не все! Оставлю на радость самостоятельного изучения: работу с case и директиву для реализации его в качестве RAM/ROM или логической схемой; работу со встроенными блоками памяти (RAM/ROM); выбор реализации умножения — аппаратным умножителем или логической схемой.

    Выводы


    Цитируя статью, хочу сказать, что «ПЛИС-ы / FPGA — не процессоры, «программируя» ПЛИС (заполняя конфигурационную память ПЛИС-а) вы создаете электронную схему (хардвер), в то время как при программировании процессора (фиксированного хардвера) вы подсовываете ему цепочку написанных в память последовательных инструкций программы (софтвер)».

    Причем, как бы мне изначально не хотелось сильно не привязываться к конкретной железяке, но иногда, чтобы более эффективно и экономно использовать ресурсы, приходится работать на низком уровне. Часто этого можно избежать, если правильно разрабатывать синхронные схемы. Однако совсем забыть, что это железо — не получается.

    Еще хочу сказать, что фанатизма и максимализма со временем поубавилось. Сначала я стремился все действия и рассчеты на ПЛИС выполнять за один такт, потому что ПЛИС это позволяет. Однако, это требуется далеко не всегда. Вычислительные ядра софт процессоров мне пока не довелось использовать, однако применение state machines для работы по определенному алгоритму — стало нормой. Вычисления не за 1 такт, временные задержки в несколько тактов из за применения конвееров — это норма.

    Книги, которые мне очень помогли


    1. В.В. Соловьев — Основы языка проектирования цифровой аппаратуры Verilog. 2014
    2. Altera: Quartus II Handbook
    3. Altera: Advanced Synthesis Cookbook
    4. Altera: Designing with Low-Level Primitives

    Статьи по тематике ПЛИС, Altera и Verilog


    Новости ПЛИС индустрии
    Microsoft переходит на процессоры собственной разработки
    Intel собирается выпустить серверные процессоры Xeon со встроенной FPGA
    Intel планирует выкупить Altera
    РБК:Intel купила производителя чипов Altera за $16,7 млрд
    Поиск Bing оптимизировали с помощью нейросети на FPGA
    Поиск Bing оптимизировали с помощью нейросети на FPGA
    Процессоры Intel Xeon оснастили FPGA Altera

    Теория
    Разработка цифровых устройств на базе СБИС программируемой логики

    Аппаратные особенности
    Метастабильность триггера и межтактовая синхронизация
    Временной анализ FPGA или как я осваивала Timequest
    Пару слов о конвейерах в FPGA
    Verilog. Обертки RAM и зачем это нужно
    Проектирование синхронных схем. Быстрый старт с Verilog HDL

    Примеры
    Делаем таймер или первый проект на ПЛИС
    Часы на ПЛИС с применением Quartus II и немного Verilog
    Как я делал USB устройство
    Цветомузыка на базе ПЛИС
    Программирование ПЛИС. Изучение явления «дребезг контактов» и метод избавления от него(VHDL!)
    Реализация на Verilog цифрового БИХ-фильтра
    Verilog. Цифровой фильтр на RAM
    ПЛИС это просто или АЛУ своими руками
    VGA адаптер на ПЛИС Altera Cyclone III
    Исследование процессора и его функциональная симуляция
    NES, реализация на FPGA
    Генерация видео математической функцией на ПЛИС
    Аппаратный сортировщик чисел на verilog-е
    Простой SDR приёмник на ПЛИС
    Автономный SDR приёмник на ПЛИС
    Взгляд на 10G Ethernet со стороны FPGA разработчика
    Простой радиопередатчик FM диапазона на основе ПЛИС
    Делаем тетрис под FPGA
    Minesweeper на FPGA
    Делаем IBM PC на FPGA

    PS


    Спасибо всем, кто прочитал до этого места. Надеюсь, что что с этой статьей принцип работы и использования ПЛИС станет хотя бы немного ближе и понятнее. А в качестве примера применения в реальном проекте, я готовлю к выпуску на этой неделе еще одну статью. Проект Функциональный DDS rенератор на ПЛИС
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 40
    • +2
      Спасибо, интересно! Пишите еще. Интересно было бы если еще про отечественные побольше информации было и проектов для начинающих (только не мигание светодиодом).
      И отдельно интересно было бы почитать про процессор с мультиклеточной архитектурой и его реальное применение.
      • +5
        Просто считайте, что отечественных ПЛИС нет. Так проще и соответствует реальной картине мира на 99.9%
        • 0
          Про отечественных разработчиков ПЛИС я только однажды слышал на одном форуме. Там речь была про ОАО «КТЦ „ЭЛЕКТРОНИКА“ г.Воронеж и их продукцию 5576ХС1Т, 5576ХС1Т1, 5576ХС2Т, 5576ХС3Т, 5576ХС4Т. Являются функциональными аналогами Altera. Для целей „попробовать“ это дорого. В принципе, я думаю, что знания в области разработки устройств с применением ПЛИС более-менее универсальные и разработчик хоть и без особого желания, но сможет перейти с Altera на Xilinx (и наоборот) или на что-то другое. Мультиклеты я не изучал, и не могу сказать, какое они имеют отношение к ПЛИС.
          По поводу мигания светодиодиками — на этих выходных решил сделать небольшой проект и уложиться в „пару вечеров“. Сейчас готовлю статью и скоро можно будет поглядеть, что из этого вышло.
          • +3
            Мультиклет к ПЛИС не имеет никакого отношения. Но его, наверное, как и любой другой процессор, можно реализовать в ПЛИС, правда очень коряво и медленно.
            А российские ПЛИС существуют только для военных, причем даже они пытаются использовать импорт там, где это возможно. Если вы не военный, то смело считайте, что российских ПЛИС не существует в природе.
        • +5
          За тот недолгий срок, что я работал программистом для FPGA, я твердо запомнил — никаких асинхронных элементов в ПЛИС. Лучше сделать чуть сложнее синхронную схему, чем потом все развалится.
          • 0
            Вы правы. Но иногда приходится делать что-то асинхронно. И надо себе отдавать полный отчет к чему это может привести — при очередной разводке может что-то куда-то уползти. А искать, понять и осознать что именно произошло, особенно если проект немаленький — ох это сколько порой времени может уйти. Поэтому такие линии надо ставить на временной контроль и после разводки обязательно проверять времянку.
            • 0
              А Вы не могли бы, пожалуйста, привести пример, когда действительно «приходится», т.е. без асинхронщины никак? У меня с ходу не получается такое придумать, но у меня совершенно минорный опыт.
              • +1
                Применение асинхронности оправдывается там, где нужна скорость и минимальные задержки.

                В одном ТЗ меня сильно зажали по времени — сигнал со входа сразу должен был выдаваться на выход и под ним уже должны были быть данные. Данные-то я, понятно дело, готовил заранее и потом из небольшого буфера выдавал, но у меня не было возможности впихнуть выходной регистр на входной управляющий сигнал, т.к. работал на частоте, которая не могла обеспечить маленькую задержку. В результате он откуда-то выходил (вне моей схемы), я его ещё пару раз считывал (растягивал по схеме) и выдавал куда-то далее (хлопался он там где-то близко регистром или нет?) — вот и представьте какая длина у этой линии в ПЛИСе? Но это уже головная боль была у того, кто весь поект собирал. Наверное не от хорошей жизни так решили делать.

                А вот когда я проект собирал. Возник казус с стыком отлаженных схем. Одна схема опрашивала две другие. Один сигнал управления (выбор схемы), второй — запрос готовности. А результат опроса уже анализировался на следюущем такте, т.е. сигнал-то еще надо было развести между двумя другими. Ну да, не продуман был стык. Схемы уже отлажены, никто не горит желанием переделывать) Поставил асинхронный мультиплексор и навесил на него временные ограничения благо частота была небольшая и там запас был хороший.
                • 0
                  Асинхронность оправдана только там, где физически без нее не обойтись — перевод сигнала между двумя асинхронными тактовыми сигналами. Во всех остальных случаях это равносильно ужину при свечах на бочке с порохом. У нас индусы умудрились зарелизить асинхронный контроллер. В результате одна микросхема заработала, а вторая нет. После чего я их заставил передать все на кондовую синхронную логику. Ну желающие рискнуть оптимисты всегда найдутся, но я бы не рекомендовал. Если не хватает скорости тактового сигнала — значит синхронизацию нужно делать более быстрым тактовым сигналом.
                  • 0
                    Проблема упирается в то, что не всегда в наличии присутствует желаемый набор тактов. Иногда можно себе встроенными DCM более высокую частоту сделать и на ней отработать. Перевод сигнала на высокую, перевод на низкую — в конечном счете каждый случай индивидуален и рассматривается есть ли в этом смысл вообще. Но у меня в некоторых проектах, например, запрещено использовать блоки DCM. Т.е. вот есть у тебя такты — вот на них и работать, счётчиком дели и т.д. Если кто-то где-то недодумал, то приходиться крутиться. На раннем этапе разработки, конечно, лучше заставить переделать.

                    Я бы не стал возводить синхронную работу схемы в безоговорочный принцип. Есть вещи, где некритичны задержки и допустима асинхронная схема. Просто разработчик должен понимать что это может за собой повлечь. И если есть возможность сделать всё по тактам — лучше делать по тактам)
                    • +2
                      Проблема-то не только в задержках. Проблема еще в том, что асинхронная схема подразумевает использование комбинационных сигналов для упраления другими частями схемы. Это подразумевает, что разработчик обязан обеспечить отсутствие паразитных импульсов на выходе таких комбинационных схем (простейший пример: нарисуйте схему двухвходового мультиплексора на элементах И-ИЛИ-НЕ с ненулевыми задержками элементов, и вы увидите, что когда оба его входа данных равны единице, то при переключении с одного на второй на выходе на некоторое время установится ноль). Но только в ПЛИСах комбинационная логика реализуется на LUT-ах, а в даташитах написано, что отсутствие паразитных импульсов на выходе LUT-ов не гарантируется.
                      • 0
                        Справедливое замечание. Я правда на практике никогда не сталкивался с подобным проявлением помех внутри ПЛИСа.
          • +3
            Интересно было бы услышать про сравнение Verilog и VHDL для практических применений, в реальных проектах
            • 0
              Мне тоже интересно, но я пока не изучал VHDL.
              • +3
                А чего тут сравнивать? Примерно 95% коммерческих разработчиков IP (начиная с ARM) используют Verilog. А они, смею вас уверить, не враги сами себе.
                • 0
                  VHDL, походу, начинает потихоньку умирать. Косвенное подтверждение тому отсутствие развитие этого языка в отличие от Veriloga. Я сам почти 20 лет назад начинал с VHDL, но уже как лет 8 его не использую — Verilog намного удобнее. Правда есть один момент неприятный — я люблю этот вопрос на собеседованиях задавать: вообще говоря, по стандарту Verilog-2001, нельзя использовать в процессе сигнал, заданный в списке чувствительности процесса. Таким образом Verilog «страхует» вас от намерения переползти в несинхронщину. А VHDL — позволяет, типа охота вам несинхронную схему городить — ну и городите.

                  А в целом, моё мнение, что VHDL, что Verilog себя изжили: слишком низкоуровневые. За языками типа SystemC будущее!
                  • 0
                    Есть мнение, что языки типа SystemC были неудачным экспериментом, потому что за много лет так по-настоящему и не прижились и даже начали потихоньку умирать.
                    А Verilog живет, процветает и обвешивается расширениями, тем же SystemVerilog кстати.
                    • 0
                      Это SystemC-то отмирает?! Особенно с учётом того, что Xilinx чуть ли уже не основным языком его в Vivado сделал?!
                      А SystemVerilog абсолютно ничего нового не добавляет к последней версии Veriloga в плане синтеза. Verilog'и, VHDL'и и прочие AHDL'и себя изжили. Они были хорошы пока ПЛИСины были относительно маленькие и многие ещё мыслили категориями 155ой серии. Сейчас писанина навороченных систем обработки сигналов на том же убогом Верилоге приводит к тому, что вы занимаетесь ловлей блох в виде разъехавшихся тактов вместо того, что бы сосредоточится собственно на воплощении алгоритмов. Для плисоводов «от сохи», для которых плисоводство — это самоцель, проблем нет. Но для остальных это — проблема.
                      • 0
                        Verilog, SystemVerilog (и SystemC) не только при разработке ПЛИС используется, но и при разработке ASIC тоже.
                        Вот, кстати, довольно профессиональное мнение по этому поводу от человека, имевшего отношение в том числе к разработке таких языков:
                        panchul.livejournal.com/473865.html
                        • 0
                          Ой, я вас умоляю! Вот только Панчула тут не хватало! Этот товарищ только пиарится хорошо научился!
                          • 0
                            Судя по тому, что именно на этой теме его стартап заработал какие-то чувствительные деньги — не только пиариться.
                            Я бы, если вы считаете, что Панчул тут не прав, с удовольствием почитал какие-то внятные аргументы против сказанного в его посте.
                • +1
                  Наверное, это дело вкуса / привычки, но я изучал Verilog и VHDL примерно в одинаковом объёме, и для синтеза VHDL мне понравился намного больше. Мне кажется, что он проще, понятнее, предсказуемее и даёт меньше возможностей выстрелить себе в ногу. В Verilog большое несинтезируемое подмножество, и много синтаксического сахара. Много всяких нюансов надо держать в голове. Зато для верификации он, возможно, и проще (а есть ещё System Verilog для высокоуровневой верификации).
                  • 0
                    Пожалуй, стоит попробовать VHDL, потому что я тоже не любитель держать нюансы в голове.
                    • +1
                      Я как-то дома себе делал на ПЛИСе платку к компьютеру. Если интересно — посмотрите статью, в ней приведена программа на VHDL, привязанная к конкретному, совсем простому, устройству.
                    • 0
                      Как-то я озадачился такой трактовкой. В плане несинтезируемой части VHDL куда богаче (чем просто Verilog, SystemVerilog в свою очередь еще навороченней), равно как и куда многословнее. В то же самое время он выглядит более логичным в рамках общего набора конструкций /личное мнение/ и является более надежным за счет строгой типизации данных.
                      Плюс верилога — лаконичность (кроме бесящего begin — end) и возможность стрелять в ногу под любым углом (если есть на то необходимость).
                      • 0
                        Не только строгая типизация. В VHDL ещё можно свои типы делать!)
                        • 0
                          Это да. Можно троллить вериложников типом fixed_point произвольной разрядности ;)
                    • +4
                      С интересом и упоением прочитал первые абзацы проповеди во славу ПЛИСоведения. Однако, в конце третьего абзаца, я неожиданно увидел влияние тлетворных сил! Призываю тебя автор — вернись на путь истинный! Отрекись от соблазнов быстрого написания и короткого кода. Трудолюбием, терпением и прилежностью проторишь ты себе дорогу к твоему будущему, вернувшись в лоно строгой типизации и контроля кода. Да будет ласкать твой взгляд красивый и гармоничный код VHDL!
                      • +5
                        Не разобраны самые типичные ошибки новичков (множество вложенных if, например) и почему их стоит избегать.

                        Лично у меня впечатление от общения с ПЛИС совершенно противоположное — если можно обойтись без них, то лучше обойтись. С этими корявыми языками (Verilog/VHDL) с ещё более корявыми синтезаторами, этой области, которая пропитана проприетарщиной и всеми её пороками до мозга костей, лучше избегать.
                        • 0
                          Я не сталкивался проблемой вложенных IF, расскажите подробнее.
                          • +2
                            Приведу скрины презентации Xilinx:
                            imgur.com/qnYFjwU
                            imgur.com/JscvPeU
                            imgur.com/nTGyoWa

                            P.S. вставить по-нормальному карма не позволяет
                            • 0
                              Спасибо
                              перезалил слайды




                              Однако, хотелось бы понять, как люди приходят к такой ошибке? Какую логику они хотели получить, создавая такую конструкцию? Просто, глядя код на этих elseif, в общем-то понятно, что описанный приоритет будет реализован именно такой цепочкой мультиплексоров.
                          • +1
                            Вы предпочитаете пользоваться готовыми микросхемами, которые с использованием «корявых языков, еще более корявых синтезаторов, проприетарщины и всех ее пороков» разработали другие люди?
                            • 0
                              Да. Потому что эти микросхемы доведены до нормального состояния. Они работают как описано (да, бывает неопределённое поведение, бывают даже аппаратные баги, но очень редко). И лично мне не придётся мучиться с тем, с чем уже намучились инженеры Intel, ST Microelectronics, Texas Instruments и т.д.

                              Усли же каждый у себя в гараже будет на ПЛИС клепать, то качество этих изделий будет… понятно какое. К тому же это удар по экосистеме — когда ты делаешь свою схему с нуля даже без софт процессора (а если и с ним, то кастомной архитектуры), то ты становишься оторван от всего богатства уже написанного кода, который можно было бы применить. Скажете, что можно будет использовать IP-ядра и делать их самим? Пока область IP-ядер находится в зачаточном состоянии. И видели бы вы, например, Memory Interface Generator (позволяющий реализовать контроллер памяти DDR1/2/3 и др.) или ядро 10 Gigabit Ethernet Mac от Xilinx — там столько всего гвоздями прибито не просто под ПЛИС конкретного производителя, а под конкретное семейство.
                              • 0
                                Так, а причем тут проприетарность-то? Со всеми ее пороками?
                          • 0
                            Отказ от микроконтроллеров конечно хорошо, да только в цене они выигрывают у ПЛИС… И даже не знаю что лучше — потратить лишние человеко-часы на хардкодинг на асме под ARM, или сделать то же на ПЛИС за 5 минут и забубенить на всю партию в 5000 девайсов. Склоняюсь все-таки к потраченным человеко-часам крутого кодера, ибо работа делается один раз, а потом тиражируется на 10-рублевые контроллеры на всю партию(и).
                            • 0
                              Да, могу согласиться. Тут нужно смотреть на задачу. Если это какой-то замысловатый алгоритм, то МК справится лучше. Да и на случай возможной доработки будет место для маневра. С другой стороны, есть задачи, которые на МК решать трудно или вовсе невозможно (например, генерация каких-нибудь сигналов на высоких частотах).
                              А вот обсуждать экономическую часть я больше не берусь. Мир экономики и финансов — он вообще другой. Я же из мира техники. Однажды я порассуждал с моим товарищем, у которого свой бизнес. Про ПЛИСы, которые мне просто интересны, про STM, стоимостью которого вообще можно пренебречь, про ARM. А им это вообще не интересно (изящность решения, полет творческо-технической мысли, перспективы развития). Из самых важных моментов он мне назвал: 1) сможешь ли ты в принципе с делать такое устройство; 2) как быстро ты сделаешь это устройство (чем быстрее, тем лучше). Про стоимость, ценообразование настоятельно рекомендовалось не рассуждать.
                              Но еще мне просто интересна ПЛИС, как платформа для разработки. Поэтому мы ее и обсуждаем.
                              • +3
                                Значит, по своему многолетнему опыту я вам докладываю: есть совершенно чёткая линия, где работает проц, а где — плисина. Плисина работает там, где тупо не хватает скорости DSP-процессора и алгоритм имеет характер конвеерного, или, проще говоря, «беспрерывного однотипного молочения данных». Например, валятся у вас отсчёты с квадратурных АЦП от радиоприёмного фронт-енда. Частота оцифровки мегагерц так 150, разрядность — около 16. На каком, простите, проце вы будете ddc делать? От такого потока даже последние варианты интеловских каменюг задохнутся! Но с этой задачей легко справится даже чуть ли не первый Стратикс стоимостью 40 баксов.

                                Вообще, обычно грамотные ребята системы обработки строят на комбинации: ПЛИС + дээспишник или мощный арм. Плисина молотит всё, что быстро и однообразно (т.е. без сложных ветвлений), а проц добивает то, что медленно и с большим количеством «если». Это — правильный путь, всё остальное — способ попасть на счётчик у заказчика.
                              • 0
                                Можете подсказать, есть ли практика использования FPGA для general purpose computaiton или еще даже для реализации внутренней логики приложений.

                                Есть ли в этом какой то реальный смысл и польза или овчинка выделки не стоит? Есть какие то наработки по использованию привычного opencl с fpga (хотя бы в виде конвертера в verilog)?
                                • +1
                                  FPGA должна конфигурироваться под конкретную задачу, иначе проще и дешевле взять чип общего назначения. Из того, что вспомнилось:
                                  Microsoft Bing использует аппаратное ускорение на базе FPGA Altera ссылка

                                  OpenCL — модная тема у альтеры, опять же, последний год-два. Но каких они там успехов добились сказать сейчас не готов.

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.