Использование Gowin Analyzer Osciloscope в FPGA проекте

GowinLogo

Некоторые инженеры до сих пор избегают использования в своих проектах китайских FPGA, например, китайской компании Gowin из-за того, что кажется, что лишены привычных инструментов разработки. Если Вы привыкли к использованию ПЛИС Altera / Intel, то один из найважнейших инструментов для вас это SignalTap. Он позволяет заглянуть внутрь микросхемы и записать выборку сигналов и потом посмотреть осцилограммы сигналов. Возможно ли такое для микросхем Gowin? Конечно, да. В этой статье я расскажу, как пользоваться инструментом GAO - Gowin Analyzer Oscilloscope. Я думаю использование GAO изменит мнение разработчиков и они станут чаше использовать микросхемы Gowin в проектах. Эти микросхемы не хуже альтеровских, а иногда даже лучше: меньше размером, имеют встроенную память PSRAM, производительность не хуже и т.д.

Будет много картинок.

Чтобы рассказ получился более содержательным я буду использовать хоть и простой, но настоящий проект двоичного счетчика для FPGA платы Marsohod3GW2. На плате стоит микросхема Gowin GW1NR-LV9QN88PC6/I5.

Проект возьмем на github https://github.com/marsohod4you/Marsohod3GW/tree/Marsohod3GW2_GW1NR-LV9QN88PC6I5 бранч Marsohod3GW2_GW1NR-LV9QN88PC6I5, папка проекта _clk_counter.

В самом проекте очень простой модуль верхнего уровня:


module top(
   input CLK, KEY0, KEY1,
   input [7:0] ADC_D,
   input [7:0] FTD,
   input [7:0] FTC,
   input FTB0,
   input FTB2,
   output FTB1,
   output FTB3,
   output ADC_CLK,
   output [7:0] LED,
   output [18:0] IO,
   output TMDS_CLK_N,
   output TMDS_CLK_P,
   output [2:0] TMDS_D_N,
   output [2:0] TMDS_D_P
);

reg [28:0]cnt = 0;
always @( posedge CLK )
   if( KEY0==1'b0)
      cnt <= 0;
   else
   if( KEY1==1'b1)
      cnt <= cnt + 1;

assign LED = cnt[28:21];

//Serial_RX -> Serial_TX
assign FTB1 = FTB0;
assign FTB3 = FTB2;

assign IO = 0;

assign ADC_CLK = 1'b0;

assign TMDS_CLK_N = 1'b0;
assign TMDS_CLK_P = 1'b0;
assign TMDS_D_N = 4'd0;
assign TMDS_D_P = 4'd0;

endmodule


В модуль подается тактовая частота CLK=100МГц из генератора, установленного на плате. Двоичный счетчик cnt считает на частоте CLK. На плате так же есть две кнопочки KEY0 и KEY1. По нажатию KEY0 счетчик cnt сбрасывается, а по нажатию кнопки KEY1 приостанавливается счет.

Посмотрим, смогу ли я увидеть эти процессы с помощью анализатора Gowin Analyzer Oscilloscope.

Итак, проект двоичного счетчика. Про создание этого проекта и знакомство с Gowin FPGA Designer я уже рассказывал в одной из моих статей. Теперь к этому проекту добавим GAO.

Открываю проект в среде Gowin FPGA Designer. Переходим в меню File => New и выбираем тип файла GAO Config File:

NewGaoConfigFile

 Открывается новое диалоговое окно, вот такое:

NewGaoSettings

В этом окне я ничего не трогал, оставил как есть опции For RTL Design и Standard. Первая опция удобна тем, что позволяет выбирать сигналы такие, которые описаны в проекте в Verilog модулях. На всякий случай напомню, что после компиляции проекта некоторые сигналы могут быть выброшены оптимизатором. Поэтому в Post-Synthesis Netlist некоторых сигналов вы можете не увидеть.

Нажимаю кнопку Next.

NewGaoCfgFile

Здесь предлагается задать имя файла для Oscilloscope. Я оставил как есть, будет создан файл project.rao.

Нажимаю кнопку Next.

Показывается итоговый диалог:

NewGaoSummary

Завершаем диалог, нажимая кнопку Finish.

Теперь обратим внимание, что в проекте появился новый файл:

GaoFileCreated

Вообще интерфейс программы Gowin FPGA Designer довольно своеобразный. Немножко нужно нестандартно мыслить. Ну и конечно, к чему привыкли в Atera / Intel Quartus здесь будет по другому.

Например, включить использование Oscilloscope в проекте Gowin можно нажав правую кнопку мыши на файле project.rao и выбрав в выпадающем меню Enable или Disable.

GaoFileEnaDis

Сейчас, когда я хочу использовать Analyzer Oscilloscope мне нужно включить файл project.rao в проект. Иначе он не будет компилироваться.

Когда файл включен в проект на нём можно кликнуть мышкой и открывается довольно мудреное на первый взгляд окно с настройками. Вот такое:

RaoCfgEditor 

На самом деле, несмотря на кажущуюся сложность этого интерфейса здесь всё довольно просто. Нужно сделать четыре операции:

  1. Выбрать сигналы триггеров
  2. Назначить условия срабатывания триггеров Match Units
  3. Задать выражение по которому срабатывают триггера
  4. Выбрать внутренние сигналы проекта, которые интересуют нас для исследования.

Пройдемся по пунктам. Двойной клик мыши по интересующим нас элементам моможет нам почти во всех случаях. Кликаю два раза на Trigger Port0. Появляется диалоговое окно:

TriggerPortDlg

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

TriggerPortKey0

Нажимаю кнопку OK. Точно таким же образом я назначаю и второй триггер сигнал KEY1 на Trigger Port1.

Теперь назначаю Match Units. Здесь галочкой включаю M0 и M1. MatchUnits

Двойной клик на Match Unit0 открывает диалоговое окно, где можно задать свойства триггера, условия срабатывания:

MatchUnit0

Я задаю простое условие, когда сигнал KEY0 станет равен нулю, то срабатывает Match Unit0. Аналогично все и для Unit1 который у меня соответствует триггеру 1.

Теперь третий шаг. Задаем итоговое условия срабатывания тригера. Я хочу, чтобы оба триггера работали в одном проекте. Двойной клик на области Expression и мы можем задать условие, когда Oscilloscope сработает либо по первому либо по второму триггеру.

Expression 

Нажмем OK и видим, что мы определили итоговое условие M0|M1:

ExpressionDef

Ну похоже почти всё готово.

Осталось добавить внутренние сигналы FPGA проекта, которые мы будем наблюдать в Oscilloscope. переходив во вкладку Capture Options.

Прежде всего нам нужно задать частоту захвата интересующих нас сигналов. Я выбираю сигнал CLK. Этом простом проекте больше особо и нечего выбирать:

SampleClock

 

Потом выбираем сигналы проекта, которые будем исследовать:

CaptureSignals

Я добавил к исследованию счетчик cnt и оба сигнала кнопок KEY0 и KEY1.

Потом пожно задать сколько выборок исследуемого сигнала будет сделано. От этого зависит сколько памяти внутри ПЛИС займет компонент GAO. Да, к сожалению она занимает место в проекте. Точно так же, как и SignalTap модуль в альтеровском проекте.

Еще здесь можно задать позицию триггера:

TriggerPos

 

Вот пожалуй все настройки сделаны.

Сохраняем файл настроек GAO. И не забываем откомпилировать весь проект.

Теперь запускаем анализатор через меню Tools => Gowin Analyzer Oscilloscope:

GaoMenuStart

 

Открывается совершенно новое окно в котором есть и программатор и анализатор. Прежде всего нужно загрузить проект с встроенным модулем анализатора. Следите, чтобы выбранный файл был только что скомпилированным ao_*.fs файлом.

Загружаем проект в FPGA

Program

Теперь уже всё готово к захвату тестовых сигналов.

GaoStartCap

Нажимаем кнопку Start и анализатор "подвисает" ожидая срабатывания триггеров.

Теперь я могу нажать либо кнопку KEY0 либо кнопку KEY1 на плате Марсоход3GW2.

Нажимаю кнопку KEY0. Тут же мне показываются осцилограммы сигналов, которые в этот момент были внутри FPGA:

GaoCapReset

Здесь я вижу, что после нажатия KEY0 значение счетчика становится равно нулю. Так и должно было быть.

А что будет если я запущу анализатор снова и нажму кнопку KEY1?

Вот что:

GaoCapNoCnt

Счетчик остановился после нажатия KEY1. Опять всё случилось так как и ожидалось!

Получается, что Gowin Analizer Oscilloscope работает, им можно пользоваться и он достаточно удобен для практического применения.

На самом деле у компании Gowin есть гораздо более подробная инструкция, но, конечно на английском языке.

Но я так же надеюсь, что и моя инструкция была полезной и поможет разработчикам смелее использовать микросхемы FPGA Gowin в проектах..

 

 

 

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