lcx 发表于 2014-5-17 16:11:31

初试VGA

您好,这学期我们开了fpga课程,总共就6、7节课,然后现在最后在开发板上做一个画图仪,是用ps2的鼠标加vga显示。
现在在做vga显示这块,就先根据例程做了一个二色的240*320的位图的显示。
就是在白色的像素,RGB一共30位全发1,黑色的像素则全发0。
但是效果不是很理想,出现了这种东西:

然后,我将代码改了一下,白色的RGB值改为了:
RValue=10’h2ff;
GValue=10'h2ff;
BValue=10'h2ff;
即次高位为0,效果变成了这样

虽然那些紫色斑纹没了,但是整个图像很暗,几乎看不出白色的样子。我又试着改变其他位的值,发现只要第8位为1,就会出现紫斑。
现在很困惑。
ps:显示器应该是好的,接在主机上是没问题的:

最后附上,时序部分的程序:
reg a = 11'd136;
reg b = 11'd160;
reg c = 11'd1024;
reg d = 11'd24;
reg e = 11'd1344;

reg o = 11'd6;
reg p = 11'd29;
reg q = 11'd768;
reg r = 11'd3;
reg s = 11'd806;

always @ (posedge CLK or negedge RSTn)
begin
    if(!RSTn)
      Count_H <= 11'd0;
    else if(Count_H == e)
      Count_H <= 11'd0;
    else
      Count_H <= Count_H + 11'd1;
end

always @ (posedge CLK or negedge RSTn)
begin
    if(!RSTn)
      Count_V <= 11'd0;
    else if(Count_V == s)
      Count_V <= 11'd0;
    else if(Count_H == e)
      Count_V <= Count_V + 11'd1;
end

always @ (posedge CLK or negedge RSTn)
begin
    if(!RSTn)
      isReady <= 0;
    else if((Count_H >= (a+b) && Count_H <= (a+b+c+11'd1)) &&
            (Count_V >= (o+p)&& Count_V <= (o+p+q+11'd1)))         //这里,在例程上分别是a+b+c+11‘1和o+p+q,我不知道原因,但是我把所有情况
                                                                                                         //都试了一次,即a+b+c和o+p+q、a+b+c+11'd1和o+p+q、a+b+c和o+p+q+11’d1
                                                                                                         //a+b+c+11'd1和o+p+q+11‘d1都试过了,效果并没有改变
      isReady <= 1'd1;
    else
      isReady <= 1'd0;
end

assign VSYNC_Sig = (Count_V <= o)   ?1'd0 : 1'd1;
assign HSYNC_Sig = (Count_H <= a)   ?1'd0 : 1'd1;
assign De_Sig    = (Count_V<=o || Count_H<=a)? 1'd0 : 1'd1;

assign Ready_Sig = isReady;

assign Column_Addr_Sig = (Ready_Sig) ? (Count_H - (a+b+11'd1)): 11'd0;
assign Row_Addr_Sig    = (Ready_Sig) ? (Count_V - (o+p+11'd1)): 11'd0;

lcx 发表于 2014-5-20 09:03:34

谢谢呀,这两天考试……我头都快晕了,今天来看到你的回复,实在非常感谢。我下午试一下,看行不行。不过不管怎样都十分感谢。

lcx 发表于 2014-5-20 23:34:56

laokai 发表于 2014-5-19 14:27
从现象来看是你的时序问题我给你个例子程序,你去看看!驱动时钟25M!输出色条!

您好,我试了下你的程序,不过,我不知道怎么产生25.175的时钟,只能产生25MHz的。
结果,屏幕上什么都没有。
然后,我将参数改成了800*600@60的,时钟用40Mhz,结果屏幕上显示 “input signal out of range”
我改了的部分如下:
parameter        H_SYNC_TIME          =10'd128;
parameter        H_BACK_PORCH       =10'd80;
parameter        H_LEFT_BORDER       =10'd8;
parameter        H_ACT_START          =H_SYNC_TIME + H_BACK_PORCH + H_LEFT_BORDER;
parameter        H_ACTIVE_TIME       =10'd800;
parameter        H_ACT_END          =H_ACT_START + H_ACTIVE_TIME;
parameter        H_TOTAL_TIME       =10'd1056;
parameter        V_TOTAL_TIME       =10'd628;
parameter        V_SYNC_TIME          =10'd4;
parameter        V_BACK_PORCH       =10'd15;
parameter        V_TOP_BORDER       =10'd8;
parameter        V_ACT_START          =V_SYNC_TIME + V_BACK_PORCH + V_TOP_BORDER;
parameter        V_ACTIVE_TIME       =10'd600;
parameter        V_ACT_END          =V_ACT_START + V_ACTIVE_TIME;

我这几天都快崩溃了……这两个星期,三场考试,一篇论文,十份个实验报告,一场答辩……

lcx 发表于 2014-5-21 13:13:48

laokai 发表于 2014-5-21 11:19
你改的参数需要按照标准走的,我给你的640*480外部加个PLL给25M时钟就行,看看那是否能跑通,然后再尝试修 ...

我又跑了次程序,这次倒是有画面了,不过还是有那种紫斑给:

就是左边那一溜~~~
不过还是很感谢了……
我后天就要交了,暂时就这种程度吧。
不过,我改了参数的还是不行
页: [1]
查看完整版本: 初试VGA