YaphetS 发表于 2012-3-30 12:42:22

一步步教你在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 最后上传下当时的情景



YaphetS 发表于 2012-3-30 12:43:47

不知道为什么 图片又挂了{:cry:}

xieshang 发表于 2012-3-30 12:46:37

学习了
PDF 可以显示,图片不行。。。
要不打包上来吧。。。

YaphetS 发表于 2012-3-30 12:48:27

把图片 补到这里了

jobwork2012 发表于 2012-3-30 13:11:21

{:curse:}只是单独驱动,小马哥的文档好像有啊

YaphetS 发表于 2012-3-30 13:12:15

不是的 里面加了芯片的驱动

YaphetS 发表于 2012-3-30 14:46:08

就因为 图片显示不出来 酷帖也没了{:smile:}

lkl10800139 发表于 2012-3-31 01:39:45

手上就de2,驱动一下。

hunningtu 发表于 2012-3-31 21:05:55

学习一下。

stoppeddream 发表于 2012-4-10 21:31:32

这么厉害,我手上有一块DE2的板子,能把你的整个工程文件都发给我么,qq:918031129@qq.com
谢谢{:smile:}

YaphetS 发表于 2012-4-13 08:24:34

代码 不都上传了吗你好懒啊{:loveliness:}

nydns 发表于 2012-4-13 11:33:16

de2是什么啊

tianpengyu 发表于 2012-4-16 21:18:47

DE2入手有一段时间了 但是VGA还是驱动不起来 楼主 我是用VHDL的 有相关的东西么

tianpengyu 发表于 2012-4-16 21:19:26

nydns 发表于 2012-4-13 11:33 static/image/common/back.gif
de2是什么啊

一款FPGA的开发板

stoppeddream 发表于 2012-4-21 11:57:04

我以前学的是VHDL,所以一时半会verilog还没有弄明白,{:lol:}楼主好像少了一个时钟分频模块,我也不太会{:sad:}

stoppeddream 发表于 2012-4-22 19:22:27

楼主我弄出来了,但怎么整体往左移了呢,难道是我的显示器比你的宽的原因??

YaphetS 发表于 2012-4-23 09:25:44

时钟是用 megafunction自动生成的。。

shaloumisha 发表于 2012-4-28 19:10:08

谢谢分享我看到现象了 呵呵

shaloumisha 发表于 2012-4-29 15:37:06

YaphetS 发表于 2012-3-30 12:48 static/image/common/back.gif
把图片 补到这里了

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

milkroad_qyj 发表于 2012-5-12 13:43:36

LZ,请问pll_module的代码在哪?

YaphetS 发表于 2012-5-12 14:50:00

用megafunction生成

peixiuhui 发表于 2012-5-16 10:33:40

这也能置酷吗?

YaphetS 发表于 2012-5-17 21:53:17

我想至酷的 可是照片无法显示。

木易 发表于 2012-7-6 17:09:59

我正在做VGA显示,256色的,不行,用的VGA接口是3bit,只能显示8种。

xzf962 发表于 2012-7-17 22:10:21

VGA驱动及实现.pdf 下载不了,LZ能否重新上传一份,万分感谢

小滑头520 发表于 2012-7-18 22:06:44

亲有没有显示图片的就是在里面加个rom 直接读出来 有不? QQ 664252700

chuwei6 发表于 2012-8-5 16:38:06

楼主,请问你的PLL如何实现50M到40M的,我都整很长时间了?还是没弄出来,希望你给指导一下qq784733289{:cry:}

chuwei6 发表于 2012-8-6 17:00:53

楼主,我都已经将频率改为四十M,还是不行,你能说说都哪里容易错吗?

orange-208 发表于 2012-8-7 10:07:54

收藏了!   

chuwei6 发表于 2012-8-7 16:54:45

有没有人知道ADV7123的VGA_SYNC应该设为高电平还是低电平

shuisxians 发表于 2012-8-10 14:39:52

登记一下~

hj_zhang 发表于 2012-8-21 23:59:13

楼主,为什么我按你的代码下到板子里却看不到现象呢?是FPGA板和电脑之间的连接问题吗?我是用的笔记本,不知道怎么连接,求指导啊。。。

liycobl 发表于 2012-8-22 11:08:43

mark       ,

残无 发表于 2012-9-17 16:28:19

YaphetS 发表于 2012-4-13 08:24 static/image/common/back.gif
代码 不都上传了吗你好懒啊

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

abcfanyuan 发表于 2012-10-4 17:08:18

残无 发表于 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

残无 发表于 2012-10-10 18:24:53

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;
不知道你注意看代码了没,注意看了的话,就会发现这个。原理图文件我传上来了,自己看吧。前段时间比较忙就没有上论坛。。。。。

longwu03272009 发表于 2012-10-10 19:12:49

mark,正在学习这部分!!! 一会儿慢慢看

普莱斯队长 发表于 2012-11-29 22:57:17

pdf挂了,能再上传一下吗?

ycwjl728 发表于 2012-11-29 23:20:50

好贴学习一下

普莱斯队长 发表于 2013-1-18 14:37:31

残无 发表于 2012-10-10 18:24 static/image/common/back.gif
你可以看代码里面写的,DAC—CLK这个引脚应该接VGA_CLK的引脚,代码里面写出来的VGA_CLK是一个输入信号, ...

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

zgje40 发表于 2013-1-18 23:11:14

图好像看不到了

lj2008213318 发表于 2013-1-23 09:07:09

stoppeddream 发表于 2012-4-22 19:22 static/image/common/back.gif
楼主我弄出来了,但怎么整体往左移了呢,难道是我的显示器比你的宽的原因?? ...

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

hubukaixuan 发表于 2013-1-29 11:37:05

发现ADV7123都容易出现在横向灰阶(R=G=B),每一个像素点跳变的时候出现亮条纹。
具体的晚点发一张照片上来。

hubukaixuan 发表于 2013-1-31 17:15:42

我把程序改成了横向灰阶,有亮条纹的现象,不知道有没有其它坛友遇到过。代码和效果如下:

xiaosi1102 发表于 2013-1-31 18:42:17

记一下,晚上回去看看

bad_fpga 发表于 2013-1-31 21:11:49

YaphetS 发表于 2012-3-30 13:12 static/image/common/back.gif
不是的 里面加了芯片的驱动

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

hubukaixuan 发表于 2013-2-4 09:30:06

bad_fpga 发表于 2013-1-31 21:11 static/image/common/back.gif
7123的CLK时钟频率要多大的,我看7123的手册说是显分辨率/回归因子,不知这个回归因子怎么算的 ...

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












hubukaixuan 发表于 2013-2-4 09:32:01

其实还是比较简单的,最好是用正脉冲进行同步。因为和标准的VGA才是匹配的。
国内的很多VGA显示器,是可以支持负脉冲同步的。

ZLIT1 发表于 2014-2-17 17:55:38

各位,
有VHDl的程序吗?

moen 发表于 2014-2-17 18:13:56

{:handshake:}{:handshake:}

lisgo 发表于 2014-6-2 00:33:44

mark!!!!找了很久了

chenxi_2008 发表于 2014-6-24 19:05:00

VGA 显示还是挺简单的,但是800*600@60hz,16bpp 得占SDRAM多大带宽啊.感觉其他事情都干不了.

allanwang1101 发表于 2014-8-14 09:28:18

MARK,好好学习一下!

ggchao 发表于 2014-8-14 09:41:46

留下备用 谢谢

dzf050727 发表于 2014-9-11 11:14:25

收藏,最近也想搞搞VGA
页: [1]
查看完整版本: 一步步教你在DE2上驱动VGA 800*600@60HZ ADV7123