Виртуальные светодиоды и 7-ми сегментный индикатор

 

Когда человек начинает осваивать какой нибудь микроконтроллер или ПЛИС, то первый проект, который он делает - это моргание светодиодом. На нашем сайте есть примеры таких простых проектов и для первой платы Марсоход, и для второй платы Марсоход2 и для третьей.

Плата Марсоход3 имеет 8 светодиодов, но даже этого иногда оказывается мало для отображения нужной информации. Конечно, можно отображать и изображения или даже видео, это слишком сложно и требует много ресурсов.

На плате Марсоход3 есть разъем видеовыхода HDMI. Я подумал, почему бы не сделать простой проект для отображения простейшей двоичной информации - такие виртуальные светодиоды и семисегментный индикатор, которые показываются на экране монитора?

Я сделал такой проект, его исходники можно взять на github: https://github.com/marsohod4you/hdmi_leds_seg7

Далее - описание проекта.

Top-модуль проекта выглядит вот так:


module hdmi_leds(
  input wire CLK100MHZ,
  input wire KEY0,
  input wire KEY1,
  output wire [7:0]LED,
  output wire [7:0]TMDS,
  //unused inputs
  input wire FTDI_BD0,
  input wire FTDI_BD1,
  input wire FTDI_BD2,
  input wire FTDI_BD3,
  input wire [7:0]FTD,
  input wire [7:0]FTC,
  input wire [19:0]IO
);

wire w_clk_video;
wire w_clk_hdmi;
wire w_locked;

mypll mypll_inst(
  .inclk0( CLK100MHZ ),
  .c0( w_clk_video ), //74MHz
  .c1( w_clk_hdmi ), //370MHz
  .locked( w_locked )
);

reg [47:0]counter;
always @( posedge w_clk_video or negedge KEY0 )
begin
  if( ~KEY0 )
    counter <= 0;
  else
  if( KEY1 )
    counter <= counter+1;
end

display display_inst(
  .reset( ~w_locked ),
  .clk_video( w_clk_video ),
  .clk_hdmi( w_clk_hdmi ),
  .red_leds( counter[31:16] ),
  .green_leds( counter[30:15] ),
  .segments( counter[47:16] ),
  .TMDS( TMDS )
);

endmodule


Здесь ничего особенного:

  • PLL выдает две частоты, 74МГц тактовая частота пикселей для видеорежима 1280х720, 370МГц - это частота кодирования TMDS сигналов HDMI.
  • Модуль display получает 16 бит для виртуальных красных светодиодов и 16 бит для виртуальных зеленых светодиодов. Так же он принимает 24-х битное число для шести семисегментных индикаторов. Есть у модуля выходы TMDS для HDMI.

Сам display внутри имеет модуль генерации синхросигналов hvsync, модуль кодирования TMDS сигналов, набор модулей altddio для выдачи TMDS сигналов. Так же display имеет логику отображения виртуальных светодиодов и семисегментных индикаторов на экране. Эта логика жестко привязана к координатной сетке экрана через сигналы w_pixel_count и w_line_count из hvsync.

Выше на видео показано, как идет отображение двоичного счетчика на экране подключенного телевизора.

Должен предупредить, что "виртуальные светодиоды" работают не совсем честно в том смысле, что пользователь может иногда увидеть странные эффекты, как, например, младший бит счетчика может казаться моргает реже, чем старший. Это происходит из-за накладывания частоты развертки монитора 60Гц на частоту моргания. Тем не менее, зная об этой небольшой проблеме, такой системой отображения информации вполне можно пользоваться.

На самом деле мне самому понадобился такой проект.
Сейчас я работаю над портированием проекта софт-процессора MIPS-FPGA на плату Марсоход3 и там в этом проекте MIPS для разных плат с ПЛИС (de0_cv, de10_lite, de2_115 и другие) используются и светодиоды и семисегментный индикатор. Теперь я смогу отображать на плате Марсоход3 все то же, что отображают другие платы. Проект MIPS уже почти готов, думаю скоро будут публикации о нем на нашем сайте.

 

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