用ZYNQ做VGA显示确实有点大材小用,一般都是直接用VDMA、VTC等IP来驱动HDMI接口,输出图像视频。这里的VGA驱动仅用作练习,实际应用的意义不大。而且我在PL里实例化了一块双端口BRAM用作显存,并且用AXI EMC的IP把这块显存当作外部存储器访问,然后这个IP就报输出引脚没有连到IOB上的Warning。越想越觉得这个做法不地道,求大家轻喷ORZ……

VGA驱动电路


  VGA驱动芯片用的是ADV7123,实际上是三路10bit的DAC。

VGA驱动

  在写驱动之前需要确定具体的时序,可以通过这个网站查到,还可以参考知乎的这篇文章。
  在PL的驱动中可以把一些具体的时序参数都提前准备好,然后把这个驱动封装成IP时,可以直接通过下拉菜单选择,就像下面这样。

  实际的设计需求是,图像大小和实际的显示分辨率大小不一致,实际图像的分辨率小于等于屏幕的分辨率,而且屏幕的分辨率是实际图像分辨率的整数倍。一个简单的拉伸图像的方法就是对像素进行复制。比如我想将图像的长和宽都拉伸成原来的两倍,那么就只需要将单个像素在重复显示4次(行列各两次)即可。
  具体实现采用行列两个方向的状态机进行控制,以下是行方向上的状态机:

  以下是列方向上的状态机:

  在代码中还实例化了一块BRAM,用作显存,因此只有在显存初始化完成后,状态机才能真正进入工作。
  列方向的状态机就是单纯地按照时序进行切换。
  行方向上的状态机,还控制了具体的工作模式。

  • 正常模式下,就是按比例缩放图像,并显示图像。每次HREAD状态从BRAM中读一次数据,一次是32bit,每个像素8bit,所以一次读数据至少能够用于显示4个像素点。再加上有时候图像要放大,一次读的数据可能需要被重复显示。所以后面一个HWTSCL状态等待的时钟周期数可能会更多,这个取决于实际图像和显示分辨率的比例。
  • 测试模式就是显示不同灰度级的条纹。

  驱动中的模式控制位也是有处理器通过存储器读写特定的bit来实现的。我的做法是,在存储图像数据之后存放模式控制位。比如一幅图像是640×512个字节,在BRAM中的寻址空间就是0~640×512-1,而模式控制位就是地址为640×512处的第0位。处理器只要修改这一位就可以改变它的工作模式。

软件部分

  软件部分比较简单,就是往显存对应的那块地址写事先准备好的图像数据,然后开启GPIO中断。用户在按下按键后可以切换工作模式。

int main(){int* p;p = (int*)0x60000000;for(int i = 0; i<C_MAX_DW_ADDR; i++) {Xil_Out32((UINTPTR)(p+i), data[i]);}GpioInit(&Intc, &Gpio, GPIO_DEVICE_ID, GPIO_INTERRUPT_ID);while(1);
}

实际效果

  • 正常工作模式:

  • 测试模式

基于ZYNQ的VGA驱动相关推荐

  1. 基于FPGA的VGA/LCD显示控制器设计(中)

    今天给大侠带来基于FPGA的VGA/LCD显示控制器设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,VGA 显示原理以及VGA/LCD 显示控制器的基本框架,话不多说,上货. 之前也有图像处理以及V ...

  2. 基于GD32VF103 的vga显示器 和ps2键盘 驱动

    基于GD32VF103的vga和ps2键盘驱动 前言 gd32vf103 是国内一款很不错的riscv架构微处理器,但是网上gd32vf103的应用还比较少,这里我决定分享一下利用这个微处理器制作的v ...

  3. 【Zedboard】FPGA边缘提取 图像处理 基于ZYNQ完成 灰度图像 在VGA显示与 边缘提取 二值化 Verilog代码实现

    [Zedboard]FPGA边缘提取 图像处理 基于ZYNQ完成 灰度图像 在VGA显示与 边缘提取 二值化 Verilog代码实现 在项目开始到目前为止已经完成了在Zedboard的PL部分即FPG ...

  4. 基于ZYNQ的petalinux 2018.3 DMA驱动的移植和内核编译

    vivado硬件设计 DMA设置 第一步,创建项目 petalinux-create --type project --template zynq --name petalinux_Dma john@ ...

  5. 基于ZYNQ的开源CANopen协议栈CANFestival移植

    1 概述 CanFestival是一个免费而且开源的CANopen协议栈,较为适合于对CANopen协议栈功能完备性和工作性能要求不高的应用场合.对于功能和性能要求较高的应用,也有很多第三方的商用CA ...

  6. 基于ZYNQ+AD9361的软件无线电平台设计与实现 (2)

    基于ZYNQ+AD9361的软件无线电平台设计与实现(1) 1 评估板简介 信迈科技 XM-ZYNQ7045-EVM 是一款基Xilinx Zynq-7000 系列 XC7Z045/XC7Z100 高 ...

  7. 基于ZYNQ 7000的1553B总线控制器测试系统的设计与实现

    为了方便对1553B设备进行测试,本文介绍了一种基于ZYNQ 7000 平台的1553B总线控制器测试系统的设计与实现方法.该系统首先在 PC机上通过人机交互界面配置数据,支持灵活对数据故障注入,然后 ...

  8. 基于V4L2的视频驱动开发

    基于V4L2的视频驱动开发 编写基于V4L2视频驱动主要涉及到以下几个知识点: ●摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等. ●Camera解码 ...

  9. 基于zynq的千兆网udp项目_基于Zynq平台的EtherCAT主站方案实现

    作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在 ...

  10. 基于ZYNQ 的多轴运动控制平台关键技术研发-总体架构设计(一)

    基于多轴运动控制平台的实时通信和同步控制需求,采用 Xilinx Zynq 7020 SoC 作为核心处理器,设计了双核 SoC 多轴运动控制平台的总体架构.结合多轴运动控 制系统与接口特征,完成了 ...

最新文章

  1. 进程间通信--命名管道
  2. 卸载破解的Navicat!操作所有的数据库靠它就够了!
  3. 大到31x31的超大卷积核,涨点又高效,一作解读RepLKNet
  4. 关于Session_End()运行机制的一些细节!
  5. GPU 原理解密(一)画个三角形居然这么难
  6. SQL语句中timestamp进行排序BUG
  7. 万维网服务器协议提供web,万维网的HTTP和FTP协议.doc
  8. 微软的Hyper-V专业级虚拟化工具
  9. Java职业规划(职业晋升路线、技术转移路线、工作经验与技术栈的匹配)——学习笔记
  10. 语音信号处理(二):矩形窗和汉明窗时域波形和频域波形
  11. IPD在华为成功的6个原因
  12. restful风格个人理解
  13. 计算机描绘的基因结构图,傻瓜式图文教程:Genecards基因信息检索与分析、基因结构图绘制.........
  14. 声音均衡器怎么调好听_酷狗均衡器怎么调好听 - 卡饭网
  15. 运用遗传算法求解函数极值(fortran)
  16. 学计算机听课不重要,评课常用语50条,再也不怕评课了!
  17. 站在智慧医院的制高点 阜外华中心血管病医院探索数字化融合实践
  18. VC中的所有WM消息
  19. Windows内存清理篇——小结
  20. Audio中underrun与overrun问题解决(十八)

热门文章

  1. nSMS-企业级短信中间件介绍
  2. 泛微OA 任意文件上传漏洞
  3. C#验证是不是合法的18位身份证号码
  4. laravel框架基础知识
  5. 二重积分的复化Simpson方法
  6. 共享单车智能锁方案的优劣势
  7. 1 c语言程序设计学生选修课管理,c语言课程设计报告-学生选修课信息管理程序.doc...
  8. python 存根_如何用Python编写类方法的存根
  9. 岌岌可危 中立之争决定云计算未来
  10. CSS<< 更改鼠标样式为自定义图片