网站后台建设费用,莱芜招聘,织梦转易优cms,wordpress 汉化 主题软件版本#xff1a;Anlogic -TD5.9.1-DR1_ES1.1
操作系统#xff1a;WIN10 64bit
硬件平台#xff1a;适用安路(Anlogic)FPGA
实验平台#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板
板卡获取平台#xff1a;https://milianke.tmall.com/
登录“米联客”FPGA社区 ht…软件版本Anlogic -TD5.9.1-DR1_ES1.1
操作系统WIN10 64bit
硬件平台适用安路(Anlogic)FPGA
实验平台米联客-MLK-L1-CZ06-DR1M90G开发板
板卡获取平台https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑
目录
1 概述
1.1 RGB像素格式
2 程序设计
2.1 系统框图
2.2 TPG源码
3 RTL仿真
3.1 仿真激励文件
3.2 仿真结果 1 概述
TPG(video_test_pattern generator) 视频测试模式发生器用于产生测试数据对视频数据通路测试。本课设计一个图像数据发生器该模块能够产生不同颜色和样式的图像数据并按顺序将RGB图像数据发送到有效显示区域。
1.1 RGB像素格式 RGB是一种颜色标准俗称三基色模式是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的是运用最广的颜色系统之一。像素点就相当于一个RGB灯通过控制 R、G、B 这三种颜色的亮度就可以显示出各种各样的色彩。在显示器发明之后从黑白显示器发展到彩色显示器人们开始使用发出不同颜色的光的荧光粉CRT等离子体显示器或者不同颜色的滤色片LCD或者不同颜色的半导体发光器件OLED和LED大型全彩显示牌来形成色彩不管采用何种技术都以红(R)、绿(G)、蓝(B)三个颜色作为基本的发光单元通过控制光强度组合出了人类视力所能感知的所有颜色。 常见RGB像素格式
1、索引格式
索引格式是比较老的格式随着越来越高的视觉需求索引格式基本不再被使用了这里只做简单介绍。索引格式中bit存储的值并非是实际的R、G、B值而是对应点的像素在调色板中的索引即在图像文件中划出一个区域存放一个调色板来存储图像中的每一种颜色这个像素的颜色对应到调色板的第几号颜色。
RGB1每个像素用1个bit表示能够表示的索引范围是0-1共2种颜色即调色板中包含2中颜色。
RGB4每个像素用4个bit表示能够表示的索引范围是0-15共16种颜色即调色板中包含16中颜色。
RGB8每个像素用8个bit表示能够表示的索引范围是0-255共256种颜色即调色板中包含256中颜色。
2、像素格式
RGB像素格式不同于索引格式索引格式bit存储的是每一个像素的色彩索引而像素格式中的bit用来存储像素点中R、G、B三个颜色的值。
RGB888也叫RGB24一个像素点由3个字节组成共8bit*324bit。其中bit23~bit16是RED 通道红色对应的值就是 24’hFF0000bit15~bit8 是 GREEN 通道绿色对应的值就是 24’h00FF00bit7~bit0 是 BLUE通道蓝色对应的值为 24’h0000FF使用RGB888格式理论上可以产生1670万种色彩。RGB888像素格式如下图所示 RGB888 数据格式
RGB565只需要两个字节可以降低成本RGB分量分别使用5bit、6bit、5bit但在色彩鲜艳度上较差一些。 RGB555只需要两个字节RGB分量都使用5bit(最高位不用)。 RGB1555只需要两个字节RGB分量都使用5bit1bit用于表示透明度0完全透明1完全不透明。 我们可以通过电脑的“画图”工具使用调色板即可获取到想要的颜色对应的数值。 2 程序设计
2.1 系统框图
本次实验通过测试视频发生器模块产生测试图形即彩条、渐变、纯色、棋方格将相应测试图形的RGB数据依次放入有效的显示区域内。实验包含3个模块 VTC视频时序控制器模块、TPG视频测试模式发生器模块、用户控制模块。以下给出系统框图关于VTC视频时序控制器驱动的详细描述请看前面的实验我们主要学习TPG视频测试模式发生器驱动。 TPG视频测试模式发生器
视频数据的有效区域如下图所示视频数据在H_AcitiveSize和V_AcitiveSize同时有效时候有效 I_tpg_ck:视频格式的像素时钟
I_tpg_vs:视频格式的场同步信号
I_tpg_hs:视频格式的行同步信号
I_tpg_de:视频格式的有效数据阶段 O_tpg_vs:同I_tpg_vs
O_tpg_hs:同I_tpg_hs
O_tpg_de:同I_tpg_de
O_tpg_data:rgb格式数据输出 计数器模块
h_cnt计数器模块I_tpg_de为高电平时表示有效显示区域阶段此时h_cnt列计数器开始计数计数为H_ActiveSize的值。
v_cnt计数器模块I_tpg_vs拉高表示一帧有效图像数据传输完成v_cnt置0否则I_tpg_hs拉高表示传输完一行有效数据v_cnt加1。
//h_cnt计数器模块
always (posedge I_tpg_clk)h_cnt I_tpg_de ? h_cnt 1b1 : 12d0; //计数行有效像素,当de无效重置 h_cnt0//v_cnt计数器模块
always (posedge I_tpg_clk)if(I_tpg_vs) //通过vs产生同步复位v_cnt 12d0; //重置v_cnt0else v_cnt ((!tpg_hs_r)I_tpg_hs) ? v_cnt 1b1 : v_cnt; //hs信号的上升沿v_cnt计数这种方式可以不管hs有效是高电平还是低电平的情况,v_cnt 视频垂直方向行计数器计数行数量
测试图像产生模块
使用状态机将我们要显示的所有样式的图形数据列举出来通过不断累加的dis_mode为了减慢显示变换图形样式的速度取dis_mode高位值进行判断该显示何种图形。
黑白格h_cnt[4]和v_cnt[4]进行“异或”运算即相同为0不同为1再进行条件判断0显示全黑1显示全白。
RGB彩条使用列计数器h_cnt将有效显示区域划分为9块分别显示不同的RGB数据。
//显示模式切换
always (posedge I_tpg_clk)if(I_tpg_rstn1b0)dis_mode 0;else dis_mode ((!tpg_vs_r)I_tpg_vs) ? dis_mode 1b1 : dis_mode;//grid_data发生器
always (posedge I_tpg_clk)begingrid_data ((v_cnt[4]1b1) ^ (h_cnt[4]1b1)) ? 8h00 : 8hff; //方格大小16*16黑白交替
end//RGB彩条发生器
always (posedge I_tpg_clk)
beginif(h_cnt260)color_bar 24hff0000;//红else if(h_cnt420)color_bar 24h00ff00;//绿else if(h_cnt580)color_bar 24h0000ff;//蓝else if(h_cnt740)color_bar 24hff00ff;//紫else if(h_cnt900)color_bar 24hffff00;//黄else if(h_cnt1060)color_bar 24h00ffff;//青蓝else if(h_cnt1220)color_bar 24hffffff;//白else if(h_cnt1380)color_bar 24h000000;//黑elsecolor_bar color_bar;
end//测试图形输出
always (posedge I_tpg_clk)begincase(dis_mode[10:7])//截取高位控制切换显示速度4d0:beginr_reg 0; b_reg 0;g_reg 0;end4d1:beginr_reg 8b11111111; //白g_reg 8b11111111;b_reg 8b11111111;end4d2,4d3:begin//连续两个状态输出相同图形r_reg 8b11111111; //红g_reg 0;b_reg 0; end 4d4,4d5:begin//连续两个状态输出相同图形r_reg 0; //绿g_reg 8b11111111;b_reg 0; end 4d6:begin r_reg 0; //蓝g_reg 0;b_reg 8b11111111;end4d7,4d8:begin //连续两个状态输出相同图形 r_reg grid_data; //方格g_reg grid_data;b_reg grid_data;end 4d9:begin r_reg h_cnt[7:0]; //水平渐变g_reg h_cnt[7:0];b_reg h_cnt[7:0];end4d10,4d11:begin //连续两个状态输出相同图形r_reg v_cnt[7:0]; //垂直渐变g_reg v_cnt[7:0];b_reg v_cnt[7:0];end4d12:begin r_reg v_cnt[7:0]; //红垂直渐变g_reg 0;b_reg 0;end4d13:begin r_reg 0; //绿垂直渐变g_reg h_cnt[7:0];b_reg 0;end4d14:begin r_reg 0; //蓝垂直渐变g_reg 0;b_reg h_cnt[7:0]; end4d15:begin r_reg color_bar[23:16]; //彩条g_reg color_bar[15:8];b_reg color_bar[7:0]; end endcase
end
2.2 TPG源码
/*******************************MILIANKE*******************************
*Company : MiLianKe Electronic Technology Co., Ltd.
*WebSite:https://www.milianke.com
*TechWeb:https://www.uisrc.com
*tmall-shop:https://milianke.tmall.com
*jd-shop:https://milianke.jd.com
*taobao-shop1: https://milianke.taobao.com
*Create Date: 2019/12/17
*Module Name:rgb_to_hdmi
*File Name:rgb_to_hdmi.v
*Description:
*The reference demo provided by Milianke is only used for learning.
*We cannot ensure that the demo itself is free of bugs, so users
*should be responsible for the technical problems and consequences
*caused by the use of their own products.
*Copyright: Copyright (c) MiLianKe
*All rights reserved.
*Revision: 1.1
*Signal description
*1) I_ input
*2) O_ output
*3) IO_ input output
*3) S_ system internal signal
*3) _n activ low
*4) _dg debug signal
*5) _r delay or register
*6) _s state mechine
*********************************************************************//*********uitpg(video test Pattern Generator)测试视频发生器***********
--版本号1.1
--以下是米联客设计的uitpg(video test Pattern Generator)测试视频发生器
--1.代码简洁占用极少逻辑资源代码结构清晰逻辑设计严谨
--2.该测试视频发生器通过产生彩条、渐变、纯色、棋方格产生测试图形
*********************************************************************/timescale 1ns / 1ns//仿真时间刻度/精度module uitpg
(
input I_tpg_clk, //系统时钟
input I_tpg_rstn,//系统复位
input I_tpg_vs, //场同步输入
input I_tpg_hs, //行同步输入
input I_tpg_de, //视频数据有效输入
output O_tpg_vs, //场同步输出
output O_tpg_hs, //行同步输出
output O_tpg_de, //视频数据有效输出
output [23:0] O_tpg_data //有效测试数据
);reg tpg_vs_r 1b0; //对vs信号寄存
reg tpg_hs_r 1b0; //对hs信号寄存
reg [7 :0] grid_data 8d0; //grid棋方格寄存器
reg [23:0] color_bar 24d0;//RGB 彩条寄存器
reg [10:0] dis_mode 11d0;//显示模式寄存器
reg [7 :0] r_reg 8d0; //红寄存器
reg [7 :0] g_reg 8d0; //绿寄存器
reg [7 :0] b_reg 8d0; //蓝寄存器always (posedge I_tpg_clk)begintpg_vs_r I_tpg_vs; //对vs信号寄存一次tpg_hs_r I_tpg_hs; //对hs信号寄存一次
endreg [11:0]v_cnt 12d0; //视频垂直方向行计数器
reg [11:0]h_cnt 12d0; //视频水平方向列计数器//h_cnt计数器模块
always (posedge I_tpg_clk)h_cnt I_tpg_de ? h_cnt 1b1 : 12d0; //计数行有效像素,当de无效重置 h_cnt0//v_cnt计数器模块
always (posedge I_tpg_clk)if(I_tpg_vs) //通过vs产生同步复位v_cnt 12d0; //重置v_cnt0else v_cnt ((!tpg_hs_r)I_tpg_hs) ? v_cnt 1b1 : v_cnt; //hs信号的上升沿v_cnt计数这种方式可以不管hs有效是高电平还是低电平的情况,v_cnt 视频垂直方向行计数器计数行数量//显示模式切换
always (posedge I_tpg_clk)if(I_tpg_rstn1b0)dis_mode 0;else dis_mode ((!tpg_vs_r)I_tpg_vs) ? dis_mode 1b1 : dis_mode;//grid_data发生器
always (posedge I_tpg_clk)begingrid_data ((v_cnt[4]1b1) ^ (h_cnt[4]1b1)) ? 8h00 : 8hff; //方格大小16*16黑白交替
end//RGB彩条发生器
always (posedge I_tpg_clk)
beginif(h_cnt260)color_bar 24hff0000;//红else if(h_cnt420)color_bar 24h00ff00;//绿else if(h_cnt580)color_bar 24h0000ff;//蓝else if(h_cnt740)color_bar 24hff00ff;//紫else if(h_cnt900)color_bar 24hffff00;//黄else if(h_cnt1060)color_bar 24h00ffff;//青蓝else if(h_cnt1220)color_bar 24hffffff;//白else if(h_cnt1380)color_bar 24h000000;//黑elsecolor_bar color_bar;
end//测试图形输出
always (posedge I_tpg_clk)begincase(dis_mode[10:7])//截取高位控制切换显示速度4d0:beginr_reg 0; b_reg 0;g_reg 0;end4d1:beginr_reg 8b11111111; //白g_reg 8b11111111;b_reg 8b11111111;end4d2,4d3:begin//连续两个状态输出相同图形r_reg 8b11111111; //红g_reg 0;b_reg 0; end 4d4,4d5:begin//连续两个状态输出相同图形r_reg 0; //绿g_reg 8b11111111;b_reg 0; end 4d6:begin r_reg 0; //蓝g_reg 0;b_reg 8b11111111;end4d7,4d8:begin //连续两个状态输出相同图形 r_reg grid_data; //方格g_reg grid_data;b_reg grid_data;end 4d9:begin r_reg h_cnt[7:0]; //水平渐变g_reg h_cnt[7:0];b_reg h_cnt[7:0];end4d10,4d11:begin //连续两个状态输出相同图形r_reg v_cnt[7:0]; //垂直渐变g_reg v_cnt[7:0];b_reg v_cnt[7:0];end4d12:begin r_reg v_cnt[7:0]; //红垂直渐变g_reg 0;b_reg 0;end4d13:begin r_reg 0; //绿垂直渐变g_reg h_cnt[7:0];b_reg 0;end4d14:begin r_reg 0; //蓝垂直渐变g_reg 0;b_reg h_cnt[7:0]; end4d15:begin r_reg color_bar[23:16]; //彩条g_reg color_bar[15:8];b_reg color_bar[7:0]; end endcase
endassign O_tpg_data {r_reg,g_reg,b_reg};//测试图形RGB数据输出
assign O_tpg_vs I_tpg_vs; //VS同步信号
assign O_tpg_hs I_tpg_hs; //HS同步信号
assign O_tpg_de I_tpg_de; //DE数据有效信号endmodule
3 RTL仿真
3.1 仿真激励文件
timescale 1ns / 1ns//仿真时间刻度/精度module video_test_tb;localparam SYS_TIME 20;//系统时钟周期10nsreg I_vid_rstn,I_vid_clk;
wire O_vid_vs,O_vid_hs,O_vid_de;
wire [7:0]O_rgb_r,O_rgb_g,O_rgb_b;//例化video_test
video_test video_test_inst
(
.I_vid_clk(I_vid_clk),
.I_vid_rstn(I_vid_rstn),
.O_vid_vs(O_vid_vs),
.O_vid_hs(O_vid_hs),
.O_vid_de(O_vid_de),
.O_rgb_r(O_rgb_r),
.O_rgb_g(O_rgb_g),
.O_rgb_b(O_rgb_b)
);//初始化
initial beginI_vid_clk 1b0;I_vid_rstn 1b0;#100;//产生100ns的系统复位I_vid_rstn 1b1;//复位完成
end
//产生仿真时钟
always #(SYS_TIME/2) I_vid_clk ~I_vid_clk;endmodule
为简化仿真这里模拟的视频格式为320*5 即一行的有效数据为350个像素一帧数据有5行像素数据。
.H_ActiveSize(320), //视频时间参数,行视频信号一行有效(需要显示的部分)像素所占的时钟数一个时钟对应一个有效像素设置320个像素
.H_FrameSize(3208844239),//视频时间参数,行视频信号一行视频信号总计占用的时钟数
.H_SyncStart(32088), //视频时间参数,行同步开始即多少时钟数后开始产生行同步信号
.H_SyncEnd(3208844), //视频时间参数,行同步结束即多少时钟数后停止产生行同步信号之后就是行数据有效数据部分
.V_ActiveSize(5), //视频时间参数,场视频信号一帧图像所占用的有效(需要显示的部分)行数量通常说的视频分辨率即H_ActiveSize*V_ActiveSize
.V_FrameSize(54528), //视频时间参数,场视频信号一帧视频信号总计占用的行数量
.V_SyncStart(54), //视频时间参数,场同步开始即多少行数后开始产生场同步信号
.V_SyncEnd (545) //视频时间参数,场同步结束即多少行数后停止产生场同步信号之后就是场有效数据部分 3.2 仿真结果