Ферритовая память. Как это работало? Просто о сложном
08.10.2022 (17.06.2021)
Эта статья была мной ранее (16 июня 2021 года) опубликована на канале Разумный мир в Дзен (бывший Яндекс.Дзен). Однако, последние изменения в Дзен привели к необходимости переноса статей на другие ресурсы. Статья публикуется с небольшими изменениями и дополнениями.
В статье о редкой специализированной вычислительной машине 15ВСМ-5 , которая выпускалась в СССР, я упомянул, что ОЗУ на магнитных кольцах сохраняло информацию при отключении питания. Это вызвало сомнения у некоторых читателей, которым не посчастливилось (или наоборот, посчастливилось?) столкнуться с таким типом памяти. Да, ферритовая память была вытеснена микросхемами и сегодня является памятником эпохи "вычислительных динозавров". Она занимала много места, была не самой экономичной, частенько капризничала... Это все верно. Но именно благодаря этому типу памяти стало возможным бурное развитие ЭВМ, которое и привело к тому, что сегодня мы называем "веком информации". Мне захотелось немного вспомнить, и рассказать, как работала и как была устроена такая ферритовая память. Которая в свое время потрепала нам немало нервов. Это статья и из серии "Архитектура ЭВМ", и из серии "История вычислительной техники".
Эта статья не является учебником по построению блоков ферритовой памяти. Я буду объяснять, что называется, "на пальцах", в самом общем и упрощенном виде. Этого достаточно, что бы вы поняли, как такая память работает, удовлетворили свое любопытство. В конечном итоге, сегодня никто уже не будет проектировать блоки такой памяти...
Все иллюстрации в статье, за исключением фотографий модулей памяти, подготовлены мной.
Электричество и магнетизм
Сначала нам придется вспомнить немного физики. Не пугайтесь, совсем немного, причем формул не будет, но будут иллюстрации. Как вы без сомнения помните, протекающий по проводнику ток создает вокруг него магнитное поле. В школьных учебниках физики это обычно показывают примерно так
Направление вектора магнитной индукции создаваемого током поля определяется по правилу буравчика (правого винта). Изменив направление тока на противоположное мы изменим и направление вектора магнитной индукции. Здесь все очень просто. При отсутствии тока в проводнике не будет и магнитного поля вокруг проводника. Нам осталось вспомнить о явлении гистерезиса, которое наблюдается у ферромагнитных материалов. Параметры петли гистерезиса зависят от свойств ферромагнитного материала. И возможно подобрать такой состав материала, что петля будет очень близкой к прямоугольному виду. Именно то нам сегодня и нужно
Здесь для нас будет самым важным тот факт, что ферромагнитные материалы могут иметь остаточную намагниченность (точки +Br и -Br). Именно благодаря этому и возможна магнитная запись (лента, дискета, жесткий диск). Но нас сегодня интересует память на ферритовых сердечниках, а не магнитная запись.
Ферритовый сердечник как элемент с памятью
Давайте возьмем сердечник из ферромагнитного материала. Для определенности и простоты это будет кольцевой сердечник из феррита. Причем это будет феррит с петлей гистерезиса близкой к прямоугольной и достаточно большой коэрцитивной силой (Hc). Пропустим через сердечник проводник и будем пропускать через него электрический ток. Направление тока в проводнике определяет направление намагниченности сердечника. Можно принять, что одно направление соответствует логическому нулю, а противоположное логической единице
Если бы у нас не было сердечника, то после отключения тока магнитное поле бы исчезало. Однако, благодаря гистерезису, сердечник сохранит остаточную намагниченность, если сила тока в проводнике была достаточно большой, после отключения тока. Значит, наш сердечник обладает памятью состояния. И мы можем переключать состояния сердечника просто изменяя направление тока через проводник. Всего у нас будет два состояния, которые соответствуют остаточной индукции +Br и - Br. Мы можем принять одно состояние за логический 0, а другое за логическую 1.
Что бы переключить сердечник из одного состояния в другое (сменить состояние) нам нужно довести его до состояния насыщения. А для этого необходима напряженность магнитного поля не менее Hm (по модулю). Это определяет и величину тока, которая должна протекать по проводнику. Если ток будет меньше, напряженность создаваемого им магнитного поля будет недостаточной для перемагничивания сердечника в одно из устойчивых состояний. И "хранящая в сердечнике" информация или не изменится, или будет потеряна (разрушена). Таким образом, сердечник может сохранять ровно 1 бит информации. Записать этот бит можно импульсом тока, соответствующего направления, в проходящем через сердечник проводнике. Причем хранить информацию сердечник будет и после окончания импульса тока, так как оба состояния намагниченности являются устойчивыми. А значит, для хранения информации нам не требуется напряжение питания. Но как прочитать хранящуюся информацию? Скоро узнаем и это. Но сначала давайте решим одну проблему, которая не позволяет использовать сердечник для построения модулей памяти большого объема. Дело в том, что в рассмотренном нами случае количество проводников будет равно количеству бит хранящейся информации. А если информации много?
Матрица ферритовых сердечников как накопитель с побитовой адресацией
Давайте снова вспомним физику. Для перемагничивания сердечника нам нужно создать магнитное поле определенной напряженности. Но кто сказал, что это поле должно создаваться единственным током? Давайте через каждый сердечник пропустим по два проводника
Теперь напряженность магнитного поля будет определяться суммой напряженностей создаваемых каждым током. А сердечники мы можем собрать в матрицу. Для примера я показал матрицу на 64 бита с организацией 8х8. И нам потребовалось только 16 проводников, а не 64. А вот так выглядит в реальности такая матрица (Матрица-накопитель ОЗУ на ферритовых сердечниках, которая использовалась в программируемом настольном калькуляторе Casio AL-1000), крупным планом
Такое хитрое расположение колец нужно для минимизации помех, в первую очередь. Но об этом позже. Теперь для перемагничивания сердечника (записи информации) нам нужно подавать импульсы тока одновременно по двум проводникам. Это позволит создать необходимую напряженность магнитного поля в сердечнике расположенном на пересечении проводников. И такой сердечник будет единственным. Во всех остальных сердечниках расположенных в той же строке (координата X) и том же столбце (координата Y) напряженность поля будет недостаточной и состояние сердечника изменяться не будет.
Предположим, что для создания магнитного поля напряженностью Hm через единственный проводник должен протекать тока Is. Так как в матрице у нас два проводника, разумно задавать токи в них равными
Isx = Isy = Is / 2
Вот теперь хорошо видно, почему я в комментариях к статье о 15ВСМ-5 говорил о полутоках. Иногда их называют токами полувыборки или токами полузаписи. Теперь мы может увидеть, что к материалу сердечника предъявляется еще одно требование. Коэрцитивная сила Hc должна быть больше Hm/2. В противном случае полуток будет искажать состояние сердечника просто размагничивая его. Так что далеко не каждый ферритовый сердечник может использоваться для построения ОЗУ. Давайте теперь договоримся о направлениях токов и соответствующих этим направлениям состояниям сердечника (хранимой информации)
На самом правом рисунке показана комбинация направлений токов создающая в сердечнике нулевую напряженность магнитного поля, что не изменяет состояния сердечника. На самом деле мы могли выбрать и прямо противоположные обозначения для состояний сердечника. Это влияет только на наше восприятие, но не на саму работу ферритовой памяти. На самом же деле, эта иллюстрация показывает и процесс записи информации в сердечник. Только ток будет протекать не постоянно, а импульсами, в момент записи.
Как же все таки его прочитать?
В общем и целом, все просто. Нужно добавить еще один проводник, который будет выполнять роль обмотки чтения. Однако, это только на первый взгляд все просто. Давайте, для начала, вспомним, как передается импульс через трансформатор. Ведь каждый бит ферритовой памяти это маленький импульсный трансформатор. Пока возьмем обычный феррит и предположим, что насыщения сердечника нет
Импульсы на обмотке считывания короткие, так как индуктивность проводников, проходящих через сердечник (индуктивность обмоток), мала. На самом деле, здесь еще добавляется влияние взаимной емкости проводников обмоток. А теперь посмотрим, как изменится форма напряжения на обмотке считывания, если у нас будет сердечник с прямоугольной петлей гистерезиса и остаточной намагниченностью
Если сердечник перемагничивается импульсом тока (0->1 или 1->0), то импульс напряжения имеет большую длительность. Перемагничивание не мгновенный процесс, поэтому и импульс напряжения будет иметь другую форму (и амплитуду). Если же сердечник не изменил свое состояние, например, записывалось тоже самое состояние, что было раньше, то форма напряжения на обмотке считывания будет примерно такой же, как на предыдущей иллюстрации. Условно можно считать, если сердечник не перемагничивается, то импульс напряжения на обмотке считывания отсутствует. А если перемагничивается, то импульс будет. Именно так это зачастую изображали в учебниках. А короткие импульсы на фронте и спаде импульса тока считались помехами. Но об этом чуть далее.
Обратите внимание, что чтение состояния сердечника (чтение информации) будет приводить к разрушению информации. Это принципиальный момент в работе ферритовой памяти. Поэтому после считывания обязательно нужно выполнять запись для восстановления хранимой информации. Таким образом, операции записи и чтения, по своей сути, выполняются абсолютно одинаково, перемагничиванием сердечника. Просто при записи нас не интересует сигнал с обмотки считывания, а при чтении именно он и интересует. Поскольку мы, в общем случае, не знаем состояние сердечника, нам надо решить, в какое состояние мы будем приводить его при считывании. Здесь нет никакой принципиальной разницы, можно выбирать и запись 0, и запись 1. Давайте примем, что для считывания мы будем выполнять запись нуля. И мы получаем вот такое
Таким образом мы получили вполне работоспособный "модуль памяти" емкостью 64 бита. А еще точнее, накопитель для модуля памяти, матрицу ячеек памяти. Так как для полноценного модуля памяти, который может использоваться в составе вычислительной машины, здесь еще многого не хватает. И прежде всего, разрядность в один бит совершенно недостаточна.
Куб памяти
Красивое название... Оно и писателям фантастам в те времена нравилось. Но у нас совсем иные задачи, поэтому не красотой будем любоваться, а разбираться, что это такое и как работает. Итак, нам недостаточно разрядности в 1 бит. Но мы ведь можем собрать несколько, например, восемь, таких модулей-накопителей в единое целое. Вот такая "стопка" накопителей и будет внешне напоминать параллелепипед. А при некотором стечении обстоятельств (разрядность, размеры одного накопителя) форма параллелепипеда будет близка к кубической. Так вот и появился этот термин. А каждый отдельный накопитель в кубе является своеобразной "битовой плоскостью" (мне нравится именно этот термин). Вот так выглядел "Куб памяти" из реальной вычислительной машины
Это куб ферритовой памяти (ОЗУ) вычислительной машины "Сетунь", с вспомогательными элементами, но без схем управления. В таком "кубе памяти" проводники (обмотки) выбора сердечника (адрес Х и адрес Y) могут соединяться последовательно или параллельно, для всех битовых плоскостей. Обычно выбирают последовательное соединение, так как количество источников тока и ключей будет меньшим.
В данном случае, у нас есть три битовых плоскости с общими проводниками адресации сердечников. А вот обмотки считывания у них разные.
Запись и чтение (запись с регенерацией) куба памяти
Ранее мы рассматривали процессы записи и чтения одного бита, одного сердечника. Причем не в реальном блоке памяти, а скорее его модели. Пришло время посмотреть, как же все будет выполняться в рамках всего накопителя, того самого куба. Давайте еще раз вспомним, что чтение это та же самая запись по своей сути. Только результатом является сигнал с обмоток считывания, а не изменение состояния сердечников. Причем мы договорились, что считывание будет выполняться как запись нулей. А значит, после считывания у нас все выбранные сердечники находятся в состоянии соответствующем нулю. То есть, для восстановления состояния, разрушенного чтением, нам всего лишь нужно записать в нужные места единицы. Запись нуля и единицы различаются направлением токов в координатных проводниках. Это мы уже рассматривали. Но теперь у нас куб памяти, несколько битовых плоскостей, а вот адресные проводники у них общие. И мы не можем изменить состояние сердечника в отдельно взятой битовой плоскости. У нас единицы (мы их записываем, помните?) запишутся во все биты. А это совсем не то, что нам нужно!
Запись единицы в отдельно взятый бит невозможна, так как одновременно выбираются соответствующие сердечники сразу во всех битовых плоскостях. Что делать? Использовать для каждой битовой плоскости свои адресные дешифраторы и свои генераторы тока? Это слишком громоздко и дорого! Но есть решение попроще! Давайте его и рассмотрим поближе
Мы добавили еще один проводник, который позволит нам разрешать или запрещать запись. Давайте посмотрим, как это работает
Протекание тока через проводник блокировки препятствует перемагничиванию сердечника (записи единицы). Индекс i у тока блокировки обозначает inhibit (подавление). Так как этот ток подавляет запись единицы. Обратите внимание, что длительность импульса блокировки (подавления) немного больше длительности импульсов координатных токов. Но почему это работает? Посмотрите внимательнее на иллюстрацию. Ток блокировки имеет направление противоположное координатным (адресным) токам. А значит, он будет снижать напряженность результирующего магнитного поля в сердечнике.
H = Hx + Hy - Hi
И ее станет недостаточно для перемагничивания сердечника. В результате, сердечник останется в том состоянии, которое было до записи. То есть, в состоянии соответствующем нулю. Обмотка блокировки располагается точно так же, как обмотка считывания. То есть, проходит через все сердечники своей битовой плоскости. Я позволю себе не приводить иллюстрацию накопителя с обмотками блокировки. Таким образом, у нас в кубе все битовые плоскости имеют общие координатные проводники, но каждая плоскость имеет собственную обмотку считывания и собственную обмотку блокировки.
Как показывает моя практика, обмотка блокировки вызывает (точнее, вызывала) больше всего вопросов у студентов. Зачем она нужна, если мы можем просто изменить направление тока или отключить один из координатных проводников? Дело в том, что обычно на лекциях рассматривалась работа одной, отдельно взятой, матрицы сердечников, а не куба в целом. И для отдельной матрицы обмотка блокировки действительно не нужна. Но она обязательно нужна при объединении матриц в куб. И я посчитал важным, по старой памяти (моей, не ферритовой), уточнить это в статье отдельно.
Здесь возникает вполне закономерный вопрос. А зачем нужна еще обмотка (проводник), неужели нельзя использовать для блокировки обмотку считывания? Безусловно, обмотку считывания можно использовать для блокировки. Более того, такие блоки памяти выпускались. Просто элементная база на первых этапах не позволяла этого, поэтому была добавлена отдельная обмотка (проводник). Теперь мы полностью готовы к рассмотрению работы куба памяти в целом.
Общие соглашения
Основным состоянием ферритовых сердечников будем считать состояние соответствующее логическому нулю. Процесс записи будет переводить выбранные сердечники в состояние соответствующее логической единице. Процесс считывания, в отличии от записи, будет переводить сердечники в состояние соответствующее логическому нулю. При этом наличие импульса на обмотке считывания будет обозначать, что сердечник хранил "1", а отсутствие - "0".
Всего можно выделить три основных типа операций:
- Стирание. Содержимое всех бит (всех битовых плоскостей) соответствующих заданному адресу устанавливается в "0". Эту операцию не всегда выделяют отдельно, так как она может рассматриваться как запись нулей. Однако, стирание выполняется быстрее, чем запись. Более того, стирание является частью операции записи. Поэтому блоки ферритовой памяти нередко реализуют эту операцию как отдельную.
- Стирание+Запись. Как мы помним, невозможно одновременно разнонаправленно изменить состояние отдельных сердечников (бит) в кубе памяти. Обмотки блокировки позволяют исключить перемагничивание некоторых сердечников, но не более того. Поэтому любой операции записи обязательно должно предшествовать стирание. Иначе мы не сможем изменить состояние бита с "1" на "0".
- Чтение+регенерация. Чтение это запись "0", по своей сути. Поэтому нам необходимо после чтения выполнить запись только что считанной информации. То есть, выполнить регенерацию.
Иногда блок памяти может реализовывать и другие операции, например, "разрушающее чтение". То есть, чтение без восстановления информации. Или операцию "установка бита", то есть, запись без стирания. Но указанные мной три операции являются основными.
Операция "Стирание"
Выполняется за один цикл доступа к памяти. Для этой операции нужен только адрес.Функциональная схема работы блока ферритовой памяти при выполнении операции "Стирание"
Я не стал показывал сигналы стробирования. Дешифратор адреса, в данном случае, включает в себя и формирователи токов для координатных проводников. Синими стрелками показаны направления токов для перемагничивания сердечников в состояние "0". В данном случае, будем считать, что для записи нулей токи (с точки зрения куба) должны быть вытекающими. При поступлении на дешифратор адреса стираемой ячейки памяти формируются токовые импульсы в координатных проводниках. Проводники (обмотки) блокировки и считывания не используются и остаются не подключенными.
На иллюстрации я показал, что импульсы координатных токов подаются одновременно и синхронно. Однако, это совершенно не обязательно. Например, может быть сначала подан ток Ix, затем ток Iy, затем ток Ix снят, затем снят ток Iy. Просто должен быть момент, когда протекают оба тока. Причем в течении времени достаточного для перемагничивания сердечников.
Операция "Стирание + запись"
Функциональная схема работы блока ферритовой памяти при выполнении операции "Стирание+Запись"
В данном случае выполняется уже два цикла доступа к памяти. Первый, "Стирание", полностью аналогичен ранее рассмотренному. Второй, "Запись 1", выполняет перемагничивание сердечников, которые должны хранить "1". Для этого нам уже нужен регистр записываемых данных, который включает в себя формирователи токов обмоток блокировки. Обратите внимание, что я показал выходы регистра данных инверсными. То есть, ток в обмотку блокировки (она для каждого бита своя) подается если соответствующий бит равен нулю. Вы же помните, что записываем мы именно "1".
Обратите внимание, что теперь у нас координатные токи (с точки зрения куба) втекающие. Я показал их в момент записи, при стирании они будут вытекающими. А вот ток блокировок вытекающий. Он и должен иметь направление противоположное координатным токам. Подача тока в обмотки блокировки исключает перемагничивание сердечников соответствующих бит. И они остаются в состоянии "0". Как и раньше я показывал, ток в обмотки блокировки должен подаваться до координатных токов, а отключаться после.
Обмотка считывания при операции "Стирание+Запись" не используется. Да, ее можно использовать вместо обмотки блокировки. Я не буду отдельно иллюстрировать этот случай.
Операция "Чтение + регенерация"
Требует двух циклов доступа к памяти. Однако, с точки зрения процессора, выполняется лишь за один цикл! Просто второй цикл, регенерация, является внутренним для блока памяти. Функциональная схема работы блока ферритовой памяти при выполнении операции "Чтение+Регенерация"
Направление координатных токов при чтении показано зелеными стрелками. В данном случае, нам уже важны сигналы с обмоток считывания. Они поступают на усилитель, а затем в регистр данных, откуда и считываются процессором. Цикл регенерации полностью идентичен ранее рассмотренному циклу записи. Только информация в регистр данных поступает не из процессора, а с усилителей считывания.
Помехи, которые нам мешают
Чем больше битовых плоскостей в кубе, тем сильнее проявляются помехи при переключении координатных токов и тока блокировки. Cердечники, координатные проводники, обмотки считывания и блокировки, друг на друга влияют. И это становится большой проблемой. Для борьбы с помехами используют различные способы. Основной - хитрые схемы расположения сердечников проводников обмоток считывания и блокировки (если отдельные). Я не буду особо вдаваться в подробности, вряд ли это будет полезно сегодня многим. Но вспомните фотографию матрицы сердечников. Там хорошо видно, что сердечники располагаются вовсе не так однообразно, как я показывал на иллюстрациях.
Вторым способом борьбы с помехами является стробирование усилителей считывания. Мы можем разрешать работу усилителей только на короткое время, импульсом стробирования, который будет поступать с некоторой задержкой относительно моментов коммутации координатных токов и тока блокировки. Таким образом можно выделить именно импульс соответствующий перемагничиванию сердечников из всего того шума, который поступает с обмотки считывания. Ну и разумеется, усилители имеют пороговые уровни, которые позволяют отсекать шум и помехи. В реальных блоках памяти используют все эти способы, и не только их.
Ох и капризное же ты создание!
Ферритовая память была довольно капризной и требовала к себе регулярного внимания. Еженедельные профилактические работы обязательно включали в себя прогон набора тестов памяти, причем довольно длительных. Ежемесячные профилактические работы требовали прогона расширенного набора тестов и подстройки блоков памяти, в которых тесты выявляли сбои. Причем эти сбои при обычной работе могли и не проявляться. А полугодовые и годовые профилактические работы включали в себя контроль сигналов осциллографом и их настройку до нормативных параметров. Что именно подстраивалось? Это зависело от конкретного блока памяти. Подстраиваемыми параметрами могли являются токи в проводниках матриц сердечников, длительности импульсов (и прочие времена), пороговые уровни и коэффициент усиления усилителей считывания. Дело в том, что параметры сердечников имеют естественный разброс, как и параметры электронных компонентов. Да и температура на них влияет. И естественное старение.
В большинстве случаев, матрицы не доставляли особых хлопот. Но иногда попадались чрезвычайно капризные экземпляры. И вот к ним приходилось искать "индивидуальный подход". А заменить возможность была далеко не всегда.
Заключение
Мы довольно подробно (но все равно очень упрощенно) рассмотрели работу ферритовой памяти, собственно накопителя. Я не стал уделять внимания схемотехнике формирователей токов, усилителей, коммутаторов, и других, в том числе, весьма важных, узлов реальных блоков ферритовой памяти. Это можно сделать, но получится весьма объемный цикл статей. И я сомневаюсь, что он будет многим интересен. Так же, я не стал описывать различные архитектуры построения накопителей ферритовой памяти. Ограничился лишь классическим вариантом.
Ферритовая память ушла в прошлое. Но она стала чрезвычайно важной вехой на пути развития вычислительной техники. Она была хрупкой и капризной, но сохраняла информацию при отключении питания. Да и просто не имела альтернатив довольно долгое время. И несмотря на то, что с этим типом памяти пришлось помучиться, я испытываю по ней некоторую ностальгию.
Вы можете обсудить данную статью или задать вопросы автору на форуме