FIFO с 2 часами в VHDL
У меня проблема с назначением VHDL. Мне нужно создать буфер FIFO между шиной 500 МГц и другой шиной 30 МГц.
Я разработал базовый буфер FIFO с
входные данные: Data_in, Write_EN, CLK_500, Read_EN, CLK_30, FlushFIFO.
выходы: Data_out, FULL, EMPTY.
Этот буфер был разработан с использованием 2D-массива:
type fifo_arr is array (0 to 63) of std_logic_vector(39 downto 0);
signal FIFO : fifo_arr := (others => (others => '0'));
Проблема заключается в следующем: как я должен записывать процессы и поддерживать указатель между ними для синхронизации? С методом, который я попробовал, код не будет синтезировать (ОШИБКА:XST:827 Сигнал ptr не может быть синтезирован)
Есть идеи?
спасибо и всего наилучшего
4 ответа
Это может быть идея показать нам код, на который он действительно жаловался!
FIFO через часовые домены довольно сложны, их не следует пытаться слегка
Сказав это - поскольку это похоже на домашнее задание, хорошее чтение может быть найдено здесь:
http://eda.ee.nctu.edu.tw/jdhuang/courses/ipcd04/paper/alfke_final.pdf
(один из авторов - покойный, великий Питер Альфке - он разработал первый чип FIFO в 1969 году и широко считается гуру FIFO).
Вы можете взглянуть на эти ядра FIFO, доступные в opencores, особенно в версии с двумя часами fifo. Это даст вам правильное представление о синхронизации указателей.
Я думаю, что вам понадобится указатель чтения и записи, оба по модулю 64, так что fifo - это в основном кольцевой буфер. Используйте серое кодирование для адресации, поскольку числа с серым кодом изменяются только на 1 бит между соседними значениями. Это может быть использовано для проверки ошибок. Указатель чтения находится в домене чтения, указатель записи находится в домене записи. Возможно, пересечь каждый указатель на противоположный домен для полной и пустой проверки?
Здесь вы можете найти pdf-файл проекта GitHub, а эту ссылку можно использовать для всего проекта.
Еще один хороший проект можно найти по этой ссылке .