Очередь FIFO (First In, First Out) представляет собой циклический буфер, где будут храниться помещаемые в очередь данные. Есть два указателя: указатель на «голову» очереди (head) и указатель на «хвост» очереди (tail).
Новый записываемый элемент помещается в ячейку, на которую указывает head, затем этот указатель перемещается на следующую ячейку памяти буфера.
Выбираются элементы из очереди по указателю tail, после того, как элемент выбран из очереди, указатель tail так же передвигается вперед к следующей ячейке.
Обычно глубина FIFO и разрядность указателей являются числами степени двойки. Например, если разрядность указателей head и tail – это 8, то глубина FIFO будет 256 элементов.
Цикличность буфера обеспечивается автоматически. При последовательном увеличении значения указателя однажды возникнает перенос, а сам указатель при этом обнуляется (после указателя 255 его следующее значение будет 0).
Теперь, когда мы знаем, что есть два указателя, легко определить всякие информационные сигналы:
Возможно, последнее утверждение нуждается в пояснении. Например, глубина FIFO 256 элементов.
Мы запишем в него 255 элементов, но читать из FIFO пока не будем. Тогда «голова»=255, а «хвост»=0. Сейчас FIFO полное. Если в него записать еще один элемент, то значение «головы» станет 0 (возникает перенос) и получится, что и «голова» и «хвост» становятся одинаковыми и равными нулю. Все, FIFO опять стало пустым? Конечно, это ошибка логики.Нельзя допускать запись в полное FIFO и чтение/выборку элемента из пустого FIFO.
Все вышеописанное прекрасно, но что делать, если запись и чтение происходят с использованием разных тактовых частот, если FIFO асинхронное? Мы не можем на прямую сравнивать или делать какие-то арифметические операции с указателями «голова» и «хвост», так как в этом случае они храняться в разных клоковых доменах (clock domains).
С другой стороны, понятно, что и «хвост» и «голова» могут изменяться только на единицу за один раз. То есть они считают последовательно. Этот факт как раз и делает возможным использование специальных счетчиков — счетчиков Грея.
Код Грея — специальная система счисления, в которой два соседних значения различаются только в одном разряде.
Вот пример трехбитных кодов Грея. Слева в таблице значения обычного двоичного счетчика, а справа значения из счетчика Грея.
000 100 101 110 111 |
000 |
Методика использования кодов Грея может быть следующая. Значение счетчика указателя, например, головы FIFO перекодируется в код Грея и пересекает клоковый домен с помощью группы синхронизаторов (каждый – это два последовательных триггера). При этом, как мы знаем, не все биты могут быть зафиксированы верно: в новом клоковом домене в некоторых битах зафиксируются новые значения числа на шине, а в некоторых – старые значения. Однако, для кода Грея изменения в соседних числах счетчика происходят только в одном бите, значит только в одном бите и может произойти коллизия. Только один изменяющийся сейчас бит может быть принят не верно. В этом случае принимающий домен просто считает предыдущее число на шине, а верное, следующее число он считает на следующем такте своей частоты. Такая ошибка даже и ошибкой не считается, ведь она не приводит к аварии FIFO.
Принятый код Грея может быть перекодирован обратно в обычную двоичную систему счисления и тут уже мы имеем верное значение обоих указателей в одном клоковом домене. Теперь можно их сравнивать, вычислять число элементов в FIFO и так далее.
В принципе, FIFO может изначально держать указатели «головы» и «хвоста» в кодах Грея.
Вообще использование кодов Грея в асинхронных FIFO очень распространено, так как действительно позволяет решить проблему пересечения клокового домена для потока данных.
Добавить комментарий
Внимание! Это упражнение было открыто в другой вкладке; автосохранение отключено. Закройте эту вкладку или обновите ее для повторной активации.
Инструменты и симуляторыSelect…Aldec Riviera Pro 2022.04Cadence Xcelium 20.09Mentor Questa 2021.3Synopsys VCS 2021.09Aldec SyntHESer 2022.05Mentor Precision 2021.1Yosys 0.9.0VTR 7.0GHDL 0.37Icarus Verilog 0.9.7Icarus Verilog 0.9.6Icarus Verilog 0.10.0 11/23/14GPL Cver 2.12 .aVeriWell 2.8.7C++CshPerlPython
Параметры компиляции
Параметры выполнения
Параметры компиляции
Параметры выполнения
Параметры компиляции
Параметры выполнения
Время выполнения:
Используйте файл run. do Tcl
Опции компиляции
Опции запуска
Время выполнения:
Опции компиляции
Опции
Время выполнения:
Используйте файл run.do Tcl
Используйте сценарий оболочки run.bash .
Параметры компиляции
Параметры выполнения
Время выполнения:
Используйте run.do Tcl-файл
Используйте сценарий оболочки run. bash .
Параметры компиляции
Параметры выполнения
Время выполнения:
Используйте файл run.do Tcl
Используйте run.bash сценарий оболочки
Параметры компиляции
Параметры выполнения
Время выполнения:
Используйте файл run.do Tcl
Используйте сценарий оболочки run.bash .
Параметры импорта Параметры настройки Параметры запуска Параметры симулятора
Параметры компиляции
Параметры выполнения
Используйте файл run. do Tcl
Используйте run.bash сценарий оболочки
Параметры компиляции
Параметры выполнения
Используйте файл run.do Tcl
Используйте сценарий оболочки run.bash .
Параметры компиляции
Параметры выполнения
Используйте файл
Используйте сценарий оболочки run.bash .
Параметры компиляции
Параметры выполнения
Используйте файл run. do Tcl
Используйте run.bash сценарий оболочки
использовать ABC с памятью библиотеки ячеек -nomap fsm -nomap пропустить шаг FSM
Вместо этого используйте файл run.ys .
Показать диаграмму после запуска
Показать список соединений после запуска
Показать диаграмма после пробега
Показать HTML после запуска
Параметры компиляции Выберите… C++98 C++03 C++11 C++14 C++17
Используйте -pedantic -Wall -Wextra
Параметры запуска
Аргументы
Аргументы
Открыть EPWave после запуска
Скачать файлы после запуска
Примеры с помощью игровой площадки EDA
VHDL
Верилог/СистемВерилог
УВМ
ЛегчеUVM
SVAUnit
SVUnit
VUnit
TL-Verilog
е + Верилог
Питон + Верилог
Только Python
С++/SystemC
Подпишитесь на @edaplayground
Тестовый стенд SV/Verilog
Имя файла
Загрузить файлы…
(перетащите куда угодно)
Имя файлаПодтвердите удаление:
Ваша учетная запись не подтверждена. Если вы хотите использовать коммерческие симуляторы, вам нужна подтвержденная учетная запись. Если вы уже зарегистрировались (или недавно изменили свой адрес электронной почты), но не нажали ссылку в письме, которое мы вам отправили, сделайте это. Если вы не можете найти письмо, проверьте папку со спамом/нежелательной почтой. Или нажмите здесь, чтобы повторно отправить электронное письмо. Если вы еще не зарегистрировали полноценную учетную запись, вы можете сделать это, нажав ниже. Затем вам нужно будет предоставить нам некоторую идентификационную информацию. Вы можете сначала сохранить свой код .
Создание, удаление и переименование файлов не поддерживаются во время совместной работы. Чтобы поощрить разработку этих функций для совместной работы, отправьте твит на @EDAPlayground
.Возможно, эта игровая площадка была изменена. Пожалуйста, сохраните или скопируйте перед началом совместной работы.
Поделиться ссылкойПоделиться в Твиттере
Поделиться на Facebook
Внимание! Курс не выбран. Перед отправкой рекомендуется выбрать курс на левой панели.
К Название упражнения Связьhttp://www.edaplayground.com/x/qmj
Ваше упражнение отправлено.
— Реклама —
Здесь представлен проект FIFO с использованием Verilog, смоделированный с помощью программного обеспечения ModelSim. В этой статье мы проектируем и анализируем FIFO, используя различные логики чтения и записи. Мы рассмотрели 64 входа, каждый из которых имеет 32-битные данные.
FIFO — это подход к обработке рабочих запросов программы из очередей или стеков, при котором самый старый запрос обрабатывается первым. Аппаратно это либо массив флопов, либо память для чтения/записи, которая хранит данные из одного домена часов и по запросу передает те же данные в другие домены часов, следуя логике FIFO.
Тактовый домен, передающий данные в FIFO, часто называют логикой записи или ввода, а тактовый домен, считывающий данные из FIFO, часто называют логикой чтения или вывода. Схема выводов FIFO представлена на рис. 1, а ее описание в таблице.
Рис. 1: Ввод/вывод памяти FIFOРис. 2: Окно создания проектаРис. 3: Добавить элементы в окно проектаРис. 4: Окно «Создать файл проекта»— Реклама —
FIFO используются в проектах для безопасной передачи многобитных слов данных из одного домена синхронизации в другой или для управления потоком данных между сторонами источника и получателя, находящимися в одном домене синхронизации. Если области чтения и записи управляются одним и тем же тактовым сигналом, FIFO называется синхронным. Если они управляются разными (асинхронными) тактовыми сигналами, FIFO называется асинхронным. Пример синхронного FIFO описан здесь.
Входной порт управляется входами синхронизации и разрешения записи. Данные записываются в FIFO по каждому переднему фронту, когда он установлен. Выходной порт управляется входами чтения и разрешения чтения. Данные считываются из FIFO по каждому переднему фронту, и активируется разрешение на чтение.
Рис. 5: Окно рабочей областиРис. 6: Добавление новых файловРис. 7: Раздел рабочей областиРис. 8: Окно компиляцииVerilog использовался для кодирования и проверки логики передачи регистров (RTL). В этой статье использовалась схема «снизу вверх», чтобы облегчить отладку различных модулей.
ModelSim — это простой в использовании, но универсальный симулятор VHDL/SystemVerilog/Verilog/SystemC от Mentor Graphics. Он поддерживает поведенческое моделирование, моделирование на уровне передачи регистров и на уровне ворот.
Чтобы начать симуляцию проектирования FIFO, установите ModelSim V10.4a на ПК с Windows и выполните шаги, указанные ниже.
1. Запустите ModelSim с рабочего стола; вы увидите диалоговое окно ModelSim 10.4a.
2. Создайте проект, нажав Jump Start на экране приветствия.
3. Появится окно «Создать проект» (рис. 2). Выберите подходящее имя для вашего проекта. Установите Project Location на E:\FIFO_DESIGN (в нашем случае) и оставьте все остальное по умолчанию, а затем нажмите OK.
4. Появится окно добавления элементов в проект (рис. 3).
5. В этом окне выберите опцию «Создать новый файл».
6. Появится окно «Создать файл проекта». Дайте подходящее имя файла (скажем, FIFO32.v) для файла, который вы хотите добавить, и выберите Verilog в качестве типа Добавить файл и Верхний уровень в качестве папки (рис. 4).
7. В рабочей области главного окна (рис. 5) дважды щелкните только что созданный файл (в нашем случае FIFO32.v).
8. Введите код Verilog (FIFO32.v) в новом окне. Поскольку мы рассмотрели 64 входа, первые данные равны 32’h52_41_4C_4C, а последние — 32’h51_52_54_49., наша главная цель — убедиться, что первые данные появляются в окне вывода симуляции. Обратите внимание, что эти входные данные являются произвольными, поэтому вы можете вводить любые 32-битные данные.
9. Сохраните код из меню «Файл».
10. Добавьте соответствующие исходные файлы, формирующие внутреннюю архитектуру FIFO. К ним относятся D-Flipflop, 2-битный мультиплексор, базовая ячейка, 32-битное слово, ядро и так далее. Добавьте новые файлы в проект FIFO, щелкнув правой кнопкой мыши файл FIFO32.v. Выберите «Добавить в проект» → «Новый файл», как показано на рис. 6.
Дайте имя файла mux21 и выполните шаги с 7 по 9.как уже упоминалось выше.
Аналогичным образом добавьте в проект другие файлы и введите в эти файлы соответствующие коды Verilog.
Подробную информацию об этом FIFO можно получить из соответствующих исходных файлов, которые являются подмодулями FIFO.
Окончательное окно рабочей области показано на Рис. 7.
Рис. 10: Вкладка «Библиотека» Рис. 11: Добавить волну в проектРис. 12: Выбор и контроль сигналовРис. 13: Окно моделированияРис. 14: Окно Wave Компиляция/отладка файлов проекта
1. Выберите «Компилировать» → «Компилировать все параметры».