VGA控制器设计实现显示器屏幕保护.docx
- 文档编号:16135969
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:14
- 大小:88.38KB
VGA控制器设计实现显示器屏幕保护.docx
《VGA控制器设计实现显示器屏幕保护.docx》由会员分享,可在线阅读,更多相关《VGA控制器设计实现显示器屏幕保护.docx(14页珍藏版)》请在冰点文库上搜索。
VGA控制器设计实现显示器屏幕保护
大学实验报告
课程名称:
数字系统现场集成技术
实验项目名称:
实验二(VGA控制器设计实现显示器屏幕保护模块)
学院:
专业:
指导教师:
报告人:
学号:
班级:
实验时间:
实验报告提交时间:
教务部制
实验目的与要求:
通过FPGA板的VGA接口在显示器上分别显示不同颜色的横向、竖直条纹图案,横向条纹和竖直条纹的切换通过FPGA板上的按键实现。
横向条纹要求是一幅640*480由8条不同颜色的横向条纹组成的图像,从上到下颜色分别为:
红,蓝,绿,蓝,红,绿,红,蓝;竖直条纹要求是一幅640*480由8条不同颜色的竖直条纹组成的图像,从左到右颜色分别为:
红,蓝,绿,蓝,红,绿,红,蓝。
实验最终达到效果:
本实验实现了实验要求中的基本要求以及高级要求,实验了VGA条纹的显示,以及通过按键,让显示屏显示不同的色彩条纹,还有实验了一个小方块在屏幕上的移动,达到动态显示效果。
调用了xilinx官方提供的DCM模块,而且本实验的VGA驱动代码,经过仔细修改和考虑,只要修改自定义的实数,即可实验任何分辨率的显示器显示,方便以后实验或者项目的调用。
实验主要代码(由于代码较多,贴出主要代码):
VGA驱动代码:
modulevga_drv(
inputclk,
inputrst,
input[7:
0]in_rgb,
outputhsync,vsync,
output[7:
0]out_rgb,
outputreg[9:
0]h_cnt,v_cnt
);
localparamHVA=640;
localparamHFP=16;
localparamHSP=96;
localparamHBP=48;
localparamHWL=800;
localparamVVA=480;
localparamVFP=10;
localparamVSP=2;
localparamVBP=33;
localparamVWL=525;
wirevalid;
//reg[9:
0]h_cnt,v_cnt;
always@(posedgeclk,posedgerst)
begin
if(rst)
h_cnt<=0;
elseif(h_cnt==(HWL-1))
h_cnt<=0;
else
h_cnt<=h_cnt+1'd1;
end
always@(posedgeclk,posedgerst)
begin
if(rst)
v_cnt<=0;
elseif(h_cnt==(HWL-1))
begin
if(v_cnt==(VWL-1))
v_cnt<=0;
else
v_cnt<=v_cnt+1'd1;
end
else
v_cnt<=v_cnt;
end
assignhsync=((h_cnt>=(HFP+HVA-1))&&(h_cnt<=(HVA+HFP+HSP-1)))?
1'b0:
1'b1;
assignvsync=((v_cnt>=(VVA+VFP-1))&&(v_cnt<=(VVA+VFP+VSP-1)))?
1'b0:
1'b1;
assignvalid=((h_cnt<=HVA-1)&&(v_cnt<=VVA-1))?
1'b1:
1'b0;
assignout_rgb=valid?
in_rgb:
8'b0000_0000;
endmodule
VGA条纹产生代码:
modulecolour_bar(
inputclk,
inputrst,
input[9:
0]h_cnt,v_cnt,
inputmode,
outputreg[7:
0]rgb
);
//wire[9:
0]h_cnt_wire=h_cnt+16;
localparamHVA=640;
localparamVVA=480;
always@(posedgeclk,posedgerst)
begin
if(rst)
rgb<=8'b0000_0000;
elseif(mode)
begin
if(h_cnt>=0&&h_cnt<(HVA/8))
rgb<=8'b111_000_00;
elseif(h_cnt>=(HVA/8)*1&&h_cnt<(HVA/8)*2)
rgb<=8'b000_000_11;
elseif(h_cnt>=(HVA/8)*2&&h_cnt<(HVA/8)*3)
rgb<=8'b000_111_00;
elseif(h_cnt>=(HVA/8)*3&&h_cnt<(HVA/8)*4)
rgb<=8'b000_000_11;
elseif(h_cnt>=(HVA/8)*4&&h_cnt<(HVA/8)*5)
rgb<=8'b111_000_00;
elseif(h_cnt>=(HVA/8)*5&&h_cnt<(HVA/8)*6)
rgb<=8'b000_111_00;
elseif(h_cnt>=(HVA/8)*6&&h_cnt<(HVA/8)*7)
rgb<=8'b111_000_00;
elseif(h_cnt>=(HVA/8)*7&&h_cnt<(HVA/8)*8)
rgb<=8'b000_000_11;
else
rgb<=8'b000_000_000;
end
else
begin
if(v_cnt>=0&&v_cnt<(VVA/8))
rgb<=8'b111_000_00;
elseif(v_cnt>=(VVA/8)*1&&v_cnt<(VVA/8)*2)
rgb<=8'b000_000_11;
elseif(v_cnt>=(VVA/8)*2&&v_cnt<(VVA/8)*3)
rgb<=8'b000_111_00;
elseif(v_cnt>=(VVA/8)*3&&v_cnt<(VVA/8)*4)
rgb<=8'b000_000_11;
elseif(v_cnt>=(VVA/8)*4&&v_cnt<(VVA/8)*5)
rgb<=8'b111_000_00;
elseif(v_cnt>=(VVA/8)*5&&v_cnt<(VVA/8)*6)
rgb<=8'b000_111_00;
elseif(v_cnt>=(VVA/8)*6&&v_cnt<(VVA/8)*7)
rgb<=8'b111_000_00;
elseif(v_cnt>=(VVA/8)*7&&v_cnt<(VVA/8)*8)
rgb<=8'b000_000_11;
else
rgb<=8'b000_000_000;
end
end
Endmodule
按键消抖代码:
modulebtn_scan(
inputclk,
inputrst,
inputbtn,
outputregbtn_down
);
localparam[1:
0]s0=2'b00,
s1=2'b01,
s2=2'b10;
reg[1:
0]state;
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
btn_down<=1'b0;
state<=s0;
end
else
begin
case(state)
s0:
begin
if(btn)
state<=s1;
else
state<=s0;
end
s1:
begin
if(cnt_done)
begin
if(btn)
state<=s2;
else
state<=s0;
end
else
state<=s1;
end
s2:
begin
if(btn==1'b0)
begin
btn_down<=~btn_down;
state<=s0;
end
else
begin
btn_down<=btn_down;
state<=s2;
end
end
endcase
end
end
reg[19:
0]cnt;
regcnt_done;
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
cnt<=20'b0;
cnt_done<=1'b0;
end
elseif(state==s1)
begin
cnt<=cnt+1'b1;
if(cnt==20'd500000)
begin
cnt<=20'b0;
cnt_done<=1'b1;
end
end
else
begin
cnt<=20'b0;
cnt_done<=1'b0;
end
end
endmodule
方块图形动态显示代码:
moduledynamic_display(
inputclk,
inputrst,
input[7:
0]in_rgb,
input[9:
0]h_cnt,v_cnt,
output[7:
0]out_rgb
);
localparamHVA=640;
localparamVVA=480;
reg[7:
0]rgb_mask;
always@(posedgeclk,posedgerst)
begin
if(rst)
rgb_mask<=8'b1111_1111;
elseif((h_cnt>=h_cnt_add)&&(h_cnt<=h_cnt_add+60)&&(v_cnt>=220)&&(v_cnt<=260))
rgb_mask<=8'b0001_1100;
else
rgb_mask<=8'b1111_1111;
end
reg[27:
0]count;
regsecond_up;
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
count<=28'd0;
second_up<=1'b0;
end
elseif(count==28'd10_000_000)
begin
second_up<=1'b1;
count<=28'd0;
end
else
begin
count<=count+1'b1;
second_up<=1'b0;
end
end
reg[9:
0]h_cnt_add;
always@(posedgeclk,posedgerst)
begin
if(rst)
h_cnt_add<=10'd0;
elseif(second_up)
begin
if(h_cnt_add==640)
h_cnt_add<=0;
else
h_cnt_add<=h_cnt_add+40;
end
else
h_cnt_add<=h_cnt_add;
end
assignout_rgb=in_rgb&rgb_mask;
endmodule
实验模块图:
实验实际效果图:
深圳大学学生实验报告用纸
实验结论:
1.由于太久没有使用verilog语言敲写代码了,对于一些语法有些健忘,这次实验重温了该语言的使用以及技巧
2.更进一步加深了对VGA驱动的理解以及VGA显示工作的原理,相比以前,这次的VGA驱动代码更加短小,而且移植性更强更好
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VGA 控制器 设计 实现 显示器 屏幕 保护