Процесор в ПЛІС - це дуже просто!
- тут йде чисто підготовка і редагування -
Передмова або трохи лірики.
Сучасна електроніка давно переступила ту межу, коли складні схеми вимагали зусиль величезних колективів і серйозних фінансових вкладень. Зараз, коли існують програмовані логічні інтегральні схеми (ПЛІС), розробка стала настільки простий, що найскладніші схеми можна створювати за лічені години силами одного інженера.
Тут я маю намір представити одну з подібних розробок, яка покаже, як можна робити свої процесори в ПЛІС. І покаже, наскільки це просто на сучасному рівні розвитку цифрової електроніки.
Метою даної статті є не отримання "мінімального", "оптимального", "кращого" або ще якогось іншого екстра-властивості процесора, а уявлення принципу його побудови і побудова якоїсь основи, яка може підійти для побудови інших процесорів і здійснення задумів програмістів, які раніше, можливо, просто боялися торкатися такої складної сфери, як процесоробудування.
1. Що таке процесор? Відповідь на це питання, як виявляється, не такий простий. Якщо звернутися до інтернету, то буде отримано безліч відповідей описового плану, в яких немає ні краплі суті того, що ж таке процесор? І як відрізнити процесор від якої-небудь іншої схеми? І чи треба шукати цю відмінність? Забудемо про все це, і спробуємо дати відповідь з точки зору цифрової електроніки.
У процесорів є багато властивостей, але одним з найголовніших є здатність процесора виконувати якусь програму дій. І в цьому сенсі процесор є виконавчим пристроєм для виконання програм. З точки зору такого визначення процесор може виявитися яким завгодно. І механічним, і електричним, і гідравлічним.
Проте, в даному випадку нас цікавить тільки один тип процесорів. Це процесор цифрової електронний. Якщо розбиратися в цифрових електронних процесорах і почати з самого початку, з історії їх створення, то досить швидко стане ясно, що подібний процесор складається з цифрових елементів певних типів. А саме, з розлогих логічних схем і безлічі регістрів, які в свою чергу складаються з тригерів (зазвичай D-типу). Покроково розбираючи подібні схеми можна прийти до певного висновку.
А саме: Процесор - це цифрова електронна схема, що представляє собою кінцевий автомат, призначений для виконання програми, записаної цифровими кодами.
Саме це визначення і закладено в основу розробки, описуваної в даній статті.
2. Кінцевий автомат Про те, що таке кінцевий автомат (КА) і теорію їх побудови можна досить легко прочитати в літературі і в інтернеті. Тут відповідей на ці питання немає місця. Тут важливо тільки, що одним з видів електронного цифрового кінцевого автомата є схема такого вигляду:
Рис.1.
Для стабільної роботи КА необхідно, щоб час відпрацювання логічної частини схеми було менше, ніж період синхронізуючих імпульсів, що надходять на вхід CLK. Це зауваження буде важливо надалі.
3. Спосіб опису процесора Опис процесора являє собою електричну схему, яку можна представляти по-різному. Звична для інженерів графічна схема для процесора мало підходить, так як будь-яка її правка при виникненні такої необхідності призводить до певних складнощів. Щоб обійти ці труднощі були розроблені мови опису апаратури (HDL), які дозволяють не тільки досить наочно описати схему процесора, але і легко її виправляти, так як виправлення текстового документа набагато простіше, ніж графічного.
У цій статті буде використовуватися альтеровскій HDL - AHDL, a перевірятися в альтеровском САПР - Quartus II. При бажанні, код може бути легко перекладений на VHDL зважаючи на свою прозорості та простоти застосовуваних конструкцій.
4. Складові частини процесора говорити про те, які регістри, які функції вони виконують і як конкретно вони з'єднані в даний момент не будемо (про це скажемо трохи нижче). Весь набір регістрів процесора є одним великим регістром, який так і назвемо BigRegister. І, згідно з рис.1 схема процесора (що є кінцевим автоматом), повинна містити крім "великої регістра" якесь логічне ядро, яке так назвемо LogicKernel. Інших частин у процесора немає. Входи і виходи для зовнішніх пристроїв розташовуються в LogicKernel, а BigRegister містить тільки внутрішні регістри процесора. У LogicKernel, звичайно, ніхто не забороняє безпосередньо з'єднати частина регістрів з виходами або подати на входи іншій частині регістрів дані зі входів логічного ядра, тому на Рис.1 і не показані можливі регістри на входах і виходах. Мається на увазі, що вони знаходяться серед Тригер великого регістра, якщо вони потрібні.
Відповідно до цими заявами, складемо верхній ієрархічний елемент процесора на мові AHDL:
Це дуже узагальнена схема процесора з знеособленими входами і виходами. В реальній схемі входи і виходи придбають конкретні назви і параметри ширини шин. Зауважимо тільки, що входи і виходи ланцюгів, з'єднаних з регістром в обох модулях процесора названі однаково, і входи передує символом 'i', а виходи символом 'o'. Для AHDL ці символи є просто частинами імен та нічого не значать. Можна, наприклад, у регістру назви входів і виходів поміняти місцями, і тоді останні рядки опису будуть з'єднувати однойменні висновки логічного ядра і великого регістра. У якихось випадках це може виявитися зручно, але тут застосовується інша ідея. Сенс якої в тому, щоб програмісту було якомога зручніше розуміти, що куди підключається. Всі входи починаються з символу 'i', а виходи з символу 'про'.
Набір регістрів буде наступним:
Набір входів / виходів процесора:
Відповідно до цими ідеями, редагуємо верхній файл проекту:
Можна було б і не оформляти великий регістр окремим файлом, а вписати всі його елементи в файл верхнього рівня, але так не зроблено навмисно з урахуванням подальшої націленості на модифікацію цього процесора від одноядерного до багатоядерних варіанту, в якому поділ регістрів і логіки має істотне значення.
Початок файлу логічного ядра:
5. Логічне ядро Логічне ядро процесора вимагає особливої уваги, тому вихідний текст логічного ядра в попередньому параграфі і був обірваний "на найцікавішому місці".
В першу чергу нагадаю, що у нас логічне ядро - це чисто комбінарторная схема, а значить, в секції елементів схеми немає ніяких Тригер і засувок. Так само, виключені і всі елементи, що описують структуру ПЛІС. Вся реалізація ядра віддається "на відкуп компілятору", а елементами призначаються лише деякі шини, які зручні для опису схеми і зовсім не зобов'язані бути присутніми в ПЛІС явно. Та це й не потрібно.
Секція елементів схеми логічного ядра:
Вибір, які шини іменувати в цій секції, лежить повністю на розробника, і не має особливого значення для суті даної статті, тому тут наведено конкретний набір без пояснень, чому саме такі шини обрані для опису.
Секція логічного опису: