Я не знаком с инструментами Xilinx, но я с инструментами Altera, поэтому я расскажу вам об их. Шилинкс и другие не должны быть слишком разными.
Verilog
Первое, что вам нужно сделать, это выучить Verilog . Это может повредить вашей голове, потому что Verilog (и несколько похожий VHDL) был изначально разработан как язык моделирования и множество конструкций (например, #5
что означает «ждать 5 временных шагов», временной шаг, как правило, наносекунда). Таким образом, существует множество ограничений, которые необходимо учитывать, чтобы сделать ваш код Verilog синтезируемым , то есть компилируемым в поток битов для ПЛИС.
Однако самый большой шок заключается в том, что вы пишете в Verilog (и VHDL) поведение, которое вы ожидаете от системы , и компилятор выводит правильную логику из вашего описания. Если вы не будете осторожны, вы можете получить много неприятных ошибок от этого.
Например, D-триггер выглядит так:
always @(posedge RESET or posedge CLK)
begin
if(RESET)
Q <= 1'b0;
else if(CLK_ENA)
Q <= D;
end
Здесь описывается, как работает DFF, и компилятор должен проанализировать его и выяснить, хотите ли вы DFF. Это @(...)
называется списком чувствительности , который представляет собой список сигналов, которые запускают переоценку кодового блока; таким образом, в этом блоке Q
изменяется только при наличии нарастающего фронта RESET
или CLK
(это для сброса активного высокого уровня). Если вы что-то забудете в списке чувствительности (который должен содержать все правые переменные без каких-либо posedge
или negedge
модификаторов для блока комбинационной логики), компилятор будет синтезировать защелки по мере необходимости, а не вызывать ошибку. Сумасшедший, но это так, потому что Verilog изначально был языком моделирования, который скрывал (и, следовательно, не требовал) детали реализации. VHDL такой же, но гораздо более многословный.
Наконец, новая версия Verilog называется SystemVerilog был выпущен несколько лет назад , что делает написание синтезируемого кода намного проще . Если возможно, выучите этот язык, поскольку Xilinx ISE и Altera Quartus II поддерживают его. Основная проблема - полное отсутствие хорошего справочного материала.
Версия DFF SystemVerilog убирает пару мелких вещей:
always_ff @(posedge RESET, posedge CLK)
begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
Обратите внимание, что сигналы в списке чувствительности разделены запятыми. Это потому, что or
сбивает с толку, так как and
не мог работать там. Также обратите внимание на замену 1'b0
(одного 0
бита) на '0
(символ, который расширяется до необходимого количества 0
битов в зависимости от того, для чего он назначается; гораздо более гибкий с параметризованными модулями). Наконец, обратите внимание на замену always
(которая может использоваться для чего угодно; комбинационная логика, защелки и триггеры), для always_ff
которой требуется синтезировать содержимое в триггеры. Также есть список, always_comb
который исключает список чувствительности, поскольку он просто определяет чувствительность от входов к блоку.
Программное обеспечение для проектирования Altera называется Quartus II, и вы будете искать Web Edition . (Подписные издания довольно дороги и нужны только для самых быстрых или самых последних моделей FPGA.)
Грустная часть в том, что я не нашел хорошую книгу на эту тему. То, что я узнал, я собрал воедино из нескольких источников, таких как книги Verilog, которые не очень хорошо рассказывают, что можно синтезировать, а что нет, и пример кода. В Quartus II есть команда «вставить шаблон», которая вставляет код шаблона для нескольких общих структур, от D-триггеров до конечных автоматов.
Демо-оборудование
После того, как вы внедрили свой процессор в Verilog, вам нужно его собрать. В настоящее время пусть Quartus выберет чип (вам нужно выбрать семейство; я бы порекомендовал Cyclone IV) и распиновку. Как только он наберется, вы узнаете, сколько чипа вам нужно. Он сообщит вам, сколько логических элементов, триггеров, битов ОЗУ и т. Д. Вы использовали. Убедитесь, что вы не более 50% на любой из них; если это так, посмотрите на микросхему, которую выбрал компилятор, и вручную выберите следующую большую (в логических элементах) микросхему, которая имеет как минимум столько же контактов, и повторяйте, пока вы не получите коэффициент использования менее 50%.
Затем идите в магазин за демонстрационной платой, в которой есть чип по крайней мере такой же большой, как тот, который вы наконец-то собрали. Убедитесь, что у вас есть периферийные устройства и / или разъемы ввода / вывода, которые вам понадобятся. Нередко создается дочерняя плата, которая подключается к разъему расширения для обеспечения недостающего оборудования.
Теперь, когда вы выбрали свое оборудование, выясните реальные распиновки и используйте планировщик выводов, чтобы поставить правильные сигналы на правильные выводы. На демонстрационной плате будет руководство пользователя, в котором будет указано, какие выводы подключены к каким устройствам или контактам разъемов на демонстрационной плате.
После того, как вы установили распиновку, создайте ее заново, чтобы она использовала нужные вам выводы. Имейте в виду, что некоторым сигналам, таким как системные часы, потребуются специальные входные контакты (поэтому они направляются прямо на внутренние ФАПЧ).
Используйте программатор для загрузки вашего дизайна прямо в FPGA (тот сдвиговый регистр, о котором я упоминал некоторое время назад). Теперь вы находитесь в привычном цикле отладки edit-compile-run. Удар по нему, пока он не работает.
Как только это сработает, вы можете использовать программатор для загрузки кода на встроенное устройство конфигурации, чтобы ваша программа загружалась и работала при включении питания.
Это было довольно долго, и я надеюсь, что это помогло некоторым. Есть чему поучиться; это не то же самое, что изучение нового языка программирования, сколько изучение новой парадигмы программирования, например, переход от процедурных к функциональным языкам. Verilog - это одновременный язык; большая часть кода всегда выполняется.
Удачи!