Я решил повторить проект "Скоростная передача данных" платы Марсоход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 и я могу убедиться, что реализованная в проекте схема работает правильно:
Вы можете видеть, что на шине 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МБайт в секунду:
Такми образом, я убедился в работоспособности платы Марсоход3GW2 в режиме синхронного FIFO микросхемы FTDI, установленной на плате.
Сейчас у меня вышло по измерениям 43Мб/сек вместо 35Мб/сек в эеспериментах с платой Марсоход3. Но думаю разницы никакой нет. Просто сейчас у меня более новый ноутбук и более новая ОС.
Подробнее...