Скоростная передача данных в режиме Synchronous FIFO

 FT PROG EXT

Я решил повторить проект "Скоростная передача данных" платы Марсоход3 теперь уже на плате Марсоход3GW2 с FPGA Gowin.

Работает!

Коротко напомню о чём был этот проект.

На плате Марсоход3GW2, как и на плате Марсоход3, стоит микросхема USB2 FT2232H, которая обычно служит нам JTAG программатором для ПЛИС. На самом деле в микросхеме два канала передачи. Первый канал, это канал JTAG, мы используем его для программирования FPGA, а второй канал используется для приёма и передачи последовательных данных из FPGA в ПК и наоборот.

Среда проектирования IDE Gowin FPGA Designer корректно распознаёт и использует FTDI JTAG программатор платы Марсоход3GW2.

Так же, на плате Марсоход3GW2 стоит микросхема памяти EEPROM 93С46 подключенная к микросхеме FTDI. В эту память можно записать дополнительную информацию для FT2232H, можно даже сменить USB идентификаторы VID/PID, но мы это делать конечно не будем. Важно, что программируя эту память можно изменить функцию самой микросхемы FTDI, перевести её в другой режим работы, а именно включить режим синхронного FIFO.

Как запрограммировать EEPROM, перевести FTDI в режим синхронного ФИФО я писал ранее вот здесь

Вся эта информация была проверена раньше на плате Марсоход3, но абсолютно корректна и для платы Марсоход3GW2. Я только что это испытал.

Теперь мне понадобится второй JTAG программатор. Я беру второй программатор MBFTDI и устанавливаю его на специальные джамперы. На фото в начале статьи вы видите как оно у меня соединено. Этим программатором я буду загружать проект в ПЛИС. А родной программатор теперь будет уже работать в режиме синхронного FIFO.

Исходники проекта можно взять здесь https://github.com/marsohod4you/Marsohod3GW/tree/Marsohod3GW2_GW1NR-LV9QN88PC6I5/_ftdi_sync_fifo

Тут есть и проект для Gowin FPGA и так же проект MS VisualStudio для ПК fast_pio.
Эта программа fast_pio использует API библиотеки ftd2xx.lib чтобы писать данные в FIFO платы и одновременно измерять пропускную способность шины USB к плате Марсоход3GW2. Программа сама находит все FTDI USB интерфейсы подключенные к компьютеру, но выбирает именно тот, которые работает в режиме FIFO.

В самом начале программа отправляет 8 тестовых произвольных байтов данных в плату:

unsigned char byOutputBuffer[1024];
byOutputBuffer[0] = 0x80;
byOutputBuffer[1] = 0x91;
byOutputBuffer[2] = 0xA2;
byOutputBuffer[3] = 0xB3;
byOutputBuffer[4] = 0xC4;
byOutputBuffer[5] = 0xD5;
byOutputBuffer[6] = 0xE6;
byOutputBuffer[7] = 0xF7;
FT_Write(ftHandle, byOutputBuffer, 8, &dwNumBytesSent);

Я ставлю в отладчике Visual Studio точку останова на FT_Write() и запускаю программу. Потом когда программа остановится я запускаю Gowin Analyzer Oscilloscope (GAO), чтобы посмотреть внутренние сигналы в момент приема пакета данных. Как пользоваться GAO я писал здесь.

А с помощью Gowin Analyzer Oscilloscope я могу посмотреть эти принятые данные уже в FPGA и я могу убедиться, что реализованная в проекте схема работает правильно:

GAO cap

 

Вы можете видеть, что на шине FTD[7:0] от FTDI идут как раз байты, которые я передаю из программы на C на компьютере. Эти же данные захватываются в регистр ft_data[7:0]. Получаются там данные на 1 такт позже. И уже с регистра ft_data данные отображаются на светодиодах платы.

Код на Verilog HDL там совсем простой:

wire clkout_o;
wire lock_o;
Gowin_rPLL your_instance_name(
  .clkout(clkout_o), //output clkout
  .lock(lock_o), //output lock
  .clkin(FT_CLK) //input clkin
);

reg ft_oen; assign FT_OEN = ft_oen;
reg ft_rd; assign FT_RD = ft_rd;
assign FT_WR = 1'b1;

always @(posedge clkout_o)
begin
  ft_oen <= FT_RXF;
  ft_rd <= ft_oen | FT_RXF;
end

reg [7:0]ft_data;
always @(posedge clkout_o)
  if( ~(FT_RXF | ft_rd) )
    ft_data <= FTD;

assign LED = ft_data;

Сигнал FT_RXF от микросхемы FTDI переходит в ноль, когда у неё есть данные в нутри в FIFO. После этого я выставляю в ноль сигнал FT_OEN чтобы включить выходные буферы FTDI и подаю сигнал на чтение FT_RD. Таким образом, вычитываются все байты, которые приняла FT2232H и накопила в своём FIFO.

Все процессы происходят на частоте 60MHz полученной от FTDI. Я пускаю этот сигнал на PLL, чтобы быть уверенным, что выход PLL clkout_o будет глобальным сигналом в проекте.

Если запустить тестовую программу fast_pio без точек останова на ПК и просто посмотреть вывод, то мы увидим пропускную способность, около 43МБайт в секунду:

sync fifo bandwidth

 

Такми образом, я убедился в работоспособности платы Марсоход3GW2 в режиме синхронного FIFO микросхемы FTDI, установленной на плате.

Сейчас у меня вышло по измерениям 43Мб/сек вместо 35Мб/сек в эеспериментах с платой Марсоход3. Но думаю разницы никакой нет. Просто сейчас у меня более новый ноутбук и более новая ОС.

 

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