[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-24 TPG图像测试数据发生器设计

news2024/9/23 3:29:45

软件版本:VIVADO2021.1

操作系统:WIN10 64bit

硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA

实验平台:米联客-MLK-H3-CZ08-7100开发板

板卡获取平台:https://milianke.tmall.com/

登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

目录

1概述

2 TPG视频测试模式发生器

2.1系统框图

2.2时序设计

3 TPG源码

4 RTL仿真

4.1仿真激励文件

4.2仿真结果


1概述

TPG(video_test_pattern generator) 视频测试模式发生器用于产生测试数据,对视频数据通路测试。

2 TPG视频测试模式发生器

2.1系统框图

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格式数据输出

2.2时序设计

视频数据的有效区域如下图所示:视频数据在H_AcitiveSize和V_AcitiveSize同时有效时候有效

3 TPG源码

产生彩条、纯色、黑白棋方格测试数据,用于视频测试。

`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   = 1'b0; //对vs信号寄存
reg         tpg_hs_r   = 1'b0; //对hs信号寄存
reg [7 :0]  grid_data  = 8'd0; //grid棋方格寄存器
reg [23:0]  color_bar  = 24'd0;//RGB 彩条寄存器
reg [10:0]  dis_mode   = 11'd0;//显示模式寄存器
reg [7 :0]  r_reg      = 8'd0; //红寄存器
reg [7 :0]  g_reg      = 8'd0; //绿寄存器
reg [7 :0]  b_reg      = 8'd0; //蓝寄存器

always @(posedge I_tpg_clk)begin
    tpg_vs_r <= I_tpg_vs; //对vs信号寄存一次
    tpg_hs_r <= I_tpg_hs; //对hs信号寄存一次
end

reg [11:0]v_cnt = 12'd0; //视频垂直方向,行计数器
reg [11:0]h_cnt = 12'd0; //视频水平方向,列计数器

//h_cnt计数器模块
always @(posedge I_tpg_clk)
    h_cnt <= I_tpg_de ? h_cnt + 1'b1 : 12'd0; //计数行有效像素,当de无效,重置 h_cnt=0

//v_cnt计数器模块
always @(posedge I_tpg_clk)
  if(I_tpg_vs) //通过vs产生同步复位
    v_cnt <= 12'd0; //重置v_cnt=0
  else 
    v_cnt <= ((!tpg_hs_r)&&I_tpg_hs) ? v_cnt + 1'b1 : v_cnt; //hs信号的上升沿,v_cnt计数,这种方式可以不管hs有效是高电平还是低电平的情况,v_cnt 视频垂直方向,行计数器,计数行数量

//显示模式切换
always @(posedge I_tpg_clk)
   if(I_tpg_rstn==1'b0)
    dis_mode <= 0;
   else 
    dis_mode <= ((!tpg_vs_r)&&I_tpg_vs) ? dis_mode + 1'b1 : dis_mode;

//grid_data发生器  
always @(posedge I_tpg_clk)begin
    grid_data <= ((v_cnt[4]==1'b1) ^ (h_cnt[4]==1'b1)) ? 8'h00 : 8'hff; //方格大小16*16,黑白交替
end

//RGB彩条发生器
always @(posedge I_tpg_clk)
begin
    if(h_cnt==260)
    color_bar   <=  24'hff0000;//红
    else if(h_cnt==420)
    color_bar   <=  24'h00ff00;//绿
    else if(h_cnt==580)
    color_bar   <=  24'h0000ff;//蓝
    else if(h_cnt==740)
    color_bar   <=  24'hff00ff;//紫
    else if(h_cnt==900)
    color_bar   <=  24'hffff00;//黄
    else if(h_cnt==1060)
    color_bar   <=  24'h00ffff;//青蓝
    else if(h_cnt==1220)
    color_bar   <=  24'hffffff;//白
    else if(h_cnt==1380)
    color_bar   <=  24'h000000;//黑
    else
    color_bar   <=  color_bar;
end
//测试图形输出
always @(posedge I_tpg_clk)begin
    case(dis_mode[10:7])//截取高位,控制切换显示速度
        4'd0:begin
            r_reg <= 0; 
            b_reg <= 0;
            g_reg <= 0;
        end
        4'd1:begin
            r_reg <= 8'b11111111;               //白
            g_reg <= 8'b11111111;
            b_reg <= 8'b11111111;
        end
        4'd2,4'd3:begin//连续两个状态输出相同图形
            r_reg <= 8'b11111111;              //红
            g_reg <= 0;
            b_reg <= 0;  
        end           
        4'd4,4'd5:begin//连续两个状态输出相同图形
            r_reg <= 0;                         //绿
            g_reg <= 8'b11111111;
            b_reg <= 0; 
        end                   
        4'd6:begin     
            r_reg <= 0;                         //蓝
            g_reg <= 0;
            b_reg <= 8'b11111111;
        end
        4'd7,4'd8:begin  //连续两个状态输出相同图形   
            r_reg <= grid_data;                 //方格
            g_reg <= grid_data;
            b_reg <= grid_data;
        end                   
        4'd9:begin    
            r_reg <= h_cnt[7:0];                //水平渐变
            g_reg <= h_cnt[7:0];
            b_reg <= h_cnt[7:0];
        end
        4'd10,4'd11:begin //连续两个状态输出相同图形
            r_reg <= v_cnt[7:0];                 //垂直渐变
            g_reg <= v_cnt[7:0];
            b_reg <= v_cnt[7:0];
        end
        4'd12:begin     
            r_reg <= v_cnt[7:0];                 //红垂直渐变
            g_reg <= 0;
            b_reg <= 0;
        end
        4'd13:begin     
            r_reg <= 0;                          //绿垂直渐变
            g_reg <= h_cnt[7:0];
            b_reg <= 0;
        end
        4'd14:begin     
            r_reg <= 0;                          //蓝垂直渐变
            g_reg <= 0;
            b_reg <= h_cnt[7:0];            
        end
        4'd15:begin     
            r_reg <= color_bar[23:16];           //彩条
            g_reg <= color_bar[15:8];
            b_reg <= color_bar[7:0];            
        end               
        endcase
end

assign 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

4 RTL仿真

4.1仿真激励文件

/*************视频测试仿真文件****************************************
*********************************************************************/

`timescale 1ns / 1ns//仿真时间刻度/精度

module video_test_tb;

localparam SYS_TIME = 10;//系统时钟周期10ns

reg I_vid_rstn,I_vid_sysclk_p,I_vid_sysclk_n;
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_sysclk_p(I_vid_sysclk_p),
.I_vid_sysclk_n(I_vid_sysclk_n),
.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 begin
    I_vid_sysclk_p  = 1'b0;
    I_vid_sysclk_n  = 1'b1;
    I_vid_rstn = 1'b0;
    #100;//产生100ns的系统复位
    I_vid_rstn = 1'b1;//复位完成
end
//产生仿真时钟
always #(SYS_TIME/2) I_vid_sysclk_p= ~I_vid_sysclk_p;
always #(SYS_TIME/2) I_vid_sysclk_n= ~I_vid_sysclk_n;

endmodule

为简化仿真,这里模拟的视频格式为320*5 即一行的有效数据为350个像素,一帧数据有5行像素数据。

4.2仿真结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非标机械设计项目“规范”笔记

2.自动化设备开发特点与技术文件输出 2.1自动化设备 自动化设备 工业自动化设备类型&#xff1a;标准自动化、非标自动化 载具和治具 焊接治具---汽车行业用的多 压装、压合治具---3C行业 治具种类&#xff1a; 电木&#xff1a;测试治具箱体&#xf…

Mac系统App打包成dmg文件总结

使用软件&#xff1a;BetterZip 操作步骤如下&#xff1a; 打开BetterZip 将想要打包的App拖入当前界面 选中文件点击文件-另存为 修改保存位置和压缩格式&#xff0c;点击存储即可 保存完成后修改文件名即可

关联模块的查询列表勾选数据,新建带出勾选数据

在模块找到页面拓展&#xff0c;新建按钮&#xff0c;代码在链接目标地址中写 获取当前勾选数据的id,将ID拼接到弹窗地址上 var CheckedCheckboxId _xtable_CheckedCheckboxId();//勾选中的checkid var result CheckedCheckboxId.replace(/^,|,$/g, ""); window.ope…

哪种类型的耳机不伤耳朵?五款口碑绝佳机型安利!

​要说最不伤耳朵的耳机&#xff0c;那肯定得是开放式耳机了&#xff01;开放式耳机现在超火&#xff0c;因为它们戴起来舒服&#xff0c;音质又棒&#xff0c;让喜欢音乐和运动的朋友们超爱。特别是那些边运动边听歌的人&#xff0c;开放式耳机简直是完美。它们戴着稳&#xf…

网站注册流程是怎样的

网站注册流程是一项关键的操作&#xff0c;对于用户来说&#xff0c;这是接触和利用公司服务的第一步。一个简单、清晰的注册流程能够提高用户体验&#xff0c;增强用户对公司的信任感。下面是一个通用的公司网站注册流程&#xff0c;以及一些设计原则&#xff0c;以确保注册过…

NB6L295M MCU 设计参考

NB6L295M 2.5V / 3.3V 双通道可编程时钟 / 数据差分 CML 的延迟输出多电平输入&#xff0c;带内部终端&#xff1b;NB6L295M 是一款双通道可编程延迟芯片主要用于 Clock 或 Data 去偏斜和定时调整。NB6L295M 在那两个单独的可变延迟通道 PD0 和 PD1 可以在以下之一中配置两种操…

基于PiAlert的网络扫描器NetAlertX

什么是 NetAlertX &#xff1f; NetAlertX 是&#x1f4bb;&#x1f50d; WIFI/LAN 入侵检测器。能扫描连接到您的网络的设备&#xff0c;并在发现新设备或未知设备时向您发出警报。能够在一个地方可视化您的所有网络&#xff0c;获得实时警报&#xff0c;并与您的智能家居无缝…

探秘微信传奇:背后的产品观重塑社交江湖

在当今互联网的浩瀚星空中&#xff0c;微信无疑是那颗最为璀璨的明星。它如同一座无形的桥梁&#xff0c;连接着全球数十亿人的生活、情感与梦想。那么&#xff0c;微信究竟是如何铸就这般传奇的呢&#xff1f;让我们一同深入探寻微信背后的产品观&#xff0c;揭开它神秘的面纱…

C练手题--Exclusive “or“ (xor) Logical Operator 【8 kyu】

一、原题 链接&#xff1a;Training on Exclusive "or" (xor) Logical Operator | Codewars Exclusive "or" (xor) Logical Operator Overview In some scripting languages like PHP, there exists a logical operator (e.g. &&, ||, and, or, e…

2024百元蓝牙耳机推荐有哪些?四款百元王炸机型2024推荐

2024年市场上的蓝牙耳机品牌和型号繁多&#xff0c;其中不乏性价比极高的选择&#xff0c;对于那些寻求高品质、高性价比的消费者来说&#xff0c;百元级别的蓝牙耳机成了最吸引人的选择&#xff0c;那么2024百元蓝牙耳机推荐有哪些&#xff1f;为了帮助消费者在2024年作出明智…

统筹1000+代理商账号,月均传播量达1200w+,互联网企业区域业务指标提升300%

五菱联动全网经销商账号促进业务增长、雅迪打造抖音万店矩阵实现流量串联带动销量、贝壳推出“银河计划”孵化上万个房产自媒体达人促进潜客转化........ 越来越多的企业开始在各大社媒平台上建设经销商矩阵、门店矩阵、代理商矩阵&#xff0c;让经销商、门店、代理商等这些终端…

C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作

C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作 一、使用Microsoft.Office.Interop.Excel库 1、通过NuGet包管理器添加引用 按照下图中红框所示进行操作。 需要安装Microsoft.Office.Interop.Excel包 添加Microsoft Office 16.0 Object …

搭建大型分布式服务(四十四)SpringBoot 无代码侵入实现多Kafka数据源:单分区提升至十万级消费速度!

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 在过去的一段时间里&#xff0c;我们利用了AI大模型写了一个多线程并发框架&#xff0c;那么&#xff0c;我们怎样集成到Kafka组件里&#xff0c;让消费速度…

15种高级RAG技术:从预检索到生成全面提升RAG效果

检索增强生成 &#xff08;RAG&#xff09; 是一种强大的技术&#xff0c;它将信息检索与生成式 AI 相结合&#xff0c;以产生更准确、上下文更丰富的响应。本文将探讨 15 种高级 RAG 技术&#xff0c;以提高生成式 AI 系统的输出质量和整体性能的鲁棒性。这样做使本文能够测试…

基于ROP漏洞挖掘与利用

支持一对一答疑的购买网址 通常情况下栈溢出可能造成的后果有两种&#xff0c;一类是本地提权另一类则是远程执行任意命令&#xff0c;通常C/C并没有提供智能化检查用户输入是否合法的功能&#xff0c;同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出&#xff0c…

华为 HCIP-Datacom H12-821 题库 (4)

有需要题库的可以看主页置顶 1.缺省情况下&#xff0c;广播型网络中运行 IS-IS 的路由器&#xff0c;DIS 发送 CSNP报文的周期为多少秒&#xff1f; A、10 B、3.3 C、30 D、40 答案&#xff1a;A 解析&#xff1a; 广播型网络中运行 IS-IS 的路由器&#xff0c;DIS 发送C…

sed awk 第二版学习(二)—— 正则表达式语法

目录 一、表达式 二、成行的字符 1. 反斜杠 2. 通配符 3. 编写正则表达式 4. 字符类 &#xff08;1&#xff09;字符的范围 &#xff08;2&#xff09;排除字符类 &#xff08;3&#xff09;POSIX 字符类补充 5. 重复出现的字符 6. 匹配单词 7. gres 替换脚本 8. …

PHP动物收容所管理系统-计算机毕业设计源码94164

摘 要 利用PHP语言和相关技术&#xff0c;设计和实现一个高效、可靠的动物收容所管理系统。该系统将提供系统用户、动物信息管理、领养申请处理、志愿者管理、医疗记录管理、捐赠信息、系统管理等功能&#xff0c;旨在促进动物收容所管理工作的便捷和透明化。本研究首先介绍了动…

HyperMesh教程从入门到精通:HyperMesh模型管理

1.4 模型管理 在HyperMesh中创建一个有效的求解输入文件时&#xff0c;模型管理功能是非常必要的。本节将介绍基本的模型管理方法&#xff0c;如单元和载荷归类、集合组装、重命名、删除、排序以及重新编号等。 本节将学习如何&#xff1a; 创建几何和组件归类。单元归类。组…

windows任务栏的空白清除

windows任务栏的空白出现一块一块的空白&#xff0c;看着好难受&#xff0c;下面介绍下怎么进行清除 在Windows操作系统中&#xff0c;任务栏出现空白区域可能是由多种原因引起的&#xff0c;比如图标被意外删除或隐藏、系统更新后的兼容性问题、或是某些程序错误地修改了系统设…