Внутрішня структура ПЛІС (FPGA)

В останній час небезвісний китайський сайт пропонує купити радіолюбителям різного роду налагоджувальні плати на ПЛІС, але, на жаль, доступного для непідготовленого розуму (ну або такого, яке б мені сподобалося) опису українською (як же ЕТО працює?) на просторах інтернету я не знайшов. З часом, звичайно, розуміння прийшло, але також прийшло й бажання написати деяку вступну статтю з красивими картинками, які б наочно пояснювали суть ПЛІС. Розпочнемо.

ПЛІС - Програмована Логічна Інтегральна Схема. ВАЖЛИВО! Існує два типи БІС (Велика Інтегральна Схема), які у нас в СНД потрапляють під визначення ПЛІС, але тим не менш принцип роботи цих БІС відрізняється, що створює певний дисонанс з реальним станом справ. В той же час на заході у кожної з цих БІС є цілком своє власне назва, чітко ставлячи всі крапки над i, а саме: CPLD-мікросхема - це ПЛІС, прошивка (конфігурація) якої ЗАВЖДИ зберігається в самій мікросхемі і при вимкненні живлення НІКОЛИ не стирається. Здається цілком логічним, що прошивка сама-собою повинна зберігатися в мікросхемі, і акцентувати увагу на цьому не слід, але перейдемо до наступної БІС. FPGA-мікросхема - це також ПЛІС, але її конфігурація зберігається на зовнішньому енергонезалежному джерелі пам'яті (наприклад, всякого роду flash). Як це працює? Дуже просто, при кожному вмиканні, FPGA прошиває саму себе конфігурацією, яку бере з пам'яті, а при вимкненні стирається.

Хотілось би відзначити, що процес написання конфігурації на CPLD і на FPGA нічим не відрізняється: все пишеться на мові опису апаратури VHDL або Verilog. Потім відбувається синтез і імплементація (компілятор спочатку намагається зрозуміти, що ви написали, а потім намагається розмістити всі структури, регістри і з'єднання в ПЛІС, на основі написаного), і на останньому етапі генерується .bit - файл, який зашивається програматором по JTAG-інтерфейсу в пристрій.

Якщо з CPLD ще якось звичніше працювати ("Ну як в мікроконтролері!" - скажете Ви), то FPGA, з усіма її незрозумілими зовнішніми джерелами пам'яті, здаються якимось нісенітницею, тому все нижче написане буде присвячене FPGA (але прийоми програмування справедливі і для CPLD), щоб внести деяку ясність у це питання. Всі приклади коду будуть виконуватись на мові VHDL.

Розглянемо найменшу складову FPGA, яка називається PLB - Програмований Логічний Блок. 

Рисунок 1

PLB складається з LUT-таблиці відповідності, мультиплексора і D-тригера. Розглянемо для початку LUT. По суті, LUT - це статичне ОЗУ (ОЗУ - Оперативне Запам'ятовуюче Пристрій. Є енергозалежною пам'яттю, тобто при відключенні живлення дані стираються. (Увімкнув. Записав. Вимкнув. Увімкнув знову, а всі записані дані стерті). Має високі показники швидкості.), в якому зберігаються вихідні значення X, утворені значеннями A,B,C,D.  

Припустимо, нам потрібно реалізувати на ПЛІС схему представлену на малюнку нижче,  з відповідною таблицею істинності:

   

Сигнали A, В, С, D подаються на вхід LUT, далі виходячи з таблиці істинності, яка зберігається в LUT, миттєво формується сигнал X. Все дуже просто. У коді це виглядає так:

X <= (A nand B) nand (C nand D); 

На малюнку нижче червоною лінією показано, як формується вихідний сигнал на апаратному рівні:

Але що, якщо нам потрібно синхронізувати сигнал по тактовій частоті? Тоді, в процесі написання конфігурації, нам потрібно вказати, що вихідний сигнал буде встановлюватись або по фронту (rising_edge(clk)) або по зрізу (falling_edge(clk)) тактового сигналу CLK, і компілятор буде брати вихідний сигнал не з виходу X, а з виходу Y. На мові VHDL це виглядає так:

process(clk)

begin

  if (rising_edge(clk)) then

   Y <= (A nand B) nand (C nand D); 

  end if;

end process;

На апаратному рівні це відбувається так: сигнал з LUT йде на Т-триггер, який встановлює значення виходу Y по CLK.  

Що робити якщо потрібно затримати вхідний сигнал на один такт? Тоді в конфігурації ми присвоюємо сигнал, який потрібно затримати, новому сигналу в процесі синхронізованому по CLK:

process(clk)

begin

  if (rising_edge(clk)) then

   Y <= Е; 

  end if;

end process;

Апаратно це відбувається так:

Нагадую, все вище розглянуте відбувається в рамках ОДНІЄЇ НАЙМЕНШОЇ складової FPGA, а саме PLB. Але всередині FPGA десятки тисяч таких PLB (а може і сотні, технології вони такі: не стоять на місці), які можуть з'єднуватися між собою. Для простоти організації зв'язків між ними, в FPGA застосовується певний модульний принцип: мале складає велике: дві PLB утворюють один SLICE. 

Два SLICE утворюють один конфігураційний логічний блок (CLB), всередині якого SLICE можуть утворювати зв'язок. Таким чином, за рахунок оптимізації адресації всередині FPGA, компілятору простіше виробляти імплементацію нашої конфігурації по кристалу. 

На завершення хотілося б розповісти чому варто придивитися до ПЛІС, і зокрема до FPGA-мікросхем. По-перше, це необмежене поле для творчості: потрібен екзотичний 13-бітний таймер/лічильник? - отримайте. Потрібно 15 UART? - легко. Передати дані зі швидкістю 6 Гбіт/с? - не питання. І якщо переваги ПЛІС очевидні, то перейдемо до того, яка з них переважніша: CPLD чи FPGA? Хотілося б відзначити, що власне тут все залежить від застосування. Якщо проект не великий, але вимагає специфічної периферії, то це CPLD. А якщо потрібна гнучкість і дуже великі швидкості, то це FPGA. Нічого не заважає вам зробити так, щоб в якийсь момент часу FPGA працювала спочатку за однією прошивкою, потім за другою, третьою, п'ятою, десятою (властивість реконфігурованості), адже на відміну від інших мікросхем, ресурс запис/стираня у FPGA прагне до безкінечності (коли востаннє ви змінювали оперативну пам'ять у своєму ПК через те, що ви використали її ресурс на запис/стирення? Ось і я про це. Власне на цьому все, дякую за увагу

Top