Меня спрашивают: "Будут ли работать шилды (дополнительные платы) от FPGA плат Марсоход2 и Марсоход3 совместно с платой Марсоход3GW с микросхемой Gowin?". Если ответить коротко, то да, будут. Рассмотрим пример использования платы шилда 7-ми сегментного индикатора, он на фото выше справа с FPGA платой Marsohod3GW (на фото слева).
Что нужно сделать, чтобы отображать цифры на индикаторе? Сейчас расскажу.
Прежде всего устанавливаем шилд индикатора на разъем FPGA платы:
Дальше нам нужно запрограммировать плату так, чтобы управлять сигналами индикатора..
Вот простой пример двоичного счетчика, который я добавил в репозиторий на github: https://github.com/marsohod4you/Marsohod3GW/tree/Marsohod3GW2_GW1NR-LV9QN88PC6I5/_clk_pll_counter_7seg.
В этом проекте реализован 32-х битный двоичный счетчик, старшие разряды которого отображаются на 7ми-сегментном индикаторе нашего шилда.
Чтобы запрограммировать шилд посмотрим его схему.
Видно, что на его разъёме используются на выход 8 сигналов IO[7:0] для управления отдельными сегментами A, B, C, D, E, F, G и точкой, четыре сигнала IO[15:14] для включения одной из четырёх цифр индикатора. Так же есть 4 сигнала IO[11:8] на вход от четырёх кнопочек. Таким образом, понятно, что шилд использует динамическую индикацию. Цифры отображаются по очереди, но быстро, чтобы глаз не заметил мерцания.
Я взял один из имеющихся проектов двоичного счетчика _clk_pll_counter для платы Марсоход3GW, скопировал в новую папку _clk_pll_counter_7seg и модифицировал его. Что я сделал:
1) выходы IO[19:0] в Verilog топ модуле проекта top.v сделал вместо output типом inout, так как некоторые сигналы будут использоваться на вывод для управления индикатором, а некоторые, от кнопочек, на ввод.
2) для использования кнопок требуется подтянуть IO[11:8] резисторами к питанию, по схеме шилда этих резисторов нет, но их можно реализовать в самой FPGA Gowin. Для этого в назначениях проекта в файле src/board.cst добавим строки
IO_PORT "IO[11]" PULL_MODE=UP;
IO_PORT "IO[10]" PULL_MODE=UP;
IO_PORT "IO[9]" PULL_MODE=UP;
IO_PORT "IO[8]" PULL_MODE=UP;
3) в топ модуль проекта вставим экземпляр модуля seg4x7, я его сейчас не писал, а просто взял готовый из других наших проектов. Выходы модуля присоединил к соответствующим IO согласно схемы шилда
wire [7:0]bAfCgD_e;
wire [3:0]dig_sel;
seg4x7 seg4x7_inst(
.clk(pll_out_clk),
.in( seg7_out ),
.digit_sel(dig_sel),
.out(bAfCgD_e)
);
assign IO[6]= bAfCgD_e[6]; //A
assign IO[7]= bAfCgD_e[7]; //B
assign IO[4]= bAfCgD_e[4]; //C
assign IO[2]= bAfCgD_e[2]; //D
assign IO[0]= bAfCgD_e[0]; //E
assign IO[5]= bAfCgD_e[5]; //F
assign IO[3]= bAfCgD_e[3]; //G
assign IO[1]= bAfCgD_e[1]; //Dot
assign IO[15]= dig_sel[0];
assign IO[13]= dig_sel[1];
assign IO[12]= dig_sel[2];
assign IO[14]= dig_sel[3];
Модуль простой, на вход подаем 16-ти битное двоичное число и тактовую частоту 100МГц. Выходные сигналы модуля прямо управляют индикатором.
4) чтобы продемонстрировать работу кнопочек добавил вот такой код:
wire [15:0]seg7_out;
assign seg7_out =
(IO[ 8]==1'b0) ? 16'h1111 :
(IO[ 9]==1'b0) ? 16'h2222 :
(IO[10]==1'b0) ? 16'h3333 :
(IO[11]==1'b0) ? 16'h4444 :
cnt[31:16];
Нажатая кнопочка дает на входе ноль, не нажатая дает единицу, ведь сигнал мы подтягиваем резистором к питанию.
По нажатию кнопок на 7-ми сегментном индикаторе будут отображаться фиксированные числа 1111, 2222, 3333 или 4444. Если кнопок не нажимать, то просто на индикаторе бежит счёт.
Вот такой простой проект и он работает, убедитесь сами.
Подробнее...