FPGA基础之VGA(一)满屏红色

2023-05-16

一、 项目分析

用VGA显示全屏的红色,VGA(Video Graphics Array,视频图形阵列)是一种电脑显示标准。开发板采用至芯科技zx-1学习板,VGA视频显示接口是256色,颜色位深为8,RGB332的高三位是红色,中间3位是绿色,最低2位是蓝色,当vga_rgb=111_000_000时,显示全红。

1.1 原理分析

1.1.1 硬件电路原理

VGA的硬件电路原理如图1- 1所示,总共有15针接口,主要接口信号包括:颜色信号VGA_RGB[7:0],水平同步信号VGA_HS(列同步信号)和垂直同步信号VGA_VS(场同步信号,行同步信号)。
在这里插入图片描述图1- 1 256色VGA接口

1.1.2 VGA扫描原理

本VGA采用逐行扫描的方式,逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。
完成一行扫描的时间为水平扫描时间,倒数为行频率;完成一帧的扫描时间为垂直扫描时间,倒数为场频率。基本上用场频率来表示显示屏的刷新频率。

1.1.3 显示时序和时钟频率

VGA显示时,需要考虑有效显示区域和无效显示区域,以640x480x60的显示标准为例,有效显示区域为640x480,无效显示区域包括行时序/场时序都需要同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Active Video Time c)和显示前沿(Front porch d),根据相应的显示标准,所以总的显示区域包括800x525,时钟频率的计算方法如下:VGA_CLK=800x525x60=25.175MHz。

VGA的行时序(列同步)和场时序(行同步)如图1- 2所示。不同VGA显示标准下的时钟频率和列同步等参数如图1- 3所示,列时序即为水平同步信号时序,行时序即为垂直同步(场同步)信号时序。
在这里插入图片描述
图1- 2 VGA列同步和场同步时序
在这里插入图片描述
图1- 3 VGA显示标准

1.2 顶层设计

在这里插入图片描述
图1- 4 顶层设计
端口说明:
clk:系统时钟50M
rst_n:复位,低电平有效
vga_rgb:颜色信号,高3位为红色,中间3位为绿色,低2位为蓝色
vga_hs:列同步信号,行同步
vga_vs:场同步信号,列同步

1.3 架构设计

在这里插入图片描述
图1- 5 VGA的架构

二、代码编写

1、顶层代码如下:

这个模块要注意的是根据显示标准,调用PLL生成相应的时钟频率。

module vga (

	input		wire					clk,
	input		wire					rst_n,
	
	output	wire		[7:0]		vga_rgb,
	output	wire					vga_hs,
	output	wire					vga_vs
);

	wire					clk_25m;
	wire					pll_locked;
	
	pll pll_inst (
	
		.areset 			( ~rst_n 	),
		.inclk0 			( clk 		),
		.c0				( clk_25m	),
		.locked 			( pll_locked)
	);

	vga_ctrl vga_ctrl_inst (

		.clk					(clk_25m		),
		.rst_n				(pll_locked	),
                         
		.vga_rgb				(vga_rgb		),
		.vga_hs				(vga_hs		),
		.vga_vs				(vga_vs		)
	);

endmodule 

2、vga_ctrl模块代码如下:

`define VGA_640x480x60					// choose different video standard,revise PLL clk ,alter cnt WIDTH
//`define VGA_680X480X75
//`define VGA_800X600X60
//`define VGA_800X600X75
//`define VGA_1024X768X60
//`define VGA_1024X768X75
//`define VGA_1280X1024X60
//`define VGA_1280X800X60
//`define VGA_1440X900X60

module vga_ctrl (

	input		wire					clk,
	input		wire					rst_n,

	output	reg		[7:0]		vga_rgb,
	output	reg					vga_hs,
	output	reg					vga_vs
);

//================ VGA_680X480X60 =========================================================

`ifdef VGA_640x480x60								// PLL clk = 25M = 640x480x60

	localparam			HS_A	=	96;				// synchronous pulse, horizontal
	localparam			HS_B	=	48;				// back porch pulse
	localparam			HS_C	=	640;				// display interval
	localparam			HS_D	=	16;				// Front porch
	localparam			HS_E	=	800;				// horizontal cycles

	localparam			VS_A	=	2;					// synchronous pulse, vertical
	localparam			VS_B	=	33;
	localparam			VS_C	=	480;	
	localparam			VS_D	=	10;	
	localparam			VS_E	=	525;	
	
	localparam			HS_WIDTH	=	10;
	localparam			VS_WIDTH	=	10;

`endif

//================ VGA_800X600X60 =========================================================
//
//`ifdef VGA_800X600X60								// PLL clk = 40.0M
//
//	localparam			HS_A	=	128;
//	localparam			HS_B	=	88;
//	localparam			HS_C	=	800;
//	localparam			HS_D	=	40;
//	localparam			HS_E	=	1056;
//		
//	localparam			VS_A	=	4;
//	localparam			VS_B	=	23;
//	localparam			VS_C	=	600;
//	localparam			VS_D	=	1;
//	localparam			VS_E	=	628;
//	
//	localparam			HS_WIDTH	=	11;			// different resolution correspond to different couter width
//	localparam			VS_WIDTH	=	10;
//	
//`endif
//=====================================================================================================
	
	reg		[HS_WIDTH - 1:0]		cnt_hs;				// counter for horizontal synchronous signal
	reg		[VS_WIDTH - 1:0]		cnt_vs;				// counter for vertical synchrous signal
	
	wire					en_hs;								//	dsiplay horizontal enable
	wire					en_vs;								// display vertical enable
	wire					en;									// effective display zone
	
	always @ (posedge clk, negedge rst_n)
		if (!rst_n)
			cnt_hs <= 0;
		else
			if (cnt_hs < HS_E - 1)
				cnt_hs <= cnt_hs + 1'b1;
			else
				cnt_hs <= 0;
				
	always @ (posedge clk, negedge rst_n)
		if (!rst_n)
			cnt_vs <= 0;
		else
			if (cnt_hs == HS_E - 1)
				if (cnt_vs < VS_E - 1)
					cnt_vs <= cnt_vs + 1'b1;
				else
					cnt_vs <= 0;
			else
				cnt_vs <= cnt_vs;
				
	always @ (posedge clk, negedge rst_n)
		if (!rst_n)
			vga_hs <= 1'b1;
		else
			if (cnt_hs < HS_A - 1)
				vga_hs <= 1'b0;
			else
				vga_hs <= 1'b1;
				
	always @ (posedge clk, negedge rst_n)
		if (!rst_n)
			vga_vs <= 1'b1;
		else
			if (cnt_vs < VS_A - 1)
				vga_vs <= 1'b0;
			else
				vga_vs <= 1'b1;
		
	assign en_hs = (cnt_hs > HS_A + HS_B - 1)	&& (cnt_hs < HS_E - HS_D);
	assign en_vs = (cnt_vs > VS_A + VS_B - 1) && (cnt_vs < VS_E - VS_D);
	assign en = en_hs && en_vs;
				
	always @ (posedge clk, negedge rst_n)
		if (!rst_n)
			vga_rgb <= 8'b000_000_00;
		else
			if (en)
				vga_rgb <= 8'b111_000_00;					// red
			else
				vga_rgb <= 8'b000_000_00;

endmodule 

3、仿真测试模块代码如下:

因为显示器的一帧完整图像扫描完成大概需要16ms,所以只仿真前几行的垂直扫描波形。

`timescale 1ns/1ps

module vga_tb;

	reg						clk;
	reg						rst_n;
	
	wire		[7:0]			vga_rgb;
	wire						vga_hs;
	wire						vga_vs;

	vga vga_inst (

		.clk					(clk			),
		.rst_n				(rst_n		),
		                   
		.vga_rgb				(vga_rgb		),
		.vga_hs				(vga_hs		),
		.vga_vs				(vga_vs		)
	);

	initial clk = 1;
	always #10 clk = ~ clk;
	
	initial 
		begin
			rst_n = 0;
			# 201
			
			rst_n = 1;
				repeat (11)
					@ (posedge vga_hs);
			# 200
			$stop;
		end

endmodule 

四、个人总结

VGA学习需要弄明白的是两个同步信号:水平同步和垂直同步。网上的表达方式各不相同,需要读者自己细细品味。注意PLL时钟速率和不同显示标准之间的关系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA基础之VGA(一)满屏红色 的相关文章

随机推荐

  • 变分自编码器(一):原来是这么一回事

    https kexue fm archives 5253 过去虽然没有细看 xff0c 但印象里一直觉得变分自编码器 xff08 Variational Auto Encoder xff0c VAE xff09 是个好东西 于是趁着最近看概
  • Linux 安装npm

    1 root 登录linux 2 cd usr loacl node 没有目录就自己创建一个 3 wget https npm taobao org mirrors node v4 4 7 node v4 4 7 linux x64 tar
  • DE1-SOC开发笔记

    verilog FPGA 采用verilog开发语言 xff0c 使用时序和组合逻辑 进行行为 xff0c 数据流 xff0c 结构建模 RTL级编程 xff0c 在实际板卡上面验证逻辑的正确性 sopc xff1a 软硬件结合的开发方式
  • 关于立创EDA使用的几点心得

    对于立创EDA 与AD仅为小白 xff0c 仅布过简单的双层板 xff0c 以下仅记录自己的几点心得 1 如果想要在立创商城 xff0c 嘉立创实现打板贴片一体化 xff0c 采用的普遍的两种方法 xff1a 立创EDA xff0c 有在线
  • 《当下即是生活》季羡林——读书笔记

    目录 书籍简介 经典摘录 三思而行 满招损 xff0c 谦受益 牵就与适应 睁一只眼 闭一只眼 论压力 论恐惧 难得糊涂 春色满寰中 槐花 书籍简介 作者季羡林 本书精选季羡林关于人生活法的散文 xff0c 阐述一个人怎样活在当下 xff0
  • Python装饰器

    Python的装饰器 decorator 可以说是Python的一个神器 xff0c 它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能 Python的装饰器同时也是Python学习从入门到精通过程中必需要熟练掌握的知识 小编我
  • Python学习笔记--带参数的装饰器

    带参数的装饰器 装饰器的副作用柯里化functools带参数的装饰器多参数小结 装饰器的副作用 def fn 39 39 39 this is fn 39 39 39 help fn 结果 xff1a Help on function fn
  • 六、51单片机之定时器/计数器_理论

    1 什么是定时器 计数器 定时器就是单片机设定一个时间间隔 xff0c 时间间隔到后通知单片机 例如设置100ms的定时器 xff0c 100ms后定时器通知单片机时间到了 1 定时器是单片机的一种内部外设 以前的单片机只有CPU 也就是只
  • 八、51单片机之蜂鸣器

    1 蜂鸣器的原理 蜂鸣器分为有源蜂鸣器和无源蜂鸣器 这里的 源 不是指电源 xff0c 而是指震荡源 1 1 无源蜂鸣器 1 早期蜂鸣器都是无源的 2 内部没有震荡电路 xff0c 无源蜂鸣器比有源蜂鸣器更便宜 3 无源蜂鸣器内部没有震荡源
  • CSS3实现loading效果

    前言 晚上躺床上刷视频的时候看到有个前端大佬写了一个loading xff0c 这是效果 xff1a loading 感觉也挺有意思哈 xff0c 要不自己也写一个 xff0c 学习 43 复习 两不误 但是又因为太晚了 xff0c 不想起
  • C#应用程序界面开发基础——窗体控制(2)——MDI窗体

    MDI窗体 单文档界面 xff08 SDI xff09 多文档界面 xff08 MDI xff09 MDI窗体的概念 MDI窗体 xff08 Multiple Document Interface xff0c 多文档界面 xff09 用于同
  • windows 10 + GTX1650 环境下基于TensorFlow的深度学习环境配置

    因论文需要 xff0c 简单的记录一个深度学习环境的配置过程 说明 xff1a 与广为应用的基于Anaconda的深度学习环境配置方法不同的是 xff0c 本文直接基于Python基础环境 43 Pycharm进行环境的配置 xff0c 不
  • TX2硬盘扩展

    TX2硬盘扩展 硬件平台 xff1a NVIDIA TX2 Samsung SSD 860EVO 系统平台 xff1a Ubuntu 18 04 LTS 安装 将硬盘连接至侧边SATA接口 扩展home 1 查看硬盘所有分区 sudo fd
  • Android手机4G网络设置ipv6

    我的卡是联通的 xff0c 所以下面截图也是联通的 xff0c 移动和电信的卡类似 xff1b 1 进入目录 xff1a 设置 移动网络 接入点名称 xff08 APN xff09 xff1b 2 点击默认的连接项 xff0c 进入详情页
  • 简单TCP编程

    1 TCP服务端 span class token macro property span class token directive hash span span class token directive keyword include
  • Redis的基本使用

    Redis简介 什么是Redis Redis是一款开源的内存数据库 xff0c 也称为键值存储 database 缓存 database 和消息队列 database 系统 它提供了丰富的数据结构和高效的操作方式 xff0c 并且支持多种编
  • Ubuntu16.04通过VNC远程桌面并开机自启动

    前置条件 xff0c 远程客户端已经安装VNC Viewer x11vnc安装 在Ubuntu 16 04中安装x11vnc xff0c 可以按照以下步骤操作 xff1a span class token comment 输入以下命令以更新
  • SpringBoot数据库读写分离

    导入maven坐标 span class token tag span class token tag span class token punctuation lt span dependency span span class toke
  • 滑模控制

    滑动模态的定义 人为设定一经过平衡点的相轨迹 xff0c 通过适当设计 xff0c 系统状态点沿着此相轨迹渐近稳定到平衡点 xff0c 或形象地称为滑向平衡点的一种运动 xff0c 滑动模态的 滑动 二字即来源于此 滑模控制的优点 xff1
  • FPGA基础之VGA(一)满屏红色

    一 项目分析 用VGA显示全屏的红色 xff0c VGA xff08 Video Graphics Array xff0c 视频图形阵列 xff09 是一种电脑显示标准 开发板采用至芯科技zx 1学习板 xff0c VGA视频显示接口是25