基于FPGA的HDMI图片显示

无病呻吟[滑稽]

首先说一下我用的板子,是XILINX的zynq-7020,这也是我学习的第一块FPGA板子,我知道这块板子的难度是很高的,我的想法是一步到位,如果只买单纯的一块像ax-4010那种的话等我以后想要学一些高阶教程还要重新买板子(穷学生党,怎么实惠怎么来,嘿嘿)。回归正题,这个HDMI图像显示是我的一个突发奇想,灵感来自于官方教程的HDMI字符显示部分,他是在ROM中初始化一段字符的数据,然后通过HDMI显示在显示器上。学完之后我就想能不能将一张图片的数据存储到ROM中然后用同样的方式显示出来,说做就做。

1.导出图片数据

首先要获得存入ROM的图片数据,图片是我在网上找的一张萌图,置于萌不萌大佬们自己看(就是萌,不接受大佬们的反驳):
这张图就是萌,不接受大佬们的反驳
在博客上搜了用matlab将图片导出.coe文件的办法,这里直接把链接放到下面:
链接: Matlab中将图像数据生成coe文件.
以这个代码为模板稍微修改一下就可以用,亲测代码很好用,这张图片的RGB数据我只导入的R部分的数据,都是重复工作,只是一个小点子,我就没有全部导入,如果你想完全还原这张图片的话你可以弄一个24位宽的数组,然后导出来即可。不过导入图片数据的时候给自己挖了一个巨坑,下面会说到。

2.将数据存入ROM中

例化IP的部分这里我就不说了,直接说结构。我用到的这张图片242x400的,ROM的位宽选择8位,深度就根据图片的尺寸来,是96800,ROM设置成单口,然后将coe文件导入到ROM中这一步就结束了。

3.程序设计

这里说几个图片显示所用到的一些时序的概念,显示器显示图片是按照从左上角一点点扫描到右下角,然后探针又返回到左上角这样的反复循环,这里就有了行和列的概念,对于行来说基本单位是图片的一个像素点,一行所显示的像素点个数是由你所定义的显示标准(分辨率)决定的,对于列来说基本单位是行,列的尺寸也是由显示标准决定。在完整的传输一行数据的过程中有几个时序参数:1.行有效信号:这个参数是根据水平同步信号(HSYNC)得来,HSYNC规定了一张图片(一帧)中每一行数据的有效起始点;2.总行时间(h_total):从HSYNC的一个上升沿到下一个上升沿到来所需要的时间;3.行消隐脉冲:
(sync_h):各行之间的低电平时间。对于列也有几个时许参数:1.垂直同步信号(VSYNC):规定了一幅图片的起点;2.总列时间(v_total);3.场前肩(torch_f):从场计数开始到场同步的时间;场后肩(torch_b):从场同步结束到行同步开始的时间。(这部分是我从《基于FPGA的数字图像处理原理及应用》书上学到的,这里面的场前肩,场后肩我还没有理解…)
从ROM中存储数据是1位的,而1像素是八位数据,所以按照地址查询数据的时候要每个时钟给地址加8来保证一次传输一个像素数据。没有什么其他注意的点了,这里的RGB转HDMI部分我直接用的官方例程给的IP核,按照官方代码搬过来用的,这个可以上淘宝XILINX官方店里面提供的链接下载到。下面直接上代码吧。

//这个是第一个文件,这部分代码实现把从ROM读出来的数据变成RGB数据然后与生成的行同步信号,场同步信号,图片有效信号一起输出给RGB2HDMI。
// An highlighted block

//   color bar generator module                                                 //
//                                                                              //
//  Author: meisq                                                               //
//          msq@qq.com                                                          //
//          ALINX(shanghai) Technology Co.,Ltd                                  //
//          heijin                                                              //
//     WEB: http://www.alinx.cn/                                                //
//     BBS: http://www.heijin.org/                                              //
//                                                                              //
//
//                                                                              //
// Copyright (c) 2017,ALINX(shanghai) Technology Co.,Ltd                        //
//                    All rights reserved                                       //
//                                                                              //
// This source file may be used and distributed without restriction provided    //
// that this copyright statement is not removed from the file and that any      //
// derivative work contains the original copyright notice and the associated    //
// disclaimer.                                                                  //
//                                                                              //
//

//================================================================================
//  Revision History:
//  Date          By            Revision    Change Description
//--------------------------------------------------------------------------------
//2013/4/16                    1.0          Original
//2013/4/18                    1.1          vs timing
//2013/5/7                     1.2          remove some warning
//2017/7/17                    1.3      
//*******************************************************************************/
`include "video_define.v"
module color_bar(
	input                 clk,           //pixel clock
	input                 rst,           //reset signal high active
	output                hs,            //horizontal synchronization
	output                vs,            //vertical synchronization
	output                de,            //video valid
	output[7:0]           rgb_r,         //video red data
	output[7:0]           rgb_g,         //video green data
	output[7:0]           rgb_b          //video blue data
);
//video timing parameter definition
`ifdef  VIDEO_1280_720
parameter H_ACTIVE = 16'd1280;           //horizontal active time (pixels)
parameter H_FP = 16'd110;                //horizontal front porch (pixels)
parameter H_SYNC = 16'd40;               //horizontal sync time(pixels)
parameter H_BP = 16'd220;                //horizontal back porch (pixels)
parameter V_ACTIVE = 16'd720;            //vertical active Time (lines)
parameter V_FP  = 16'd5;                 //vertical front porch (lines)
parameter V_SYNC  = 16'd5;               //vertical sync time (lines)
parameter V_BP  = 16'd20;                //vertical back porch (lines)
parameter HS_POL = 1'b1;                 //horizontal sync polarity, 1 : POSITIVE,0 : NEGATIVE;
parameter VS_POL = 1'b1;                 //vertical sync polarity, 1 : POSITIVE,0 : NEGATIVE;
`endif

//480x272 9Mhz
`ifdef  VIDEO_480_272
parameter H_ACTIVE = 16'd480; 
parameter H_FP = 16'd2;       
parameter H_SYNC = 16'd41;    
parameter H_BP = 16'd2;       
parameter V_ACTIVE = 16'd272; 
parameter V_FP  = 16'd2;     
parameter V_SYNC  = 16'd10;   
parameter V_BP  = 16'd2;     
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//640x480 25.175Mhz
`ifdef  VIDEO_640_480
parameter H_ACTIVE = 16'd640; 
parameter H_FP = 16'd16;      
parameter H_SYNC = 16'd96;    
parameter H_BP = 16'd48;      
parameter V_ACTIVE = 16'd480; 
parameter V_FP  = 16'd10;    
parameter V_SYNC  = 16'd2;    
parameter V_BP  = 16'd33;    
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//800x480 33Mhz
`ifdef  VIDEO_800_480
parameter H_ACTIVE = 16'd800; 
parameter H_FP = 16'd40;      
parameter H_SYNC = 16'd128;   
parameter H_BP = 16'd88;      
parameter V_ACTIVE = 16'd480; 
parameter V_FP  = 16'd1;     
parameter V_SYNC  
  • 17
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值