Открыть сервис

Синхронный FIFO

Синхронный FIFO (First In, First Out) — это тип цифрового буферного устройства, реализующего дисциплину обслуживания «первым пришёл — первым ушёл», в котором все операции (запись и чтение данных) синхронизированы единым тактовым сигналом. Синхронные FIFO широко применяются в цифровой электронике, в частности в проектировании программируемых логических интегральных схем (ПЛИС) и специализированных интегральных схем (ASIC), для согласования потоков данных между различными тактовыми доменами или для временного хранения данных в конвейерных архитектурах.

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

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

Устройство имеет два основных порта управления:

  • Порт записи: сигнал записи (wr_en) и входные данные (data_in).
  • Порт чтения: сигнал чтения (rd_en) и выходные данные (data_out).

Также присутствуют флаги состояния:

  • full (полон) — FIFO заполнен, запись невозможна.
  • empty (пуст) — FIFO пуст, чтение невозможно.
  • almost_full и almost_empty — предупреждающие флаги (настраиваемые пороги).

Данные записываются в память FIFO (обычно на основе двухпортовой оперативной памяти — dual-port RAM) по адресу, который указывает указатель записи (write pointer). Чтение происходит по адресу, который указывает указатель чтения (read pointer). При каждом такте, если активен сигнал записи, данные записываются, а указатель записи инкрементируется. При активном сигнале чтения данные считываются, а указатель чтения инкрементируется. Указатели циклически проходят по адресному пространству памяти.

Генерация флагов full и empty

Ключевая сложность синхронного FIFO — корректное определение состояний «полон» и «пуст», так как указатели записи и чтения могут «догонять» друг друга. Для этого используется сравнение значений указателей. В простейшем случае, если указатели равны, FIFO считается пустым. Если указатель записи отстаёт от указателя чтения ровно на один оборот (то есть после полного цикла), FIFO считается полным.

Однако на практике часто применяют метод с дополнительным битом (MSB — most significant bit). Указатели расширяются на один бит. При каждом обороте (переполнении адресного пространства) старший бит инвертируется. Тогда:

  • empty: все биты указателей (включая MSB) совпадают.
  • full: старшие биты различны, а младшие биты совпадают.

Этот метод позволяет однозначно различать пустое и полное состояние без дополнительной логики.

Архитектура и компоненты

Типовая структурная схема синхронного FIFO включает:

  1. Двухпортовая память (dual-port RAM) — основной массив для хранения данных. Один порт предназначен для записи, другой — для чтения. Оба порта работают по одному тактовому сигналу.
  2. Указатель записи (write pointer)счётчик, адресующий ячейку для записи.
  3. Указатель чтения (read pointer) — счётчик, адресующий ячейку для чтения.
  4. Компаратор указателей — логическая схема, сравнивающая значения указателей и формирующая флаги full и empty.
  5. Логика управления — обрабатывает сигналы wr_en, rd_en, а также флаги full и empty для предотвращения переполнения (запись в полный FIFO) и опустошения (чтение из пустого FIFO).

Применение

Синхронные FIFO находят применение в следующих сценариях:

  • Буферизация данных в конвейерах: временное хранение результатов промежуточных вычислений в цифровых процессорах и ПЛИС.
  • Согласование тактовых доменов (clock domain crossing): хотя синхронный FIFO не предназначен для работы с разными тактовыми частотами, его можно использовать для передачи данных между блоками, работающими на одной частоте, но с разными фазами или задержками.
  • Интерфейсы ввода-вывода: буферизация данных при обмене с внешними устройствами (например, АЦП, ЦАП, микроконтроллеры).
  • Реализация очередей и буферов FIFO в процессорных ядрах: например, в кэш-памяти или в буферах команд.

Отличия от асинхронного FIFO

ХарактеристикаСинхронный FIFOАсинхронный FIFO
Тактовый сигналОдин (единый clk)Два (clk_wr, clk_rd)
Сложность реализацииНижеВыше (требуется синхронизация указателей)
Область примененияОдин тактовый доменРазные тактовые домены
Генерация флаговПроще (сравнение указателей)Сложнее (используются серые коды)

Реализация на языках описания аппаратуры

Синхронный FIFO часто описывается на языках VHDL или Verilog. Пример типовой реализации на Verilog (упрощённый):

```verilog module sync_fifo #( parameter DATA_WIDTH = 8, parameter ADDR_WIDTH = 4 )( input wire clk, input wire rst, input wire wr_en, input wire rd_en, input wire [DATA_WIDTH-1:0] data_in, output reg [DATA_WIDTH-1:0] data_out, output wire full, output wire empty );

localparam DEPTH = 1 << ADDR_WIDTH;

reg [ADDR_WIDTH-1:0] wr_ptr, rd_ptr; reg [DATA_WIDTH-1:0] mem [0:DEPTH-1];

always @(posedge clk) begin if (wr_en && !full) mem[wr_ptr] <= data_in; if (rd_en && !empty) data_out <= mem[rd_ptr]; end

always @(posedge clk or posedge rst) begin if (rst) begin wr_ptr <= 0; rd_ptr <= 0; end else begin if (wr_en && !full) wr_ptr <= wr_ptr + 1; if (rd_en && !empty) rd_ptr <= rd_ptr + 1; end end

assign empty = (wr_ptr == rd_ptr); assign full = ((wr_ptr + 1) == rd_ptr); // упрощённый вариант

endmodule ```

В реальных проектах применяются более сложные схемы с дополнительными битами и защитой от метастабильности.

Ограничения и особенности

  • Глубина FIFO: определяется разрядностью адреса (2^ADDR_WIDTH). При выборе глубины необходимо учитывать максимальную задержку между записью и чтением.
  • Производительность: максимальная тактовая частота ограничена задержками в цепях памяти и компаратора. Для высокоскоростных применений (например, >500 МГц) требуется оптимизация (конвейеризация, использование блоков памяти с низкой задержкой).
  • Потребление энергии: активность записи/чтения и переключение указателей влияют на динамическое энергопотребление. В маломощных приложениях применяются методы тактирования с пониженной активностью (clock gating).

Источники

  • Clifford E. Cummings, «Simulation and Synthesis Techniques for Asynchronous FIFO Design», SNUG 2002.
  • Peter J. Ashenden, «The Designer’s Guide to VHDL», 3rd Edition, Morgan Kaufmann, 2008.
  • Xilinx, «UG901: Vivado Design Suite User Guide — Synthesis», 2023.
  • Altera (Intel), «AN 480: Implementing FIFOs in Intel FPGA Devices», 2017.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →