实验9 VGA显示控制器实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验9 VGA显示控制器实验
1、实验目的:
1)理解VGA显示的基本原理。
2)学习计数器和LPM_ROM的使用方法
2、实验原理:
图1 VGA显示控制器的原理框图
3、实验内容
1)彩条信号实验
a)创建锁相环,把输入的50MHz时钟变成25MHz,并创建元件。
b)利用所给的VGA_Pattern和VGA_Ctrl,创建元件。
c)完成顶层原理图,在QuartusⅡ上进行编译、综合、适配。
引脚锁定以及
硬件下载测试。
2)显示自己的姓实验。
修改VGA_Pattern,利用if语句控制相应区域的相应值,在QuartusⅡ上进行编译、综合、适配。
引脚锁定以及硬件下载测试。
3)显示数字实验
a)创建lpm_rom,手动输入“0”的mif文件。
b)顶层文件为numTop.v,在QuartusⅡ上进行编译、综合、适配,硬件下载
测试。
4)计数显示实验
a)创建“1~9”的lpm_rom,mif文件已给出。
b)加入计数器。
c)完成顶层文件,在QuartusⅡ上进行编译、综合、适配,硬件下载测试。
5)数字钟实验
在4)基础上加入位置控制,完成顶层文件,在QuartusⅡ上进行编译、综合、适配,硬件下载测试。
6)显示理工校徽实验
(2)moduleVGA_Pattern(
//HostSideoRed,oGreen,oBlue,iCurrent_X,iCurrent_Y,iVGA_CLK,iRST_N); // Host Side
output reg oRed;
output reg oGreen;
output reg oBlue;
input [9:0] i Current_X;
input [9:0] i Current_Y;
// Control Signal
input iVGA_CLK;
input iRST_N;
always@(posedge iVGA_CLK or negedge iRST_N)
begin
if(!iRST_N)
begin
oRed <= 0;
oGreen <= 0;
oBlue <= 0;
end
else
begin
if((( iCurrent_Y>60)&& (iCurrent_Y <
80))&&((iCurrent_X>200)&&(iCurrent_X <400)))
begin
oRed <= 1;
oGreen <= 0;
oBlue <= 0;
end
else if((( iCurrent_Y>80)&& (iCurrent_Y <
240))&&((iCurrent_X>200)&&(iCurrent_X <240)))
begin
oRed <= 1;
oGreen <= 0;
oBlue <= 0;
end
/*else if((( iCurrent_Y>150)&& (iCurrent_Y <
170))&&((iCurrent_X>260)&&(iCurrent_X <340)))
/*else if((150 < iCurrent_Y < 170)&&(260<iCurrent_X < 340))
begin
oRed <= 1;
oGreen <= 0;
oBlue <= 0;
end
else if((( iCurrent_Y>170)&& (iCurrent_Y <
240))&&((iCurrent_X>290)&&(iCurrent_X <310)))
/*else if((170 < iCurrent_Y < 240)&&(290 < iCurrent_X < 310))
begin
oRed <= 1;
oGreen <= 0;
oBlue <= 0;
end*/
else if((( iCurrent_Y>240)&& (iCurrent_Y <
260))&&((iCurrent_X>200)&&(iCurrent_X <400)))
/*else if((240 < iCurrent_Y < 260)&&(150 < iCurrent_X < 450))*/
begin
oRed <= 1;
oGreen <= 0;
oBlue <= 0;
end
else
begin
oRed <= 0;
oGreen <= 0;
oBlue <= 0;
end
end
end
endmodule
(3)
(4)module numTop1(CLK,RST,R,G,B,HS,VS); input CLK,RST;
output R,G,B,HS,VS;
wire clk25Mhz,vga_clk;
wire [9:0]ram_data;
wire [9:0] X,Y;
wire [6:0] ram_addr;
wire [3:0]COUNT;
wire carry1;
wire CLK1HZ;
reg vga_data;
assign ram_addr = {Y[5:2],X[4:2]};
altPLL0 u1(CLK,clk25Mhz);
VGA_Ctrl u2(
.iRed(vga_data),
.iGreen(vga_data),
.iBlue(vga_data),
.oCurrent_X(X),
.oCurrent_Y(Y),
// VGA Side
.oVGA_R(R),
.oVGA_G(G),
.oVGA_B(B),
.oVGA_HS(HS),
.oVGA_VS(VS),
.oVGA_CLK(vga_clk),
// Control Signal
.iCLK(clk25Mhz),
.iRST_N(RST) ); demo_shuzi u17(ram_addr,vga_clk,ram_data[0]); ROM1 u21(ram_addr,vga_clk,ram_data[1]);
ROM2 u14(ram_addr,vga_clk,ram_data[2]);
ROM3 u15(ram_addr,vga_clk,ram_data[3]);
ROM4 u6(ram_addr,vga_clk,ram_data[4]);
ROM5 u7(ram_addr,vga_clk,ram_data[5]);
ROM6 u8(ram_addr,vga_clk,ram_data[6]);
ROM7 u9(ram_addr,vga_clk,ram_data[7]);
ROM8 u10(ram_addr,vga_clk,ram_data[8]);
ROM9 u11(ram_addr,vga_clk,ram_data[9]);
/*demo_shuzi u3(ram_addr,vga_clk,ram_data);*/ GeneralCnt #(4,9) u4(CLK1HZ,RST,1,COUNT,carry1); ClkDiv #(26,50000000) u5(CLK,RST,CLK1HZ);
always@(X,Y)
if(X<32 && Y<64)
vga_data=ram_data[COUNT];
else if(X<64 && Y<64)
vga_data=ram_data[COUNT];
else
vga_data=0;
endmodule
//任意倍整数分频器
module ClkDiv(clk_in,rst_n,clk_out);
parameter MSB = 4, DIV_TIMES = 10;
input clk_in,rst_n;
output clk_out;
reg clk_out;
reg [MSB-1:0] count;
always @(negedge rst_n or posedge clk_in)
begin
if(rst_n==0)
begin
count<=0;
end
else
begin
if(count < (DIV_TIMES-1))
count<=count+1'b1;
else
count<=0;
end
end
always @(negedge rst_n or posedge clk_in) begin
if(rst_n==0)
begin
clk_out<=1'b0;
end
else
begin
if(count<(DIV_TIMES>>1))
clk_out<=1'b0;
else
clk_out<=1'b1;
end
end
endmodule
//通用计数器
module GeneralCnt(clk,reset_n,
ena,
cnt,
carry_out
);
parameter MSB = 4, CNT_END = 9; input clk;
input reset_n;
input ena;
output [MSB-1:0]cnt;
output carry_out;
reg [MSB-1:0]cnt;
reg carry_out;
//计数
always@(posedge clk or negedge reset_n) begin
if(!reset_n)
cnt <= 0;
else if(ena && cnt==CNT_END)
cnt <= 0;
else if (ena && cnt < CNT_END)
cnt <= cnt + 1'b1;
end
//产生进位输出
always@(posedge clk or negedge reset_n) begin if(!reset_n)
carry_out <= 1'b0;
else if(ena && cnt==CNT_END)
carry_out <= 1'b1;
else
carry_out <= 1'b0;
end
endmodule。