开发板环境:vivado2017.4

开发板:Zedboard 芯片型号:xc7z020clg484-1

VGA显示硬件

新建工程vivado工程(如果不会可以参考前面的hello_world这章)

新建Block工作区

调用zynq核

双击ZYNQ核,选择Presets-->Apply Configuration导入tcl配置文件

选择vdma_vga.tcl并点击OK,导入配置文件

配置完成后如下图所示

需调用的所有IP核

VDMA设置

设置VGA时钟和VTC,分辨率设置为1920*1080,频率为148.5M

设置时钟

设置V_TC分辨率

设置Video out

顶层文件

//Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.
//--------------------------------------------------------------------------------
//Tool Version: Vivado v.2017.4 (win64) Build 2086221 Fri Dec 15 20:55:39 MST 2017
//Date        : Sun Sep 18 22:55:19 2022
//Host        : PS2022UUIQUORW running 64-bit major release  (build 9200)
//Command     : generate_target design_1_wrapper.bd
//Design      : design_1_wrapper
//Purpose     : IP block netlist
//--------------------------------------------------------------------------------
`timescale 1 ps / 1 psmodule design_1_wrapper(DDR_addr,DDR_ba,DDR_cas_n,DDR_ck_n,DDR_ck_p,DDR_cke,DDR_cs_n,DDR_dm,DDR_dq,DDR_dqs_n,DDR_dqs_p,DDR_odt,DDR_ras_n,DDR_reset_n,DDR_we_n,FIXED_IO_ddr_vrn,FIXED_IO_ddr_vrp,FIXED_IO_mio,FIXED_IO_ps_clk,FIXED_IO_ps_porb,FIXED_IO_ps_srstb,vga_r,vga_g,vga_b,vga_hs,vga_vs);inout [14:0]DDR_addr;inout [2:0]DDR_ba;inout DDR_cas_n;inout DDR_ck_n;inout DDR_ck_p;inout DDR_cke;inout DDR_cs_n;inout [3:0]DDR_dm;inout [31:0]DDR_dq;inout [3:0]DDR_dqs_n;inout [3:0]DDR_dqs_p;inout DDR_odt;inout DDR_ras_n;inout DDR_reset_n;inout DDR_we_n;inout FIXED_IO_ddr_vrn;inout FIXED_IO_ddr_vrp;inout [53:0]FIXED_IO_mio;inout FIXED_IO_ps_clk;inout FIXED_IO_ps_porb;inout FIXED_IO_ps_srstb;output          vga_hs;output            vga_vs;output    [3:0]   vga_r;output    [3:0]   vga_g;output    [3:0]   vga_b;wire [14:0]DDR_addr;wire [2:0]DDR_ba;wire DDR_cas_n;wire DDR_ck_n;wire DDR_ck_p;wire DDR_cke;wire DDR_cs_n;wire [3:0]DDR_dm;wire [31:0]DDR_dq;wire [3:0]DDR_dqs_n;wire [3:0]DDR_dqs_p;wire DDR_odt;wire DDR_ras_n;wire DDR_reset_n;wire DDR_we_n;wire FIXED_IO_ddr_vrn;wire FIXED_IO_ddr_vrp;wire [53:0]FIXED_IO_mio;wire FIXED_IO_ps_clk;wire FIXED_IO_ps_porb;wire FIXED_IO_ps_srstb;wire vid_active_video;wire vid_clk;wire [23:0]vid_data;wire vid_hsync;wire vid_vsync;assign vga_hs =     ~vid_hsync;assign vga_vs =     ~vid_vsync;assign vga_r    =    (vid_active_video)? vid_data[23:20]: 4'd0;assign vga_g  =    (vid_active_video)? vid_data[15:12]: 4'd0;assign vga_b  =    (vid_active_video)? vid_data[7:4]  : 4'd0;design_1 design_1_i(.DDR_addr(DDR_addr),.DDR_ba(DDR_ba),.DDR_cas_n(DDR_cas_n),.DDR_ck_n(DDR_ck_n),.DDR_ck_p(DDR_ck_p),.DDR_cke(DDR_cke),.DDR_cs_n(DDR_cs_n),.DDR_dm(DDR_dm),.DDR_dq(DDR_dq),.DDR_dqs_n(DDR_dqs_n),.DDR_dqs_p(DDR_dqs_p),.DDR_odt(DDR_odt),.DDR_ras_n(DDR_ras_n),.DDR_reset_n(DDR_reset_n),.DDR_we_n(DDR_we_n),.FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),.FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),.FIXED_IO_mio(FIXED_IO_mio),.FIXED_IO_ps_clk(FIXED_IO_ps_clk),.FIXED_IO_ps_porb(FIXED_IO_ps_porb),.FIXED_IO_ps_srstb(FIXED_IO_ps_srstb),.vid_active_video(vid_active_video),.vid_clk(vid_clk),.vid_data(vid_data),.vid_hsync(vid_hsync),.vid_vsync(vid_vsync));
endmodule

设置管脚约束

set_property PACKAGE_PIN V20 [get_ports {vga_r[0]}]
set_property PACKAGE_PIN U20 [get_ports {vga_r[1]}]
set_property PACKAGE_PIN V19 [get_ports {vga_r[2]}]
set_property PACKAGE_PIN V18 [get_ports {vga_r[3]}]
set_property PACKAGE_PIN AB22 [get_ports {vga_g[0]}]
set_property PACKAGE_PIN AA22 [get_ports {vga_g[1]}]
set_property PACKAGE_PIN AB21 [get_ports {vga_g[2]}]
set_property PACKAGE_PIN AA21 [get_ports {vga_g[3]}]
set_property PACKAGE_PIN Y21 [get_ports {vga_b[0]}]
set_property PACKAGE_PIN Y20 [get_ports {vga_b[1]}]
set_property PACKAGE_PIN AB20 [get_ports {vga_b[2]}]
set_property PACKAGE_PIN AB19 [get_ports {vga_b[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {vga_r[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_r[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_r[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_r[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_g[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_g[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_g[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_g[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_b[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_b[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_b[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_b[0]}]set_property PACKAGE_PIN AA19 [get_ports vga_hs]
set_property PACKAGE_PIN Y19 [get_ports vga_vs]
set_property IOSTANDARD LVCMOS33 [get_ports vga_hs]
set_property IOSTANDARD LVCMOS33 [get_ports vga_vs]

因v_tc产生的时序和vga时序有所不同,所以在顶层需要对hs和vs进行处理,并且输出数据需要使用vid_active_video信号进行使能

生成bit文件

导出硬件配置

打开SDK

新建fsbl

新建完成的fsbl

新建vdma_vga工程,选择刚刚新建的fsbl_bsp

现在hello_world 模板,点击Finish

新建的vdma_vga工程

在src下重新加入1080p.c图片数据文件和新的hello_world.c文件,hello_world文件为vdma的配置

hello_world文件代码,这里代码参考虚无缥缈vs威武的博客

/** Copyright (c) 2009-2012 Xilinx, Inc.  All rights reserved.** Xilinx, Inc.* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A* COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS* ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR* STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION* IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE* FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.* XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO* THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO* ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE* FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY* AND FITNESS FOR A PARTICULAR PURPOSE.**//** helloworld.c: simple test application** This application configures UART 16550 to baud rate 9600.* PS7 UART (Zynq) is not initialized by this application, since* bootrom/bsp configures it to baud rate 115200** ------------------------------------------------* | UART TYPE   BAUD RATE                        |* ------------------------------------------------*   uartns550   9600*   uartlite    Configurable only in HW design*   ps7_uart    115200 (configured by bootrom/bsp)*/#include <stdio.h>
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"#define DDR_BASEADDR        0x00000000#define VDMA_BASEADDR       XPAR_AXI_VDMA_0_BASEADDR
#define H_STRIDE            1920
#define H_ACTIVE            1920
#define V_ACTIVE            1080#define VIDEO_LENGTH  (H_STRIDE*V_ACTIVE)
#define VIDEO_BASEADDR0 DDR_BASEADDR + 0x2000000
#define VIDEO_BASEADDR1 DDR_BASEADDR + 0x3000000
#define VIDEO_BASEADDR2 DDR_BASEADDR + 0x4000000//函数声明
void Xil_DCacheFlush(void);extern const unsigned char gImage_beijing[8294400];void show_img(u32 x, u32 y, u32 disp_base_addr, const unsigned char * addr, u32 size_x, u32 size_y)
{//计算图片 左上角坐标u32 i=0;u32 j=0;u32 r,g,b;u32 start_addr=disp_base_addr;start_addr = disp_base_addr + 4*x + y*4*H_STRIDE;for(j=0;j<size_y;j++){for(i=0;i<size_x;i++){b = *(addr+(i+j*size_x)*4+1);g = *(addr+(i+j*size_x)*4+2);r = *(addr+(i+j*size_x)*4+3);Xil_Out32((start_addr+(i+j*H_STRIDE)*4),((r<<24)|(g<<16)|(b<<8)|0x0));}}Xil_DCacheFlush();
}int main()
{//各种显示 相关的参数Xil_Out32((VDMA_BASEADDR + 0x000), 0x00000003);       // enable circular modeXil_Out32((VDMA_BASEADDR + 0x05c), VIDEO_BASEADDR0);    // start addressXil_Out32((VDMA_BASEADDR + 0x060), VIDEO_BASEADDR0);   // start addressXil_Out32((VDMA_BASEADDR + 0x064), VIDEO_BASEADDR0);   // start addressXil_Out32((VDMA_BASEADDR + 0x058), (H_STRIDE*4));      // h offset (1920 * 4) bytesXil_Out32((VDMA_BASEADDR + 0x054), (H_ACTIVE*4));      // h size (1920 * 4) bytesXil_Out32((VDMA_BASEADDR + 0x050), V_ACTIVE);            // v size (1080)while(1){show_img(0,0,VIDEO_BASEADDR0,&gImage_beijing[0],1920,1080);}}

生成BOOT.bin文件

生成的BOOT.bin文件,将生成的BOOT.bin文件拷贝到SD卡里运行

开发板插上SD卡,上电后连接VGA接口

感觉颜色有点异常,但大致是显示了图片数据,需要对vga的数据打拍才能使颜色正常,先写到这里有时间再改下顶层时序

ZedBoard教程PS篇(6):搭建VDMA显示通路,通过VGA输出显示图片相关推荐

  1. ZedBoard教程PL篇(2):按键检测

    开发板环境:vivado2017.4 开发板:Zedboard 芯片型号:xc7z020clg484-1 本章主要使用用verilog编写一个按键检测程序,按一次按键LED亮一次,依次点亮八个LED灯 ...

  2. 怎么把python结果全部显示-python – 如何展开输出显示以查看更多列?

    更新:Pandas 0.23.4起 这不是必需的,如果设置pd.options.display.width = 0,pandas会自动检测终端窗口的大小.(对于旧版本,请参阅底部.) pandas.s ...

  3. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十七:TFT模块 - 显示

    实验二十七:TFT模块 - 显示 所谓TFT(Thin Film Transistor)就是众多LCD当中,其中一种支持颜色的LCD,相较古老的点阵LCD(12864笑),它可谓高级了.黑金的TFT ...

  4. Mac 配置教程-开发篇

    将 Mac 日常使用的软件和开发软件区分开,将之前写的 Mac 配置的文章分成了两篇: Mac 配置教程-日常篇 Mac 配置教程-开发篇 图床 iPic 设置快捷键 Command+Shift+u ...

  5. Win2003 服务器安装及设置教程 系统设置篇

    Windows2003服务器安装及设置教程 系统设置篇,提高性能与安全系数. 本安装及设置教程适用于使用Windows2003为操作系统的服务器,目的是让服务器支持常见网络编程语言包括ASP.PHP. ...

  6. 教程 | 用安卓手机搭建 web 服务器(二)—— Nginx 安装配置

    上一步完成了必要的软件安装,接下来需要在 Linux 系统上安装 nginx. Nginx("engine x")是一款是由俄罗斯的程序设计师 Igor Sysoev 所开发高性能 ...

  7. 电子报纸教程--部署篇

    本篇内容是电子报纸从排版到上线的终篇:部署篇 前两期内容指路: 第一篇:四分钟入门报纸排版[方正飞腾] 第二篇:零基础学习电子报纸 本项目的所有代码已开源在码云上:https://gitee.com/ ...

  8. 博客系统项目:编码篇-基础篇-架构搭建

    博客系统项目:编码篇-基础篇 1 背景 2 环境 2.1 环境说明 2.2 模式说明 2.2.1 MTV模式 2.2.2 MVC 3 前置工作 3.1 环境搭建 4 编码实现 4.1 项目调整 4.1 ...

  9. 教程 | 用安卓手机搭建 web 服务器(一)—— 应用安装配置

    [2019.2.23 更新]:更新 BusyBox,Linux Deploy 软件 之前无意间看到了一篇<在安卓上部署服务器>的文章,正好最近换了新手机,正好最近在学 Python 和 H ...

最新文章

  1. 分享Kali Linux 2016.2第45周VMware虚拟机
  2. J2SE的30个基本概念
  3. 京瓷 打印 打印机 账户_UV打印机市场竞争的关键是什么?
  4. Kafka如何在千万级别时优化JVM GC问题?
  5. 这波操作,会把你的中间件架构带到另一个Level
  6. tmux与python虚拟环境问题
  7. 设计模式学习---单件模式
  8. Ionic Cordova实现软键盘的监听 以及操作大全
  9. matlab里的svmtrain的输出model里,各参数的含义
  10. MySQL必知必会(二)
  11. idea快捷键,可摆脱鼠标
  12. Linux开发板-串口连接成功后界面空白问题
  13. Metric study
  14. 分享多张图片到微信朋友圈
  15. 来自北京大学NOIP金牌选手yxc的常用代码模板1——基础算法
  16. 计算机设备更新理由,电脑硬件明明升级了,为什么速度还这么慢?四种原因在背后作怪!...
  17. 周鸿袆: 教您打造十页完美商业计划书(转载)
  18. C# DirectInput游戏手柄和键盘开发心得2(SharpDX版)
  19. 《赢在中国》精彩评语 2006年度
  20. 计算机二级后续操作基于此文件,2017年9月全国计算机等级考试二级MS-office高级应用考试预测题-2.pdf...

热门文章

  1. orbslam2-基础理论(六)-g2o(常用的优化算法)
  2. 动画 gif_调整动画GIF的大小
  3. 测试用例设计——边界值分析法
  4. 第七十三章 SQL函数 LCASE
  5. 在嵌入式Linux系统上安装打印机
  6. 爬取QQ音乐(讲解爬虫思路)
  7. 中秋特辑--洛谷题目-P2431【正妹吃月饼】
  8. 从《浪潮之巅》看互联网
  9. Android 动态切换应用图标方案
  10. c语言printf snm,甘肃三校生高考模拟试题专业基础知识测试(二)