MIPSfpga і SDRAM. Частина 2

Посилання першу частину
Розглянута нами конфігурація складається з наступних елементів:
image
Шина AHB-Lite
Є основним інструментом для спілкування ядра MIPSfpga з зовнішнім світом. З неї в модуль доступу до SDRAM надходять команди на читання і запис інформації, за нею ж передаються зчитуються і записувані дані. Основна особливість: фаза адреси наступної команди збігається за часом з фазою даних поточної команди. Найкраще це видно на наступній діаграмі:
image
Короткий опис зображених сигналів: HCLK — тактовий сигнал; HADDR — адресу, дані по якому ми хочемо записати або прочитати на наступній фазі, задається майстром; HWRITE — при високому рівні на наступній фазі повинна бути проведена операція запису, виставляється майстром; HRDATA — прочитані дані; HREADY — прапор завершення поточної операції; HWDATA — записувані дані, виставляються майстром. Документація на шину, включаючи опис всіх сигналів та їх можливих комбінацій входить до складу пакету MIPSfpga.
Пам'ять SDRAM
Основні принципи, на яких побудована SDRAM, дуже добре описані в Розділі 5 підручника Харріс-енд-Харріс [1]. Відзначимо головні моменти:
  • для зберігання одного біта використовується інформація про наявність або відсутність заряду конденсатора;
  • пам'ять організована у вигляді матриць з ємностей і керуючої логіки: зі стовпцями і рядками;
  • під час операції читання заряд клітинки (конденсатора) витрачається, після читання її доводиться заряджати;
  • під час бездіяльності величина збереженого заряду також зменшується (хоч і повільніше) — комірки пам'яті вимагають періодичної підзарядки (т. зв. регенерації).
Подальший розгляд продовжимо на прикладі мікросхеми MT48LC64M8A2 компанії Мікрон. Крім дуже зручного і детального даташита компанія надає Verilog модель для симуляції роботи з цим чіпом пам'яті. Що, з одного боку, значно спрощує розробку, а з інший, дозволяє, не маючи налагоджувальної плати, запустити MIPSfpga всередині симулятора і подивитися, як ядро взаємодіє з SDRAM.
Структурна схема чіпа пам'яті представлена на малюнку нижче.
image
Основні елементи:
  • банк (матриця) пам'яті (4x bank memory array) — саме тут зберігаються нас цікавлять дані. У цій мікросхемі 4 банку, в кожному з яких 8192 рядки і 1024 стовпця по 16 біт кожен. Отже, сумарна ємність чіпа 4х8192х1024х16 = 512 Mb = 64 MB.
  • пристрій управління (control logic, bank control logic) — забезпечують декодування отриманої команди і видачу відповідних керуючих сигналів на інші елементи;
  • мультиплексори, засувки і декодери адресної шини (row address mux, 4x bank row address latch & decoder, column address counter/latch, column decoder) — забезпечують зберігання адресної інформації рядків, стовпців і банків пам'яті, надходить в різних командах;
  • регістри і логіка шини даних (data output register, data input register, i/o gating, dqm mask logic) — забезпечують введення/виведення даних при операціях читання і запису, дозволяють працювати з масками (коли з 16 біт нам потрібен тільки старший або молодший байти), забезпечують переклад висновків шини даних в Z-стан, шина є двонаправленою.
Умови функціонування
Для коректної роботи ОЗП нам необхідно виконати ряд умов. Частина з них розглядати не будемо: забезпечення температурного режиму, стабільність частоти і харчування, рівні сигналів (статична дисципліна), правильна розводка на платі. У полі нашого зору залишається:
Для того, щоб предметно розуміти про що йде мова, розглянемо, що повинен зробити модуль доступу до пам'яті при читанні даних з ОЗП. В якості прикладу виступить випадок т. н. READ With Auto Precharge — коли мікросхема після операції читання сама забезпечує підзарядку осередків, до яких ми звернулися. Ініціалізація модуля (INIT), операції запису (WRITE) або автоматична регенерація (AUTO_REFRESH) виконуються аналогічним чином, з різницею у виконуваних командах і накладаються тимчасові обмеження.
Нижче наведено викопіювання з даташита: таблиця істинності для команд і часова діаграма, на якій показано як проводиться коректне читання даних.
image
Примітка: L — низький рівень, H — високий рівень, Х — не має значення, High-Z — високий імпеданс.
image
Примітка: tCMS — command setup time, tCMH — command hold time, tAS — address setup time, tAH — address hold time, tRCD — active command to read, tRAS — command period (ACT to PRE), tRC — command period (ACT to ACT), tLZ — output Low impedance time, tAC — access time from clock, tOH — output data hold time, tRP — commad period (PRE to ACT). Мінімальні значення цих і інших параметрів для різних умов наведено в документації, що чіп пам'яті.
Послідовність дій при читанні даних (тактів)
T0. Не пізніше ніж за tCMS до фронту CLK забезпечити наявність встановили сигналів на висновках CS#, RAS#, CAS#, WE#, DQM (далі — команда), відповідних команді ACTIVE. Зазначені сигнали не повинні змінювати свій стан протягом tCMH з моменту фронту CLK. Не пізніше ніж за tAS до фронту tCLK встановити на шині адреси (A[12:0]) адреса рядка, на шині адреси банку пам'яті (BA[1:0]) — адреса банку пам'яті. Ці сигнали повинні бути стабільними протягом tAH після фронту CLK.
T1. У перебігу (tRCD — 1 такт) подавати команду NOP. Після закінчення цього часового проміжку раніше переданий адресу рядка буде гарантовано збережений в row address latch & decoder відповідного банку пам'яті, відбудеться вибір одного з 8192 рядків (див. структурну схему чіпа).
T2. Не пізніше ніж за tCMS до фронту CLK забезпечити введення команди READ, не змінювати команду протягом tCMH з моменту фронту CLK. Не пізніше ніж за tAS до фронту tCLK встановити на шині адреси адреса стовпця, на шині адреси банку пам'яті — адресу банку пам'яті. Десятий біт шини адреси встановлюється в 1 як ознака того, що після читання необхідно виконати Auto Precharge.
T3-T7. Забезпечити подачу команди NOP на весь час читання даних не менше ніж на (tRC — 1 такт) з моменту подачі команди ACTIVE.
T4. Через CL тактів (т. зв. CAS Latency, CAS) лічені дані будуть гарантовано бути присутнім на шині даних DQ. Якщо більш точно, то вони з'являться на шині (1 такт + tAC) — для випадку, коли CAS = 2. І будуть стабільні протягом мінімум tOH після фронту CLK. За цей час дані з шини необхідно вважати.
Якщо дивитися на взаємодію всередині чіпа, то за час (1 такт + tAC) адреса стовпця буде збережений в column address counter/latch, на виході відповідного банку пам'яті column decoder буде встановлені сигнали, вибирають 16 біт необхідного нам стовпця, ці дані надійдуть у data output register і, зрештою, виявляться на шині даних (DQ[15:0]).
T5-T7. Розглянутий нами приклад припускає, що чіп пам'яті був налаштований на виконання пакетних операцій (burst) c розміром пакета BL = 4 (burst length, задається в числі інших параметрів командою LOAD MODE REGISTER, в поточній реалізації модуля доступу до пам'яті він заданий як BL = 2, щоб отримати 32 біта даних). З цієї причини протягом наступних трьох тактів column address counter/latch буде автоматично збільшуватися на одиницю, а на вихід шини даних — надійде ще 3х16 біт.
Необхідно врахувати, що кількість тактів не обов'язково буде рівною 8, як зображено на діаграмі (Т0-Т7) — воно повинно бути збільшено в більшу сторону з метою задоволення вимог усіх часових обмежень: tRCD, tRC і т. д.
Вимоги тимчасових обмежень виконуються з допомогою
  • зсуву фази тактового сигналу, на якому працює пам'ять (CLK) щодо тактового сигналу, на якій працює модуль доступу до пам'яті — для малих проміжків (tCMS, tCMH, tAS, tAH, tAC, tOH);
  • подачею порожніх команд (NOP) на великих проміжках (tRCD, tRC, tRP) — де розмір затримки перевищує ширину 1 такту тактового сигналу. Для цього в склад кінцевого автомата модуля введені відповідні стани.
Зсув фази тактового сигналу
Є кілька хороших джерел ([3] і [4]), які аргументовано протиставляють "науковий" підхід визначення зсуву фази тактового сигналу методу "проб і помилок". У цих документах наведено ряд формул по обчисленню кордонів "безпечних вікон", в які потрібно підставити значення затримок. Після чого пропонується змістити тактові сигнали таким чином, щоб їх фронти опинилися максимально близькі до центрів цих "вікон". Погоджуючись з тим, що описана методика працює, хочу звернути увагу на кілька більш "ледачий" варіант цього ж підходу (мені здається, що він зображений на 12 і 20 сторінках презентації, але оскільки коментарів до неї немає, то я в цьому не впевнений):
  • беремо два листка/смужки паперу в клітинку (можна міліметрівку);
  • з дотриманням масштабу наносимо на кожен з них кілька тактів тактового сигнал, один з них — для fpga, інший — для мікросхеми пам'яті;
  • з дотриманням масштабу відзначаємо на кожному з них:
    заборонені зони, в яких зчитаний вхідний сигнал не повинен змінюватися (А);
    зони, у яких значення вихідного сигналу не визначено;
    зони, у яких вихідний сигнал є валиндным (Б).
  • маємо смужки паперу паралельно і зміщуємо їх відносно один одного (a-la логарифмічна лінійка) так, щоб зони А знаходились якомога ближче до центрів зон Б і ні в якому разі не виходили за їх межі.
  • вимірюємо лінійкою отримане зміщення тактових сигналів, переводимо його в ns згідно масштабу.
Щоб забезпечити точне і стабільне зсув фаз до складу системи необхідно включити PLL-модуль. Зазвичай я додаю ще 3-й тактовий сигнал з частотою в 4 рази вище, ніж інші невеликим фазовим зсувом — для того, щоб використовувати його в якості тактової частоти для логічного аналізатора (SignalTap) при налагодженні взаємодії з пам'яттю в залозі.
Модуль доступу до пам'яті
У цьому розділі наведено діаграма станів кінцевого автомата модуля доступу до пам'яті, а також окремі рядки коду модуля, що описують процедуру читання даних (із зазначенням номерів рядків коду для спрощення навігації). У повному обсязі всі вихідні коди доступні на github (mfp_ahb_ram_sdram.v).
image
Стану кінцевого автомата, що описують процедуру читання, повністю відповідають тому, що було описано вище на прикладі діаграми READ With Auto Precharge:
image
Правила переходу між цими станами:
image
Там, де необхідна затримка, вона заноситься в регістр delay_n, нульове значення регістра відповідає прапору DelayFinished. На статусах S_READ4_RD0 і S_READ4_RD1 проводиться зчитування даних з шини DQ:
image
Кодування команд і їх виведення в залежності від поточного стану:
image
image
Всі затримки є налаштованим і визначається в параметрах модуля, що повинно спростити портування на інші плати, а також модифікацію параметрів у разі зміни частоти тактового сигналу.
image
Список літератури
[1] Підручник Девіда Харріса і Сари Харріс «Цифрова схемотехніка та архітектура комп'ютера»
[2] Документація на мікросхему пам'яті MT48LC64M8A2 компанії Мікрон;
[3] Документація Quartus. Ядро конроллера SDRAM (переклад)
[4] SDRAM PLL Tuning (презентація)
[5] Ryan Donohue. Synchronization in Digital Logic Circuits, презентація
[6] Документація на мікросхему пам'яті IS42S16320D
Всі даташиты, статті та презентації на які є посилання в статті, доступні на github.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.