首先感谢所有开源分享资源的博主或者机构个人,这篇主要参考开拓者FPGA开发指南。通过分析代码,理清思路。

主要分为四个模块,顶层模块,时钟分频模块,VGA显示模块,VGA驱动模块。前三个模块在任何时候都是不变的,只有最后一个模块,显示需要显示的内容。代码设计真的很巧,这里讲驱动模块单独写出来,不仅方便控制,同时仿真也很方便的可以看到结果。具体代码的理解讲在代码中展现,同时后面的字符显示,基于ROM的静态图片显示,都是基于此的。只是有一点,网上现有资源很多不是ISE的,而笔者现在还用的ISE.....;因此在调用IP的时候就很少有教程了。后面再说,这些模块可以在任何板子开发环境下运行编译成bit文件。

实验目标:实现彩条的显示,实现方框移动的显示(从第一行还是移动,一直到最后一行的最后一个,重新回到开始的位置重复),实现部分主要是在display模块显示改变的,这也是这个比较优势的地方。

模块介绍_div_clk

分频模块,生成要用的时钟周期,前面一节里边有时钟周期计算方法,可以调用pll,也可以自己写一个分频都可以。此模块主要提供显示所需要的时钟周期。因为我这里还是用的640*480@60hz,所以还是大概系统时钟的一半。

module div_clk(clk,rst_n,div_clk);
input clk;
inout rst_n;
output reg div_clk;always@(posedge clk or negedge rst_n)
beginif(!rst_n)div_clk <= 1'b0;else div_clk <= ~div_clk;
endendmodule

模块介绍_vga_diver

此模块主要两个功能,每一个功能由两个输出组成。

功能一:输出vga_hs,vga_vs这两个时序信号,用来点亮屏幕,时序的控制由厂家提供的文档为基准。

功能二:输出颜色控制,这个主要是将x,y分别输出到下一个模块,即vga_display模块,可以控制每一行每一个像素,然后给颜色。

module vga_driver(vga_clk,rst_n,pixel_data,vga_hs,vga_vs,vga_rgb,x_pixel,y_pixel);
//---------------------------------
input               vga_clk     ;
input               rst_n       ;
input       [15:0]  pixel_data  ;
//---------------------------------
output              vga_hs      ;
output              vga_vs      ;
output      [15:0]  vga_rgb     ;
output      [ 9:0]  y_pixel     ;//y像素坐标
output      [ 9:0]  x_pixel     ;//x像素坐标
//---------------------------------
parameter Hor_Total_Time        = 10'd800 ;       //行显示帧长
parameter Hor_Sync              = 10'd96  ;       //行同步脉冲
parameter Hor_Back_Porch        = 10'd48  ;       //行显示后沿(同显示前沿,这里由两个时段合成)
parameter Hor_Addr_Time         = 10'd640 ;       //行显示区域
parameter Hor_Front_Porch       = 10'd16  ;       //行显示前沿
//---------------------------------
parameter Ver_Total_Time        = 10'd525 ;       //列显示帧长
parameter Ver_Sync              = 10'd2       ;       //列同步脉冲
parameter Ver_Back_Porch        = 10'd33  ;       //列显示后沿(同显示前沿,这里由两个时段合成)
parameter Ver_Addr_Time         = 10'd480 ;       //列显示区域
parameter Ver_Front_Porch       = 10'd10  ;       //列显示前沿
//---------------------------------
//两个计数器//行计数器
reg [9:0] x_cnt;
always@(posedge vga_clk or negedge rst_n)
beginif(!rst_n)x_cnt <= 10'd1;else if(x_cnt == Hor_Total_Time)x_cnt <= 10'd1;else x_cnt <= x_cnt + 1'b1;
end
//列计数器
reg [9:0] y_cnt;
always@(posedge vga_clk or negedge rst_n)
beginif(!rst_n)y_cnt <= 10'd1;else if(y_cnt == Ver_Total_Time && x_cnt == Hor_Total_Time)y_cnt <= 10'd1;else if(x_cnt == Hor_Total_Time)y_cnt <= y_cnt + 1'b1;
end
//VGA行场同步信号
assign vga_hs = (x_cnt < Hor_Sync) ? 1'b1 : 1'b0;
assign vga_vs = (y_cnt < Ver_Sync) ? 1'b1 : 1'b0;
//VGA输出
reg vga_en;
always@(*)
beginvga_en <= (x_cnt > (Hor_Sync + Hor_Back_Porch) && x_cnt <= (Hor_Sync + Hor_Back_Porch + Hor_Addr_Time) && y_cnt > (Ver_Sync + Ver_Back_Porch) && y_cnt <= (Ver_Sync + Ver_Back_Porch + Ver_Addr_Time));
end
assign vga_rgb = (vga_en) ? pixel_data :   16'd0;
assign x_pixel = (vga_en) ? (x_cnt - (Hor_Sync + Hor_Back_Porch)   )  :       10'd0;
assign y_pixel = (vga_en) ? (y_cnt - (Ver_Sync + Ver_Back_Porch)   )  :       10'd0;endmodule

模块介绍_vga_display

控制每一行,每一列的像素点作为输入,输出位像素数据。display1为方框移动

module vga_display1(vga_clk,rst_n,x_pixel,y_pixel,pixel_data);
//---------------------------------
input                 vga_clk   ;
input                   rst_n   ;
input       [9:0]     x_pixel   ;
input       [9:0]     y_pixel   ;
//---------------------------------
output  reg [15:0]    pixel_data;
//---------------------------------
parameter side                  = 10'd40    ;     //边框
parameter block                 = 10'd40    ;     //方格
//---------------------------------
//---------------------------------
parameter Hor_Total_Time        = 10'd800 ;       //行显示帧长
parameter Hor_Sync              = 10'd96  ;       //行同步脉冲
parameter Hor_Back_Porch        = 10'd48  ;       //行显示后沿(同显示前沿,这里由两个时段合成)
parameter Hor_Addr_Time         = 10'd640 ;       //行显示区域
parameter Hor_Front_Porch       = 10'd16  ;       //行显示前沿
//---------------------------------
parameter Ver_Total_Time        = 10'd525 ;       //列显示帧长
parameter Ver_Sync              = 10'd2       ;       //列同步脉冲
parameter Ver_Back_Porch        = 10'd33  ;       //列显示后沿(同显示前沿,这里由两个时段合成)
parameter Ver_Addr_Time         = 10'd480 ;       //列显示区域
parameter Ver_Front_Porch       = 10'd10  ;       //列显示前沿
//---------------------------------
parameter white = 16'b11111_111111_11111   ;
parameter black = 16'b00000_000000_00000   ;
parameter red   = 16'b11111_000000_00000   ;
parameter green = 16'b00000_111111_00000   ;
parameter bule  = 16'b00000_000000_11111   ;
//---------------------------------
reg [24:0] cnt_1s;      //25_000_000        12_500_000
reg move_en;
always@(posedge vga_clk or negedge rst_n )
beginif(!rst_n)begin cnt_1s <= 25'd1;move_en <= 1'b0;endelse if(cnt_1s == 25'd25_000_000)begincnt_1s <= 25'd1;move_en <= 1'b1;endelse begincnt_1s <= cnt_1s + 1'b1;move_en <= 1'b0;end
end
reg [9:0] block_x;
reg [9:0] block_y;
always@(posedge vga_clk or negedge rst_n)
beginif(!rst_n)beginblock_x <= 10'd40;block_y <= 10'd40;endelse if(move_en)beginif(block_x == 10'd520 && block_y == 10'd360 )begin block_x <= 10'd40;block_y <= 10'd40;endelse if(block_x == 10'd520) beginblock_y <= block_y + 10'd80;block_x <= 10'd40;           endelse block_x <= block_x + 10'd80;end
end
always@(posedge vga_clk or negedge rst_n)
beginif(!rst_n)pixel_data <= black;else if(x_pixel <= ( side - 1'b1 ) || x_pixel >= (560 + side - 1'b1) || y_pixel <= side - 1'b1 || y_pixel >= (400 + side - 1'b1) )pixel_data <= bule;else if(x_pixel >= ( block_x - 1'b1 ) && (block_x + 10'd80) >= x_pixel && y_pixel >= ( block_y - 1'b1 )  && y_pixel <= (block_y + 10'd80) )pixel_data <= black;else pixel_data <= white;
endendmodule

display为彩条显示

module vga_display(vga_clk,rst_n,x_pixel,y_pixel,pixel_data);
//---------------------------------
input                 vga_clk   ;
input                   rst_n   ;
input       [9:0]     x_pixel   ;
input       [9:0]     y_pixel   ;
//---------------------------------
output  reg [15:0]    pixel_data;
//---------------------------------
parameter Hor_Addr_Time         = 10'd640 ;       //行显示区域
parameter Ver_Addr_Time         = 10'd480 ;       //列显示区域
//---------------------------------
parameter white = 16'b11111_111111_11111   ;
parameter black = 16'b00000_000000_00000   ;
parameter red   = 16'b11111_000000_00000   ;
parameter green = 16'b00000_111111_00000   ;
parameter bule  = 16'b00000_000000_11111   ;
//---------------------------------
//判断行和场的像素位置输出控制颜色always@(posedge vga_clk or negedge rst_n)
beginif(!rst_n)pixel_data <= 16'd0;else if(x_pixel <= (Hor_Addr_Time / 5 - 1'b1 ) * 1 ) pixel_data <= white;elseif(x_pixel <= (Hor_Addr_Time / 5 - 1'b1 ) * 2 ) pixel_data <= black;else if(x_pixel <= (Hor_Addr_Time / 5 - 1'b1 ) * 3 )pixel_data <= red;else if(x_pixel <= (Hor_Addr_Time / 5 - 1'b1 ) * 4 )pixel_data <= green;elsepixel_data <= bule;
endendmodule

模块介绍_vga_top

module top_vga(clk,rst_n,vga_hs,vga_vs,vga_rgb);
input clk ;
input rst_n;
output vga_hs;
output vga_vs;
output [15:0] vga_rgb;wire [9:0] w_x_pixel;
wire [9:0] w_y_pixel;
wire w_clk;
wire [15:0] pixel_data;div_clk A(.clk                       (clk        ),.rst_n                        (rst_n      ),.div_clk                  (w_clk      ));vga_driver B(.vga_clk                    (w_clk      ),.rst_n                        (rst_n      ),.pixel_data                   (pixel_data ),.vga_hs                       (vga_hs     ),.vga_vs                       (vga_vs     ),.vga_rgb                  (vga_rgb    ),.x_pixel                  (w_x_pixel  ),.y_pixel                  (w_y_pixel  ));vga_display1 C(.vga_clk                  (w_clk      ),.rst_n                        (rst_n      ),.x_pixel                  (w_x_pixel  ),.y_pixel                  (w_y_pixel  ),.pixel_data                   (pixel_data ));
endmodule

FPGA实现VGA显示(二)——————color_bar显示及方框移动(参考开拓者FPGA开发指南)相关推荐

  1. input自适应_【正点原子FPGA连载】第十一章基于OV5640的自适应二值化实验-领航者ZYNQ之HLS 开发指南...

    1)摘自[正点原子]领航者ZYNQ之HLS 开发指南 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手 ...

  2. FPGA之VGA/LCD数字时钟显示

    文章目录 前言 一.LCD显示控制 1.LCD显示一个字符 2.LCD显示多个字符 二.数字时钟输出 1.数字时钟 2.十进制数据拆分BCD码 三.按键检测及LCD驱动 1.按键检测 2.LCD驱动 ...

  3. 实验一 简单io应用—流水灯控制示例程序_【正点原子FPGA连载】第十章呼吸灯实验--领航者ZYNQ之linux开发指南...

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  4. 微信二维码支付支付宝二维码支付(主扫模式)开发指南

    微信二维码支付 熟悉微信支付全家桶的童鞋应该都清楚,微信支付是没有提供PC网关支付的,那么传统的网站需要怎么接入微信支付产品呢? 我们可以选择微信支付中的Native支付产品,官方介绍: Native ...

  5. FPGA实现VGA显示(三)——————单个字符显示

    这里笔者首先记录一个问题,给自己提个醒,所有的模块都有一点点的问题,在行数列数都可能有一行像素的误差,有可能是在驱动和显示模块的问题,等后面修改,这里第一次做,只要不影响显示,实现功能. 字符显示只修 ...

  6. 基于FPGA的VGA协议实现

    基于FPGA的VGA协议实现 一.VGA简述 1.VCG接口 2.原理 3.显示器扫描 4.VGA时序分析 5.VGA时钟计算 6.不同分辨率的VGA参数 二.显示彩条 1.色彩原理 2.彩条输出 三 ...

  7. 【接口协议】FPGA 驱动 VGA 显示实验(二)实验设计部分

    目录 实验任务 实验环境 实验设计 程序设计 VGA 时序模块 模块框图 仿真波形 顶层模块 约束文件 实验任务 利用FPGA驱动VGA实现彩条显示,分辨率为800 × 600@60Hz,分别显示三种 ...

  8. FPGA实现VGA显示(六)——————多字符显示及基于fpga的“打字机”实现

    前面笔者总结了如何显示单字符,设立通过一个简单的任务来总结如何实现vga多字符显示. 实验要求 基础: 由PC通过UART发送数据在VGA显示.数据可以为字母,数字,汉字(任选10个字),VGA分为左 ...

  9. 基于FPGA的VGA控制输出显示(使用GM7123高清视频编码芯片)

    目录 一.VGA原理 1.VGA接口简介 2.VGA显示原理 二.VGA模块 三.VGA接口设计 1.设计要求 2.设计实现 3.实现结果 四.总结 一.VGA原理 1.VGA接口简介 VGA的全称是 ...

最新文章

  1. [case19]聊聊eureka的TaskDispatcher
  2. QMainWindow多线程demo
  3. python的用途-Python运算符的作用与意义
  4. Unity3D学习笔记(二) 一些常用的空间函数
  5. 085_html5服务器发送事件
  6. IOS关于键盘的弹出和收起
  7. LeetCode 1665. 完成所有任务的最少初始能量(贪心)
  8. ubuntu系列-很好用的截图工具shutter
  9. (转)UIWebView的基本用法,适合新手
  10. 通达信 移动平均算法_涨停板这样选!首次公开通达信超级选股法使用流程(建议收藏)...
  11. Kafka面试题(附答案)
  12. 复数基础——二次公式的复根,复平面上标复数值点_7
  13. GPU驱动、CUDA和cuDNN之间的版本匹配与下载
  14. 「行业/市场分析」简说
  15. Minor GC和Full GC有什么区别?
  16. 订单23系统服务器,死亡搁浅图文攻略 主线流程+订单系统+运送流程+建筑搭建 第3节芙拉吉尔 订单No23.系统服务器-游侠网...
  17. iOS开发 开发者账户介绍
  18. android 删除号码恢复,安卓手机删了联系人怎么恢复?这些方法很容易
  19. c#编程实现秒是几天几小时几分钟几秒
  20. 半导体放电管TSS详解

热门文章

  1. 通过Android上的意图启动Google地图路线
  2. 密钥库证书的SHA-1指纹
  3. 使用getApplication()作为上下文的对话框抛出“无法添加窗口-令牌null不适用于应用程序”
  4. 电脑usb安装win11失败,如何给电脑安装win11系统
  5. Shiro 支持三种方式的授权
  6. python wechatpay微信支付回调_python服务器 实现app微信支付:支付异步通知
  7. clientsideevents能定义几个click事件_分享8个非常实用的Vue自定义指令
  8. 天梯—重要的话说三遍(C语言)
  9. PCL之点云分割算法概述
  10. 计算机无法备份,电脑无法备份怎么办