Буфер fifo что это

Используем черную магию для создания быстрого кольцевого буфера

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Вчера я заглянул на страницу Википедии, посвященную кольцевому буферу (circular buffer), и был заинтригован предполагаемой техникой оптимизации, с которой до этого не был знаком:

В рамках реализации кольцевого буфера нам необходимо обработать случай, когда сообщение попадает на «разрыв» в очереди и должно быть перенесено (wrap around). Очевидная реализация записи в кольцевой буфер может полагаться на побайтовую запись и выглядеть примерно так:

Тот факт, что для индексации в массиве необходима операция деления, затрудняет (если не исключает) векторизацию этой функции и, следовательно, делает ее неоправданно медленной. Хотя есть и другие оптимизации, которые мы можем здесь применить, методика из Википедии, предложенная выше, превосходит аппаратно-независимые подходы в силу того факта, что блок управления памятью может справиться с львиной долей логики циклического переноса за нас. Я был так воодушевлен этой идеей, что не стал проводить никаких дополнительных исследований и реализовал ее, основываясь только на кратком описании, приведенном выше.

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

Кольцевой буфер

Учитывая это, мы можем написать простые методы чтения ( get ) и записи ( put ), используя побайтовый доступ:

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

А вот пример использования этого кольцевого буфера:

Наш код прост и отлично работает. Но почему бы не усложнить его немного?

Встречайте таблицу страниц

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

Таблица страниц для некоторой программы А может выглядеть следующим:

Номер виртуальной страницы

Источник

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

FIFO (First In First Out)

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

FIFO (англ. First In First Out ) является аббревиатурой для «первый пришел, первый ушел», способа организации и управления буфером данных, где сначала обрабатывается самая старая (первая) запись, или ‘голова’ очереди. Она аналогична обработке очереди (первым пришел, первым обслужен (ПППО)): где люди покидают очередь в том порядке, в котором они прибывают.

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

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

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

Содержание

Информатика

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

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

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

Реализация

Следующий код показывает реализацию связанного списка FIFO на языке C++. На практике, существует целый ряд реализаций списка, в том числе популярных макросов Unix-систем C sys/queue.h или шаблона стандартной библиотеки C++ std :: list, устраняя необходимость в реализации структуры данных с нуля.

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

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

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

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

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

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

Электроника

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

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

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

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

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

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

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

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

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

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

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

Источник

Как работает FIFO

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

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

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

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

Давайте рассмотрим внешние порты компонента 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 мы должны записать слово в двухпортовую память и увеличить счётчик записи. Или сначала увеличить, а потом записать. А при операции чтения надо зафиксировать данные на выходе и увеличить счётчик чтения. А вот дальше требуется решить следующие вопросы:

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер 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 пустое.

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

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

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

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

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

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

В этом случае 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:

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

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

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

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

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

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

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

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

Источник

UDB. Что же это такое? Часть 3. Datapath FIFO

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Продолжаем делать перевод фирменной документации фирмы Cypress на блоки UDB. Тем более, что всё очень удачно совпадает. Для продолжения практической статьи по UDB понадобится использование FIFO, а в теоретической части мы подобрались как раз к их описанию. Поэтому начинаем изучать их во всех деталях.

Общее содержание цикла «UDB. Что же это такое?»
Часть 1. Введение. PLD.
Часть 2. Datapath.
Часть 3. Datapath FIFO. (Текущая статья)
Часть 4. Datapath ALU.
Часть 5. Datapath. Полезные мелочи.
Часть 6. Модуль управления и статуса.
Часть 7. Модуль управления тактированием и сбросом
Часть 8. Адресация UDB

21.3.2.2 Datapath FIFO

Режимы и конфигурации FIFO

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

Таблица 21-2. Режимы и конфигурации FIFO.

РежимОписание
Input/Output
(Входной/выходной буфер)
В режиме входного буфера CPU или DMA записывают
данные в FIFO, а Datapath считывает их. В режиме
выходного буфера данные попадают в FIFO из
Datapath, а считывает их оттуда CPU или DMA.
Single Buffer
(Одиночный буфер)
FIFO работает как одиночный буфер без статуса.
Записанные в FIFO данные сразу доступны для чтения и могут
быть перезаписаны в любое время.
Level/Edge
(Уровень/перепад)
Параметр, отвечающий за загрузку FIFO из Datapath,
может инициироваться по уровню или по перепаду.
Normal/Fast
(Нормальный/быстрый)
Параметр, отвечающий за загрузку FIFO из источника
Datapath: тактируется она с частотой выбранного для Datapath
тактового источника (normal) или с частотой шины (fast).
Это позволяет выполнять захват с наивысшей частотой
в системе (частота шины), независимо от тактовой частоты Datapath.
Software Capture
(Программный захват)
Когда включен этот режим, а FIFO находится в режиме
выходного буфера, чтение CPU или DMA связанного
аккумулятора (A0 для F0, A1 для F1), инициализирует
синхронную передачу значения аккумулятора в FIFO.
Захваченное значение сразу доступно для чтения из FIFO.
Если активирована поддержка связывания в цепочки,
операция проследует по цепочке до блока MS, чтобы
Datapath мог выполнить атомарное считывание многобайтовых
значений.
Asynch
(Асинхронный)
Когда тактовые частоты Datapach и системной шины не
синхронизированы, сигналы статуса FIFO могут быть
проброшены на остальную часть Datapath либо
напрямую, тактируясь от тактовой частоты Datapath,
либо с двойной синхронизацией, в режиме Asynch.
Independent Clock Polarity
(Независимая тактовая полярность)
Каждый FIFO имеет управляющий бит для инвертирования
полярности тактового сигнала FIFO по отношению к тактированию Datapath.

На рисунке 21-7 показаны возможные варианты конфигурации пары FIFO, в зависимости от выбранных для каждого из них режимов Input/Output. Если один FIFO находится во входном режиме, а другой в выходном, получаем конфигурацию RX/TX. Типичный пример, где нужна такая конфигурация, контроллер шины SPI. В конфигурации Dual Capture (оба FIFO настроены на выход) обеспечивается независимый захват пары A0 и A1 или два независимых захвата регистров A0 или A1. Наконец, в режиме Dual Buffer (оба на вход) возможно использование для загрузки или сравнения как регистровой пары, так и двух независимых регистров.

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Рисунок 21-7. Конфигурации FIFO.

На рисунке 21-8 подробно показаны источники и приемники для FIFO.

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Рисунок 21-8. Источники и приемники FIFO.

Когда FIFO работает в режиме входного буфера, источником является системная шина, а приемниками – регистры Dx и Ax. При работе в режиме выходного буфера, источниками являются регистры Ax и ALU, а приемником – системная шина. Выбор мультиплексора задан статически в регистре конфигурации UDB CFG15, как показано в таблице для F0_INSEL[1:0] или F1_INSEL[1:0]:

Таблица 21-3. Набор мультиплексоров FIFO в регистре конфигурации UDB.

Fx_INSEL[1:0]Описание
00Режим входного буфера: системная шина записывает в FIFO, а приемником
FIFO является Ax или Dx.
01Режим выходного буфера: источником FIFO является А0, а приемником
FIFO – системная шина.
10Режим выходного буфера: источником FIFO является A1, а приемником
FIFO – системная шина.
11Режим выходного буфера: источником FIFO является выход ALU, а приемником
FIFO – системная шина.

Статус FIFO

Каждый FIFO вырабатывает два сигнала статуса, «bus» и «block», которые передаются на трассировочные ресурсы UDB через выходной мультиплексор Datapath. Статус «bus» можно использовать для взведения прерывания или запроса DMA чтения/записи в FIFO. Состояние «block» в основном предназначается для передачи состояния FIFO на внутренние сущности UDB. назначение битов статуса зависят от сконфигурированного направления (Fx_INSEL[1:0]), и битов уровня FIFO. Биты уровня FIFO (Fx_LVL) устанавливаются в регистре Auxiliary Control в пространстве рабочих регистров. Варианты статусов показаны в следующей таблице:

Таблица 21-4. Варианты состояния FIFO.

Fx_INSEL[1:0]Fx_LVLСостояниеСигналОписание
Ввод0Не полонСтатус «Bus»Взводится, когда в FIFO есть
место хотя бы для одного байта.
Ввод1Опустошен
как минимум
наполовину
Статус «Bus»Взводится, когда в FIFO есть
место хотя бы для 2 байтов.
ВводН/ДПустСтатус «Block»Взводится, когда в FIFO нет
ни одного байта.
Когда FIFO не пуст, Datapath
может считывать байты.
Когда FIFO пуст, Datapath
может находиться в состоянии
ожидания либо сгенерировать
состояние опустошения.
Вывод0Не пустСтатус «Bus»Взводится, когда в FIFO
доступен хотя бы 1 байт
для чтения.
Вывод1Заполнен
как минимум
наполовину
Статус «Bus»Взводится, когда в FIFO доступны
хотя бы 2 байта для чтения.
ВыводН/ДПолонСтатус «Block»Взводится, когда FIFO полон.
Когда FIFO не полон, Datapath
может записывать байты в FIFO.
Когда FIFO полон, Datapath
может находиться в
состоянии ожидания или
сгенерировать условие
переполнения.

Иллюстрация работы FIFO

Рисунок 21-9 показывает типичную последовательность чтения и записи, а также генерации связанных с этими операциями статусов. На рисунке чтение и запись происходят в разное время, однако они могут выполняться и одновременно.

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Рисунок 21-9 Работа приемников FIFO.

Быстрый режим FIFO (FIFO FAST)

Когда FIFO работает в режиме выходного буфера, операция загрузки FIFO обычно использует тактовую частоту выбранного Datapath для тактирования сигнала записи. Как показано на рисунке 21-10, при выборе быстрого режима FIFO (FIFO FAST) для этой конкретной операции можно выбрать частоту шины. При использовании совместно с режимом Level/Edge = Edge, эта операция позволяет уменьшить задержку передачи из аккумулятора в FIFO с периода тактовой частоты Datapath до периода тактовой частоты шины, так как у шины частота может быть гораздо выше. Это позволяет CPU или DMA считывать полученный результат FIFO с минимальной задержкой.

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

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Рисунок 21-10. Приемники быстрой конфигурации FIFO.

Режим записи в FIFO Edge/Level (по перепаду/по уровню)

Существуют два режима записи в FIFO из Datapath. В первом режиме данные синхронно передаются из аккумуляторов в FIFO. Управляющий сигнал этой записи (FX_LD) обычно формируется конечным автоматом или синхронизированным с тактированием Datapath условием. Запись в FIFO будет проводиться в любом цикле, в котором управляющий сигнал загрузки ввода равен ‘1’. Во втором режиме FIFO используется для захвата значений аккумулятора в ответ на положительный перепад сигнала FX_LD. В этом режиме формат сигнала сигнала является произвольным (однако его период должен быть равен как минимум одному циклу тактирования Datapath). Примером этого режима является захват значения аккумулятора при помощи входа внешней ножки в качестве триггера. Ограничением этого режима является то, что параметр входа должен возвращаться к значению ‘0’ как минимум за один цикл до обнаружения другого положительного перепада.

На рисунке 21-11 показана реализация режима обнаружения перепада на входе FX_LD. Режим обоих FIFO в UDB управляются одним и тем же битом, переключающим данную опцию. Обратите внимание, что обнаружение перепада тактируется с частотой, равной частоте выбранного FIFO.

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Рисунок 21-11. Обнаружение перепада для внутренних приемников записи FIFO.

Режим программного захвата FIFO (Software Capture)

Распространенным и важным требованием является обеспечение возможности для CPU и DMA надежно считывать содержимое аккумулятора во время нормальной работы. Это делается при помощи программного захвата и включается при помощи бита конфигурации FIFO Cap. Этот бит применяется к обоим FIFO в UDB, но работает, только когда FIFO находится в режиме выходного буфера. При использовании программного захвата F0 должен считывать из A0, а F1 из A1.

Как показано на рисунке 21-12, чтение аккумулятора инициирует запись в FIFO из аккумулятора. Сигнал связывается в цепочку, чтобы чтение конкретного байта одновременно захватывало значения аккумуляторов всех UDB в цепочке. Это позволяет 8-битному процессору успешно считывать одновременно 16 битов или больше. Данные, возвращенные при чтении аккумулятора, должны игнорироваться, а захваченное значение может быть сразу доступно для чтения из FIFO.

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

Также рекомендуется очищать целевой FIFO в программном коде (регистр ACTL) до начала программного захвата. Благодаря этому указатели на чтение и запись FIFO будут установлены в известное состояние.

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Рисунок 21-12. Конфигурация программного захвата.

Примечание переводчика:
Я долго не мог понять смысла этого раздела. Потом я долгое время был уверен, что раздел написан для PSoC3, восьмибитное ядро которого не может обращаться более, чем к байту. Но при создании восьмой части перевода, оказалось, что даже в PSoC5LP при всей 32-битности процессорного ядра ARM, доступ к рабочим регистрам UDB может вестись либо в воьмибитном, либо в шестнадцатибитном режиме. Больше, судя по документу, нет. Вот тут-то и пригодится описываемая функциональность.

Биты управления FIFO

В регистре Auxiliary Control, который может быть использован для управления FIFO во время нормальной работы, содержится 4 бита.

Биты FIFO0 CLR и FIFO1 CLR используются для сброса или очистки FIFO. Когда одному из этих битов присваивается значение ‘1’, связанный с ним FIFO сбрасывается. Бит должен быть восстановлен в исходное значение (‘0’), чтобы FIFO продолжил работу. Если значение бита останется равным единице, соответствующий FIFO будет отключен и будет работать как однобайтный буфер без статуса. Данные могут быть записаны в FIFO, данные сразу доступны для чтения и могут быть перезаписаны в любое время. Направление данных при помощи битов конфигурации FX INSEL[1:0] все еще можно задавать.

Биты FIFO0 LVL и FIFO1 LVL определяют уровень, при котором FIFO взведёт статусный бит «bus» (когда шина читает или пишет в FIFO). То есть, состояние статуса «bus» зависит от заданного направления, как показано в таблице ниже.

Таблица 21-5. Управляющие биты уровня FIFO

FIFO LVLРежим входного буфера
(шина записывает в FIFO)
Режим выходного буфера
(шина читает из FIFO)
0Не полон
Может быть записан как минимум 1 байт
Не пуст
Может быть считан как минимум 1 байт
1Опустошен как минимум наполовину
Могут быть записаны как минимум 2 байта
Заполнен как минимум наполовину
Могут быть считаны как минимум 2 байта

Асинхронная работа FIFO

Рисунок 21-13 показывает принцип асинхронной работы FIFO. В качестве примера представим, что F0 работает в режиме входного буфера, а F1 в режиме выходного буфера, что является типичной конфигурацией TX и RX регистров.

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Рисунок 21-13. Асинхронная работа FIFO.

На стороне TX конечный автомат Datapath использует флаг Empty, чтобы определить, есть ли доступные для получения байты. Значение Empty устанавливается синхронно с конечным автоматом Datapath, а очищается асинхронно из-за записи из шины. После очистки статус снова синхронизируется с конечным автоматом Datapath.

На стороне RX конечный автомат RX использует Full, чтобы определить есть ли свободное пространство для записи в FIFO. Значение Full устанавливается синхронно с конечным автоматом Datapath, а очищается асинхронно из-за чтения шиной. После очистки статус снова синхронизируется с конечным автоматом Datapath.

Один бит FIFO ASYNCH используется для включения этого метода синхронизации, после активации этот метод применяется к обоим FIFO.

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

Таблица 21-6. Параметры синхронизации статуса Block FIFO.

ASYNCADD SYNCОперацияМодель использования
00Синхронно с тактированием шиныИзменения статуса записи/чтения CPU
происходят на частоте шины. Можно
использовать для минимальной
задержки, если удается достичь
частоты тактирования Datapatch,
равного частоте шине.
01Пересинхронизация с частоты
шины на частоту Datapath.
Этот режим должен быть
режимом работы по умолчанию. Когда
CPU выполняет операции чтения/записи,
изменение статуса будет пересинхронизировано
с частотой, используемой в Datapath.
Даёт возможность использовать полный
период частоты Datapath для установки
сигнала для логики UDB.
10Зарезервировано
11Двойная синхронизация частоты
шины на частоту Datapath.
Когда тактовые импульсы для Datapath
не только не синхронизированы с
системными по частоте, но и
вырабатываются отдельным
независимым генератором,
этот параметр может быть
использован для двойной
синхронизации операций
чтения и записи CPU
с тактированием Datapath.

Переполнение FIFO при работе

Для безопасной реализации внутренних (Datapath) и внешних (CPU или DMA) операций чтения и записи следует использовать сигналы статуса FIFO. От условий опустошения и переполнения нет встроенной защиты. Если FIFO полон, а последующие операции записи выполняются (переполнение), новые данные перезаписывают начало FIFO (данные, который на данный момент выводятся, и являются следующими в очереди на чтение). Если FIFO пуст, а последующие операции чтения выполняются (опустошения или истощения), считываемое значение не определено. Указатели FIFO сохраняют точность вне зависимости от незаполнения и переполнения.

Инверсия тактирования FIFO

Каждый FIFO имеет бит управления Fx CK INV, который отвечает за полярность тактирования FIFO Относительно полярности тактирования Datapath. По умолчанию, FIFO работает с той же полярностью что и тактирование Datapath. Когда этот бит равен 1, FIFO работает с обратной полярностью относительно Datapath. Это обеспечивает поддержку протоколов, обменивающимися данными по обоим фронтам, например, SPI.

Динамическое управление FIFO

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

Буфер fifo что это. Смотреть фото Буфер fifo что это. Смотреть картинку Буфер fifo что это. Картинка про Буфер fifo что это. Фото Буфер fifo что это

Рисунок 21-14. Динамический режим FIFO.

В режиме внутреннего доступа (Internal Access) Datapath может считывать и записывать в FIFO. В этой конфигурации, чтобы выбирать источник операций записи в FIFO, биты Fx INSEL должны иметь значение 1. Fx INSEL = 0 (источник шины CPU) в этом режиме некорректен, он может принимать только значения 1, 2 или 3 (A0, A1 или ALU). Стоит заметить, что чтение имеет доступ только к соответствующему аккумулятору, направление регистров данных в этом режиме недоступно.

В режиме внешнего доступа (External Access) CPU или DMA могут как считывать, так и записывать в FIFO.

Конфигурация динамически переключается между внешним и внутренним доступом при помощи проброса сигналов от Datapath. Для этого используются входные сигналы Datapath d0_load и d1_load. Стоит заметить, что в режиме динамического управления d0_load и d1_load недоступны для их нормального использования при загрузке регистров D0/D1 из F0/F1. Сигналы dx_load могут быть вызваны любым трассировочным сигналом, включая константы.

Рассмотрим пример, в котором, начиная с внешнего доступа (dx_load == 1), CPU или DMA могут записывать один или несколько байтов данных в FIFO. Затем, при переключении на внутренний доступ (dx_load == 0), Datapath может выполнять операции над данными. После этого, при переключении на внешний доступ, CPU или DMA могут считать результат вычислений.
Так как Fx INSEL всегда должен быть равен 01, 10 или 11 (A0, A1 или ALU), что соответствует «режиму выходного буфера» при нормальной работе, сигналы статуса FIFO имеют следующие определения (в зависимости от параметра Fx LVL):

Таблица 21-7. Статус FIFO.

Сигнал статусаЗначениеFx LVL = 0Fx LVL = 1
fx_blk_statСтатус записиFIFO полонFIFO полон
fx_bus_statСтатус чтенияFIFO не полонЗаполнен как минимум наполовину

Так как и Datapath и CPU могут записывать и считывать из FIFO, эти сигналы больше не считаются статусами «block» и «bus». Сигнал blk_stat используется для статуса записи, а сигнал bus_stat для статуса чтения

21.3.2.3 Статус FIFO

Существует четыре сигнала статуса FIFO, по два для каждого FIFO: fifo0_bus_stat, fifo0_blk_stat, fifo1_bus_stat и fifo1_blk_stat. Значение этих сигналов зависит от направления конкретного FIFO, которое определено статической конфигурацией. Статус FIFO подробно описан в разделе 21.3.2.2 Datapath FIFO.

В следующей части мы перейдем к разбору Арифметико-Логического Устройства (ALU).

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *