МАРСОХОД

Open Source Hardware Project

Проекты Altera Quartus Prime для платы Марсоход3

Виртуальные светодиоды и 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 уже почти готов, думаю скоро будут публикации о нем на нашем сайте.

 

Комментарии  

0 #4 nckm 22.11.2017 14:15
Цитирую Zas:
Подскажите, пожалуйста, существует ли своего рода библиотека стандартных функций, позволяющих отрисовывать примитивные фигуры (линия, круг, квадрат и т.д.) для генерации своего видеопотока?
Правильно ли я понимаю, что для того чтобы создать кадр сложной конфигурации, состоящий из нескольких фигур (возможно, накладывающихся одна на другую), его необходимо заранее прорисовать, переложить в память, а затем попиксельно выдавать на вход декодера?
Если да, то возможна ли реализация такого фрейм-буфера внутри встроенной памяти ПЛИС при таком разрешении кадра или ее будет недостаточно?

Внутренней памяти ПЛИС будет маловато. Но если использовать внешнюю память SDRAM то фреймбуффер можно сделать, как в этом проекте например: https://marsohod.org/projects/proekty-dlya-platy-marsokhod3/316-videoadapter-dlya-proekta-usbterm
0 #3 Zas 22.11.2017 11:00
Подскажите, пожалуйста, существует ли своего рода библиотека стандартных функций, позволяющих отрисовывать примитивные фигуры (линия, круг, квадрат и т.д.) для генерации своего видеопотока?
Правильно ли я понимаю, что для того чтобы создать кадр сложной конфигурации, состоящий из нескольких фигур (возможно, накладывающихся одна на другую), его необходимо заранее прорисовать, переложить в память, а затем попиксельно выдавать на вход декодера?
Если да, то возможна ли реализация такого фрейм-буфера внутри встроенной памяти ПЛИС при таком разрешении кадра или ее будет недостаточно?
0 #2 nckm 22.11.2017 10:26
Цитирую Zas:
Добрый день!
В архиве проекта отсутствует файл max10.bdf, в проект он включен, а фвйла нет

вероятно я забыл его выбросить из проекта.. топ модуль все равно на верилоге.. так что max10.bdf не нужен.
0 #1 Zas 22.11.2017 07:23
Добрый день!
В архиве проекта отсутствует файл max10.bdf, в проект он включен, а фвйла нет

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



facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Проекты Проект Марсоход3 Виртуальные светодиоды и 7-ми сегментный индикатор