Визуальная электроника

Дорогие друзья, мы рады вступить в новый год вместе с вами! Позвольте поздравить вас с этим замечательным праздником, пожелать здоровья, успехов и благополучия вам и вашим семьям. Чтобы в новом году были новые победы и свершения, исполнялись самые заветные желания. А мы и впредь будем помогать вам идти к своим целям, отдавая лучшее, что у нас есть. Искренне ваша Визуальная электроника.

В качестве новогоднего проекты мы создадим новогоднюю картинку, переливающуюся всеми цветами радуги. Для начала изменим код нашего преобразователя bmp to mif из проекта Частотомер с VGA выходом. В монохромном bmp файле 1 байт содержит 8 точек изображения, что вполне логично. Поэтому добавляем еще один цикл, перебирающий биты в байте:

 

C++ Code:
  1. //Перебираем пиксели bmp файла
  2. for(unsigned int dy=0;dy<pic_height;dy++)
  3. {
  4. for(unsigned int dx=0;dx<pic_width/8;dx++)
  5. {
  6. for(unsigned char db=0;db<8;db++)
  7. {
  8. adr1=pic_width*dy+8*dx+db;
  9. adr2=pic_width*(pic_height-dy-1)/8+dx;
  10. Colour=(picture.data()[62+adr2] & 1<<(7-db))==0 ? 0:1;
  11. adr_str=QString::number(adr1);
  12. rgb_str=QString::number(Colour);
  13. mif.append(adr_str);
  14. mif.append(":");
  15. mif.append(rgb_str);
  16. mif.append(";\n");
  17. }
  18. }
  19. }

Запускаем наш конвертер:

pic1Вид программы конвертера.

Далее создадим проект для нашей платы VE-EP4CE10E. Проект достаточно простой: модуль picture это память содержащая нашу картинку, модуль vga это генератор vga развертки. Ну и самое интересное это функция генератор радуги. Вот ее код:

Verilog Code:
  1. function [23:0] RGB;
  2. input [7:0] in_cnt;
  3.  
  4. reg [7:0] R_func;
  5. reg [7:0] G_func;
  6. reg [7:0] B_func;
  7.  
  8. begin
  9. if (in_cnt < 85)
  10. begin
  11. R_func=in_cnt * 3;
  12. G_func=255 - in_cnt * 3;
  13. B_func=0;
  14. RGB={R_func, G_func, B_func};
  15. end
  16. else if(in_cnt < 170)
  17. begin
  18. in_cnt = in_cnt-85;
  19. R_func=255-in_cnt * 3;
  20. G_func=0;
  21. B_func=in_cnt * 3;
  22. RGB={R_func, G_func, B_func};
  23. end
  24. else
  25. begin
  26. in_cnt = in_cnt-170;
  27. R_func=0;
  28. G_func=in_cnt * 3;
  29. B_func=255 - in_cnt *3;
  30. RGB={R_func, G_func, B_func};
  31. end
  32. end
  33. endfunction

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

Verilog Code:
  1. assign r=pic_on ? tst_RGB[23:20]:4'b0000;
  2. assign g=pic_on ? tst_RGB[15:12]:4'b0000;
  3. assign b=pic_on ? tst_RGB[7:4]:4'b0000;
  4.  
  5.  
  6. always @(negedge pclk) begin
  7. if(col0==1)
  8. begin
  9. rb_cnt1<=0;
  10. rb_cnt2<=rb_cnt2 + 1'b1;
  11. end
  12. else
  13. begin
  14. rb_cnt1<=rb_cnt1 + 1'b1;
  15. end
  16.  
  17. case(rb_cnt2[16:15])
  18. 0 : tst_RGB<=RGB(rb_cnt1 - rb_cnt2);
  19. 1 : tst_RGB<=RGB(rb_cnt1 + rb_cnt2);
  20. 2 : tst_RGB<=RGB(rb_cnt1 ^ rb_cnt2);
  21. 3 : tst_RGB<=RGB(rb_cnt2);
  22. default : tst_RGB<=RGB(rb_cnt1 - rb_cnt2);
  23. endcase

Видео работы нашей демки:

Проект новогоднего поздравления для платы VE-EP4CE10E: new_year_gift.zip

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