8-900-374-94-44
[email protected]
Slide Image
Меню

Fifo verilog: FIFO для самых маленьких (вместе с вопросами на интервью) / Хабр

Базовые принципы построения FIFO.

Подробности
Разное
Просмотров: 38004


Очередь FIFO (First In, First Out) представляет собой циклический буфер, где будут храниться помещаемые в очередь данные. Есть два указателя: указатель на «голову» очереди (head) и указатель на «хвост» очереди (tail).

Новый записываемый элемент помещается в ячейку, на которую указывает head, затем этот указатель перемещается на следующую ячейку памяти буфера.

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

 

Обычно глубина FIFO и разрядность указателей являются числами степени двойки. Например, если разрядность указателей head и tail – это 8, то глубина FIFO будет 256 элементов.

Цикличность буфера обеспечивается автоматически. При последовательном увеличении значения указателя однажды возникнает перенос, а сам указатель при этом обнуляется (после указателя 255 его следующее значение будет 0).

Теперь, когда мы знаем, что есть два указателя, легко определить всякие информационные сигналы:

  1. FIFO пусто, если значения указателей «голова» и «хвост» равны.
  2. Число элементов хранимых в FIFO можно вычислить отняв от значения «головы» значение указателя «хвоста». Если получится отрицательное число, то нужно еще прибавить глубину FIFO.
  3. FIFO полное, если число хранимых элементов на единицу меньше, чем глубина FIFO.

Возможно, последнее утверждение нуждается в пояснении. Например, глубина FIFO 256 элементов.

Мы запишем в него 255 элементов, но читать из FIFO пока не будем. Тогда «голова»=255, а «хвост»=0. Сейчас FIFO полное. Если в него записать еще один элемент, то значение «головы» станет 0 (возникает перенос) и получится, что и «голова» и «хвост» становятся одинаковыми и равными нулю. Все, FIFO опять стало пустым? Конечно, это ошибка логики.

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

Все вышеописанное прекрасно, но что делать, если запись и чтение происходят с использованием разных тактовых частот, если FIFO асинхронное? Мы не можем на прямую сравнивать или делать какие-то арифметические операции с указателями «голова» и «хвост», так как в этом случае они храняться в разных клоковых доменах (clock domains).

Просто пересинхронизировать группу (8-ми битные счетчики указателей голова и хвост) сигналов в другой домен не есть хороший вариант, как было уже ранее показано в другой статье. Главная проблема здесь – не все биты шины могут перейти в другой клоковый домен одновременно, а значит двоичное число на шине может быть искажено.

С другой стороны, понятно, что и «хвост» и «голова» могут изменяться только на единицу за один раз. То есть они считают последовательно. Этот факт как раз и делает возможным использование специальных счетчиков — счетчиков Грея.

Код Грея — специальная система счисления, в которой два соседних значения различаются только в одном разряде.

Вот пример трехбитных кодов Грея. Слева в таблице значения обычного двоичного счетчика, а справа значения из счетчика Грея.

000
001
010

011
100
101
110
111

000
001
011
010
110
111
101
100

 

 

 

 

 

 

Методика использования кодов Грея может быть следующая. Значение счетчика указателя, например, головы FIFO перекодируется в код Грея и пересекает клоковый домен с помощью группы синхронизаторов (каждый – это два последовательных триггера). При этом, как мы знаем, не все биты могут быть зафиксированы верно: в новом клоковом домене в некоторых битах зафиксируются новые значения числа на шине, а в некоторых – старые значения. Однако, для кода Грея изменения в соседних числах счетчика происходят только в одном бите, значит только в одном бите и может произойти коллизия. Только один изменяющийся сейчас бит может быть принят не верно.  В этом случае принимающий домен просто считает предыдущее число на шине, а верное, следующее число он считает на следующем такте своей частоты. Такая ошибка даже и ошибкой не считается, ведь она не приводит к аварии FIFO.

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

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

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

 

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

Код редактирования — EDA Playground

Код редактирования — EDA Playground

Загрузка…

Внимание! Это упражнение было открыто в другой вкладке; автосохранение отключено. Закройте эту вкладку или обновите ее для повторной активации.

Инструменты и симуляторы

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.do Tcl

Используйте сценарий оболочки 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


  • testbench. sv

Тестовый стенд SV/Verilog

Имя файла

или

Загрузить файлы…

(перетащите куда угодно)

Имя файла

Подтвердите удаление:

  • Эда игровая площадка
  • EPWave
  • Тривиальный пример
  • Оперативная память от EDA Playground
  • Пример OpenCores

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

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

.

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

Поделиться ссылкой

Поделиться в Твиттере

Поделиться на Facebook

Внимание! Курс не выбран. Перед отправкой рекомендуется выбрать курс на левой панели.

К Название упражнения Связь

http://www.edaplayground.com/x/qmj

Ваше упражнение отправлено.


FIFO Design с использованием Verilog | Подробный проект доступен

— Реклама —

Здесь представлен проект FIFO с использованием Verilog, смоделированный с помощью программного обеспечения ModelSim. В этой статье мы проектируем и анализируем FIFO, используя различные логики чтения и записи. Мы рассмотрели 64 входа, каждый из которых имеет 32-битные данные.

Схема FIFO

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

Тактовый домен, передающий данные в FIFO, часто называют логикой записи или ввода, а тактовый домен, считывающий данные из FIFO, часто называют логикой чтения или вывода. Схема выводов FIFO представлена ​​на рис. 1, а ее описание в таблице.

Рис. 1: Ввод/вывод памяти FIFOРис. 2: Окно создания проектаРис. 3: Добавить элементы в окно проектаРис. 4: Окно «Создать файл проекта»

— Реклама —

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

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

Рис. 5: Окно рабочей областиРис. 6: Добавление новых файловРис. 7: Раздел рабочей областиРис. 8: Окно компиляции

Программное обеспечение

Рис. 9: Окно запуска моделирования

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. Выберите «Компилировать» → «Компилировать все параметры».

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

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