锆石科技社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 246|回复: 1

关于VGA显示彩条的问题

[复制链接]

3

主题

37

帖子

1173

积分

金牌会员

Rank: 6Rank: 6

积分
1173
发表于 2017-2-2 15:18:28 | 显示全部楼层 |阅读模式
在教程中显示的是竖着的彩条,我尝试着改了改代码,想把彩条改成横着的,但是一直没成功,不知道哪位大神可以帮助解决一下,还有就是最后的四个十六进制数,8'hE0,8'h03,8'FC,8'h1C为什么会分别表示红黄蓝绿?万分感谢
附上原来竖条的代码:
`define HSYNC_A 16'd128
`define HSYNC_B 16'd216
`define HSYNC_C 16'd1016
`define HSYNC_D 16'd1056
`define VSYNC_O 16'd4
`define VSYNC_P 16'd27
`define VSYNC_Q 16'd627
`define VSYNC_R 16'd628
module Vga_Module
(
CLK_40M,RST_N,
VGA_HSYNC,VGA_VSYNC,VGA_DATA
);
input CLK_40M,RST_N;
output reg VGA_HSYNC;
output reg VGA_VSYNC;
output reg [7:0] VGA_DATA;
reg [15:0] hsync_cnt;
reg [15:0] hsync_cnt_n;
reg [15:0] vsync_cnt;
reg [15:0] vsync_cnt_n;
reg VGA_HSYNC_N;
reg VGA_VSYNC_N;
reg vga_data_en;
reg vga_data_en_n;
reg [7:0] VGA_DATA_N;
always @(posedge CLK_40M,negedge RST_N)
begin
if(!RST_N)
  hsync_cnt<=16'h0;
else
  hsync_cnt<=hsync_cnt_n;
end
always @(*)
begin
if(hsync_cnt==`HSYNC_D)
  hsync_cnt_n=16'h0;
else
  hsync_cnt_n=hsync_cnt+16'h1;
end
always @(posedge CLK_40M,negedge RST_N)
begin
if(!RST_N)
  vsync_cnt<=16'h0;
else
  vsync_cnt<=vsync_cnt_n;
end
always @(*)
begin
if((hsync_cnt==`HSYNC_D) && (vsync_cnt==`VSYNC_R))
  vsync_cnt_n=16'h0;
else if(hsync_cnt==`HSYNC_D)
  vsync_cnt_n=vsync_cnt+1'h1;
else
  vsync_cnt_n=vsync_cnt;
end
always @(posedge CLK_40M,negedge RST_N)            //行同步信号,发送给接收端以表示一行扫描完毕
begin
if(!RST_N)
  VGA_HSYNC<=1'h0;
else
  VGA_HSYNC<=VGA_HSYNC_N;
end
always @(*)
begin
if(hsync_cnt<`HSYNC_A)
  VGA_HSYNC_N=1'h1;
else
  VGA_HSYNC_N=1'h0;
end
always @(posedge CLK_40M,negedge RST_N)            //场同步信号,发送给接收端表示一场扫描完毕
begin
if(!RST_N)
  VGA_VSYNC<=1'h0;
else
  VGA_VSYNC<=VGA_VSYNC_N;
end
always @(*)
begin
if(vsync_cnt<`VSYNC_O)
  VGA_VSYNC_N=1'h1;
else
  VGA_VSYNC_N=1'h0;
end
always @(posedge CLK_40M,negedge RST_N)
begin
if(!RST_N)
  vga_data_en<=1'h0;
else
  vga_data_en<=vga_data_en_n;
end
always @(*)
begin
if((hsync_cnt>`HSYNC_B) && (hsync_cnt<`HSYNC_C) && (vsync_cnt>`VSYNC_P) && (vsync_cnt<`VSYNC_Q))
  vga_data_en_n=1'h1;
else
  vga_data_en_n=1'h0;
end
always @(posedge CLK_40M,negedge RST_N)
begin
if(!RST_N)
  VGA_DATA<=8'h0;
else
  VGA_DATA<=VGA_DATA_N;
end
always @(*)
begin
if(hsync_cnt>`HSYNC_B && hsync_cnt<=`HSYNC_B+10'd200)
  VGA_DATA_N=8'hE0;
else if(hsync_cnt>`HSYNC_B+10'd200 && hsync_cnt<=`HSYNC_B+10'd400)
  VGA_DATA_N=8'h03;
else if(hsync_cnt>`HSYNC_B+10'd400 && hsync_cnt<=`HSYNC_B+10'd600)
  VGA_DATA_N=8'hFC;
else if(hsync_cnt>`HSYNC_B+10'd600 && hsync_cnt<=`HSYNC_B+10'd800)
  VGA_DATA_N=8'h1C;
else
  VGA_DATA_N=8'h00;
end
endmodule
回复

使用道具 举报

发表于 2017-2-2 19:40:41 | 显示全部楼层
本帖最后由 锆石科技解答员 于 2017-2-2 19:44 编辑

用hsync_cnt计数器做判断显示的就是竖着的彩条,用vsync_cnt计数器做判断显示的就是横着的彩条。从A4开发板原理图中可以得到,8位的VGA数据,分别对应的是R三位,G三位,B两位,因此,R2,R1,R0,G2,G1,G0,B1,B0分别对应VGA的8个数据。如果R2,R1,R0都为1,其余的G2,G1,G0,B1,B0都为0,那么就是红色,其对应的十六进制就是8'hE0,依次类推。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|锆石科技社区 ( 苏ICP备15059756号  

GMT+8, 2019-5-27 03:06 , Processed in 0.125685 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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