FPGA достигла предела USB WireIns

Я программирую Xilinx Spartan-6 на основе OpalKelly для своей магистерской диссертации в университете. Если быть точным, это ПЛИС, над которой я работаю (XEM6010-LX45): https://www.opalkelly.com/products/xem6010/

Он установлен на плате, которая должна собирать несколько сигналов (8+), обрабатывать их и генерировать несколько (16+), чтобы закрыть некоторые петли обратной связи в зависимости от настроек.

Он управляется пользовательским интерфейсом, созданным на C#, который я также программирую сам, и который должен иметь возможность изменять используемую логику обратной связи, когда это необходимо, без перезапуска эксперимента. Это означает, что интерфейс USB постоянно отправляет данные для обновления настроек.

Я только что столкнулся с классической (я полагаю) проблемой, когда у меня закончились WireIns, которые представляют собой реализацию Opal Kelly для передачи данных через USB из программы C # в FPGA.

Они ограничены 16-битными данными с адресами от 0x00 до 0x1F (то есть 32 WireIn). Подробнее здесь, на странице 41 http://assets00.opalkelly.com/library/FrontPanel-UM.pdf


Вот вопрос: как я могу увеличить данные, которые я могу отправить на FPGA?

Первая идея, которая приходит на ум, — это большой мультиплексор в FPGA, который просто использует два WireIn, один для данных, другой в качестве селектора. Затем триггер активирует FPGA, сохраняя данные в регистре с правильным адресом.

Это действительно жизнеспособно или невероятно неэффективно? Должен ли я использовать WireORs (см. руководство по FrontPanel, на которое я ссылаюсь)? Должен ли я использовать PipeIn и каким-то образом управлять требуемым мультиплексором?

Как разработчики ПЛИС преодолевают этот предел связи через USB?

Заранее спасибо!


person FlyerDragon    schedule 23.02.2015    source источник


Ответы (2)


Если у вас есть много данных, которые вы можете передавать, используйте канал.

Если вы хотите получить доступ к данным случайным образом, вам придется использовать мультиплексор, управляемый WireIn.

Что касается эффективности, вам нужно будет указать, какое измерение эффективности вас интересует и какое значение является приемлемым. Например, пропускная способность, задержка, используемые LUT.

--- Обновление с некоторым кодом

Если у вас есть массив векторов для обновления, называемый regs, и 2 проводных сигнала, называемых address и data, вам просто нужно сделать:

regs(to_integer(unsigned(address))) <= data when rising_edge(clk);

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

regs(to_integer(unsigned(address))) <= data when rising_edge(clk) and trigger_signal = '1';

Если ваш синтезатор не примет приведенный выше код, вам придется зарегистрировать ошибку и преобразовать ее в синхронизируемый процесс с оператором if внутри синхронизируемой части.

person Martin Thompson    schedule 26.02.2015
comment
У меня недостаточно опыта, чтобы оценить приемлемый средний размер проекта. На данный момент я ограничен 32 16-битными словами, но мне понадобится по крайней мере в три раза больше, и большинство из них должны изменяться в середине эксперимента, не влияя на другие значения. Мне было интересно, есть ли правильный/оптимизированный способ кодирования такого мультиплексора - person FlyerDragon; 26.02.2015
comment
Большое спасибо за код, у меня есть сомнения по поводу триггерного сигнала: почему бы не восходящий_край (триггерный_сигнал), так как это импульс, который я мог бы использовать? У меня много разных часов в дизайне: 2, 38, 40, 80Mhz - person FlyerDragon; 04.03.2015
comment
Всегда используйте только истинные тактовые сигналы в операторахrising_edge. Это первое правило синхронного дизайна, о котором много написано. И убедитесь, что вы используете часы, чтобы триггер был синхронным (например, триггер в порту clk блока). Если у вас много разных часов, вам нужно быть очень осторожным при перемещении сигналов, которые передаются из одного домена в другой - ищите часы пересечение доменов - person Martin Thompson; 04.03.2015

Хорошим ответом было бы использование okRegisterBridge, но, как я вижу в описании вашей платы, он доступен только на USB 3.0 :(

Тогда да, в вашем случае, если вы хотите увеличить адресное пространство, вам нужно сделать мультиплексор с одним регистром okWireIn для адреса и одним для записи данных.

person FabienM    schedule 24.02.2015
comment
Помимо того, что для экспериментов мне нужен ноутбук с USB 3.0, какие шаги мне нужно сделать, чтобы переключиться на USB 3.0 как в VHDL, так и в C#? Когда я начал программировать эту плату, первая версия прошивки уже была закодирована, поэтому у меня не было опыта инициализации связи через USB. - person FlyerDragon; 24.02.2015
comment
Проблема связана с используемым вами набором: opalkelly.com/products/xem6010 Он работает с USB2.0. А в вашем мануале (стр. 60) я видел, что только комплект с USB3. 0 поддерживает okRegisterBridge. - person FabienM; 24.02.2015