大 学 实 验 报 告
课程名称: 数字系统现场集成技术
实验项目名称: 实验二(VGA控制器设计实现显示器屏幕保护模块)
学院:
专业:
指导教师:
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
人:学号: 班级:
实验时间:
实验报告提交时间:
教务部制
实验目的与要求:
通过FPGA板的VGA接口在显示器上分别显示不同颜色的横向、竖直条纹图案,横向条纹和竖直条纹的切换通过FPGA板上的按键实现。横向条纹要求是一幅640*480由8条不同颜色的横向条纹组成的图像,从上到下颜色分别为:红,蓝,绿,蓝,红,绿,红,蓝;竖直条纹要求是一幅640*480由8条不同颜色的竖直条纹组成的图像,从左到右颜色分别为:红,蓝,绿,蓝,红,绿,红,蓝。
实验最终达到效果:
本实验实现了实验要求中的基本要求以及高级要求,实验了VGA条纹的显示,以及通过按键,让显示屏显示不同的色彩条纹,还有实验了一个小方块在屏幕上的移动,达到动态显示效果。调用了xilinx官方提供的DCM模块,而且本实验的VGA驱动代码,经过仔细修改和考虑,只要修改自定义的实数,即可实验任何分辨率的显示器显示,方便以后实验或者项目的调用。
实验主要代码(由于代码较多,贴出主要代码):
VGA驱动代码:
module vga_drv(
input clk,
input rst,
input[7:0] in_rgb,
output hsync,vsync,
output[7:0] out_rgb,
output reg[9:0] h_cnt,v_cnt
);
localparam HVA=640;
localparam HFP=16;
localparam HSP=96;
localparam HBP=48;
localparam HWL=800;
localparam VVA=480;
localparam VFP=10;
localparam VSP=2;
localparam VBP=33;
localparam VWL=525;
wire valid;
//reg[9:0] h_cnt,v_cnt;
always@(posedge clk,posedge rst)
begin
if(rst)
h_cnt<=0;
else if(h_cnt == (HWL-1))
h_cnt<=0;
else
h_cnt<=h_cnt+1'd1;
end
always@(posedge clk,posedge rst)
begin
if(rst)
v_cnt<=0;
else if(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
assign hsync = ((h_cnt>=(HFP+HVA-1))&&(h_cnt<=(HVA+HFP+HSP - 1)))?1'b0:1'b1;
assign vsync = ((v_cnt>=(VVA+VFP - 1))&&(v_cnt<=(VVA+VFP+VSP - 1)))?1'b0:1'b1;
assign valid = ((h_cnt<=HVA-1)&& (v_cnt<=VVA-1))?1'b1:1'b0;
assign out_rgb = valid ? in_rgb:8'b0000_0000;
endmodule
VGA条纹产生代码:
module colour_bar(
input clk,
input rst,
input[9:0] h_cnt,v_cnt,
input mode,
output reg[7:0] rgb
);
//wire[9:0] h_cnt_wire=h_cnt+16;
localparam HVA=640;
localparam VVA=480;
always@(posedge clk,posedge rst)
begin
if(rst)
rgb<=8'b0000_0000;
else if(mode)
begin
if(h_cnt>=0 && h_cnt<(HVA/8))
rgb<=8'b111_000_00;
else if(h_cnt>=(HVA/8)*1 && h_cnt<(HVA/8)*2)
rgb<=8'b000_000_11;
else if(h_cnt>=(HVA/8)*2 && h_cnt<(HVA/8)*3)
rgb<=8'b000_111_00;
else if(h_cnt>=(HVA/8)*3 && h_cnt<(HVA/8)*4)
rgb<=8'b000_000_11;
else if(h_cnt>=(HVA/8)*4 && h_cnt<(HVA/8)*5)
rgb<=8'b111_000_00;
else if(h_cnt>=(HVA/8)*5 && h_cnt<(HVA/8)*6)
rgb<=8'b000_111_00;
else if(h_cnt>=(HVA/8)*6 && h_cnt<(HVA/8)*7)
rgb<=8'b111_000_00;
else if(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;
else if(v_cnt>=(VVA/8)*1 && v_cnt<(VVA/8)*2)
rgb<=8'b000_000_11;
else if(v_cnt>=(VVA/8)*2 && v_cnt<(VVA/8)*3)
rgb<=8'b000_111_00;
else if(v_cnt>=(VVA/8)*3 && v_cnt<(VVA/8)*4)
rgb<=8'b000_000_11;
else if(v_cnt>=(VVA/8)*4 && v_cnt<(VVA/8)*5)
rgb<=8'b111_000_00;
else if(v_cnt>=(VVA/8)*5 && v_cnt<(VVA/8)*6)
rgb<=8'b000_111_00;
else if(v_cnt>=(VVA/8)*6 && v_cnt<(VVA/8)*7)
rgb<=8'b111_000_00;
else if(v_cnt>=(VVA/8)*7 && v_cnt<(VVA/8)*8)
rgb<=8'b000_000_11;
else
rgb<=8'b000_000_000;
end
end
Endmodule
按键消抖代码:
module btn_scan(
input clk,
input rst,
input btn,
output reg btn_down
);
localparam[1:0] s0=2'b00,
s1=2'b01,
s2=2'b10;
reg[1:0] state;
always@(posedge clk,posedge rst)
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;
reg cnt_done;
always@(posedge clk,posedge rst)
begin
if(rst)
begin
cnt<=20'b0;
cnt_done<=1'b0;
end
else if(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
方块图形动态显示代码:
module dynamic_display(
input clk,
input rst,
input[7:0] in_rgb,
input[9:0] h_cnt,v_cnt,
output[7:0] out_rgb
);
localparam HVA=640;
localparam VVA=480;
reg[7:0] rgb_mask;
always@(posedge clk,posedge rst)
begin
if(rst)
rgb_mask<=8'b1111_1111;
else if((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;
reg second_up;
always@(posedge clk,posedge rst)
begin
if(rst)
begin
count<=28'd0;
second_up<=1'b0;
end
else if(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@(posedge clk,posedge rst)
begin
if(rst)
h_cnt_add<=10'd0;
else if(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
assign out_rgb=in_rgb & rgb_mask;
endmodule
实验模块图:
实验实际效果图:
深圳大学学生实验报告用纸
实验结论:
1.由于太久没有使用verilog语言敲写代码了,对于一些语法有些健忘,这次实验重温了该语言的使用以及技巧
2.更进一步加深了对VGA驱动的理解以及VGA显示工作的原理,相比以前,这次的VGA驱动代码更加短小,而且移植性更强更好
指导教师批阅意见:
成绩评定:
指导教师签字:
年 月 日
备注:
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
继续阅读