thy110 发表于 2016-10-14 21:46:52

我在用FPGA做VGA驱动屏幕时,屏幕始终是黑色的。

本帖最后由 thy110 于 2016-10-14 21:48 编辑

我的原理图如图所示



实验现象是屏幕一直是黑色,没有提示““没有信号输入”。求助
我的驱动程序如下:
1、驱动ADV7123、产生行信号和列信号

module LCD_VS_HS(clk,rst_n,VGA_ACT,HS,VS,VGA_CLk,VGA_SYNC_N,VGA_BLANK_N,ypos,xpos);//600 800
`include "LCD_Parament.v"
input clk,rst_n;

output VGA_ACT;
output HS,VS;
output VGA_CLk,VGA_SYNC_N,VGA_BLANK_N;
output ypos,xpos;

reg Hcnt,Vcnt;
reg HS,VS;

reg ypos;
reg xpos;
reg HACT,VACT;


always @(posedge clk or negedge rst_n)
begin
        if(!rst_n)
        begin
                Hcnt <= 11'd0;
                HS <= 1'b0;
                xpos <=11'd0;
                HACT <= 1'b0;
        end
        else
        begin
                if(Hcnt == (`VGA_HTOTAl-1))Hcnt <= 11'd0;
                else Hcnt <= Hcnt + 1'b1;
               
                if(Hcnt <= (`VGA_HSYNC-1))HS <= 1'b0;
                else HS <= 1'b1;
               
                if((Hcnt > (`VGA_HSYNC + `VGA_HBACK -1)) && (Hcnt <= (`VGA_HSYNC + `VGA_HBACK + `VGA_HACT -1)))
                begin
                        xpos <= Hcnt-(`VGA_HSYNC + `VGA_HBACK);
                        HACT <= 1'b1;
                end
                else
                begin
                        xpos<=11'd0;
                        HACT <= 1'b0;
                end               
        end
end

always @(posedge clk or negedge rst_n)
begin
        if(!rst_n)
                begin
                Vcnt <=11'd0;
                ypos <= 11'd0;
                VACT <=1'b0;
                VS <= 1'b0;
                end
        else
        begin
                if(Hcnt == (`VGA_HTOTAl-1))       
                        Vcnt <= Vcnt + 1'b1;
                else if(Vcnt == (`VGA_TOTAL-1))
                        Vcnt <= 11'd0;
               
                if(Vcnt <= (`VGA_VSYNC-1)) VS <= 1'b0;
                elseVS <= 1'b1;
               
                if((Vcnt > (`VGA_VSYNC + `VGA_VBACK -1)) && (Vcnt <= (`VGA_VSYNC + `VGA_VBACK + `VGA_VACT -1)))
                begin
                        ypos <= Vcnt -(`VGA_VSYNC + `VGA_VBACK );
                        VACT <= 1'b1;
                end
                else
                begin
                        ypos <= 11'd0;
                        VACT <= 1'b0;
                end
        end
end

assign VGA_ACT = HACT && VACT;
assign VGA_CLk = clk;
assign VGA_BLANK_N = HS & VS;
assign VGA_SYNC_N = 1'b0;
endmodule


2、颜色生成
module LCD_Display(clk,rst_n,VGA_ACT,xpos,ypos,R,G,B);
`include "LCD_Parament.v"
input clk,rst_n;
input xpos,ypos;
inputVGA_ACT;

output R,B,G;

reg RGB_data;

always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
        RGB_data <= 24'h000000;
else
        begin
        if(ypos>=0 && ypos < (`LCD_YPOS/8)*1)
                RGB_data <= `RED;
        else if(ypos>=(`LCD_YPOS/8)*1 && ypos < (`LCD_YPOS/8)*2)
                RGB_data <= `GREEN;
        else if(ypos>=(`LCD_YPOS/8)*2 && ypos < (`LCD_YPOS/8)*3)
                RGB_data <= `BLUE;
        else if(ypos>=(`LCD_YPOS/8)*3 && ypos < (`LCD_YPOS/8)*4)
                RGB_data <= `WITHE;
        else if(ypos>=(`LCD_YPOS/8)*4 && ypos < (`LCD_YPOS/8)*5)
                RGB_data <= `BLACK;
        else if(ypos>=(`LCD_YPOS/8)*5 && ypos < (`LCD_YPOS/8)*6)
                RGB_data <= `YELLOW;
        else if(ypos>=(`LCD_YPOS/8)*6 && ypos < (`LCD_YPOS/8)*7)
                RGB_data <= `CYAN;
        else
                RGB_data <= `MAGENTA;
        end
end


assign R = RGB_data;
assign G = RGB_data;
assign B = RGB_data;

endmodule




3、顶层

module VGA600_800(clk,rst_n,R,G,B,VGA_CLk,VGA_SYNC_N,VGA_BLANK_N,HS,VS);
input clk,rst_n;

output R,G,B;
output HS,VS;
output VGA_CLk,VGA_SYNC_N,VGA_BLANK_N;

wire VGA_ACT;
wire xpos,ypos;
wire VGA40MHZ;
wire locked;

VGA_40MHZ u1(.areset(!rst_n),.inclk0(clk),.c0(VGA40MHZ),.locked(locked));

LCD_VS_HS VSHS(.clk(VGA40MHZ),.rst_n(rst_n),.VGA_ACT(VGA_ACT),.HS(HS),.VS(VS),
                                        .VGA_CLk(VGA_CLk),.VGA_SYNC_N(VGA_SYNC_N),.VGA_BLANK_N(VGA_BLANK_N)
                                        ,.ypos(ypos),.xpos(xpos));

                                       
LCD_Display Display(.clk(VGA40MHZ),.rst_n(rst_n),.VGA_ACT(VGA_ACT),.xpos(xpos),.ypos(ypos),.R(R),.G(G),.B(B));


endmodule


NJ8888 发表于 2016-10-14 22:02:43

要是有示波器就好了,看行场信号,另外要查你显示器分辨对应的行场脉冲时正脉冲还是负脉冲,别反

thy110 发表于 2016-10-15 09:25:52

NJ8888 发表于 2016-10-14 22:02
要是有示波器就好了,看行场信号,另外要查你显示器分辨对应的行场脉冲时正脉冲还是负脉冲,别反 ...

找到问题所在了,ADV7123的BLANK_N信号,网上大多数讲的都是行信号和列信号的与,但是我试了不行,实际上是行信号数据有效区域和列信号有效区域的与,我修改后现在可以了

ackyee 发表于 2016-10-15 09:40:37

thy110 发表于 2016-10-15 09:25
找到问题所在了,ADV7123的BLANK_N信号,网上大多数讲的都是行信号和列信号的与,但是我试了不行,实际上 ...

black 还有 en信号不同的模块不一样的
页: [1]
查看完整版本: 我在用FPGA做VGA驱动屏幕时,屏幕始终是黑色的。