Я не знайомий з інструментами Xilinx, але я з інструментами Altera, тому я розповім вам про їхні. Xilinx та інші не повинні бути занадто різними.
Верилог
Перше, що вам потрібно буде зробити - це вивчити Verilog . Це зробить вашу голову боляче, тому що Verilog (і дещо схожий VHDL) вперше був розроблений як мова імітації , і багато конструкцій (як, наприклад, #5
означає "почекайте 5 часових кроків", тимчасовий крок, як правило, наносекунд). Таким чином, існує багато обмежень, про які вам потрібно пам’ятати, щоб зробити ваш код Verilog синтезованим , тобто комбінованим у бітовий потік для FPGA.
Найбільшим шоком є те, що те, що ви пишете у 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. Основна проблема - цілком відсутність хороших довідкових матеріалів.
Версія SystemVerilog DFF очищує пару дрібниць:
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, і ви шукаєте веб-версію . (Видання підписки є досить дорогим і потрібне лише для найшвидших або останніх FPGA-моделей.)
Сумно полягає в тому, що я не знайшов гарної книги на цю тему. Що я дізнався, я отримав, зібравши речі з різних джерел, таких як книги Verilog, які не дуже добре розповідають, що можна синтезувати, а що ні, і, наприклад, код. У Quartus II є команда "шаблон шаблону", яка вставляє код шаблону для декількох загальних структур, від D тригмарів до станкових машин.
Демо обладнання
Після того як ви реалізували ваш процесор у Verilog, вам потрібно його скласти. На даний момент дозвольте Quartus обрати чіп (ви повинні вибрати сім'ю; я б рекомендував Cyclone IV) та розпізнавання. Як тільки він з'явиться, ви дізнаєтеся, скільки чіпа вам потрібно. Він підкаже, скільки логічних елементів, фліп-флопів, бітів оперативної пам’яті тощо ви використовували. Переконайтеся, що ви не перевищували 50% на будь-якому з них; якщо ви є, подивіться на мікросхему, яку вибрав компілятор і вручну виберіть наступну більшу (в логічних елементах) мікросхему, яка має щонайменше стільки штифтів, і повторюйте, поки ви не отримаєте використання менше 50%.
Потім вирушайте за покупками на демонстраційну дошку, яка має чіп як мінімум такий же великий, як той, який ви нарешті створили. Перевірте, чи є у нього периферійні пристрої та / або роз'єми вводу / виводу, які вам знадобляться. Не рідкість побудувати дочірню карту, яка підключається до роз'єму розширення для забезпечення будь-якого відсутнього обладнання.
Тепер, коли ви вибрали обладнання, з’ясуйте справжні розпізнавання та використовуйте Планувальник контактів, щоб виставити правильні сигнали на праві штифти. На демонстраційній платі буде посібник користувача, який розповість вам, які штифти підключені до яких пристроїв або роз'ємів на демонстраційній платі.
Як тільки ви встановите гніздо, встановіть його знову, щоб він використовував потрібні шпильки. Майте на увазі, що для деяких сигналів, таких як системні тактові годинники, знадобляться спеціальні вхідні штифти (тому вони спрямовуються прямо до внутрішніх PLL).
Використовуйте програміст для завантаження вашого дизайну безпосередньо в FPGA (цей регістр зрушень я згадував деякий час назад). Тепер ви перебуваєте у звичному циклі налагодження редагування-збирання. Бийте по ньому, поки воно не працює.
Як тільки це працює, ви можете скористатися програмістом для завантаження коду на бортовий конфігураційний пристрій, щоб ваша програма завантажувалася та працювала при включенні.
Це було досить довго, і я сподіваюся, що це допомогло деяким. Є чому навчитися; це не так, як вивчати нову мову програмування настільки, як це вивчати нову парадигму програмування, наприклад, перехід від процедурних до функціональних мов. Верилог - це одночасна мова; більша частина коду завжди виконується.
Удачі!