一步步教你在DE2上驱动VGA 800*600@60HZ ADV7123
本帖最后由 YaphetS 于 2012-3-30 13:03 编辑新论坛第一帖,申请酷帖。
最近忙着如何在DE2上实现驱动VGA,终于在成功之后,将代码进一步规范,完善之后发布,过程中参考了Xiaomagee ,AKuei2和cnblog上刘强的日志。
看下效果图
先上传下我参考的资料
第一篇:
谈谈VGA的时序
现在简单分析下,VGA显示分为行显示和场显示,说白点就是X和Y轴的显示,我们需要关心的图2中的c段和q段,这两段的重合之处便是显示器显示
的阶段,这个阶段显示器从RGB口读取电压显示器AD转换为色彩显示,其余时序段根据名字就能知道作用,尤其关心的是电平被拉低的那一段,因为
整个时序中只有那一段被拉低。
所以我们要做的就是模拟时序,直到重合段写入RGB数据。
第二篇
显示驱动芯片 ADV7123
这是DE2中ADV7123的原理图,关于这个芯片的资料我整理出来了
第三篇
代码篇
代码写的浅显易懂,不同于我参考的的代码,基本上是仿顺序,仿时序写的,注释也还好,看代码肯定,比我说的好。
先看下RTL视图
sync_modulemodule sync_module
(
VGA_CLK, RSTn,
VGA_HS,VGA_VS,
VGA_BLANKn, VGA_SYNCn,
VGA_X, VGA_Y,
VGA_ACT,
DAC_CLK
);
inputVGA_CLK, RSTn;
output VGA_HS,VGA_VS;
output VGA_BLANKn, VGA_SYNCn;
output VGA_X, VGA_Y; //MAX 4096
output VGA_ACT; //When the VGA is ready to displayy that means in the active area Set to 1
output DAC_CLK;
/**************** 800*600@60HZ ********************/
//Horizontal parameter
parameter H_FRONT = 40; //d
parameter H_SYNC= 128; //a
parameter H_BACK= 88; //b
parameter H_ACT = 800; //c
parameter H_BLANK = H_FRONT + H_SYNC + H_BACK;
parameter H_TOTAL = H_BLANK + H_ACT;
//Vertical parameter
parameter V_FRONT = 1; //r
parameter V_SYNC= 4; //o
parameter V_BACK= 23; //p
parameter V_ACT = 600; //q
parameter V_BLANK = V_FRONT + V_SYNC + V_BACK;
parameter V_TOTAL = V_BLANK+ V_ACT;
/**************************************************/
//ADV7123
assign DAC_CLK = VGA_CLK;
assign VGA_BLANKn = VGA_HS && VGA_VS;
assign VGA_SYNCn = 1'b0; //If the SOG is not enable, SYNC should be set to 0;
//Horizontal Generator
reg H_Count;
reg VGA_HSr;
reg VGA_Xr;
reg VGA_HACT;
always @ (posedge VGA_CLK or negedge RSTn)
begin
if(!RSTn)
begin
VGA_HSr <= 1'b0;
VGA_HACT <= 1'b0;
VGA_Xr <= 12'd0;
H_Count <= 12'd0;
end
else
begin
if (H_Count == H_TOTAL)
H_Count <= 12'd0;
else
H_Count <= H_Count + 1'b1;
// Generate SYNC
if (H_Count <= H_SYNC)
VGA_HSr <= 1'b0;
else
VGA_HSr <= 1'b1;
// Define the active area
if ((H_Count > (H_SYNC+H_BACK))&&(H_Count <= (H_SYNC+H_BACK+H_ACT)))
begin
VGA_HACT <= 1'b1;
VGA_Xr <= H_Count - (H_SYNC+H_BACK+1); // X Address range 0-H_ACT
end
else
begin
VGA_HACT <= 1'b0;
VGA_Xr <= 12'd0;
end
end
end
assign VGA_HS = VGA_HSr;
assign VGA_X= VGA_Xr;
//Vertical Generator
reg V_Count;
reg VGA_VSr;
reg VGA_Yr;
reg VGA_VACT;
always @ (posedge VGA_CLK or negedge RSTn)
begin
if(!RSTn)
begin
VGA_VSr <= 1'b0;
VGA_VACT <= 1'b0;
VGA_Yr <= 12'd0;
V_Count <= 12'd0;
end
else
begin
if (V_Count == V_TOTAL)
V_Count <= 12'd0;
else if(H_Count == H_TOTAL)
V_Count <= V_Count + 1'b1;
// Generate SYNC
if (V_Count <= V_SYNC)
VGA_VSr <= 1'b0;
else
VGA_VSr <= 1'b1;
// Define the active area
if ((V_Count > (V_SYNC+V_BACK))&&(V_Count <= (V_SYNC+V_BACK+V_ACT)))
begin
VGA_VACT <= 1'b1;
VGA_Yr <= V_Count - (V_SYNC+V_BACK); // Y Address range 0-V_ACT
end
else
begin
VGA_VACT <= 1'b0;
VGA_Yr <= 12'd0;
end
end
end
assign VGA_VS = VGA_VSr;
assign VGA_Y= VGA_Yr;
assign VGA_ACT = VGA_HACT&&VGA_VACT;
endmodulevga_control_modulemodule vga_control_module
(
VGA_CLK, RSTn,
VGA_X, VGA_Y,
VGA_ACT,
VGA_R, VGA_G, VGA_B
);
inputVGA_CLK, RSTn;
input VGA_X, VGA_Y;
input VGA_ACT;
output VGA_R, VGA_G, VGA_B;
//Pattern Generator
reg VGA_Rr, VGA_Gr, VGA_Br;
always @ (posedge VGA_CLK or negedge RSTn)
begin
if (!RSTn)
begin
VGA_Rr <= 0;
VGA_Gr <= 0;
VGA_Br <= 0;
end
else
begin
VGA_Rr <= (VGA_Y < 10'd100) ? 10'd1023 :
(VGA_Y>=10'd100 && VGA_Y<=10'd200) ? 10'd896:
(VGA_Y>=10'd200 && VGA_Y<=10'd300) ? 10'd768:
(VGA_Y>=10'd300 && VGA_Y<=10'd400) ? 10'd512:
(VGA_Y>=10'd400 && VGA_Y<=10'd500) ? 10'd256:
128;
VGA_Gr <= (VGA_X < 10'd100) ? 10'd128 :
(VGA_X>=10'd100 && VGA_X<=10'd200) ? 10'd256:
(VGA_X>=10'd200 && VGA_X<=10'd300) ? 10'd384:
(VGA_X>=10'd300 && VGA_X<=10'd400) ? 10'd512:
(VGA_X>=10'd400 && VGA_X<=10'd500) ? 10'd640:
(VGA_X>=10'd500 && VGA_X<=10'd600) ? 10'd768:
(VGA_X>=10'd600 && VGA_X<=10'd700) ? 10'd896:
1023;
VGA_Br <= (VGA_Y < 10'd100) ? 10'd128 :
(VGA_Y>=10'd100 && VGA_Y<=10'd200) ? 10'd256:
(VGA_Y>=10'd200 && VGA_Y<=10'd300) ? 10'd512:
(VGA_Y>=10'd300 && VGA_Y<=10'd400) ? 10'd768:
(VGA_Y>=10'd400 && VGA_Y<=10'd500) ? 10'd896:
1023;
end
end
assign VGA_R = VGA_Rr;
assign VGA_G = VGA_Gr;
assign VGA_B = VGA_Br;
endmodule vga_moduleTOPmodule vga_module
(
CLK_50M, RSTn,
VGA_HS,VGA_VS,
VGA_BLANKn, VGA_SYNCn,
DAC_CLK,
VGA_R, VGA_G, VGA_B
);
inputCLK_50M, RSTn;
output VGA_HS,VGA_VS;
output VGA_BLANKn, VGA_SYNCn;
output DAC_CLK;
output VGA_R, VGA_G, VGA_B;
wire VGA_CLK;
pll_module U1
(
.inclk0(CLK_50M),
.c0(VGA_CLK)
);
wire VGA_X, VGA_Y;
wire VGA_ACT;
sync_module U2
(
.VGA_CLK(VGA_CLK),
.RSTn(RSTn),
.VGA_HS(VGA_HS),
.VGA_VS(VGA_VS),
.VGA_BLANKn(VGA_BLANKn),
.VGA_SYNCn(VGA_SYNCn),
.VGA_X(VGA_X),
.VGA_Y(VGA_Y),
.VGA_ACT(VGA_ACT),
.DAC_CLK(DAC_CLK)
);
vga_control_module U3
(
.VGA_CLK(VGA_CLK),
.RSTn(RSTn),
.VGA_X(VGA_X),
.VGA_Y(VGA_Y),
.VGA_ACT(VGA_ACT),
.VGA_R(VGA_R),
.VGA_G(VGA_G),
.VGA_B(VGA_B)
);
endmodule 最后上传下当时的情景
不知道为什么 图片又挂了{:cry:} 学习了
PDF 可以显示,图片不行。。。
要不打包上来吧。。。 把图片 补到这里了 {:curse:}只是单独驱动,小马哥的文档好像有啊 不是的 里面加了芯片的驱动 就因为 图片显示不出来 酷帖也没了{:smile:} 手上就de2,驱动一下。 学习一下。 这么厉害,我手上有一块DE2的板子,能把你的整个工程文件都发给我么,qq:918031129@qq.com
谢谢{:smile:} 代码 不都上传了吗你好懒啊{:loveliness:} de2是什么啊 DE2入手有一段时间了 但是VGA还是驱动不起来 楼主 我是用VHDL的 有相关的东西么 nydns 发表于 2012-4-13 11:33 static/image/common/back.gif
de2是什么啊
一款FPGA的开发板 我以前学的是VHDL,所以一时半会verilog还没有弄明白,{:lol:}楼主好像少了一个时钟分频模块,我也不太会{:sad:} 楼主我弄出来了,但怎么整体往左移了呢,难道是我的显示器比你的宽的原因?? 时钟是用 megafunction自动生成的。。 谢谢分享我看到现象了 呵呵 YaphetS 发表于 2012-3-30 12:48 static/image/common/back.gif
把图片 补到这里了
LZ有没有继续做过图片显示的啊,用SRAM作缓存 LZ,请问pll_module的代码在哪? 用megafunction生成 这也能置酷吗? 我想至酷的 可是照片无法显示。 我正在做VGA显示,256色的,不行,用的VGA接口是3bit,只能显示8种。 VGA驱动及实现.pdf 下载不了,LZ能否重新上传一份,万分感谢 亲有没有显示图片的就是在里面加个rom 直接读出来 有不? QQ 664252700 楼主,请问你的PLL如何实现50M到40M的,我都整很长时间了?还是没弄出来,希望你给指导一下qq784733289{:cry:} 楼主,我都已经将频率改为四十M,还是不行,你能说说都哪里容易错吗? 收藏了! 有没有人知道ADV7123的VGA_SYNC应该设为高电平还是低电平 登记一下~ 楼主,为什么我按你的代码下到板子里却看不到现象呢?是FPGA板和电脑之间的连接问题吗?我是用的笔记本,不知道怎么连接,求指导啊。。。 mark , YaphetS 发表于 2012-4-13 08:24 static/image/common/back.gif
代码 不都上传了吗你好懒啊
能告诉我那个DAC_CLK是接到哪个引脚么?为什么还要输出一个和VGA_CLK一模一样的时钟呢?ADV7123的那部分电路图我又看了,还是没想明白,求解释。。。。。。。。 残无 发表于 2012-9-17 16:28 static/image/common/back.gif
能告诉我那个DAC_CLK是接到哪个引脚么?为什么还要输出一个和VGA_CLK一模一样的时钟呢?ADV7123的那部分 ...
请问你的问题解决了没有?
也遇到相同的问题,DAC—CLK是不是可以不接啊?
工程下进去,屏幕没有反应啊。
显示的是 input signalout of range change settingto1600*900-60HZ
abcfanyuan 发表于 2012-10-4 17:08 static/image/common/back.gif
请问你的问题解决了没有?
也遇到相同的问题,DAC—CLK是不是可以不接啊?
工程下进去,屏幕没有反应啊。 ...
你可以看代码里面写的,DAC—CLK这个引脚应该接VGA_CLK的引脚,代码里面写出来的VGA_CLK是一个输入信号,代码中:39.assign DAC_CLK = VGA_CLK;
不知道你注意看代码了没,注意看了的话,就会发现这个。原理图文件我传上来了,自己看吧。前段时间比较忙就没有上论坛。。。。。
mark,正在学习这部分!!! 一会儿慢慢看 pdf挂了,能再上传一下吗? 好贴学习一下 残无 发表于 2012-10-10 18:24 static/image/common/back.gif
你可以看代码里面写的,DAC—CLK这个引脚应该接VGA_CLK的引脚,代码里面写出来的VGA_CLK是一个输入信号, ...
您好,我用的是115,现在移植时发现,既然VGA_CLK=DAC_CLK,是不是意味着配置引脚时配置在一个上面?另外程序中VGA-SYNCN是干什么用的那?我的115里面没有他的配置脚 图好像看不到了 stoppeddream 发表于 2012-4-22 19:22 static/image/common/back.gif
楼主我弄出来了,但怎么整体往左移了呢,难道是我的显示器比你的宽的原因?? ...
我的也出现了这种情况,不知道是什么原因,求指点啊{:smile:} 发现ADV7123都容易出现在横向灰阶(R=G=B),每一个像素点跳变的时候出现亮条纹。
具体的晚点发一张照片上来。 我把程序改成了横向灰阶,有亮条纹的现象,不知道有没有其它坛友遇到过。代码和效果如下:
记一下,晚上回去看看 YaphetS 发表于 2012-3-30 13:12 static/image/common/back.gif
不是的 里面加了芯片的驱动
7123的CLK时钟频率要多大的,我看7123的手册说是显分辨率/回归因子,不知这个回归因子怎么算的 bad_fpga 发表于 2013-1-31 21:11 static/image/common/back.gif
7123的CLK时钟频率要多大的,我看7123的手册说是显分辨率/回归因子,不知这个回归因子怎么算的 ...
有专门的文档计算,我传点资料。
你可以对照着算,里面也有常用的分辨率和刷新率的,已经计算好的。
其实还是比较简单的,最好是用正脉冲进行同步。因为和标准的VGA才是匹配的。
国内的很多VGA显示器,是可以支持负脉冲同步的。 各位,
有VHDl的程序吗? {:handshake:}{:handshake:} mark!!!!找了很久了 VGA 显示还是挺简单的,但是800*600@60hz,16bpp 得占SDRAM多大带宽啊.感觉其他事情都干不了. MARK,好好学习一下! 留下备用 谢谢 收藏,最近也想搞搞VGA
页:
[1]