搜索
bottom↓
回复: 54

一步步教你在DE2上驱动VGA 800*600@60HZ ADV7123

  [复制链接]

出0入0汤圆

发表于 2012-3-30 12:42:22 | 显示全部楼层 |阅读模式
本帖最后由 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_module
  1. module sync_module
  2. (   
  3.     VGA_CLK, RSTn,
  4.     VGA_HS,  VGA_VS,
  5.     VGA_BLANKn, VGA_SYNCn,
  6.     VGA_X, VGA_Y,
  7.     VGA_ACT,
  8.     DAC_CLK
  9. );

  10. input  VGA_CLK, RSTn;
  11. output VGA_HS,  VGA_VS;
  12. output VGA_BLANKn, VGA_SYNCn;
  13. output[11:0] VGA_X, VGA_Y;      //  MAX 4096
  14. output VGA_ACT;                                        //  When the VGA is ready to displayy that means in the active area Set to 1
  15. output DAC_CLK;

  16. /**************** 800*600@60HZ ********************/

  17. //Horizontal parameter
  18. parameter H_FRONT = 40;     //  d
  19. parameter H_SYNC  = 128;    //  a
  20. parameter H_BACK  = 88;     //  b
  21. parameter H_ACT   = 800;    //  c
  22. parameter H_BLANK = H_FRONT + H_SYNC + H_BACK;
  23. parameter H_TOTAL = H_BLANK + H_ACT;

  24. //Vertical parameter
  25. parameter V_FRONT = 1;     //  r
  26. parameter V_SYNC  = 4;    //  o
  27. parameter V_BACK  = 23;     //  p
  28. parameter V_ACT   = 600;    //  q
  29. parameter V_BLANK = V_FRONT + V_SYNC + V_BACK;
  30. parameter V_TOTAL = V_BLANK  + V_ACT;

  31. /**************************************************/

  32. //ADV7123   
  33. assign DAC_CLK = VGA_CLK;
  34. assign VGA_BLANKn = VGA_HS && VGA_VS;
  35. assign VGA_SYNCn = 1'b0;        //If the SOG is not enable, SYNC should be set to 0;

  36. //Horizontal Generator
  37. reg[11:0] H_Count;
  38. reg VGA_HSr;
  39. reg[11:0] VGA_Xr;
  40. reg VGA_HACT;                                       
  41. always @ (posedge VGA_CLK or negedge RSTn)
  42. begin
  43.         if(!RSTn)
  44.         begin
  45.                 VGA_HSr <= 1'b0;
  46.                 VGA_HACT <= 1'b0;
  47.                 VGA_Xr <= 12'd0;
  48.                 H_Count <= 12'd0;
  49.         end
  50.         else
  51.         begin
  52.                 if (H_Count == H_TOTAL)
  53.                         H_Count <= 12'd0;
  54.                 else
  55.                         H_Count <= H_Count + 1'b1;
  56.                        
  57.                 // Generate SYNC
  58.                 if (H_Count <= H_SYNC)
  59.                         VGA_HSr <= 1'b0;
  60.                 else
  61.                         VGA_HSr <= 1'b1;
  62.                
  63.                 //        Define the active area       
  64.                 if ((H_Count > (H_SYNC+H_BACK))&&(H_Count <= (H_SYNC+H_BACK+H_ACT)))
  65.                 begin
  66.                         VGA_HACT <= 1'b1;
  67.                         VGA_Xr <= H_Count - (H_SYNC+H_BACK+1);                // X Address range 0-H_ACT
  68.                 end
  69.                 else
  70.                 begin
  71.                         VGA_HACT <= 1'b0;
  72.                         VGA_Xr <= 12'd0;
  73.                 end
  74.         end
  75. end
  76. assign VGA_HS = VGA_HSr;
  77. assign VGA_X  = VGA_Xr;

  78. //Vertical Generator
  79. reg[11:0] V_Count;
  80. reg VGA_VSr;
  81. reg[11:0] VGA_Yr;
  82. reg VGA_VACT;                                       
  83. always @ (posedge VGA_CLK or negedge RSTn)
  84. begin
  85.         if(!RSTn)
  86.         begin
  87.                 VGA_VSr <= 1'b0;
  88.                 VGA_VACT <= 1'b0;
  89.                 VGA_Yr <= 12'd0;
  90.                 V_Count <= 12'd0;
  91.         end
  92.         else
  93.         begin
  94.                 if (V_Count == V_TOTAL)
  95.                         V_Count <= 12'd0;
  96.                 else if(H_Count == H_TOTAL)
  97.                         V_Count <= V_Count + 1'b1;
  98.                        
  99.                 // Generate SYNC
  100.                 if (V_Count <= V_SYNC)
  101.                         VGA_VSr <= 1'b0;
  102.                 else
  103.                         VGA_VSr <= 1'b1;
  104.                
  105.                 //        Define the active area       
  106.                 if ((V_Count > (V_SYNC+V_BACK))&&(V_Count <= (V_SYNC+V_BACK+V_ACT)))
  107.                 begin
  108.                         VGA_VACT <= 1'b1;
  109.                         VGA_Yr <= V_Count - (V_SYNC+V_BACK);                // Y Address range 0-V_ACT
  110.                 end
  111.                 else
  112.                 begin
  113.                         VGA_VACT <= 1'b0;
  114.                         VGA_Yr <= 12'd0;
  115.                 end
  116.         end
  117. end       

  118. assign VGA_VS = VGA_VSr;
  119. assign VGA_Y  = VGA_Yr;

  120. assign VGA_ACT = VGA_HACT&&VGA_VACT;

  121. endmodule
复制代码
vga_control_module
  1. module vga_control_module
  2. (
  3.     VGA_CLK, RSTn,
  4.     VGA_X, VGA_Y,
  5.     VGA_ACT,
  6.     VGA_R, VGA_G, VGA_B
  7. );

  8. input  VGA_CLK, RSTn;
  9. input[11:0] VGA_X, VGA_Y;
  10. input VGA_ACT;
  11. output[9:0] VGA_R, VGA_G, VGA_B;

  12. //Pattern Generator
  13. reg[9:0] VGA_Rr, VGA_Gr, VGA_Br;
  14. always @ (posedge VGA_CLK or negedge RSTn)
  15. begin
  16.         if (!RSTn)
  17.         begin
  18.                 VGA_Rr <= 0;
  19.                 VGA_Gr <= 0;
  20.                 VGA_Br <= 0;
  21.         end
  22.         else
  23.         begin
  24.                 VGA_Rr <= (VGA_Y < 10'd100) ? 10'd1023 :
  25.                                   (VGA_Y>=10'd100 && VGA_Y<=10'd200) ? 10'd896:
  26.                                   (VGA_Y>=10'd200 && VGA_Y<=10'd300) ? 10'd768:
  27.                                   (VGA_Y>=10'd300 && VGA_Y<=10'd400) ? 10'd512:
  28.                                   (VGA_Y>=10'd400 && VGA_Y<=10'd500) ? 10'd256:
  29.                           128;
  30.                           
  31.                 VGA_Gr <= (VGA_X < 10'd100) ? 10'd128 :
  32.                                   (VGA_X>=10'd100 && VGA_X<=10'd200) ? 10'd256:
  33.                                   (VGA_X>=10'd200 && VGA_X<=10'd300) ? 10'd384:
  34.                                   (VGA_X>=10'd300 && VGA_X<=10'd400) ? 10'd512:
  35.                                   (VGA_X>=10'd400 && VGA_X<=10'd500) ? 10'd640:
  36.                                   (VGA_X>=10'd500 && VGA_X<=10'd600) ? 10'd768:
  37.                                   (VGA_X>=10'd600 && VGA_X<=10'd700) ? 10'd896:
  38.                           1023;
  39.                           
  40.                 VGA_Br <= (VGA_Y < 10'd100) ? 10'd128 :
  41.                                   (VGA_Y>=10'd100 && VGA_Y<=10'd200) ? 10'd256:
  42.                                   (VGA_Y>=10'd200 && VGA_Y<=10'd300) ? 10'd512:
  43.                                   (VGA_Y>=10'd300 && VGA_Y<=10'd400) ? 10'd768:
  44.                                   (VGA_Y>=10'd400 && VGA_Y<=10'd500) ? 10'd896:
  45.                           1023;
  46.         end
  47. end

  48. assign VGA_R = VGA_Rr;
  49. assign VGA_G = VGA_Gr;
  50. assign VGA_B = VGA_Br;

  51. endmodule
复制代码
vga_module  TOP
  1. module vga_module
  2. (
  3.         CLK_50M, RSTn,
  4.     VGA_HS,  VGA_VS,
  5.     VGA_BLANKn, VGA_SYNCn,
  6.     DAC_CLK,
  7.     VGA_R, VGA_G, VGA_B
  8. );

  9. input  CLK_50M, RSTn;

  10. output VGA_HS,  VGA_VS;
  11. output VGA_BLANKn, VGA_SYNCn;
  12. output DAC_CLK;
  13. output[9:0] VGA_R, VGA_G, VGA_B;

  14. wire VGA_CLK;

  15. pll_module U1
  16. (
  17.         .inclk0(CLK_50M),
  18.         .c0(VGA_CLK)
  19. );

  20. wire[11:0] VGA_X, VGA_Y;
  21. wire VGA_ACT;
  22.    
  23. sync_module        U2       
  24. (   
  25.     .VGA_CLK(VGA_CLK),
  26.     .RSTn(RSTn),
  27.     .VGA_HS(VGA_HS),  
  28.     .VGA_VS(VGA_VS),
  29.     .VGA_BLANKn(VGA_BLANKn),
  30.     .VGA_SYNCn(VGA_SYNCn),
  31.     .VGA_X(VGA_X),
  32.     .VGA_Y(VGA_Y),
  33.     .VGA_ACT(VGA_ACT),
  34.     .DAC_CLK(DAC_CLK)
  35. );

  36. vga_control_module U3
  37. (
  38.     .VGA_CLK(VGA_CLK),
  39.     .RSTn(RSTn),
  40.     .VGA_X(VGA_X),
  41.     .VGA_Y(VGA_Y),
  42.     .VGA_ACT(VGA_ACT),
  43.     .VGA_R(VGA_R),
  44.     .VGA_G(VGA_G),
  45.     .VGA_B(VGA_B)
  46. );

  47. endmodule
复制代码
最后上传下当时的情景



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-3-30 12:43:47 | 显示全部楼层
不知道为什么 图片又挂了

出0入0汤圆

发表于 2012-3-30 12:46:37 | 显示全部楼层
学习了
PDF 可以显示,图片不行。。。
要不打包上来吧。。。

出0入0汤圆

 楼主| 发表于 2012-3-30 12:48:27 | 显示全部楼层
把图片 补到这里了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-3-30 13:11:21 | 显示全部楼层
只是单独驱动,小马哥的文档好像有啊

出0入0汤圆

 楼主| 发表于 2012-3-30 13:12:15 | 显示全部楼层
不是的 里面加了芯片的驱动

出0入0汤圆

 楼主| 发表于 2012-3-30 14:46:08 | 显示全部楼层
就因为 图片显示不出来 酷帖也没了

出0入0汤圆

发表于 2012-3-31 01:39:45 | 显示全部楼层
手上就de2,驱动一下。

出0入0汤圆

发表于 2012-3-31 21:05:55 | 显示全部楼层
学习一下。

出0入0汤圆

发表于 2012-4-10 21:31:32 | 显示全部楼层
这么厉害,我手上有一块DE2的板子,能把你的整个工程文件都发给我么,qq:918031129@qq.com
谢谢

出0入0汤圆

 楼主| 发表于 2012-4-13 08:24:34 | 显示全部楼层
代码 不都上传了吗  你好懒啊

出0入0汤圆

发表于 2012-4-13 11:33:16 | 显示全部楼层
de2是什么啊

出0入0汤圆

发表于 2012-4-16 21:18:47 | 显示全部楼层
DE2入手有一段时间了 但是VGA还是驱动不起来 楼主 我是用VHDL的 有相关的东西么

出0入0汤圆

发表于 2012-4-16 21:19:26 | 显示全部楼层
nydns 发表于 2012-4-13 11:33
de2是什么啊

一款FPGA的开发板

出0入0汤圆

发表于 2012-4-21 11:57:04 | 显示全部楼层
我以前学的是VHDL,所以一时半会verilog还没有弄明白,楼主好像少了一个时钟分频模块,我也不太会

出0入0汤圆

发表于 2012-4-22 19:22:27 | 显示全部楼层
楼主我弄出来了,但怎么整体往左移了呢,难道是我的显示器比你的宽的原因??

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-4-23 09:25:44 | 显示全部楼层
时钟是用 megafunction  自动生成的。。

出0入0汤圆

发表于 2012-4-28 19:10:08 | 显示全部楼层
谢谢分享  我看到现象了 呵呵

出0入0汤圆

发表于 2012-4-29 15:37:06 | 显示全部楼层
YaphetS 发表于 2012-3-30 12:48
把图片 补到这里了

LZ有没有继续做过图片显示的啊,用SRAM作缓存

出0入0汤圆

发表于 2012-5-12 13:43:36 | 显示全部楼层
LZ,请问pll_module的代码在哪?

出0入0汤圆

 楼主| 发表于 2012-5-12 14:50:00 | 显示全部楼层
用megafunction生成

出0入0汤圆

发表于 2012-5-16 10:33:40 | 显示全部楼层
这也能置酷吗?

出0入0汤圆

 楼主| 发表于 2012-5-17 21:53:17 | 显示全部楼层
我想至酷的 可是照片无法显示。

出0入0汤圆

发表于 2012-7-6 17:09:59 | 显示全部楼层
我正在做VGA显示,256色的,不行,用的VGA接口是3bit,只能显示8种。

出0入0汤圆

发表于 2012-7-17 22:10:21 | 显示全部楼层
VGA驱动及实现.pdf 下载不了,LZ能否重新上传一份,万分感谢

出0入0汤圆

发表于 2012-7-18 22:06:44 | 显示全部楼层
亲  有没有显示图片的  就是在里面加个rom 直接读出来 有不? QQ 664252700

出0入0汤圆

发表于 2012-8-5 16:38:06 | 显示全部楼层
楼主,请问你的PLL如何实现50M到40M的,我都整很长时间了?还是没弄出来,希望你给指导一下qq784733289

出0入0汤圆

发表于 2012-8-6 17:00:53 | 显示全部楼层
楼主,我都已经将频率改为四十M,还是不行,你能说说都哪里容易错吗?

出0入0汤圆

发表于 2012-8-7 10:07:54 | 显示全部楼层
收藏了!   

出0入0汤圆

发表于 2012-8-7 16:54:45 | 显示全部楼层
有没有人知道ADV7123的VGA_SYNC应该设为高电平还是低电平

出0入0汤圆

发表于 2012-8-10 14:39:52 | 显示全部楼层
登记一下~

出0入0汤圆

发表于 2012-8-21 23:59:13 | 显示全部楼层
楼主,为什么我按你的代码下到板子里却看不到现象呢?是FPGA板和电脑之间的连接问题吗?我是用的笔记本,不知道怎么连接,求指导啊。。。

出0入0汤圆

发表于 2012-8-22 11:08:43 来自手机 | 显示全部楼层
mark       ,

出0入0汤圆

发表于 2012-9-17 16:28:19 | 显示全部楼层
YaphetS 发表于 2012-4-13 08:24
代码 不都上传了吗  你好懒啊

能告诉我那个DAC_CLK是接到哪个引脚么?为什么还要输出一个和VGA_CLK一模一样的时钟呢?ADV7123的那部分电路图我又看了,还是没想明白,求解释。。。。。。。。

出0入0汤圆

发表于 2012-10-4 17:08:18 | 显示全部楼层
残无 发表于 2012-9-17 16:28
能告诉我那个DAC_CLK是接到哪个引脚么?为什么还要输出一个和VGA_CLK一模一样的时钟呢?ADV7123的那部分 ...

请问你的问题解决了没有?
也遇到相同的问题,DAC—CLK是不是可以不接啊?
工程下进去,屏幕没有反应啊。
显示的是 input signal  out of range   change setting  to  1600*900-60HZ

出0入0汤圆

发表于 2012-10-10 18:24:53 | 显示全部楼层
abcfanyuan 发表于 2012-10-4 17:08
请问你的问题解决了没有?
也遇到相同的问题,DAC—CLK是不是可以不接啊?
工程下进去,屏幕没有反应啊。 ...

你可以看代码里面写的,DAC—CLK这个引脚应该接VGA_CLK的引脚,代码里面写出来的VGA_CLK是一个输入信号,代码中:39.assign DAC_CLK = VGA_CLK;
不知道你注意看代码了没,注意看了的话,就会发现这个。原理图文件我传上来了,自己看吧。前段时间比较忙就没有上论坛。。。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-10-10 19:12:49 | 显示全部楼层
mark,正在学习这部分!!! 一会儿慢慢看

出0入0汤圆

发表于 2012-11-29 22:57:17 | 显示全部楼层
pdf挂了,能再上传一下吗?

出0入24汤圆

发表于 2012-11-29 23:20:50 | 显示全部楼层
好贴学习一下

出0入0汤圆

发表于 2013-1-18 14:37:31 | 显示全部楼层
残无 发表于 2012-10-10 18:24
你可以看代码里面写的,DAC—CLK这个引脚应该接VGA_CLK的引脚,代码里面写出来的VGA_CLK是一个输入信号, ...

您好,我用的是115,现在移植时发现,既然VGA_CLK=DAC_CLK,是不是意味着配置引脚时配置在一个上面?另外程序中VGA-SYNCN是干什么用的那?我的115里面没有他的配置脚

出0入0汤圆

发表于 2013-1-18 23:11:14 | 显示全部楼层
图好像看不到了

出0入0汤圆

发表于 2013-1-23 09:07:09 | 显示全部楼层
stoppeddream 发表于 2012-4-22 19:22
楼主我弄出来了,但怎么整体往左移了呢,难道是我的显示器比你的宽的原因?? ...

我的也出现了这种情况,不知道是什么原因,求指点啊

出0入0汤圆

发表于 2013-1-29 11:37:05 | 显示全部楼层
发现ADV7123都容易出现在横向灰阶(R=G=B),每一个像素点跳变的时候出现亮条纹。
具体的晚点发一张照片上来。

出0入0汤圆

发表于 2013-1-31 17:15:42 | 显示全部楼层
我把程序改成了横向灰阶,有亮条纹的现象,不知道有没有其它坛友遇到过。代码和效果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-1-31 18:42:17 来自手机 | 显示全部楼层
记一下,晚上回去看看

出0入0汤圆

发表于 2013-1-31 21:11:49 | 显示全部楼层
YaphetS 发表于 2012-3-30 13:12
不是的 里面加了芯片的驱动

7123的CLK时钟频率要多大的,我看7123的手册说是显分辨率/回归因子,不知这个回归因子怎么算的

出0入0汤圆

发表于 2013-2-4 09:30:06 | 显示全部楼层
bad_fpga 发表于 2013-1-31 21:11
7123的CLK时钟频率要多大的,我看7123的手册说是显分辨率/回归因子,不知这个回归因子怎么算的 ...

有专门的文档计算,我传点资料。
你可以对照着算,里面也有常用的分辨率和刷新率的,已经计算好的。












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-2-4 09:32:01 | 显示全部楼层
其实还是比较简单的,最好是用正脉冲进行同步。因为和标准的VGA才是匹配的。
国内的很多VGA显示器,是可以支持负脉冲同步的。

出0入0汤圆

发表于 2014-2-17 17:55:38 | 显示全部楼层
各位,
有VHDl的程序吗?

出0入0汤圆

发表于 2014-2-17 18:13:56 | 显示全部楼层

出0入0汤圆

发表于 2014-6-2 00:33:44 | 显示全部楼层
mark!!!!找了很久了

出0入0汤圆

发表于 2014-6-24 19:05:00 | 显示全部楼层
VGA 显示还是挺简单的,但是800*600@60hz,16bpp 得占SDRAM多大带宽啊.感觉其他事情都干不了.

出0入0汤圆

发表于 2014-8-14 09:28:18 | 显示全部楼层
MARK,好好学习一下!

出0入0汤圆

发表于 2014-8-14 09:41:46 | 显示全部楼层
留下备用 谢谢

出0入0汤圆

发表于 2014-9-11 11:14:25 | 显示全部楼层
收藏,最近也想搞搞VGA
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表