我在用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
要是有示波器就好了,看行场信号,另外要查你显示器分辨对应的行场脉冲时正脉冲还是负脉冲,别反 ...
找到问题所在了,ADV7123的BLANK_N信号,网上大多数讲的都是行信号和列信号的与,但是我试了不行,实际上是行信号数据有效区域和列信号有效区域的与,我修改后现在可以了 thy110 发表于 2016-10-15 09:25
找到问题所在了,ADV7123的BLANK_N信号,网上大多数讲的都是行信号和列信号的与,但是我试了不行,实际上 ...
black 还有 en信号不同的模块不一样的
页:
[1]