ZYNQ_project:HDMI

实验目标:先显示彩条,通过uart串口传输100x100 大小图片像素信息,然后开始弹跳显示该图片在显示器上。

HDMI 是新一代的多媒体接口标准, 英文全称是 High-Definition Multimedia Interface, 即高清多媒体接口。 它能够同时传输视频和音频,简化了设备的接口和连线;同时提供了更高的数据传输带宽, 可以传输无压缩的数字音频及高分辨率视频信号。 HDMI 1.0 版本于 2002 年发布, 最高数据传输速度为 5Gbps; HDMI2.0
版本于 2013 年推出的, 2.0 理论传输速度能达到 18Gbit/s,实际传输速度能达到 14.4Gbit/s; 而 2017 年发布的 HDMI 2.1 标准的理论带宽可达 48Gbps,实际速度也能达到 42.6Gbit/s。

模块框图:

代码:

(与上一个vga显示相比,多了编码模块,串行转并行模块,单端信号转差分信号模块。)

用的是官方给的编码模块,与原语(就相当于开源的简单IP核心)。

只需要进行例化连线即可。

重点讲解像素产生模块:

首先产生彩条像素,当ram中数据存储超过10000个像素信息后,开始在规定范围内,以跳跃的方式显示该图片。

// 根据传进来的有效图像坐标信息,产生有效的像素数据�?
module lcd_display (input       wire                sys_clk     , // lcd的时钟,用来读取ram�?数�??input       wire                sys_rst_n   , input       wire                clk_wr_ram  , // 50Mhz,与rx模块相同时钟�?input       wire    [10:0]      axi_x       , // 直接传递有效坐标数据,其余时刻为0input       wire    [10:0]      axi_y       , // 直接传递有效坐标数据,其余时刻为0input       wire    [7:0]       pi_data     ,input       wire                pi_flag     ,input       wire                finish_falg ,input       wire    [10:0]      H_SYNC      ,input       wire    [10:0]      H_BACK      ,input       wire    [10:0]      H_DISP      ,input       wire    [10:0]      V_SYNC      ,input       wire    [10:0]      V_BACK      ,input       wire    [10:0]      V_DISP      ,output      reg     [23:0]      pix_data                    
);localparam  BLACK       = 24'h000000 , // 黑色WHITE       = 24'hFFFFFF , // 白色RosyBrown   = 24'hBC8F8F , // �?瑰�??RED         = 24'hFF0000 , // 红色APRICOT     = 24'hE69966 , // 杏黄�?VIOLET      = 24'h8B00FF , // �?罗兰�?LINEN       = 24'hFAF0E6 , // 亚麻�?KHAKI       = 24'h996B1F , // 卡其�?PEACH       = 24'hFFE5B4 , // 桃色GOLDEN      = 24'hFFD700 , // 金色SkyBule     = 24'h87CEEB ; // 天空�?localparam  PIC_SIZE    = 11'd100    , // 正方形图片像素大�?100*100H_BYOND     = 11'd350    , V_BYOND     = 11'd190    ; localparam  DEEP        = 18'd10_000 ; // ram深度// reg signal definereg     [ 7:0]      data1       ;reg     [ 7:0]      data2       ;reg     [ 7:0]      data3       ;reg     [ 1:0]      cnt_data    ;reg                 data_flag   ;reg     [13:0]      wr_addr     ;reg     [23:0]      wr_data     ; reg                 wr_en       ;reg     [13:0]      rd_addr     ;reg                 data_done   ;reg                 left_flag   ; reg                 down_flag   ; reg     [10:0]      cnt_h       ;reg     [10:0]      cnt_l       ;// wire signal definewire                wr_en_r     ;wire    [13:0]      wr_addr_r   ;wire    [23:0]      wr_data_r   ;wire    [13:0]      rd_addr_r   ;wire                all_en      ;wire                rd_en       ;wire    [23:0]      rd_data     ;
/******************************************************************************************
********************************************main code**************************************
*******************************************************************************************/// // reg signal define// reg     [ 7:0]      data1       ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) data1 <= 8'd0 ;else if(pi_flag && (cnt_data == 0))data1 <= pi_data ;else data1 <= data1 ;end// reg     [ 7:0]      data2       ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) data2 <= 8'd0 ;else if(pi_flag && (cnt_data == 1))data2 <= pi_data ;else data2 <= data2 ;end// reg     [ 7:0]      data3       ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) data3 <= 8'd0 ;else if(pi_flag && (cnt_data == 2))data3 <= pi_data ;else data3 <= data3 ;end// reg     [ 1:0]      cnt_data    ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) cnt_data <= 2'd0 ;else if(pi_flag && cnt_data == 2)cnt_data <= 2'd0 ;else if(pi_flag)cnt_data <= cnt_data + 1'b1 ;else cnt_data <= cnt_data ;end// reg                 data_flag   ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) data_flag <= 1'b0 ;else if(pi_flag && cnt_data == 2)data_flag <= 1'b1 ;else data_flag <= 1'b0 ;end// reg     [13:0]      wr_addr     ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) wr_addr <= 14'd0 ;else if(wr_en &&( wr_addr == DEEP - 1))wr_addr <= 14'd0 ;else if(wr_en)wr_addr <= wr_addr + 1'b1 ;else wr_addr <= wr_addr ;end// reg     [23:0]      wr_data     ; always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) wr_data <= 24'd0 ;else if(data_flag)wr_data <= {data1,data2,data3} ;else wr_data <= wr_data ;end// reg                 wr_en       ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) wr_en <= 1'b0 ;else wr_en <= data_flag ;end// reg     [13:0]      rd_addr     ; // 读地址的时钟与lcd_clk相同always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) rd_addr <= 14'd0 ;else if((rd_en && rd_addr == DEEP - 1) || (finish_falg))rd_addr <= 14'd0 ;else if(rd_en)rd_addr <= rd_addr + 1'b1 ;else rd_addr <= rd_addr ;end// reg    left_flag     一帧图像显示完,再进行计数。always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) left_flag <= 1'b1 ;else if(left_flag && (cnt_h == (H_DISP - PIC_SIZE - 1)))left_flag <= 1'b0 ;else if((!left_flag) && (cnt_h == 0))left_flag <= 1'b1 ;else left_flag <= left_flag ;end// reg     [10:0]      cnt_h       ; 行计数器always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_h <= 11'd0 ; // 初始显示在左上角else if(left_flag && finish_falg) cnt_h <= cnt_h + 1'b1 ;else if(!left_flag && finish_falg)cnt_h <= cnt_h - 1'b1 ;else cnt_h <= cnt_h ;end// reg    down_flag always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) down_flag <= 1'b1 ;else if(down_flag && (cnt_l == (V_DISP - PIC_SIZE - 1)))down_flag <= 1'b0 ;else if((!down_flag) && (cnt_l == 0))down_flag <= 1'b1 ;else down_flag <= down_flag ;end// reg     [10:0]      cnt_l       ; 列计数器always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_l <= 11'd0 ; // 初始显示在左上角else if(down_flag && finish_falg) cnt_l <= cnt_l + 1'b1 ;else if(!down_flag && finish_falg)cnt_l <= cnt_l - 1'b1 ;else cnt_l <= cnt_l ;end// reg     [10:0]      cnt_l       ;// wire signal define// wire                wr_en_r     ;assign              wr_en_r     = wr_en   ;// wire    [13:0]      wr_addr_r   ;assign              wr_addr_r   = wr_addr ;// wire    [23:0]      wr_data_r   ;assign              wr_data_r   = wr_data ;// wire    [13:0]      rd_addr_r   ;assign              rd_addr_r   = rd_addr ;// wire                all_en      ;assign  all_en = 1'b1 ;// wire                rd_en       ;// assign  rd_en = ((axi_y >= V_SYNC + V_BACK + V_BYOND) && (axi_y <= V_SYNC + V_BACK + V_BYOND + PIC_SIZE - 1)//                 && (axi_x >= H_SYNC + H_BACK + H_BYOND) && (axi_x <= H_SYNC + H_BACK + H_BYOND + PIC_SIZE - 1)) ? 1'b1 : 1'b0 ;//reg  data_done ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) data_done <= 1'b0 ;else if(wr_addr_r == DEEP - 1)data_done <= 1'b1 ;else data_done <= data_done ;endassign  rd_en = (((axi_y >= cnt_l + V_SYNC + V_BACK) && (axi_y <= cnt_l + V_SYNC + V_BACK + PIC_SIZE - 1) &&  ((axi_x >= cnt_h + H_SYNC + H_BACK) && (axi_x <= cnt_h + H_SYNC + H_BACK + PIC_SIZE - 1))) && data_done) ? 1'b1 : 1'b0 ;// wire    [23:0]      rd_data     ;// wire    [23:0]      rd_data     ;// output pix_dataalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) pix_data <= BLACK ;else if((axi_y >= V_SYNC + V_BACK) && (axi_y <= V_SYNC + V_BACK + V_DISP - 1)) begin// 在场同�?�有效区间�??if(rd_en) beginpix_data <= rd_data ;end else beginif((axi_x >= H_SYNC + H_BACK) && (axi_x <= H_SYNC + H_BACK + H_DISP/10 - 1))  pix_data <= WHITE ; else if((axi_x >= H_SYNC + H_BACK + H_DISP/10) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*2 - 1))pix_data <= BLACK ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*2) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*3 - 1))pix_data <= RosyBrown ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*3) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*4 - 1))pix_data <= APRICOT ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*4) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*5 - 1))pix_data <= RED ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*5) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*6 - 1))pix_data <= VIOLET ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*6) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*7 - 1))pix_data <= KHAKI ;elseif((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*7) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*8 - 1))pix_data <= PEACH ;elseif((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*8) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*9 - 1))pix_data <= GOLDEN ;elseif((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*9) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*10 - 1))pix_data <= SkyBule ;elsepix_data <= BLACK ;end endelse  pix_data <= BLACK ;end//  例化ram
ram_24x400x400 ram_24x400x400_inst (.clka                           ( clk_wr_ram    ) , // input wire clka.ena                            ( all_en        ) , // input wire ena.wea                            ( wr_en_r       ) , // input wire [0 : 0] wea.addra                          ( wr_addr_r     ) , // input wire [13 : 0] addra.dina                           ( wr_data_r     ) , // input wire [23 : 0] dina.clkb                           ( sys_clk       ) , // input wire clkb.enb                            ( rd_en         ) , // input wire enb.addrb                          ( rd_addr       ) , // input wire [13 : 0] addrb.doutb                          ( rd_data       )   // output wire [23 : 0] doutb
);// ila_0 your_instance_name (
// 	.clk(clk_wr_ram), // input wire clk// 	.probe0(pi_flag), // input wire [0:0]  probe0  
// 	.probe1(pi_data), // input wire [7:0]  probe1 
// 	.probe2(data1), // input wire [6:0]  probe2 
// 	.probe3(data2), // input wire [6:0]  probe3 
// 	.probe4(data3), // input wire [6:0]  probe4 
// 	.probe5(wr_en_r), // input wire [0:0]  probe5 
// 	.probe6(wr_addr_r), // input wire [22:0]  probe6 
// 	.probe7(wr_addr_r) // input wire [13:0]  probe7
// );// ila_0 ila_0_inst (
// 	.clk(clk_wr_ram), // input wire clk// 	// .probe0(rd_en), // input wire [0:0]  probe0  
// 	// .probe1(rd_addr), // input wire [13:0]  probe1 
// 	// .probe2(rd_data), // input wire [23:0]  probe2 
// 	// .probe3(wr_en_r), // input wire [0:0]  probe3 
// 	// .probe4(axi_x), // input wire [10:0]  probe4 
// 	// .probe5(axi_y), // input wire [10:0]  probe5
// 	.probe0( ), // input wire [0:0]  probe0  
// 	.probe1( ), // input wire [13:0]  probe1 
// 	.probe2( ), // input wire [23:0]  probe2 
// 	.probe3( ), // input wire [0:0]  probe3 
// 	.probe4( ), // input wire [10:0]  probe4 
// 	.probe5( ), // input wire [10:0]  probe5// 	.probe6(pi_flag), // input wire [0:0]  probe6 
// 	.probe7(pi_data), // input wire [7:0]  probe7 
// 	.probe8 (data1), // input wire [7:0]  probe8 
// 	.probe9 (data2), // input wire [7:0]  probe9 
// 	.probe10(data3), // input wire [7:0]  probe10 
// 	.probe11(wr_data), // input wire [23:0]  probe11 
// 	.probe12(cnt_data) // input wire [1:0]  probe12// );endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode(38)生命游戏【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 生命游戏 1.题目 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是…

【数据库】数据库并发控制的冲突检测,冲突可串行化的调度,保障事务的特性

冲突可串行化 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定期更新…

cocos游戏引擎制作的滚动框地图防止误点操作的简单方法

本篇文章主要讲解&#xff0c;使用cocos creator 来解决在我们日常滚动框开发中&#xff0c;滚动和触摸存在冲突的情况&#xff0c;导致的误触行为的解决办法。 日期&#xff1a;2023年11月25日 具体事项 说明&#xff1a;在我们滚动滚动框时&#xff0c;会出现误点的情况&…

JSP过滤器和监听器

什么是过滤器 Servlet过滤器与Servlet十分相似&#xff0c;但它具有拦截客户端&#xff08;浏览器&#xff09;请求的功能&#xff0c;Servlet过滤器可以改变请求中的内容&#xff0c;来满足实际开发中的需要。 对于程序开发人员而言&#xff0c;过滤器实质就是在Web应用服务…

【双向链表的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 双向链表的结构 2. 双向链表的实现 2.1 头文件 ——双向链表的创建及功能函数的定义 2.2 源文件 ——双向链表的功能函数的实现 2.3 源文件 ——双向链表功能的…

处理机调度与作业调度

处理机调度 一个批处理型作业&#xff0c;从进入系统并驻留在外存的后备队列上开始&#xff0c;直至作业运行完毕&#xff0c;可能要经历如下的三级调度 高级调度 也称为作业调度、长程调度、接纳调度。调度对象是作业 主要功能&#xff1a; 挑选若干作业进入内存 为作业创建…

Js页面录屏切片存储数据上传后端

前端 screenShot(){// 获取屏幕共享流navigator.mediaDevices.getDisplayMedia({video: true,audio: true,//preferCurrentTab 共享本次操作的页面preferCurrentTab: true}).then(async stream > {const mediaRecorder new MediaRecorder(stream, { mimeType: video/webm; …

阿里云国际短信业务网络超时排障指南

选取一台或多台线上的应用服务器或选取相同网络环境下的机器&#xff0c;执行以下操作。 获取公网出口IP。 curl ifconfig.me 测试连通性。 &#xff08;推荐&#xff09;执行MTR命令&#xff08;可能需要sudo权限&#xff09;&#xff0c;检测连通性&#xff0c;执行30秒。 m…

基于B/S架构的医院一体化电子病历编辑器源码

电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;通过一体化的设计&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心&#xff0c;以临床诊疗信息为主线…

Docker配置Halo搭建个人博客-快速入门

Docker配置Halo搭建个人博客-快速入门 1 官方文档1.1 快速启动 2 安装Halo2.1 创建Halo主目录2.2 远程下载配置文件2.3 编辑配置文件2.4 拉取最新镜像2.6 查看容器2.7 开放服务器的防火墙 3 运行3.1 运行项目3.2 停止项目 4 常见问题4.1 没有权限4.2 ommand netstart not found…

(项目已开源)社区求助 哪位大佬能不能帮我 将box1 audio 和 box2 slider滑块 和 box3 歌词滚动区域 进行联动

(项目已开源)社区求助 哪位大佬能不能帮我 将box1 audio 和 box2 slider滑块 和 box3 歌词滚动区域 进行联动 链接&#xff1a;https://pan.baidu.com/s/16lpEW6L5jrHfhsG7EXocLw?pwdkryy 提取码&#xff1a;kryy <!--社区求助 哪位大佬能不能帮我 将box1 audio 和 box2 s…

Flink(八)【窗口】

前言 终于忙完了四门专业课的期末&#xff0c;确实挺累啊。今天开始继续学习 Flink &#xff0c;接着上次的内容。 今日摘录&#xff1a; 他觉得一个人奋斗更轻松自在。跟没有干劲的人在一起厮混&#xff0c;只会徒增压力。 -《解忧杂货店》 1、窗口 之前我们已经了解了…

使用ApexSQLLog工具恢复数据库

目录 前言 一、ApexSQLLog是什么&#xff1f; 二、使用步骤 1.连接你要恢复的数据库 2.选择你要恢复的时间点的数据 3.恢复指定操作的数据 4.恢复指定的表 5.输出结果方式 6.输出结果方式 7.生成还原的sql语句 总结 前言 我们在操作数据库的时候可能误操作把数据修…

使用Golang构建高性能网络爬虫

目录 一、Golang的特点 二、构建网络爬虫的步骤 三、关键技术和注意事项 使用协程进行并发处理 使用通道进行协程间的通信 合理控制并发数和处理速度 遵守网站使用协议和法律法规 防止被网站封禁或限制访问 优化网页解析和数据处理 异常处理和错误处理 日志记录和监控…

智跃人力资源管理系统 SQL注入漏洞复现

0x01 产品简介 智跃人力资源管理系统是基于B/S网页端广域网平台&#xff0c;一套考勤系统即可对全国各地多个分公司进行统一管控&#xff0c;成本更低。信息共享更快。跨平台&#xff0c;跨电子设备 0x02 漏洞概述 智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在…

传统算法:使用 Pygame 实现线性查找

使用 Pygame 模块实现了线性查找的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过线性查找算法对数组进行查找,动画效果可视化每一步的变化。在查找的过程中,程序逐个遍历数组元素,如果找到目标值,将相应的元素高…

掌握区块链技术将推进2024年市场发展脚步

1.高收入潜力 精通区块链的人才通常享有超过全国平均水平的薪酬&#xff0c;这也反映了对于专业技能的需求正在迅速增长。无论你选择成为这个领域哪一块业务的人员&#xff0c;掌握区块链技能均可以显著提升你的收入。 2.职业多样性 无论你目前从事什么职业&#xff0c;都可…

使用canvas实现代码雨高级升阶版【附带源码和使用方法】

文章目录 前言基本绿色的彩色版本飘散雪花状后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端面试 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&…

1.网络编程基础知识 - 基础概念、TCP网络通信、UDP网络通信

网络编程 文章目录 网络编程一、概念1.1 网络1.2 IP地址1.2.1 IPv4 介绍1.2.2 IPv6 介绍1.2.3 查看IP地址 1.3 域名和端口1.4 网络协议1.5 TCP与UDP1.6 InetAddress类1.7 Socket 二、TCP网络通信编程2.1 介绍2.2 案例2.2.1 字节流编程案例12.2.2 字节流编程案例22.2.3 字符流编…

【面试HOT200】回溯篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot300】进行的&#xff0c;每个知识点的修正和深入主要参…