
FIFO (First In, First Out) — это метод хранения данных, в котором первые данные, записанные в буфер, также являются первыми данными, прочитанными из него. Принцип работы аналогичен очереди. Данные поступают в буфер в определённом порядке и остаются в нём до тех пор, пока не будут прочитаны. Самые ранние данные всегда выходят из буфера первыми, в то время как новые данные ждут за ними.
В системах FPGA и ASIC FIFO обычно используется как временная зона хранения между цепями, которые производят данные, и цепями, которые потребляют данные. Вместо прямой передачи данных от одного блока к другому, входящие данные сначала хранятся в FIFO. Получающая цепь затем считывает сохранённые данные, когда она готова. Этот подход помогает поддерживать непрерывный и надежный поток данных.
В отличие от обычной памяти, FIFO не требует внешних адресных линий для выбора мест хранения. Во время операции записи входящие данные автоматически помещаются в следующую доступную ячейку в буфере. Во время операции чтения старейшие сохранённые данные автоматически извлекаются и отправляются на выход.
Этот процесс управляется внутренними указателями записи и указателями чтения. Когда новые данные записываются, указатель записи перемещается к следующему местоположению хранения. Когда данные читаются, указатель чтения продвигается к следующему доступному элементу. Поскольку эти указатели работают автоматически, FIFO требует меньше логики управления, чем обычная память.
Недостатком является то, что данные можно получать только последовательно. В отличие от RAM, FIFO не может получить доступ к конкретному местоположению хранения напрямую. Каждая операция чтения следует в точном порядке, в котором данные изначально были записаны.
FIFO широко используется, когда разные части системы работают на разных скоростях. Во многих приложениях одно устройство постоянно генерирует данные, в то время как другое устройство обрабатывает или передает эти данные с более низкой скоростью. Без временного хранилища входящие данные могут поступать быстрее, чем они могут быть обработаны, что приводит к потере данных.
Например, аналого-цифровой преобразователь (ADC) может постоянно генерировать цифровые образцы, в то время как процессор, шина PCI или интерфейс связи обрабатывают эти образцы на другой скорости. FIFO действует как промежуточный буфер, который хранит входящие данные и освобождает их, когда получающая цепь готова. Это позволяет обеим сторонам системы работать независимо, не теряя информацию.
FIFO также может решить проблемы несовпадения ширины данных между устройствами. В некоторых системах одно устройство может выводить данные шириной 8 бит, в то время как другое ожидает данные шириной 16 бит. Прямая связь может потребовать дополнительной логики преобразования для реорганизации данных.
FIFO может упростить этот процесс, временно храня входящие данные и представляя их в формате, соответствующем принимающему устройству. Эта возможность помогает различным аппаратным блокам эффективно обмениваться данными, снижая сложность интерфейса.
Структуры FIFO обычно делятся на синхронные FIFO и асинхронные FIFO.
Синхронный FIFO использует один тактовый сигнал как для операций чтения, так и для операций записи. Поскольку все действия происходят под одной тактовой системой, отношения по времени легче управлять и проверять. Синхронные FIFO обычно используются, когда данные остаются в одном тактовом домене.
Асинхронный FIFO использует отдельные тактовые сигналы для записи и чтения. Данные могут поступать в FIFO с одной тактовой частотой и выходить с другой. Поскольку два тактовых сигнала работают независимо, асинхронные FIFO широко используются для передачи данных между различными тактовыми доменами.
Эта возможность особенно важна в системах FPGA, где процессоры, интерфейсы связи, контроллеры памяти и периферийные устройства часто работают на разных частотах.
Надежная работа FIFO зависит от того, насколько много данных в данный момент хранится в буфере. Если новые данные продолжают поступать после того, как FIFO достигнет своей вместимости, действительная информация может быть перезаписана. Аналогично, попытка чтения данных из пустого FIFO приводит к недействительным результатам.
Чтобы предотвратить эти условия, конструкции FIFO используют несколько сигнальных индикаторов.
Флаг переполнения указывает на то, что все доступные ячейки хранения заняты и дополнительные данные не могут быть записаны. Флаг пустоты указывает на то, что не осталось действительных данных для чтения.
Многие реализации FIFO также предоставляют индикаторы почти полного и почти пустого состояния. Эти сигналы действуют как ранние предупреждения перед тем, как FIFO достигнет полностью полного или полностью пустого состояния. Логика управления может использовать эти сигналы, чтобы замедлить, остановить или отрегулировать передачу данных до переполнения или недополнения.
Поскольку эти индикаторы состояния напрямую влияют на целостность данных и надежность системы, они являются важной частью проектирования FIFO.
Структуры FIFO обычно делятся на FIFO с одним тактовым сигналом (SCFIFO) и FIFO с двумя тактовыми сигналами (DCFIFO). Эти структуры предназначены для поддержки различных отношений тактовых сигналов и требований к передаче данных.
Наиболее распространенные структуры FIFO включают:
• SCFIFO (FIFO с одним тактовым сигналом)
• DCFIFO (FIFO с двумя тактовыми сигналами)
• DCFIFO смешанной ширины (FIFO с двумя тактовыми сигналами с разной шириной данных для чтения и записи)
В большинстве документации по FPGA стандартные двутаковые FIFO и двутаковые FIFO смешанной ширины обе классифицируются как двутаковые FIFO, если не требуется различение.

Выбор структуры FIFO в основном зависит от того, как данные поступают в буфер и покидают его. Взаимоотношения между тактовым сигналом записи и тактовым сигналом чтения обычно являются самым важным фактором при выборе подходящей архитектуры FIFO.
FIFO с одним тактовым сигналом использует один тактовый сигнал для управления как операциями записи, так и операциями чтения. Поскольку оба процесса работают в одном тактовом домене, управление временем относительно просто, а проблемы синхронизации минимизированы.
Когда действительные данные поступают на вход FIFO и запрашивается запись, данные сохраняются в следующем доступном месте памяти на активном тактовом фронте. С поступлением новых данных указатель записи продолжает движение вперед по области хранения FIFO.
Когда запрашивается чтение, FIFO извлекает самые старые сохраненные данные и выводит их на выход. Указатель чтения затем перемещается к следующему сохраненному месту. Это непрерывное движение указателей чтения и записи позволяет данным поступать в FIFO в правильном порядке.
FIFO с одним тактовым сигналом также предоставляют несколько сигнальных индикаторов, которые помогают контролировать состояние буфера. Флаг переполнения указывает на то, что все ячейки хранения заняты, и дополнительные записи должны быть остановлены. Флаг почти полного состояния предупреждает о том, что FIFO приближается к максимальной вместимости.
Флаг пустоты указывает на то, что в буфере не осталось действительных данных, в то время как флаг почти пустого состояния предупреждает о том, что в остатке осталась лишь малая часть данных. Многие реализации также включают счетчик использованных слов, который сообщает, сколько данных в данный момент хранится в FIFO.
Эти индикаторы позволяют окружающей логике принимать безопасные решения о чтении и записи, обеспечивая надежную работу FIFO.
FIFO с двумя тактовыми сигналами использует отдельные такты для операций записи и чтения. Сторона записи работает в одном тактовом домене, в то время как сторона чтения работает в другом.
Входящие данные записываются в FIFO с использованием тактового сигнала записи. После сохранения данные остаются внутри буфера, пока сторона чтения не извлечет их с помощью тактового сигнала чтения. Поскольку два тактовых сигнала независимы, FIFO может безопасно передавать данные между разными тактовыми доменами.
Эта возможность делает двутаковые FIFO одним из самых распространенных решений для перехода через тактовый домен в системах FPGA.
Для обеспечения надежной работы двучасовые FIFO предоставляют сигналы состояния для обеих сторон интерфейса. Сторона записи обычно использует такие сигналы, как wrfull и wrempty, чтобы указывать на состояние буфера с записью. Сторона чтения обычно использует rdfull и rdempty, чтобы указать на доступность данных для чтения.
Также часто предоставляются отдельные счетчики, чтобы каждая тактовая область могла независимо отслеживать количество хранимых данных. Эти индикаторы позволяют обеим сторонам FIFO принимать решения, не мешая друг другу.
Некоторые приложения требуют различных ширин данных на стороне записи и стороне чтения FIFO. В таких ситуациях можно использовать FIFO с разной шириной.
Например, данные могут быть записаны в FIFO в формате 16-битных слов, но считываться в формате 8-битных слов. FIFO автоматически реорганизует сохраненную информацию и выполняет необходимое преобразование ширины при этом сохраняя оригинальную последовательность данных.
Эта функция полезна при подключении устройств, которые используют различные ширины шины. Вместо добавления отдельной схемы преобразования FIFO обрабатывает адаптацию ширины внутренне.
FIFO с одним тактом обычно используется, когда чтение и запись происходят в одной тактовой области. Его более простая архитектура упрощает анализ времени и внедрение.
FIFO с двойным тактом предпочтителен, когда данные должны перемещаться между независимыми тактовыми доменами. Он обеспечивает надежное пересечение тактовых доменов и помогает устранить проблемы синхронизации.
Когда требуется как пересечение тактовых доменов, так и преобразование ширины данных, FIFO с разной шириной предлагает эффективное решение, объединяя обе функции в одной структуре FIFO.
FIFO действует как временное хранилище между различными частями цифровой системы. Во многих приложениях данные не поступают и не выходят с одинаковой скоростью. Одно устройство может генерировать данные непрерывно, в то время как другое устройство может обрабатывать или передавать эти данные с более медленной скоростью. Без буфера между ними входящие данные могут накапливаться быстрее, чем их можно обработать, что приводит к потере данных.
FIFO решает эту проблему, храня данные по мере их поступления и освобождая их, когда принимающая схема готова. Это создает более плавный поток информации и позволяет различным частям системы работать более эффективно, не требуя идеальной временной координации.
Кроме простого буферизации, FIFO также помогает улучшить общую производительность системы. Собирая данные временно перед передачей, FIFO уменьшает количество операций доступа к шине и минимизирует ненужные накладные расходы на коммуникацию. Это позволяет более эффективно использовать ресурсы системы.
FIFO также может снизить нагрузку на процессор. Вместо того, чтобы заставлять ЦП обрабатывать каждую отдельную передачу данных, данные могут накапливаться в FIFO и обрабатываться большими блоками. Этот подход улучшает эффективность и освобождает ресурсы процессора для других задач.
Еще одно важное преимущество — поддержка операций прямого доступа к памяти (DMA). В высокоскоростных системах DMA позволяет данным перемещаться напрямую между периферийными устройствами и памятью без постоянного участия ЦП. FIFO предоставляет временное хранилище, необходимое для поддержки этих передач и поддержания непрерывного потока данных.
Без буферизации FIFO и поддержки DMA процессору может потребоваться значительное количество времени для управления перемещением данных, что может снизить общую производительность системы и увеличить риск возникновения узких мест в передаче.
FIFO с одним тактом обычно используется, когда операции записи и чтения контролируются одним и тем же тактовым сигналом. Поскольку обе стороны FIFO работают в одной тактовой области, управление временем проще, и проблемы синхронизации легче избежать.
Одним из распространенных приложений является сбор данных с сенсора. Во многих системах сенсор может генерировать данные намного быстрее, чем интерфейс связи, ответственный за передачу этих данных на другое устройство.
Например, FPGA может собирать данные от сенсора через высокоскоростной интерфейс SPI. Каждый образец сенсора поступает быстро и должен быть немедленно сохранен, чтобы избежать потери информации. В то же время собранные данные могут потребовать передачи через интерфейс UART, работающий на гораздо более низкой скорости передачи.
Когда данные сенсора поступают в FPGA, они записываются непосредственно в FIFO. Сохраненные данные затем ждут внутри буфера, пока UART постепенно передает их на своей собственной скорости. По мере того как данные покидают FIFO, новые образцы сенсора продолжают поступать в буфер. Этот непрерывный процесс записи и чтения позволяет обеим сторонам системы работать на разных скоростях передачи данных, оставаясь синхронизированными тем же источником тактового сигнала.
Поглощая временные различия в скорости между сбором данных и передачей данных, однотактовый FIFO помогает поддерживать стабильный поток данных и предотвращает потерю данных.
Двухтактовый FIFO предназначен для систем, в которых сторона записи и сторона чтения работают с разными тактовыми сигналами. Эта ситуация распространена в конструкциях FPGA, поскольку многие функциональные блоки работают на разных частотах и имеют различные требования к временным задержкам.
Когда данные переходят из одной тактовой области в другую, прямые соединения могут вызвать проблемы синхронизации. Данные могут прийти слишком рано, слишком поздно или в нестабильные временные окна, что приводит к ненадежной работе.
Двухтактовый FIFO обеспечивает безопасную границу между двумя тактовыми областями. Входящие данные записываются в FIFO, используя источник тактового сигнала. После хранения данные остаются в буфере до тех пор, пока сторона назначения не прочитает их, используя свой собственный тактовый сигнал. FIFO внутренне управляет процессом передачи, чтобы обе тактовые области могли работать независимо.
Система обработки видео служит хорошим примером. Камера может захватывать изображение с использованием одной тактовой частоты, в то время как контроллер VGA выводит изображение с использованием другой тактовой частоты. По мере генерации изображений камерой они постоянно записываются в FIFO. Контроллер VGA затем считывает сохраненные данные об изображении с той скоростью, которая необходима для вывода на экран.
Поскольку тактовые сигналы записи и чтения полностью независимы, FIFO выступает в качестве моста между двумя временными системами. Это позволяет надежно передавать данные изображений от интерфейса камеры к интерфейсу дисплея без ошибок синхронизации.
По этой причине двухтактовые FIFO широко используются для пересечения тактовых доменов, высокоскоростной передачи данных, систем обработки видео, коммуникационных интерфейсов и других приложений, где данные должны перемещаться между независимыми временными окружениями.
Устройства Altera FPGA предоставляют несколько способов реализации функциональности FIFO. Лучший метод зависит от требований к проекту, графика разработки и уровня необходимой настройки.
В большинстве проектов цель остается прежней. FIFO должно быть добавлено между двумя функциональными блоками, чтобы данные могли временно храниться, передаваться надежно и обрабатываться с необходимой скоростью. Различие заключается в том, как FIFO создается и интегрируется в проект FPGA.
Три распространенных метода реализации широко используются в разработке Altera FPGA.
Первый метод заключается в создании FIFO непосредственно с использованием RTL (уровень передачи регистра) кода.
В этом подходе проектировщик создает полную структуру FIFO, включая массив памяти, указатель чтения, указатель записи, логику обнаружения заполненности, логику обнаружения пустоты и управляющие цепи. Каждая часть работы FIFO определяется вручную в коде HDL.
Этот метод предоставляет наивысший уровень гибкости. Глубина FIFO, ширина данных, статусные флаги и поведение управления могут быть настроены в соответствии с конкретными требованиями приложения. Также можно добавить дополнительные функции, если стандартные реализации FIFO не обеспечивают необходимую функциональность.
Однако разработка FIFO с нуля требует глубокого понимания архитектуры FIFO, временного анализа и техник проектирования FPGA. Также требуется больше верификации и тестирования, чтобы гарантировать надежную работу при всех условиях.
По этой причине разработка пользовательских FIFO обычно резервируется для приложений, которые требуют специализированных функций или уникальных требований производительности.
Второй метод предполагает использование открытого или стороннего IP-ядра FIFO.
Вместо того чтобы разрабатывать FIFO с самого начала, существующий модуль FIFO импортируется в проект и подключается к окружающей логике. Поскольку исходный код часто доступен, дизайн все еще можно изменить, когда требуются дополнительные функции или корректировки.
Этот подход может значительно сократить время разработки. Большая часть архитектуры FIFO уже создана, протестирована и подтверждена, позволяя проектировщикам сосредоточиться на интеграции системы, а не на низкоуровневой разработке FIFO.
Когда требования проекта немного отличаются от стандартного поведения FIFO, исходный код можно отредактировать, чтобы поддержать желаемую функциональность, избегая при этом усилий, необходимых для создания совершенно нового дизайна FIFO.
Наиболее распространенным методом является использование IP-ядер FIFO, предоставляемых программным обеспечением Quartus II.
Quartus II включает встроенные генераторы FIFO, которые позволяют создаваывать структуры FIFO через графический интерфейс конфигурации. Вместо того чтобы вручную писать логику FIFO, проектировщик выбирает необходимые параметры и позволяет программному обеспечению автоматически сгенерировать реализацию.
Во время настройки можно определить несколько важных параметров. К ним относятся:
• Тип FIFO (с одним тактовым сигналом или с двумя)
• Ширина данных
• Глубина FIFO
• Опции реализации памяти
• Сигналы состояния "полный" и "пустой"
• Пороги "почти полный" и "почти пустой"
• Настройки тактовых сигналов чтения и записи
После выбора параметров Quartus II генерирует файлы FIFO и сопутствующую логику, необходимую для проектирования FPGA.
После завершения настройки FIFO Quartus II автоматически создает оптимизированную реализацию для выбранного устройства Altera FPGA.
Сгенерированный FIFO может быть подключен непосредственно к окружающей логике. Входящие данные соединяются с интерфейсом записи, исходящие данные соединяются с интерфейсом чтения, а сигналы состояния используются для управления потоками данных по всей системе.
Поскольку сгенерированный дизайн оптимизирован для целевой архитектуры FPGA, использование ресурсов обычно более эффективно, чем во многих вручную разработанных реализациях. Также сокращается время разработки, поскольку большая часть работы по проектированию, тестированию и оптимизации выполняется автоматически программным обеспечением.
Для большинства проектов FPGA IP-ядро FIFO Quartus II предоставляет самый быстрый и простой путь к реализации надежной функциональности FIFO при эффективном использовании ресурсов FPGA.
FIFO предоставляет простой и надежный способ буферизации данных, согласования скоростей передачи и поддержки связи между различными компонентами системы. Понимая архитектуру FIFO, сигналы состояния, синхронную и асинхронную работу, а также методы реализации, проектировщики могут улучшить целостность данных, предотвратить переполнения и исчерпания, а также создавать более эффективные цифровые системы.
Буферы FIFO выступают в качестве временного хранилища между схемами, производящими данные, и схемами, потребляющими данные. Когда одно устройство генерирует данные быстрее, чем другое может их обработать, FIFO хранит входящую информацию и извлекает ее, когда принимающее устройство готово. Это предотвращает потерю данных, повышает надежность системы и позволяет обеим схемам работать независимо, не требуя идеального совпадения скоростей.
Асинхронные FIFO используют отдельные тактовые сигналы для операций записи и чтения, что позволяет безопасно перемещать данные между независимыми тактовыми доменами. Это предотвращает проблемы с таймингом и синхронизацией, которые могут возникнуть при прямой передаче сигналов между схемами, работающими на разных частотах. В результате асинхронные FIFO обычно используются в коммуникационных интерфейсах, видеосистемах, процессорах и контроллерах памяти.
Сигналы состояния FIFO предоставляют информацию в реальном времени о использовании буфера. Сигналы "полный" и "почти полный" предупреждают о том, что пространство для хранения заканчивается, в то время как сигналы "пустой" и "почти пустой" указывают на то, что остается мало или нет данных. Эти сигналы позволяют логике управления регулировать передачи данных до возникновения ошибок, помогая поддерживать целостность данных и стабильную работу системы.
Видеосистемы часто включают устройства, работающие на разных тактовых частотах, такие как камеры и контроллеры дисплеев. Двутактовый FIFO хранит входные данные изображения, используя один такт, и позволяет их считывать, используя другой такт. Это создает надежный мост между двумя временными доменами и обеспечивает непрерывную передачу изображения без ошибок синхронизации или порчи данных.
IP-ядра FIFO Quartus II упрощают разработку, автоматически генерируя оптимизированную логику FIFO на основе заданных пользователем параметров, таких как глубина, ширина, тип такта и сигналы состояния. Это сокращает время проектирования, минимизирует усилия на верификацию и часто обеспечивает лучшее использование ресурсов, чем реализации, закодированные вручную, что делает это предпочтительным решением для большинства проектов FPGA.
2024/08/28
2024/07/29
2024/10/6
2024/07/4
2025/09/20
2024/04/22
2024/07/15
2025/09/15
2023/12/28
2024/11/15









