Fifo что это в компьютере

Обновлено: 05.07.2024

Название каналов FIFO происходит от выражения First In First Out (первый вошел — первый вышел). FIFO очень похожи на каналы, поскольку являются однонаправленным средством передачи данных, причем чтение данных происходит в порядке их записи. Однако в отличие от программных каналов, FIFO имеют имена, которые позволяют независимым процессам получить к этим объектам доступ. Поэтому иногда FIFO также называют именованными каналами. FIFO являются средством UNIX System V и не используются в BSD. Впервые FIFO были представлены в System III, однако они до сих пор не документированы и поэтому мало используются.

FIFO является отдельным типом файла в файловой системе UNIX (ls -l покажет символ p в первой позиции, см. раздел "Файлы и файловая система UNIX" главы 1). Для создания FIFO используется системный вызов mknod(2):

int mknod(char *pathname, int mode, int dev);

где pathname — имя файла в файловой системе (имя FIFO),

mode — флаги владения, прав доступа и т.д. (см. поле mode файла),

dev — при создании FIFO игнорируется.

FIFO может быть создан и из командной строки shell:

После создания FIFO может быть открыт на запись и чтение, причем запись и чтение могут происходить в разных независимых процессах.

Каналы FIFO и обычные каналы работают по следующим правилам:

1. При чтении меньшего числа байтов, чем находится в канале или FIFO, возвращается требуемое число байтов, остаток сохраняется для последующих чтений.

2. При чтении большего числа байтов, чем находится в канале или FIFO, возвращается доступное число байтов. Процесс, читающий из канала, должен соответствующим образом обработать ситуацию, когда прочитано меньше, чем заказано.

3. Если канал пуст и ни один процесс не открыл его на запись, при чтении из канала будет получено 0 байтов. Если один или более процессов открыли канал для записи, вызов read(2) будет заблокирован до появления данных (если для канала или FIFO не установлен флаг отсутствия блокирования O_NDELAY).

4. Запись числа байтов, меньшего емкости канала или FIFO, гарантированно атомарно. Это означает, что в случае, когда несколько процессов одновременно записывают в канал, порции данных от этих процессов не перемешиваются.

5. При записи большего числа байтов, чем это позволяет канал или FIFO, вызов write(2) блокируется до освобождения требуемого места. При этом атомарность операции не гарантируется. Если процесс пытается записать данные в канал, не открытый ни одним процессом на чтение, процессу генерируется сигнал SIGPIPE, а вызов write(2) возвращает 0 с установкой ошибки (errno=ERRPIPE) (если процесс не установил обработки сигнала SIGPIPE, производится обработка по умолчанию — процесс завершается).

char buff[MAXBUFF]; /* буфер для чтения данных из FIFO */

/* Создадим специальный файл FIFO с открытыми для всех

правами доступа на чтение и запись */

if (mknod(FIFO, S_IFIFO | 0666, 0) < 0)

printf("Невозможно создать FIFO ");

/* Получим доступ к FIFO */

if ((readfd = open(FIFO, O_RDONLY)) < 0)

printf("Невозможно открыть FIFO ");

while ((n = read(readfd, buff, MAXBUFF)) > 0)

/* Закроем FIFO, удаление FIFO - дело клиента */

/* Соглашение об имени FIFO */

/* Получим доступ к FIFO */

if ((writefd = open(FIFO, O_WRONLY)) < 0)

printf("Невозможно открыть FIFO ");

if (write(writefd, "Здравствуй, Мир! ", 18) != 18)

if (unlink(FIFO) < 0)

printf("Невозможно удалить FIFO ");

Данный текст является ознакомительным фрагментом.

Продолжение на ЛитРес

9.3. Базовое межпроцессное взаимодействие: каналы и очереди FIFO

9.3. Базовое межпроцессное взаимодействие: каналы и очереди FIFO Межпроцессное взаимодействие (Interprocess communication — IPC) соответствует своему названию: это способ взаимодействия для двух отдельных процессов. Самым старым способом IPC на системах Unix является канал (pipe):

9.4.3.4. Неблокирующий ввод/вывод для каналов и FIFO

9.4.3.4. Неблокирующий ввод/вывод для каналов и FIFO Ранее для описания способа работы каналов мы использовали сравнение с двумя людьми, моющими и вытирающими тарелки с использованием сушилки; когда сушилка заполняется, останавливается моющий, а когда она пустеет,

FIFO Название каналов FIFO происходит от выражения First In First Out (первый вошел — первый вышел). FIFO очень похожи на каналы, поскольку являются однонаправленным средством передачи данных, причем чтение данных происходит в порядке их записи. Однако в отличие от программных

26.3. Каналы типа FIFO

26.3. Каналы типа FIFO Канал FIFO — это канал, основанный на принципе очереди: «первым вошел, первым вышел». От обычного канала канал FIFO отличается следующим:? Канал FIFO сохраняется в файловой системе в виде файла, поэтому каналы FIFO называются именованными.? С именованным

4.6. Именованные каналы (FIFO)

4.6. Именованные каналы (FIFO) Программные каналы не имеют имен, и их главным недостатком является невозможность передачи информации между неродственными процессами. Два неродственных процесса не могут создать канал для связи между собой (если не передавать

Атомарность записи в FIFO

Атомарность записи в FIFO Наша простейшая пара клиент-сервер позволяет наглядно показать важность наличия свойства атомарности записи в пpoгрaммныe каналы и FIFO. Предположим, что два клиента посылают серверу запрос приблизительно в один и тот же момент. Первый клиент

4.11. Ограничения программных каналов и FIFO

4.11. Ограничения программных каналов и FIFO На программные каналы и каналы FIFO системой накладываются всего два ограничения:? OPEN_MAX — максимальное количество дескрипторов, которые могут быть одновременно открыты некоторым процессом (Posix устанавливает для этой величины

10.14. Реализация с использованием FIFO

10.14. Реализация с использованием FIFO Займемся реализацией именованных семафоров Posix с помощью каналов FIFO. Именованный семафор реализуется как канал FIFO с конкретным именем. Неотрицательное количество байтов в канале соответствует текущему значению семафора. Функция sem_post

5.4.5. Каналы FIFO

5.4.5. Каналы FIFO Файл FIFO (First-In, First-Out — первым пришел, первым обслужен) — это канал, у которого есть имя в файловой системе. Любой процесс может открыть и закрыть такой файл. Процессы, находящиеся на противоположных концах канала, не обязаны быть связанными друг с другом.

FIFO это один из ключевых элементов цифровой техники. Это память типа «первым вошёл-первым ушёл» (first input – first output). Меня как разработчика ПЛИС FIFO окружают повсюду. Собственно я только и делаю что беру данные из одного FIFO и перекладываю в другое. Но как оно работает? В современных САПР конечно уже есть готовые элементы, у Altera есть замечательные мегафункции. У Xilinx есть Core Generator. Но что делать если что-то не устраивает в стандартных решениях? Ответ один – разобраться и написать самому.

В интернете существует большое количество статей про FIFO, и когда то мне попалась очень хорошая и толковая статья. К сожалению, сейчас я её не нашёл. Далее – мой личный опыт по созданию и применению компонента FIFO. Готовый элемент находится на Github в проекте fpga_components. Свой компонент потребовался по нескольким причинам:

  1. FIFO XIlinx не умеет работать в режиме ретрансмита – это главная причина
  2. FIFO Xilinx требует создания компонента с заданными параметрами – у нас развелось слишком много разных компонентов.
  3. FIFO Xilinx содержит ошибку – если приходит сигнал сброса одновременно с сигналом записи данных, то в FIFO застревает одно слово. Это мы конечно обошли, но всё равно неприятно.


Одно из главных применений FIFO это перевод данных с одной тактовой частоты на другую. Этим определяется такая схема. При одной тактовой частоте на запись и чтение автоматы можно упростить.

Давайте рассмотрим внешние порты компонента FIFO:

  • FIFO_WIDTH – ширина FIFO, может быть любая.
  • FIFO_SIZE – число слов в FIFO, это степень двойки, от 64 до 65536. Если нужен больший размер то надо делать составное FIFO.
  • FIFO_PAF – уровень срабатывания флага почти полного FIFO.
  • FIFO_PAE – уровень срабатывания флага почти пустого FIFO, о флагах будет дальше.

Флаги FIFO передаются типом bl_fifo_flag; Определение типа:


Обратите внимание, используется отрицательная логика. Узнали? Да, я ещё из тех динозавров кто работал с TTL на сериях 155, 533, 1533 и отдельными микросхемами FIFO. Так что эти флаги мне привычны, они были сделаны много лет назад и до сих пор используются.

Флаг ef – сигнализирует что FIFO пустое. Если ef=1, то из FIFO можно прочитать одно слово.
Флаг pae – сигнализирует, что FIFO почти пустое. На сколько почти определяет параметр FIFO_PAE. Если pae=1, то из FIFO можно прочитать не более чем FIFO_PAE слов.
Флаг hf – сигнализирует что FIFO заполнено наполовину.
Флаг paf – сигнализирует, что FIFO почти полное. На сколько почти определяет параметр FIFO_PAF. Если paf=1, то в FIFO можно записать не более чем FIFO_PAF слов
Флаг ff – FIFO полное. Если ff=0, то в FIFO записывать нельзя.
Флаг ovr – переполнение. Если ovr=1, то это значит что произошла запись в полное FIFO
Флаг und – underflow. Если und=1, то это значит что произошло чтение из пустого FIFO.

Вполне очевидно, что при записи в FIFO мы должны записать слово в двухпортовую память и увеличить счётчик записи. Или сначала увеличить, а потом записать. А при операции чтения надо зафиксировать данные на выходе и увеличить счётчик чтения. А вот дальше требуется решить следующие вопросы:

  1. Как определить что FIFO полное или не полное, т.е. можно ли в него записывать ?
  2. Как определить что FIFO пустое или не пустое? Т.е. можно ли из него читать ?
  3. Как правильно сформировать флаги PAE, PAF, HF ?
  4. Что такое число слов в FIFO ?


Надо ясно понимать, что узел перетактирования (в проекте это компонент ctrl_retack_counter_m12) передаёт данные с задержкой на несколько тактов. Поэтому состояния FIFO также изменяются с задержкой. Например, если FIFO пустое и него записано одно слово, то флаг ef=1 появится с некоторой задержкой. Это же относится к выходам количества слов в FIFO. Например, если в пустое FIFO будет записано 16 слов, то в процессе записи выход cnt_wr будет принимать значения 0,1,2,3, … 16 (это если не производится чтение из FIFO), а вот выход cnt_rd будет принимать значения например такие: 0, 5, 8, 12, 16. Точный порядок будет зависеть от соотношения частот и не может быть предсказан. Это принципиальное свойство FIFO которое работает на разных частотах. Хотя в зависимости от схемы синхронизации могут быть различные нюансы.

Определение пустого и полного FIFO производится на анализе счётчиков адресов. Причём у меня есть два адреса для записи (текущий и следующий) и два адреса для чтения, также текущий и следующий. В компоненте cl_fifo_control_m12 это сигналы w_adr, w_next_adr и r_adr, r_next_adr; Соотношение адресов в различных состояниях представлено на рисунках ниже.

В исходном состоянии w_adr=0, r_adr=0, w_next_adr=1, r_next_adr=1. Если w_adr=r_adr, то FIFO пустое.


При записи слово данных записывается по адресу w_adr и адрес записи увеличивается.


Через несколько таков значение w_adr будет передано в w_adr_to_rd (перейдёт в тактовый домен clk_rd) и по факту не совпадения r_adr и w_adr_to_rd будет установлен флаг ef=1, т.е. из FIFO можно будет считать слово данных. Однако одно слово это мало, для получения высокой скорости передачи надо работать с блоком данных. И здесь требуется использовать флаг PAE. Когда в FIFO будет записано FIFO_PAE слов, будет установлен флаг pae=1 и можно будет прочитать сразу блок данных. Это основной режим работы с DMA каналом.

Если скорость записи больше чем скорость чтения, то адрес записи догонит адрес чтения:


В этом случае w_next_adr будет равен r_adr, а точнее r_adr_to_wr (мы можем сравнивать только значения на своём тактовом домене). Это означает, что FIFO полное и записывать дальше нельзя, что бы не испортить уже записанные данные. Надо отметить, что для подключения АЦП это обычная ситуация. У нас такой режим называется однократный сбор через FIFO. В этом режиме АЦП записывает данные на большой скорости в FIFO, а медленный процессор эти данные считывает. При этом мы знаем, что действительными будет только блок данных который соответствует размеру FIFO. Обычно на этот размер как раз и программируется канал DMA. После чтения данных FIFO сбрасывается и всё повторяется снова. Вот в этом режиме принципиально важно, что бы запись в полное FIFO не портила предыдущие данные.

Если требуется записывать данные блоками, то надо использовать флаг PAF. Если paf=1, то в FIFO можно записать FIFO_PAF слов.

Значения флагов PAE и PAF надо выбирать из требований DMA контроллера к которому подключено FIFO. Например, для PCI Express у нас используется блок данных размером 4 кБ. Это 256 слов по 128 разрядов. Размер флага PAE я устанавливаю в 272. Т.е. чуть больше чем 256. Это я делаю намеренно, что бы не допускать опустошения FIFO. Ну не доверяю я схемам формирования флагов.

А как производится определение количества слов в FIFO? Всё достаточно просто – из адреса записи надо вычесть адрес чтения. Адрес кратен степени 2, поэтому вычитание будет идти по модулю 2^N; Поскольку у нас есть две пары адресов, то у нас получится и два значения количества слов в одном FIFO (может это как то связано с квантовой механикой?).

Значения флагов PAE и HF (по чтению) формируются из r_cnt. Значения PAF и HF(по записи) формируются из w_cnt.

Основной причиной, по которой пришлось разрабатывать свой компонент FIFO, является потребность в реализации циклического режима для работы на ЦАП. В этом режиме производится запись блока данных, он может быть любого размера, разумеется не превышая размера FIFO. А затем начинается чтение, причём после выдачи последнего записанного слова сразу происходит переход на первое слово. Это позволяет подключить медленный процессор к быстрому ЦАП. Компонент FIFO имеет два входа для циклического режима. rt_mode=1 означает, что после выдачи последнего записанного слова надо перейти на нулевой адрес.

А вот вход rt нужен немного для другого. Наличие rt=1 позволяет перевести FIFO на нулевой адрес в произвольный момент времени. Иногда это у нас тоже используется.

В проекте fpga_components представлены два FIFO:

  • ctrl_dpram512x64_v7
  • ctrl_dpram1024x64_v7
  • ctrl_dpram8192x64_v7
  • ctrl_dpram32768x64_v7


Это конструкция будет синтезирована в двухпортовую память. Идея красивая и в результате доработки cl_fifo_x64_v7 получилось FIFO cl_fifo_m12.

Недостаточно написать FIFO, надо ещё проверить его работу. Для проверки используется подход принятый при разработке PROTEQ, о котором можно прочитать в моей предыдущей статье.

Существует компонент tb_00 который имеет настраиваемые параметры.

Он позволяет проверить прохождение потока данных через FIFO при различных соотношениях тактовых частот и уровнях срабатывания флагов PAE и PAF. Также существуют компоненты тестовых случаев:

  • tc_00_01 – проверят случай, когда скорость записи больше скорости чтения. – а это когда скорость чтения больше чем скорость записи.


Конечно, для каждого теста сохраняется и свой отчёт.

При необходимости тесты будут дополняться. Хочу обратить внимание, что для вывода текста в консоль я использую пакет PCK_FIO. Он резко упрощает вывод текста.

Например, вывод результатов выглядит так:


Это похоже на Си.

В итоге я считаю что получился элегантный компонент, достаточно удобный для практической работы.

Всем привет! Не так давно мы приступили к созданию стенда для тестирования модулей цифровой обработки сигнала. Предполагается, что всякое вновь разрабатываемое устройство будет не просто подвергаться моделированию, а будет проходить более жесткий контроль через работу на реальной железке. Продолжаем идти в этом направлении.

Поворот не туда

При разработке первого варианта кольцевого буфера преследовалась цель показать основной принцип работы. Если по простому, то это буфер между пишущим и читающими модулями.

Место кольцевого буфера FIFO при передачи данных между модулями Место кольцевого буфера FIFO при передачи данных между модулями

Для того, чтобы они смогли взаимодействовать, необходимо реализовать двухпортовую память и механизм записи и чтения данных из нее.

Принцип работы FIFO буфера на основе двухпортовой памяти Принцип работы FIFO буфера на основе двухпортовой памяти

Наиболее простой механизм разделения всего адресного пространства памяти на 2 половины (верхняя и нижняя) хорош для учебных целей. Пока пишущий модуль занимается сохранением данных в одну половину, читающий занят выборкой данных из другой половины . Никто никому не мешает. Нет ничего проще, чем контроль перехода адресов (на запись и чтение) через границу и выставление или уборка соответствующего сигнала о готовности или не готовности данных.

Однако, с учебным кольцевым буфером не все так ладно. Он выполняет свою задачу только в том случае, если запись идет медленнее, чем чтение . При незаполненности половинки - сигнала о готовности нет, значит читающий модуль ожидает. Как только половинка готова, модуль чтения бросается забирать данные, а в это время пишется вторая половинка.

Рваный режим работы системы ЦОС при использовании учебного буфера Рваный режим работы системы ЦОС при использовании учебного буфера

На картинке выше результат моделирование такого FIFO , которое хранит данные, пришедшие по медленному интерфейсу RS-232 . Обратите внимание, что большую часть времени быстрая система ЦОС в лице интегратора простаивает в ожидании данных. Это видно по ступенчатому накоплению результата на выходе интегратора ( y ). Только при готовности данных в буфере срабатывают пачки импульсов на линии clk .

Для случая, когда пишущий модуль работает быстро , а читающий медленно , такая схема уже не работает. В наших планах передавать в компьютер результаты вычислений системы цифровой обработки сигнала ( ЦОС ) при помощи довольно медленного интерфейса RS-232 . Очевидно, пора взять на вооружение FIFO подходящей конструкции.

Одна важная деталь

Как вы понимаете, конструкций FIFO буферов множество. Для самых различных жизненных ситуаций нашему вниманию предлагаются двунаправленные FIFO, а также буферы с приоритетами, где очередь может совсем не соблюдается (совсем как в жизни). Но из тех простых, что подходят для нашей задачи есть, так называемые, SCFIFO и DCFIFO . Не нужно пугаться, SCFIFO это синхронный буфер, он же с одной тактовой линией (читатель и писатель на одной тактовой частоте),а DCFIFO с двумя тактовыми линиями.

По первым двум буквам видно отличие: SC - single clock (одна тактовая линия), DC - dual clock (две тактовые линии).

DCFIFO. Заметны отдельные тактовые линии на запись (wrclk) и чтение (rdclk) DCFIFO. Заметны отдельные тактовые линии на запись (wrclk) и чтение (rdclk)

У этих кольцевых буферов FIFO много общего. В каждый из буферов входят данные ( data ). Разумеется, они и выходят ( q ). Запрос на запись данных поступает по линии wrreq , запрос на чтение по линии rdreq . Эти линии запросов не дадут буферу записать данные, если они еще не готовы и выдать их, если необходимости в них еще не было. Несколько линий на выходе этих модулей сигнализируют о предельной загрузке буфера ( full ), отсутствии данных ( empty ). Значение остальных линий и шин (если они есть) можно узнать из документации.

Принцип работы

Сразу хочется предупредить, что досконально работу всех частей и механизмов таких модулей мы не рассмотрим. Однако, для общего понимания пару слов все-же будет сказано.

Как уже было сказано, центральным узлом FIFO буфера является двухпортовая память, один из портов предназначен для записи данных, другой для их чтения. На схеме ниже такая память обозначена как FIFO Memory (Dual Port RAM) .

Обязательным условием является наличие двух счетчиков адреса. Один ( wptr ) подсчитывает адрес ячейки памяти ( waddr ), предназначенной для записи данных . Другой счетчик ( rptr ) ведет подсчет адреса ячейки ( raddr ), где хранится слово данных для чтения. Эти счетчики находятся во взаимодействии друг с другом с помощью линий wptr и rptr . Основное назначение этого взаимодействия это полный контроль над ситуацией. А ситуации, как известно, бывают разные.

При отсутствии данных буфере читателю выводится сигнал rempty . Это предохраняет от ошибочного чтения несуществующих данных. Для недопущения переполнения буфера модулю-писателю поступает сигнал wfull . Это приостановит поступление новых данных. Судя по синхронизирующим триггерам, проблема взаимодействия всех частей буфера между собой далеко не так проста, как может показаться на первый взгляд.

OpenSource модули - для того чтобы их использовали

По ссылке выше лежит неплохой проект (async_fifo), это стало понятно после сборки и моделирования.

При скорости записи выше скорости чтения свободная память постепенно исчезает. Указатель (адрес) записи бежит по кругу от младших адресов к старшим и догоняет медленный указатель чтения. При этом на выход выставляется предупреждающий сигнал о переполнении.

Появление сигнала о переполнении кольцевого буфера Появление сигнала о переполнении кольцевого буфера

При непринятии своевременных мер и продолжении записи, сигнал переполнения исчезает, но при этом неизбежна потеря данных . Сигнал переполнения это всего лишь разность чисел между указателями записи и чтения. Благо, что он появляется заранее и очевидно, что его обязательно нужно обрабатывать.

Теперь другая ситуация. Запись идет медленно, а считывание происходит быстро. При моделировании дадим памяти слегка заполниться путем запрета считываний, а потом их разрешим.

Довольно быстро адрес на чтение догоняет адрес на запись и происходит то, что должно было произойти: появляется сигнал об отсутствии данных. Этот сигнал необходимо обрабатывать модулю чтения по той простой причине, что на шине данных буфера будет какое-то число, но это совсем не валидные данные. Считывание с буфера в момент сигнала empty будет ошибочным.

По всей видимости, мы нашли что искали, осталось собрать и протестировать испытательный стенд. Делать это мы будем в следующих выпусках. До новых встреч!

Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.

Также не обойдите вниманием канал на YouTube . Подписки и лайки будут приятным ответом от аудитории.


ПППО - также жаргонный термин для алгоритма FIFO планирования операционной системы, которая дает каждому процессу время CPU (центрального процессора) в том порядке, в каком он потребовал.

Противоположностью FIFO является LIFO (Last In First Out), "последним пришел, первым ушел", где самая молодая запись или "вершина стека" обрабатывается в первую очередь. [1]

Очередь с приоритетами не является ни FIFO, ни LIFO, но может принять подобное поведение временно или по умолчанию.

Теория массового обслуживания охватывает эти методы для обработки структур данных, а также взаимодействия между строгими FIFO очередями.

Содержание

Информатика

Структура данных


В зависимости от прикладной программы, буфер FIFO может быть реализован в виде аппаратного регистра сдвига, или с использованием различных структур памяти, обычно циклическим буфером или одним из видов списков.

Есть несколько эффективных реализаций очередей FIFO. Эффективной реализацией является та, которая может выполнять операции — добавление в очередь (enqueuing) и извлечение из очереди (dequeuing) — за время O(1) .

  • Связанный список
    • У двусвязного списка операции вставки и удаления на обоих концах занимают O (1) времени, так что это естественный выбор для очередей.
    • Простой связный список имеет эффективную вставку и удаление только на одном конце. Тем не менее, небольшая модификация — по поддержанию указателя на последний узел в дополнение к первому — позволит реализовать эффективную очередь.

    Реализация

    Первоочередность головы или хвоста очереди

    Концы очереди FIFO часто называют головой и хвостом. К сожалению, существует спор относительно этих терминов:

    • По мнению многих людей предметы должны входить в конец очереди (в хвост), и оставаться в очереди, пока они не достигнут начала очереди (головы) и покинуть очередь оттуда. Эта точка зрения оправдана по аналогии с очередями людей, ожидающих своего обслуживания в передней и задней части очереди (как и в приведенном выше примере).
    • Другие люди считают, что элементы входят в очередь в голове и покидают её в хвосте, по аналогии с пищей, проходящей через змею. Очереди написанные таким образом появляются в тех местах, которые можно рассматривать как авторитетные, например, такие как операционная система Linux.

    Программирование работы диска

    Дисковые контроллеры могут использовать очередь FIFO в качестве алгоритма планирования работы диска для определения порядка обслуживания запросов ввода/вывода.

    Коммуникации и сети

    Сетевые мосты, коммутаторы и маршрутизаторы, используемые в компьютерных сетях используют FIFO для хранения пакетов данных на пути к их следующему месту назначения. Как правило, по меньшей мере, одна структура FIFO используется за сетевое соединение. Некоторые устройства имеют несколько FIFO для одновременного и независимого массового обслуживания различных типов информации.

    Электроника


    FIFO широко используются в электронных схемах для буферизации и управления потоком между аппаратным и программным обеспечением. В своей аппаратной форме, в первую очередь FIFO состоит из набора операций чтения и записи указателей, систем хранения данных и логики управления. Хранение может быть статическим оперативным запоминающим устройством (ОЗУ), триггерами или любой другой подходящей формой хранения. Для FIFO нетривиального размера обычно используется двухпортовый SRAM, где один порт предназначен для записи, а другой для чтения.

    Синхронный FIFO это такой FIFO, где один и тот же тактовый сигнал используется как для чтения, так и для записи. Асинхронный FIFO использует различные тактовые сигналы для чтения и записи. Асинхронные FIFO вводят проблемы метастабильности. Общая реализация асинхронного FIFO использует код Грея (или любой блок кода расстояния) для чтения и записи указателей для обеспечения надежной генерации флага. Еще одно примечание, касающееся генерации флага, в том, что надо обязательно использовать арифметические операции над указателями, чтобы создать флаги для реализации асинхронного FIFO. С другой стороны, можно использовать либо подход, который называется "дырявое ведро", или арифметические операции над указателями для создания флагов в реализациях синхронных FIFO.

    Примеры флагов состояния FIFO включают в себя: полный, пустой, почти полный, почти пустой, и т.д.

    Первый известный FIFO, реализованный в электронике, был сделан Питером Алфке в 1969 году в Fairchild Semiconductors [2] . Питер Алфке позже стал директором Xilinx.

    Очередь FIFO полна/пуста

    Аппаратный FIFO используется для целей синхронизации. Он часто реализуется в виде круговой очереди, и, таким образом, имеет два указателя:

    1. Указатель чтения/Регистр адреса чтения
    2. Указатель записи/Регистр адреса записи

    Операции чтения и записи адреса изначально находятся на первой позиции памяти и очередь FIFO пуста.

    Очередь FIFO пуста

    Когда регистр адреса чтения достигает регистра адреса записи, FIFO вызывает сигнал "Пуст".

    Очередь FIFO полна

    Когда регистр адреса записи достигает регистра адреса чтения, то FIFO запускает сигнал "Полон".

    В обоих случаях, адреса чтения и записи в конечном итоге равны. Для того, чтобы различать эти две ситуации, есть простое и надежное решение - нужно добавить один дополнительный бит для каждого адреса чтения и записи, который инвертируется каждый раз, когда адрес переносится. При этом созданы условия неоднозначности:

    Характерной особенностью памяти FIFO по сравнению с обычной памятью RAM или ROM является отсутствие адресных линий. Базовая архитектура FIFO представлена в виде массива (RAM ARRAY) с перемещаемыми при считывании и записи указателями начала (READ POINTER) и конца (WRITE POINTER) свободного пространства памяти (рис. 1). Преимуществом такого способа организации памяти является выводная совместимость микросхем FIFO, имеющих разную информационную емкость.

    Другим отличительным свойством памяти FIFO является наличие отдельного порта для чтения и отдельного — для записи данных. Благодаря наличию указателей и двухпортовой структуре памяти FIFO, стробы считывания и записи данных могут поступать на одноименные входы микросхемы в произвольном порядке. И если в памяти RAM операции чтения и записи данных выполняются строго последовательно во времени, то в памяти FIFO допускается выполнение записи и считывания в независимых друг от друга асинхронных режимах.

    Недостатком FIFO является то, что содержимое уже прочитанной ячейки памяти может быть автоматически замещено новым значением, тогда как в RAM или ROM содержимое ячеек может быть изменено только путем непосредственной адресации и записи в них новых значений. Для предотвращения непредусмотренной потери данных в состав микросхем памяти FIFO введены флаги заполненности. В процессе функционирования память FIFO может находиться в одном из следующих возможных состояний: «нормальная работа», «буфер пуст», «буфер почти пуст», «буфер заполнен на 1/2 от максимального размера пространства памяти», «буфер почти полон», «буфер полон». Флаги заполненности являются индикаторами этих состояний и позволяют внешним устройствам осуществлять гибкий контроль над потоками считываемых или записываемых данных. С целью обеспечения помехоустойчивой передачи данных в канале связи, в состав большинства современных микросхем памяти FIFO добавлена функция повторного считывания данных из буфера, начиная с первого слова. Расширением этой функции является возможность повторного считывания произвольного сегмента памяти путем пользовательской установки указателя начала записи.

    Общими характеристиками памяти FIFO, RAM и ROM, принимаемыми в расчет на этапе проектирования, остаются быстродействие, разрядность слова и информационная емкость. Быстродействие характеризуют временем цикла считывания или записи, разрядность определяют числом бит в слове чтения или записи, информационную емкость характеризуют числом единиц информации в битах или словах, которое микросхема памяти может хранить одновременно.

    2. Классификация памяти FIFO производства IDT Inc.

    Все устройства FIFO можно подразделить на классы, определяемые по способу воздействия входных управляющих сигналов (асинхронная и синхронная память) и по способу управления передачей данных (однонаправленная и двунаправленная память). В качестве подкласса асинхронной памяти можно выделить микросхемы Serial-to-Parallel FIFOs (последовательная запись/параллельное считывание) и Parallel-to-Serial FIFOs (параллельная запись/последовательное считывание). В микросхему Parallel-to-Serial FIFO данные записываются всеми разрядами одновременно, а считываются с одного выхода последовательно во времени. По аналогии осуществляется обращение к данным в микросхеме Serial-to-Parallel FIFO. Классификацию устройств памяти FIFO, производимых корпорацией IDT, можно представить в следующем виде:

    Асинхронная память

    • семейство Asynchronous x9 и Asynchronous Dual x9256…64Kx9;
    • семейство Specialty FIFOs

    Parallel-to-Serial FIFOs 256…1Kx16, 1K…4Kx9

    Serial-to-Parallel FIFOs 2K…4Kx9

    Синхронная память

      семейство Super Sync II (133 МГц)

    Двунаправленная память

      семейство Bi-directional Asynchronous FIFOs x18

    3. Принцип работы асинхронной памяти FIFO

    Рис. 4. Временные диаграммы переключения флагов заполненности

    4. Принцип работы синхронной памяти FIFO

    5. Наращивание разрядности и информационной емкости FIFO

    В процессе проектирования новых устройств нередко возникает задача объединения микросхем памяти FIFO в один модуль. Наращивание разрядности достигается путем соединения всех одноименных входов микросхем, кроме информационных. Для контроля за потоками данных могут использоваться флаги заполненности одной из микросхем в модуле. Способ решения этой задачи иллюстрирует рис. 9, на котором показан блок FIFO емкостью 512 слов и разрядностью слова 18 бит, построенный на микросхемах IDT7201. Каждая микросхема имеет организацию 512ґ9 бит.

    6. Рекомендации по применению памяти FIFO

    Основными областями применения памяти FIFO являются устройства с последовательными потоками параллельных данных (например, цифровая видеокамера, сетевой концентратор и др.). В их составе память FIFO может применяться в качестве буфера для приема, накопления и выдачи по запросу накопленных данных. Наличие такого буфера позволяет высвободить ресурсы процессора от постоянного сканирования магистрали при приеме медленных асинхронных потоков данных. Процессор в этом случае можно будет подключать к буферу FIFO только для выгрузки накопленных данных, пользуясь информацией о состоянии флагов заполненности.

    Другим примером применения памяти FIFO является преобразование скорости передачи данных в процессе взаимодействия двух асинхронных устройств с разной пропускной способностью. Для организации непрерывного обмена потоками данных преобразованию подлежит также разрядность входной и выходной шины данных.

    В случае применения RAM для решения аналогичных задач требуется наличие дополнительной схемы управления, представляющей собой контроллер прямого доступа к памяти. Это связано с необходимостью формирования адресов ячеек в процессе выполнения операций записи и чтения. Преимущество в применении памяти FIFO состоит в естественном порядке прохождения данных (первым поступил — первым выводится) и в отсутствии внешней схемы для формирования адресов ячеек.В качестве реальных примеров применения памяти FIFO можно привести следующие: устройство цифровой обработки и вывода на монитор сигналов, поступающих от рентгеновской установки; устройство сопряжения мультипроцессорного модуля на базе DSP с PCI-шиной; кодек MPEG для телевидения высокой четкости.

    В первом случае микросхемы «IDT72V21105, 256Kx18 FIFO» применяются для согласования скорости передачи данных между тремя асинхронными устройствами: источником цифрового рентгеновского сигнала, модулем цифровой обработки данных на базе нескольких DSP- процессоров и видеоконтрольного устройства. Для обеспечения требуемой ширины пакета передаваемых данных микросхемы FIFO включены в режиме наращивания информационной емкости и образуют модуль памяти с организацией 1,5Mґ18.

    Во втором случае две однонаправленные микросхемы «IDT72V36110, 128Kx36 FIFO» используются для организации двунаправленного обмена данными между 32-разрядным PCI-интерфейсом с тактовой частотой 33 МГц и модулем, состоящим из двух DSP-процессоров с пропускной способностью шины данных 66 МГц и разрядностью 16 бит. Для поддержания обмена данными между 32-разрядной и 16-разрядной шинами используется дополнительная функция BUS MATCHING.

    В кодеке MPEG-2 для телевидения высокой четкости удачным решением является использование памяти FIFO и, в частности, «IDT72V2113, 512Kx9». Стандарт MPEG-2 предусматривает возможность гибкого изменения скорости передачи видеоданных в очень широких пределах, а также работы как с чересстрочной, так и с прогрессивной развертками при частоте полей 50 или 60 Гц.Итак, микросхемы памяти FIFO можно рекомендовать к применению:

    Читайте также: