#import "/commons.typ": imagebox
= Память.
_Память (статическая и динамическая ячейки, их преимущества и недостатки)._

Модули памяти отличаются типом ячеек и способом их организации.

== Типы ячеек памяти
В современном мире существует два основных типа ячеек памяти -- _статические_ и _динамические_. Статическии ячейки памяти имеют быстрый доступ к чтению и записи, обладают полным набором всех возможностей. Динамичнеские ячейки памяти более медленные, но намного дешевле и имеют более компактную схему.

Статические ячейки памяти используються в кэш памяти и регистровых файлах, где не нужен большой объем, но важна скорость доступа. Динамические ячейки памяти из-за дешевизны и компактности используються в оперативной памяти (DDR\*).

=== Статический
Как уже было упомянуто, статические ячейки памяти достаточно громостки и дороги в производстве. Ячейка состоит из 6 транзисторов. Транзисторы $M_1, M_2$ и $M_3, M_4$ -- 2 разнонаправленных инвертора. Чтение состояния ячейки всегда доступно на $"BL", accent("BL", macron)$ (подав $1$ на $"WL"$). Для записи подаем необходимые значения на $"BL", accent("BL", macron)$, и $1$ на $"WL"$.

Состояние ячейки хранят два инвертора, оно стабильно пока подаеться напряжение на $V_"dd"$ (ячейка энергозависима). Получение состояния возможно почти сразу после подачи сигнала на $"WL"$, что обеспечивает большую скорость доступа.
#imagebox("static_memory_cell.png", height: 120pt, label: [Схема статической ячейки памяти.])

=== Динамический
Динамические ячейки памяти намного более простые и компактные. Состоят из транзистора и конденсатора.
#imagebox("dinamic_memory_cell.png", height: 50pt, label: [Схема динамической ячейки памяти.])

Для чтения подается $1$ на $"AL"$, что увеличит или уменьшит напряжение на $"DL"$ (если увеличилось, то конденсатор был заряжен и стостояние ячейки -- $1$, если уменьшилось, то разряжен, мы его начали заряжать, состояние -- $0$). Для записи значения ячейки необходимо подать соответвующий сигнал на $"DL"$ и на $"AL"$ на достаточное для зарядки/разрядки конденсатора время.

Состояние динамической ячейки памяти хранится в конденсаторе ($"C"$), который немного разряжается после каждого чтения и с течением времени -- ячейка памяти не стабильна. Решениие -- дозаряжать конденсатор после каждого чтения.

Время для чтения достаточно большое из-за необходимости периодически (примерно каждые 64мс) и после каждого чтения памяти заряжать конденсатор.
#imagebox("dinamic_memory_time.png", height: 150pt, label: [График $Q(t)$ зарядки и разрядки конденсатора, $Q_"charge"=Q_0(1-e^(-t/(R C))), Q_"discharge" = Q_0e^(-t/(R C))$])

== Организация ячеек памяти
- *Одиночная организация*. На каждую яческу памяти собственные контакты чтения/записи. Абсолютно не практична из-за количесва проводов -- на 4GiB ОЗУ их потребуется $2^32$.
- *Линейная организация*. В линию распологаем ячейки, подсоединяем шину для записи к демультиплексору, для чтения к мультиплесору. Намного компактнее предыдущего, всего 23 контакта на 1GiB. Для доступа к $2^N$ линиям нужен $N "to" 1$ DMUX/MUX, имеющий большие размеры (увеличиваеться экспоненциально). Также возникают проблемы с синхронизацией большого количества ячеек, расположенных линейно.
  #columns(2)[
    #imagebox("simple_memory.png", height: 120pt)
    #colbreak()
    _Пример. Схема игрушечного модуля памяти на D-триггерах._ Непреемлем в жизни из-за того, что:
    + сами ячейки памяти очень дороги в производстве (целый D-триггер -- много транзисторов)
    + доступ к ним происходит линейно через 1 мультиплексор и демультиплексор
    + шина для передачи адреса чтения/записи очень длинная, отдельно соединена с мультиплексором.
  ]
- *Матричная организация*. Распологаем ячейки в ряды и колонки, доступ происходит через 1 демультиплексор для кодирования ряда, 1 мультиплексор для кодирования колонки.
#imagebox("dynamic_memory_matrix.png", height: 180pt, label: "Пример организации 16 динамических ячеек памяти в матрицу.")
На практике, безусловно, применяется матричный вариант из-за компактости.


