pzl104 3 21 февраля, 2023 Опубликовано 21 февраля, 2023 · Жалоба Здравствуйте! Возможно глупый вопрос, я только начинаю осваивать ПЛИС. Насколько понимаю из литературы и рекомендаций - самый идеальный вариант - когда вся система тактируется от одного источника глобального клока, и все события выполняются с привязкой к нему - так называемый "синхронный дизайн". Есть у меня задача - для обмена данными с ПК - прицепить к ПЛИСине микросхему FT2232 (это конвертер с usb на параллельный fifo) , т.к. по текущему уровню знаний не готов ввязываться в запуск ethernet'а и т.п. Так вот у этой ft2232 максимальная скорость передачи данных достигается при использовании режима, когда запись и чтение из регистра делаются по фронту клока, который генерирует сам чип - и он там 60мгц. Из этого следует два вопроса. Куда в плисину этот клок заводить? На специальные clk ножки, или можно на любую "gpio" ножку? Если на clk ножку, обязательно ли шину данных подключать к этой группе ножек к которой относится клок? Второй вопрос - модуль работы с этим 2232 - я так понимаю что чтение/запись нужно делать по клоку с этой ножки, а дальше копировать регистр в некий буфер, который будет передаваться в другие модули по состоянию готовности, уже синхронно с глобальным клоком? Получается к аппаратному fifo нужно делать еще и программный fifo внутри плисины, для обеспечения синхронности работы всей системы? Камень Virtex 4, язык Verilog, среда - ISE 14.7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба 1 час назад, pzl104 сказал: На специальные clk ножки Желательно. 1 час назад, pzl104 сказал: Если на clk ножку, обязательно ли шину данных подключать к этой группе ножек к которой относится клок? Необязательно. 1 час назад, pzl104 сказал: Второй вопрос - модуль работы с этим 2232 - я так понимаю что чтение/запись нужно делать по клоку с этой ножки, а дальше копировать регистр в некий буфер, который будет передаваться в другие модули по состоянию готовности, уже синхронно с глобальным клоком? Получается к аппаратному fifo нужно делать еще и программный fifo внутри плисины, для обеспечения синхронности работы всей системы? Видео в помощь 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба 6 hours ago, pzl104 said: Куда в плисину этот клок заводить? На специальные clk ножки, или можно на любую "gpio" ножку? Если на clk ножку, обязательно ли шину данных подключать к этой группе ножек к которой относится клок? Второй вопрос - модуль работы с этим 2232 - я так понимаю что чтение/запись нужно делать по клоку с этой ножки, а дальше копировать регистр в некий буфер, который будет передаваться в другие модули по состоянию готовности, уже синхронно с глобальным клоком? Получается к аппаратному fifo нужно делать еще и программный fifo внутри плисины, для обеспечения синхронности работы всей системы? Камень Virtex 4, язык Verilog, среда - ISE 14.7 1. Крайне желательно на спец. клоковый пин. 2. Подойдет любой клоковый пин. 3. Синхронности в любом случае вам уже не достичь, ибо два клока как минимум независимых вы уже имеете. Вместо обычного FIFO попробуйте использовать двухклоковый. Не забудьте что различные флажки привязаны к различным доменам клока когда будете делать автомат управления логикой работы всей системы. Управление переходами автомата сигналом из другого клокового домена - классическая ошибка. Вроде как бы всё и работает, но иногда улетает в непонятное состяние. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pzl104 3 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба Спасибо большое! Буду пробовать. Цикл лекций на Youtube интересный, не попадался он мне при поиске - за ссылку отдельное спасибо! Некоторые вещи стали более понятными ) 6 часов назад, Bad0512 сказал: Управление переходами автомата сигналом из другого клокового домена - классическая ошибка. Вроде как бы всё и работает, но иногда улетает в непонятное состяние. Правильно ли я понимаю что автомат нужно тактировать об общего клока, а внутри него условно говоря такой алгоритм (псевдокод): char state=1; select case(state): 1: if (fifo_ready) state++; 2: read from fifo if (read_ok) state++; 3: fifo_ready=0; (даем сигнал о том что прочитали данные и можно продолжать заполнять буфер) переменная fifo_ready соответственно ставится в 1 внутри автомата который тактируется от отдельного клока ft2232, после того как буфер готов к чтению из top модуля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба On 2/22/2023 at 1:59 PM, pzl104 said: даем сигнал о том что прочитали данные и можно продолжать заполнять буфер сигналы готовности FIFO (с обеих сторон - и со стороны приходящих данных, и со стороны, эти данные забирающей) - как я понимаю, должны формироваться внутри этого FIFO в соответствующих клоковых доменах (управляющие потоком входящих данных - (входным) клоком, синхронным с этим потоком, а с "выходной" стороны FIFO - внутренним клоком FPGA), а не внешним автоматом. Т.к. внешний автомат не видит состояния FIFO - есть ли в нем место для приходящих данных, есть ли еще не "забранные" из него данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pzl104 3 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба 18 минут назад, Yuri124 сказал: сигналы готовности FIFO (с обеих сторон - и со стороны приходящих данных, и со стороны, эти данные забирающей) - как я понимаю, должны формироваться внутри этого FIFO в соответствующих клоковых доменах (управляющие потоком входящих данных - (входным) клоком, синхронным с этим потоком, а с "выходной" стороны FIFO - внутренним клоком FPGA), а не внешним автоматом. Т.к. внешний автомат не видит состояния FIFO - есть ли в нем место для приходящих данных, есть ли еще не "забранные" из него данные. Я думал сделать дополнительный wire, например fifo_ready который ставится в 1 внутри fifo'шного clock домена когда он готов к приему данных, и по критерию появления этой единицы автомат из глобального домена начинает записывать туда данные - так не правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба On 2/22/2023 at 3:08 PM, pzl104 said: внутри fifo'шного clock домена FIFO имеет 2 клоковых домена - для входящих данные и исходящих данных. On 2/22/2023 at 3:08 PM, pzl104 said: автомат из глобального домена начинает записывать туда данные Глобальный домен - это что? Записывать в FIFO данные должно устройство со стороны входа FIFO, на входной частоте (клоковый домен входящих данных - т.е. Ваша FT2232), и сигнал готовности принять данные в FIFO логично формировать в этом домене - это должно делать само fifo. А сигнал наличия данных - уже формируется на частоте того блока FPGA, который их должен забирать - тоже самим FIFO. Можно, конечно, формировать управляющие сигналы не теми клоками, но в таком случае придется их синхронизировать вне FIFO дополнительными синхронизаторами. Но логичнее, даже если писать FIFO самому, всё это (при необходимости наличия) впихнуть в само FIFO, чтобы внешние устройства имели уже готовый синхронный в своем клоковом домене сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pzl104 3 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба Спасибо. Надо осмыслить ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 27 февраля, 2023 Опубликовано 27 февраля, 2023 · Жалоба On 2/22/2023 at 5:59 PM, pzl104 said: Правильно ли я понимаю что автомат нужно тактировать об общего клока, а внутри него условно говоря такой алгоритм (псевдокод): char state=1; select case(state): 1: if (fifo_ready) state++; 2: read from fifo if (read_ok) state++; 3: fifo_ready=0; (даем сигнал о том что прочитали данные и можно продолжать заполнять буфер) переменная fifo_ready соответственно ставится в 1 внутри автомата который тактируется от отдельного клока ft2232, после того как буфер готов к чтению из top модуля. У вас в асинхронном ФИФО есть два клоковых домена - домен клока записи и домен клока чтения. Флажки(FULL,ALMOST_FULL,HALF_FULL), которые определяют заполненность фифошки привязаны к домену клока записи, а флажки(EMPTY,ALMOST_EMPTY,PROG_EMPTY), которые определяют наличие места в фифошке - привязаны к домену клока чтения. В принципе не очень важно на каком из этих двух клоков вы построите автомат управления, важно чтобы сигналы, которые управляют переходами в этом автомате были порождены от того же клока, на котором работает автомат. При необходимости эти сигналы надо пересинхронизировать на нужный клоковый домен. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться