VGA显示8色彩条的实现

使用软件:Quartus II 13.1
使用语言 :Verilog HDL
板载芯片:EP4CE6E22C8

VGA显示8色彩条的实现

  • VGA显示8色彩条的实现
    • 写在前面
    • 准备工作
      • VGA接口
      • VGA 时序
      • 开始Coding
    • 结果显示
    • 写在最后

写在前面

由于之前在学校学习的FPGA基础是基于VHDL(Very-High-Speed Integrated Circuit Hardware Description Language)的,但大都已经忘记不太想从头再来,所以再次学习并接触FPGA,想用另一种更接近C语言的HDL(硬件描述语言)–也就是Verilog HDL。

VHDL有entity(实体),architecture(结构体)configuration(配置)package(包),和library(库)

  • entity内部主要包括端口的声明,建立一个黑盒子的模型。

  • architecture内部主要包括行为级的内部逻辑设计,进行各个进程或状态机的配置。

  • library 用于引用所需要的库文件。常使用库文件library ieee;

  • package用于引用需要的包文件。例如,如果要使用std_logic(标准逻辑)类型,应对类型所在包进行声明use ieee.std_logic_1164.all;,否则会报错;如果行为级建模是需要运算符重载,则要声明use ieee.std_logic_unsigned.all,如果需要类型转换从整型转化为逻辑矢量类型的函数CONV_STD_LOGIC_VECTOR(begin,end),则需要引用use ieee.std_logic_arith.all

当然与VHDL 类似的 ,Verilog HDL 也有着类似的结构,比如module(模块)procedural(过程块) `include(头文件)对应 于 VHDL的port、process,package。所以如果有C语言和VHDL语言的基础,VerilogHDL是不成问题的。

准备工作

书归正传,了解了使用语言的语法有利于代码的编写和代码的阅读。

我们应该再了解一下VGA相关的知识。

VGA接口

VGA接口是一种D型接口,采用非对称分布连接方式,共有15针.对用户来说,其引出线常用的有5个信号:红色 R,绿色 G,蓝色B,行同步信号HS,场同步信号 VS.HS和 VS的作用是处理输入模拟信号,并联合起来控制VGA的显示时序,分别对应PIN1、PIN2、PIN3、PIN13、PIN14。

是不是有点抽象?这边上图最为直接明了

当然,美术生和 Photoshop使用者应该对色彩不会太陌生,Red、Green、Blue正是三原色,经过不同的混合碰撞,产生色彩缤纷的世界,进而显示再屏幕上,但是硬件内部实现输出的是数字信号,无法被显示在VGA显示屏上,因而需要进行数模转换DAC(Digital Analog Convertor),常用的数模转换芯片是ADV7125,是3个8位视频信号的DAC信号的转换。

但是,芯片开销会比较大,所以一般VGA视频图像信号都使用权电阻网络(如下图所示)来完成

当 R s = 8 R {R_s = 8R } Rs​=8R, V o = − V r e f 2 8 D n {V_o = -\frac{V_{ref}}{2^8}D_n} Vo​=−28Vref​​Dn​, D n 是 高 位 ( M S B ) 或 低 位 ( L S B ) 电 阻 权 重 {D_n}是高位(MSB)或低位(LSB)电阻权重 Dn​是高位(MSB)或低位(LSB)电阻权重

VGA 时序

了解了VGA接口的相关知识,进一步了解一下VGA时序的知识,因为书写代码一般是以时序为准。以一般工业标准来说,640*480@60是显示比较稳定且易于掌握的,因而下文皆是根据640*480@60讲述的。
@Attention:640*480@60,表示行列总共有307200个像素点,同时显示一帧图像的速率是60MHz

由上图可知行扫描周期以像素为单位,分别由行同步、后沿、图像有效区域、前沿直到下一帧图像开始,当完成一行的扫描后,场扫描周期开始,同时经过场同步、上沿,图像有效区域、下沿构成。

开始Coding

根据前面的讲解应该对VGA显示有所了解,因而开始Coding。

/*
* @author: LangZi
* @data:2021.12.26
* @modulename:VGA
* @header:include"vga_param.v"
*/
`include"vga_param.v"
module VGA(
clock   ,
switch  ,
out_RGB ,
hsync   ,
vsync
);
input  clock        ;    //系统时钟 50MHz
input  [1:0] switch ;   //用于切换模式,显示棋盘格output [2:0] out_RGB;   //VGA输出颜色
output  hsync       ;   //VGA扫描信号
output  vsync       ;   //VGA场扫描信号reg [9:0]    hcount   ;   //VGA行计数器
reg [9:0]    vcount ;  //VGA场计数器
reg [2:0]    data       ;
reg [2:0]    h_dat      ;
reg [2:0]    v_dat      ;reg   flag             ;   //标志位
wire  hcount_ov         ;   //溢出信号
wire  vcount_ov         ;
wire  dat_act           ;
wire  hsync             ;
wire  vsync             ;
reg  vga_clk            ;//分频操作活得25MHz的时钟
always @(posedge clock)
begin
vga_clk = ~vga_clk;
end//************************VGA驱动*******************************
//行计数
always @(posedge vga_clk)
begin
if (hcount_ov)// 若溢出则清零
hcount <= 10'd0;
else
hcount <= hcount + 10'd1;
end
assign hcount_ov = (hcount == hpixel_end);
//场计数
always @(posedge vga_clk)
begin
if (hcount_ov)
begin
if (vcount_ov)
vcount <= 10'd0;
else
vcount <= vcount + 10'd1;
end
end
assign  vcount_ov = (vcount == vline_end);
//判断是否处于有效数据区域
assign dat_act =    ((hcount >= hdat_begin) && (hcount < hdat_end))
&& ((vcount >= vdat_begin) && (vcount < vdat_end));
assign hsync = (hcount > hsync_end);
assign vsync = (vcount > vsync_end);
assign disp_RGB = (dat_act) ?  data : 3'h00;       //************************VGA 显示处理操作*******************************
always @(posedge vga_clk)
begin
case(switch[1:0])
2'd0: data <= h_dat;      //行数据
2'd1: data <= v_dat;      //列数据
2'd2: data <= (v_dat ^ h_dat); //棋盘格
2'd3: data <= (v_dat ~^ h_dat); //转置棋盘
endcase
endalways @(posedge vga_clk)  //行彩条计数时序
begin
if(hcount < 223)
v_dat <= 3'h7;
else if(hcount < 303)
v_dat <= 3'h6;
else if(hcount < 383)
v_dat <= 3'h5;
else if(hcount < 463)
v_dat <= 3'h4;
else if(hcount < 543)
v_dat <= 3'h3;
else if(hcount < 623)
v_dat <= 3'h2;
else if(hcount < 703)
v_dat <= 3'h1;
else
v_dat <= 3'h0;
endalways @(posedge vga_clk)  //列彩条计数时序
begin
if(vcount < 94)
h_dat <= 3'h7;
else if(vcount < 154)
h_dat <= 3'h6;
else if(vcount < 214)
h_dat <= 3'h5;
else if(vcount < 274)
h_dat <= 3'h4;
else if(vcount < 334)
h_dat <= 3'h3;
else if(vcount < 394)
h_dat <= 3'h2;
else if(vcount < 454)
h_dat <= 3'h1;
else
h_dat <= 3'h0;
endendmodule

时序参数的头文件(vga_param.v)

`ifndef __VGA_PARAM_
`define __VGA_PARAM_640_480_60MHz
`define hsync_end    10'd95
`define hdat_begin   10'd143
`define hdat_end     10'd783
`define hpixel_end   10'd799
`define vsync_end   10'd1
`define vdat_begin   10'd34
`define vdat_end     10'd514
`define vline_end       10'd524
`endif

引入头文件,可以提升代码的可移植性,同时可以将文件的代码风格显示的更简洁,易懂

结果显示




写在最后

FPGA的首篇作文,尚有不足,愿共勉。

FPGA|VGA的8色彩条的实现相关推荐

  1. FPGA—VGA显示

    FPGA-VGA显示 一.VGA介绍 颜色显示 VGA接口 引脚分配 二.VGA显示彩色条纹 分辨率控制部分 颜色显示 顶层模块 三.字符显示 四.图片显示 一.VGA介绍 VGA的全称是Video ...

  2. FPGA—VGA 显示器显示彩条(附代码)

    目录 1. 理论 2. 实操 2.1 顶层设计 2.1.1 模块框图 2.1.2 代码编写 2.1.3 仿真验证 2.2 时钟生成模块 2.3 VGA时序控制模块 2.3.1 模块框图 2.3.2 波 ...

  3. FPGA: VGA显示

    目录 一.VGA通信协议 1.外部接口 2.色彩原理 3.扫描方式 4.行场信号 二.实验任务 1.显示彩色条纹 2.字符显示 3.图片显示 三.总结 参考链接 一.VGA通信协议 VGA(Video ...

  4. FPGA——VGA协议实现特定文字与图像显示

    茵蒂克丝 简介 一.屏幕上显示彩色条纹 1.新建项目 2.利用Verilog HDL语言设计模块 3.源代码 4.实验结果 二.显示自定义的字符 1.创建项目 2.源代码 3.实验结果 三.总结 参考 ...

  5. FPGA VGA图片显示(vga_top)

    一.VGA简介 关于VGA的一些基础知识可以参考这篇文章:VGA介绍. 二.程序设计 FMC_apt模块存储着图像数据 vga_top模块发送rom_rd_en信号请求图像数据vga_data,并且例 ...

  6. 学习日记——FPGA实验平台板级电路详解

    一.板级电路整体架构 我接下来一段时间学习的就是"勇敢的芯"FPGA 实验平台,它是特权同学和至芯科技携手打造的一款基于Altera Cyclone IV FPGA 器件的入门级 ...

  7. FPGA虚拟三阶魔方(HDMI显示版)

    目录 ​编辑 一.设计概述 二.设计模块 1.三阶魔方建模 (1)魔方基本操作: (2)魔方建模: 2.魔方转动控制: (1)控制概述: (2)按键消抖: (3)魔方控制: 3.HDMI显示模块: ( ...

  8. VGA显示8色彩条RGB888(一)

    目录 1.color bar (彩条)颜色编码 2.VGA驱动原理 3.设计思路 4.模块代码 4.1顶层代码 4.2分频时钟模块 4.3 vga_driver模块 五.仿真结果图​ 六.makefi ...

  9. fpga/嵌入式硬件初级工程师必备链接(不定时更新)

    因为刚开始做FPGA这一块,工作不久,把遇到的好一些的资料整理下来,不定时更新,方便自己查看的同时,希望能给大家带来帮助,如果觉得有用的话请给个赞,谢谢. 1.工具使用类: 01.示波器使用方法: h ...

最新文章

  1. 直接排序python实现
  2. 【视觉项目】【day2】8.21号实验记录(手机固定高度15cm拍摄+直方图均衡化+模板匹配,模板12个,测试28个,效果十分差)
  3. android 活动之间传递参数,Android:使用适配器在活动之间传递参数
  4. python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property...
  5. 第 25 章 基于小波变换的数字水印技术
  6. 如何通过python下载视频文件
  7. java cursor_cursor的基本使用方法
  8. 华为 15 到 18 级的研发族社招工作岗位内推
  9. PC端微信的文件夹都是些什么
  10. ECCV2022论文列表(中英对照)
  11. 解决Visio中对象不能通过键盘方向键微调位置
  12. php邮箱失效链接,wordpress邮件功能设置及密码重置链接失效问题解决
  13. 一顿操作猛如虎,3000 行代码重构成 15 !
  14. 7-7 sdust-Java-字符串集合求并集 (10分)
  15. JS_将汉字转换成汉语拼音JS版
  16. 【项目实战】Python基于BP神经网络算法实现家用热水器用户行为分析与事件识别
  17. 互联网日报 | 蔚来发布官方二手车业务;去哪儿2020年实现全年盈利;港交所正式换帅...
  18. 爬虫速成(一):前言
  19. pycharm安装Translation翻译插件
  20. cannot find a java se sdk installed at path_SDK管理器找不到Java

热门文章

  1. Python爬虫-selenium爬取网易云歌单
  2. Blender图解教程:用Krita为模型贴花
  3. SpringBoot在controller返回一个HTML页面
  4. python基础 列表
  5. Java实现第九届蓝桥杯哪天返回
  6. 十二星座分手时会怎么说?
  7. 使用jQuery调色器farbtastic--触发change事件
  8. java基础知识-----转
  9. Hadoop HDFS分布式文件系统原理及应用介绍
  10. 还在用手机搜题?懒人必备网页搜题插件来了