Дорогие друзья, мы рады вступить в новый год вместе с вами! Позвольте поздравить вас с этим замечательным праздником, пожелать здоровья, успехов и благополучия вам и вашим семьям. Чтобы в новом году были новые победы и свершения, исполнялись самые заветные желания. А мы и впредь будем помогать вам идти к своим целям, отдавая лучшее, что у нас есть. Искренне ваша Визуальная электроника.
В качестве новогоднего проекты мы создадим новогоднюю картинку, переливающуюся всеми цветами радуги. Для начала изменим код нашего преобразователя bmp to mif из проекта Частотомер с VGA выходом. В монохромном bmp файле 1 байт содержит 8 точек изображения, что вполне логично. Поэтому добавляем еще один цикл, перебирающий биты в байте:
C++ Code:
//Перебираем пиксели bmp файла for(unsigned int dy=0;dy<pic_height;dy++) { for(unsigned int dx=0;dx<pic_width/8;dx++) { for(unsigned char db=0;db<8;db++) { adr1=pic_width*dy+8*dx+db; adr2=pic_width*(pic_height-dy-1)/8+dx; Colour=(picture.data()[62+adr2] & 1<<(7-db))==0 ? 0:1; adr_str=QString::number(adr1); rgb_str=QString::number(Colour); mif.append(adr_str); mif.append(":"); mif.append(rgb_str); mif.append(";\n"); } } }
Запускаем наш конвертер:
Вид программы конвертера.
Далее создадим проект для нашей платы VE-EP4CE10E. Проект достаточно простой: модуль picture это память содержащая нашу картинку, модуль vga это генератор vga развертки. Ну и самое интересное это функция генератор радуги. Вот ее код:
Verilog Code:
function [23:0] RGB; input [7:0] in_cnt; reg [7:0] R_func; reg [7:0] G_func; reg [7:0] B_func; begin if (in_cnt < 85) begin R_func=in_cnt * 3; G_func=255 - in_cnt * 3; B_func=0; RGB={R_func, G_func, B_func}; end else if(in_cnt < 170) begin in_cnt = in_cnt-85; R_func=255-in_cnt * 3; G_func=0; B_func=in_cnt * 3; RGB={R_func, G_func, B_func}; end else begin in_cnt = in_cnt-170; R_func=0; G_func=in_cnt * 3; B_func=255 - in_cnt *3; RGB={R_func, G_func, B_func}; end end endfunction
Следующий участок кода содержит мультиплексор видеоданных, выводящий изображение только когда из памяти картинки читаются логические единицы. А также процесс выборки видеоэффекта:
Verilog Code:
assign r=pic_on ? tst_RGB[23:20]:4'b0000; assign g=pic_on ? tst_RGB[15:12]:4'b0000; assign b=pic_on ? tst_RGB[7:4]:4'b0000; always @(negedge pclk) begin if(col0==1) begin rb_cnt1<=0; rb_cnt2<=rb_cnt2 + 1'b1; end else begin rb_cnt1<=rb_cnt1 + 1'b1; end case(rb_cnt2[16:15]) 0 : tst_RGB<=RGB(rb_cnt1 - rb_cnt2); 1 : tst_RGB<=RGB(rb_cnt1 + rb_cnt2); 2 : tst_RGB<=RGB(rb_cnt1 ^ rb_cnt2); 3 : tst_RGB<=RGB(rb_cnt2); default : tst_RGB<=RGB(rb_cnt1 - rb_cnt2); endcase
Видео работы нашей демки:
Проект новогоднего поздравления для платы VE-EP4CE10E: new_year_gift.zip