Шилд 7-ми сегментного индикатора на плате Марсоход3GW (Gowin)

board seg7 inst

Меня спрашивают: "Будут ли работать шилды (дополнительные платы) от FPGA плат Марсоход2 и Марсоход3 совместно с платой Марсоход3GW с микросхемой Gowin?". Если ответить коротко, то да, будут. Рассмотрим пример использования платы шилда 7-ми сегментного индикатора, он на фото  выше справа с FPGA платой Marsohod3GW (на фото слева).

Что нужно сделать, чтобы отображать цифры на индикаторе? Сейчас расскажу.

Прежде всего устанавливаем шилд индикатора на разъем FPGA платы:

board seg7

Дальше нам нужно запрограммировать плату так, чтобы управлять сигналами индикатора..

Вот простой пример двоичного счетчика, который я добавил в репозиторий на github: https://github.com/marsohod4you/Marsohod3GW/tree/Marsohod3GW2_GW1NR-LV9QN88PC6I5/_clk_pll_counter_7seg.

В этом проекте реализован 32-х битный двоичный счетчик, старшие разряды которого отображаются на 7ми-сегментном индикаторе нашего шилда.

Чтобы запрограммировать шилд посмотрим его схему.

segment 7 schema

Видно, что на его разъёме используются на выход 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. Если кнопок не нажимать, то просто на индикаторе бежит счёт.

Вот такой простой проект и он работает, убедитесь сами.

 

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