Как подключить к Arduino FPGA

Теоретически, чтобы подключить к Arduino микросхему FPGA, требуется выполнить согласование уровней напряжений сигналов, поскольку выводы FPGA соответствуют стандарту логических уровней напряжений LVTTL. Так я и поступил, подключив чип FPGA к Arduino по следующей схеме согласования:

Схема согласования уровней TTL и LVTTL при подключении к Arduino микросхемы FPGA

Однако стабильно эта схема работать по невыясненной пока причине отказалась -- данные передавались как бы с помехами на линии (периодически два-три байта передавались неверно). Чуть лучше всё это работало, если после отправки каждого байта посылался импульс по линии nSS.

Тогда я попробовал подключить к FPGA трёхвольтовую плату Olimexino-STM32, и в результате выяснилось, что первая версия slave-модуля интерфейса SPIбыла написана что называется криво. Переписав модуль с нуля и добавив подтягивающие (pull-up) резисторы, я получил работающую схему, которая успешно передает данные даже с частотой тактирования SCK 18 МГц (18 Мбод).

Я соединил по такой же схеме согласования уровней Arduino и Olimexino-STM32, однако выяснилось, что данные по ней получается передавать, только когда Olimexino-STM32 выступает в качестве мастера, а Arduino в режиме slave. Да и то, со скоростью не выше 1.125 МГц.

С написанным мною slave-модулем интерфейса SPI, после добавления в схему дополнительных подтягивающих (pull-up) резисторов, Arduino в качестве мастера работать и вовсе отказался -- данные передаются, но неверно. Тестирование самой схемы согласования не выявило никаких проблем, да и Olimexino-STM32 в роли мастера и Arduino в режиме slave с ней успешно работают.

UPD1: Есть подозрение, что вышел из строя кварцевый осциллятор. Возможно, причина того, что данные от Arduino перестали передаваться, заключается именно в этом.

UPD2: Замена осциллятора не спасла положения. Возможных вариантов вижу 3:

  1. Не работает сама схема согласования, но чтобы это проверить, требуется осциллограф, которого у меня пока к сожалению нет.
  2. Данные на самом деле передаются от Arduino к FPGA, но не передаются обратно, поскольку тока в 8 мА на выводе микросхемы Cyclone III не хватает для того, чтобы управлять подтяжкой (pull-up) в 5К из двух резисторов по 10К, включенных параллельно.
  3. Теоретически тока должно хватать (ток подтяжки при напряжении 3,3 В получается 660 мкА против 330 мкА для одного резистора в 10К), следовательно есть ещё вариант, что это как-то связано с тем, что микросхема Cyclone III вообще-то 2,5 В. Такой вывод я сделал из того, что кодеком, который я успешно подключил до этого к Cyclone, у меня с Cyclone III работать не захотел (тоже интерфейс управления SPI). Во всяком случае проблема с кварцевым осциллятором оказалась в том, что в настройках распиновки вход CLK был по умолчанию заявлен как LVTTL 2,5 В.

UPD3: Удалось выяснить причину появления "мусора" при передаче. Причиной оказался блок питания, который я использовал. Попробую заменить на другой.

UPD4: Заказал на Farnell DE0-Nano.

  1. В ней оказался 2.5 вольтовый чип, следовательно нужно начинать подключение сначала.
  2. Из интереса скомпилировал Nios-II. В ней 22 тысячи логических вентилей, процессор с SDRAM-контроллером занял около 3 тысяч. К нему прилагается компилятор C. Попробовал помигать светодиодом - работает. Программа выполняется в SDRAM, которого на борту 32 МБ, процессор 32-битный, хоть и медленный. Задумался, что к чему стоит подключать - FPGA к Arduino или логичнее Arduino к FPGA.