AX7A200教程(8): HDMI输入和输出显示1080p视频

文章目录

本章节主要将hdmi输入的1080p视频通过ddr3缓存,然后通过hdmi输出口输出到显示屏上显示

一, 突发读写命令

设置读写突发长度为64

//parameter defineparameter  WRITE_LENGTH = 64;parameter  READ_LENGTH = 64;parameter  IDLE        = 3'd0;            //空闲状态parameter  WRITE       = 3'd1;            //写状态parameter  WRITE_DONE  = 3'd2;            //读到写过度等待parameter  READ        = 3'd3;            //读状态parameter  READ_DONE   = 3'd4;

1.突发写命令

当写fifo计数器rd_data_count计数大于62,执行一次写突发命令,拉高wr_len_en

    //突发写使能always@(posedge ui_clk or negedge i_rst_n)beginif(!i_rst_n)wr_len_en    <=  1'd0;    else if(ddr_wr_end)wr_len_en    <=  1'd0;    else if(rd_len_en)wr_len_en    <=  1'd0;    else if(wr_len_done)wr_len_en    <=  1'd0;                             else if(rd_data_count >= 9'd62)wr_len_en    <=  1'd1;                        end 

2.突发读命令

当读fifo计数器wr_data_count小于等于64执行一次读突发命令,拉高rd_len_en

//突发读使能always@(posedge ui_clk or negedge i_rst_n)beginif(!i_rst_n)rd_len_en    <=  1'd0;else if(ddr_rd_end)rd_len_en    <=  1'd0;            else if(wr_len_en)rd_len_en    <=  1'd0;     else if(rd_len_done)rd_len_en    <=  1'd0;                 else if(ddr_rd_en && wr_data_count <= 9'd64)rd_len_en    <=  1'd1;                     end  

从上面的读突发命令可以看出来,读突发命令rd_len_en拉高,需要fifo计数器wr_data_count小于等于64和ddr_rd_en为高才行。因读突发设置的fifo读计数器wr_data_count小于等于64才触发,开发板上电后,ddr初始化后ddr里这时并没有数据,但如果直接设置读fifo小于等于64触发,那么这时进行的突发读将会读到的是ddr里面的随机值,因为此时突发读是先开始执行的,所以加入ddr_rd_en这个信号,当ddr_rd_en拉高才能使能突发读,ddr_rd_en信号需要输入的hdmi的场信号vs计数为3开始拉高ddr_rd_en这个信号,也就是ddr写入三个帧存才开始ddr突发读。

3.突发读使能信号

将hdmi输入的vs_in场信号打拍,每次上升沿计数,当计数到3时开始拉高start_en信号

reg vs_r; 
reg [2:0] count;  
always@(posedge clk or negedge rst)beginif(!rst)    vs_r    <=  1'b0;elsevs_r    <=  vs_in;
end                always@(posedge clk or negedge rst)beginif(!rst)    count    <=  3'd0;else if(count == 3'd3)count    <=  count;    else if(vs_in && !vs_r)count    <=  count + 1'b1;
endassign  start_en = (count == 3'd3)? 1'b1:1'b0;

可以看到start_en信号直接连接ddr_rd_en

  ddr_test ddr_test_inst (// Memory interface ports.ddr3_addr                      (ddr3_addr),  // output [13:0]		ddr3_addr.ddr3_ba                        (ddr3_ba),  // output [2:0]		ddr3_ba.ddr3_cas_n                     (ddr3_cas_n),  // output			ddr3_cas_n.ddr3_ck_n                      (ddr3_ck_n),  // output [0:0]		ddr3_ck_n.ddr3_ck_p                      (ddr3_ck_p),  // output [0:0]		ddr3_ck_p.ddr3_cke                       (ddr3_cke),  // output [0:0]		ddr3_cke.ddr3_ras_n                     (ddr3_ras_n),  // output			ddr3_ras_n.ddr3_reset_n                   (ddr3_reset_n),  // output			ddr3_reset_n.ddr3_we_n                      (ddr3_we_n),  // output			ddr3_we_n.ddr3_dq                        (ddr3_dq),  // inout [31:0]		ddr3_dq.ddr3_dqs_n                     (ddr3_dqs_n),  // inout [3:0]		ddr3_dqs_n.ddr3_dqs_p                     (ddr3_dqs_p),  // inout [3:0]		ddr3_dqs_p.ddr3_cs_n                      (ddr3_cs_n),  // output [0:0]		ddr3_cs_n.ddr3_dm                        (ddr3_dm),  // output [3:0]		ddr3_dm.ddr3_odt                       (ddr3_odt),  // output [0:0]		ddr3_odt.init_calib_complete            (init_calib_complete),// System Clock Ports.sys_clk_i                      (clk_out2),.sys_rst                        (rst_n), // input sys_rst//fifo.wr_clk                         (vin_clk),.rd_clk                         (video_clk),.write_fifo_wr_en               (vin_de),.write_fifo_din                 ({8'd0,vin_data[23:0]}),.read_fifo_rd_en                (read_en),.read_fifo_dout                 (read_data),.read_fifo_empty                (read_fifo_empty),.read_valid                     (read_valid),.ddr_rd_en                      (start_en),.vin_vs                         (vin_vs),.vout_vs                        (read_req),.rd_reset                       (read_req_ack)    ); 

二,fifo读写复位信号 

1.写fifo复位信号

hdmi输入的场信号vin_vs检测到上升沿,拉高wr_reset信号用于写fifo复位

always@(posedge ui_clk or negedge rst_n)beginif(!rst_n)beginwr_load_r0   <=  1'd0;wr_load_r1   <=  1'd0;endelse beginwr_load_r0   <=  vin_vs;wr_load_r1   <=  wr_load_r0;end
end always@(posedge ui_clk or negedge rst_n)beginif(!rst_n)wr_reset   <=  1'd0;else if(wr_load_r0 && !wr_load_r1)wr_reset   <=  1'd1;else if(app_addr_wr == 0 && !(wr_load_r0 && !wr_load_r1))    wr_reset   <=  1'd0;
end

2.读fifo复位信号

hdmi输出的场信号vout_vs检测到上升沿,拉高rd_reset信号用于读fifo复位

always@(posedge ui_clk or negedge rst_n)beginif(!rst_n)beginrd_load_r0   <=  1'd0;rd_load_r1   <=  1'd0;endelse begin rd_load_r0   <=  vout_vs;rd_load_r1   <=  rd_load_r0;end
endalways@(posedge ui_clk or negedge rst_n)beginif(!rst_n)rd_reset   <=  1'd0;else if(rd_load_r0 && !rd_load_r1)rd_reset   <=  1'd1;else if(app_addr_rd == 0 && !(rd_load_r0 && !rd_load_r1))    rd_reset   <=  1'd0;
end 

三,帧缓存切换

从下面的ddr手册可以看出,ddr一共有8个bank,也就是这个ddr一共可以缓存8页

而且地址是[14:0],注意这里在mig选ddr型号的时候一定要注意ddr的地址务必要选[14:0]或者以上,不然就只能操作一个帧缓存,我前面的工程都是[13:0],即使写了多帧,也只能操作一帧,目前这个工程是[14:0],按照ddr手册可以最大操作8个帧存 ,当然具体可以操作多少个帧存也和mig控制器有关,如果ddr最大帧存有8个,那我们操作8个帧存或者8个以下的帧存都是可以,当然mig也必须配置相应的帧存个数,如果我们的帧存为4个那么只能操作4个或者以下的,即使你的mig设置为8个帧存,那么能操作的最大的也只能是4个,帧存说白了就是ddr的bank数。

1.mig控制器帧设置 

 bank数量设置,ddr最大的bank数为8,我们这里设置为4表示最大能操作4个帧存,也就是0,1,2,3这四页

 2.ddr写帧缓存切换

将hdmi输入的场信号vin_vs的上升沿做为计数信号,每次检测到上升沿就直接加1,因wr_page位宽为[1:0],也就是两个位宽,所以ddr写帧存在0,1,2,3之间切换

always@(posedge ui_clk or negedge rst_n)beginif(!rst_n)beginwr_load_r0   <=  1'd0;wr_load_r1   <=  1'd0;endelse beginwr_load_r0   <=  vin_vs;wr_load_r1   <=  wr_load_r0;end
end always @(posedge ui_clk or negedge rst_n) beginif(!rst_n)wr_page    <=  2'd0;else if(wr_load_r0 && !wr_load_r1)wr_page    <=  wr_page + 1'b1;
end

3.ddr读帧缓存切换

将hdmi输出的场信号的上升沿做为计数信号,每次检测到上升沿直接将当前读ddr帧存减1,这样做的目的,就是为了让读和写不在同一个帧存,避免图像有撕裂现象(一般显示撕裂也不明显,单帧也是可以的,但为了显示效果建议还是不要在同一个帧存进行)

always@(posedge ui_clk or negedge rst_n)beginif(!rst_n)beginrd_load_r0   <=  1'd0;rd_load_r1   <=  1'd0;endelse begin rd_load_r0   <=  vout_vs;rd_load_r1   <=  rd_load_r0;end
endalways @(posedge ui_clk or negedge rst_n) beginif(!rst_n)rd_page    <=  2'd0;else if(rd_load_r0 && !rd_load_r1)rd_page    <=  wr_page - 1'b1;
end

从ddr手册看,行地址宽度是[14:0],列地址宽度为[9:0],所以ddr的寻址空间为[24:0],所以帧存控制管脚BA0,BA1,BA2,为ddr地址里25,26,27这三个管脚,2^3=8所以最大寻址控制为0~7一共8个帧存,又因我们上面mig控制器设置的是4,所以将ddr寻址的27这个管脚设置为0,直接使用25,26两个管脚来进行帧存切换,一共有0,1,2,3这样四种帧存切换,如下图所示。

hdmi输入和输出显示工程截图如下所示

工程看起来也不是很多,将黑金的hdmi输入和输出工程的axi的ddr控制全部去掉,然后把ddr读写这部分放进去,两个hdmi输入和输出的iic配置都是使用黑金的代码,ddr缓存使用前面的工程文件

四,硬件连接

hdmi输入接机箱,hdmi输出接显示屏

 五,显示效果

手机不行,只能拍出这种效果了,实际显示还是很清晰的

  工程下载链接:链接:链接:https://pan.baidu.com/s/1_3o0YiaL7cE_9mjd9fy6GQ  提取码:4clr

如若转载,请注明出处

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

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

相关文章

C#实现结构体与字节流的相互转化

unity项目中&#xff0c;涉及到与C的相互通信&#xff0c;而通信接口为C封好的动态库。所以&#xff0c;传输信息时&#xff0c;需要向C端发送字节流信息。 对此&#xff0c;需将结构体数据转为字节流&#xff0c;其代码如下&#xff1a; public static byte[] StructToBytes(…

如何用DHTMLX组件为Web应用创建甘特图?(二)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一&#xff0c;DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…

Kotlin基础(十):函数进阶

前言 本文主要讲解kotlin函数&#xff0c;之前系列文章中提到过函数&#xff0c;本文是kotlin函数的进阶内容。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 函数基本用法 Kotlin 是一种现代的静态类型编程语言&#xff0c;它在函数的定义和使用上有一些特点…

什么是互斥锁?怎么运用互斥锁?

1、什么是互斥锁&#xff1f; 互斥锁是&#xff08;Mutex&#xff09;是一种用于多线程编程的同步原语&#xff0c;用于确保在多个线程访问共享资源时的互斥性。 在多线程环境中&#xff0c;当多个线程同时访问共享资源时&#xff0c;可能会导致数据的竞争和不一致问题。为了…

国家之间的标准的语言代码

当涉及到标准的语言代码时&#xff0c;以下是一些常见的国家/地区与其对应的语言代码&#xff1a; 美国英语&#xff1a;en-US英国英语&#xff1a;en-GB加拿大英语&#xff1a;en-CA澳大利亚英语&#xff1a;en-AU法国法语&#xff1a;fr-FR德国德语&#xff1a;de-DE中国普通…

改造 ChatGPT-Next-Web 项目重新生成 Docker 镜像

改造 ChatGPT-Next-Web 项目重新生成 Docker 镜像 0.背景1. 修改代码2. 生成 Docker 镜像3. 上传 Docker 镜像4. 运行 Docker 镜像 0.背景 需要通过 ChatGPT-Next-Web 使用自己搭建的 OpenAI API 兼容的服务器&#xff0c;需要对 ChatGPT-Next-Web 项目的少量代码进行改造。 …

无人机自动返航的关键技术有哪些

无人机的广泛应用使得无人机自动返航技术变得至关重要。在各种应对意外情况的背景下&#xff0c;无人机自动返航技术的发展对确保无人机的安全&#xff0c;以及提高其应用范围具有重要意义。接下来&#xff0c;便为大家详细介绍无人机自动返航所运用到的关键技术。 一、定位与导…

20230802-下载jdk1.8、jre

搜索oracle oracle官网 https://www.oracle.com/cn/

ulog记录(RTTulog部分)

ulog.h int ulog_init(void); int ulog_async_init(void); void ulog_output_lock_enabled(rt_bool_t enabled); void ulog_deinit(void); log初始化、异步初始化、输出锁初始化、log反初始化&#xff1b; #define LOG_E(...) ulog_e(LOG_TAG, __VA_ARGS…

13-1_Qt 5.9 C++开发指南_多线程及QThread 创建多线程程序_ThreadSignal

一个应用程序一般只有一个线程&#xff0c;一个线程内的操作是顺序执行的&#xff0c;如果有某个比较消耗时间的计算或操作&#xff0c;比如网络通信中的文件传输&#xff0c;在一个线程内操作时&#xff0c;用户界面就可能会冻结而不能及时响应。这种情况下&#xff0c;可以创…

如何看待低级爬虫与高级爬虫?

爬虫之所以分为高级和低级&#xff0c;主要是基于其功能、复杂性和灵活性的差异。根据我总结大概有下面几点原因&#xff1a; 功能和复杂性&#xff1a;高级爬虫通常提供更多功能和扩展性&#xff0c;包括处理复杂页面结构、模拟用户操作、解析和清洗数据等。它们解决了开发者…

C++ 通过time.windows.com获取时间

C++ 通过time.windows.com获取时间 在C++中,你可以使用 <ctime>头文件中的 time()函数来获取当前的系统时间。然后,你可以使用 <ctime>头文件中的 localtime()函数将时间转换为本地时间,并从中获取小时、分钟和秒。 以下是一个示例代码,演示如何通过time.windo…

关于hardcoded账号和密码的问题的想法

在编写应用程序时&#xff0c;都会访问一些存储系统获取相关的信息。最简单的例子就是用户登录&#xff0c;需要访问存储的用户和密码&#xff0c;进而可以验证用户是否可以正常登录。为了访问数据库各种框架结构也都提供了相应的方法和接口支持。但是&#xff0c;程序员在实现…

ctfshow----php特性(89-104)

目录 web89 preg_match函数 、数组 web90 intval()函数、强比较 web91 正则修饰符 web92 intval()函数、弱比较 web93 八进制、小数点 web94 strpos() 函数、小数点 web95 小数点 web96 highlight_file() 下的目录路径 web97 数组 web98 三目运算符 web9…

金融翻译难吗,如何做好金融翻译?

我们知道&#xff0c;金融翻译涉及企业经济这块的&#xff0c;是影响各公司发展很重要的一方面&#xff0c;翻译做得好&#xff0c;可以促进公司内外的交流&#xff0c;及时掌握各种信息&#xff0c;做好应对。那么&#xff0c;金融翻译难吗&#xff0c;如何做好金融翻译&#…

MySQL 极速安装使用与卸载

目录 mysql-5.6.51 极速安装使用与卸载 sqlyog工具 mysql简化 mysql-8.1.0下载配置 再完善 mysql-5.6.51 极速安装使用与卸载 mysql-8.1.0下载安装在后 mysql中国官网 MySQLhttps://www.mysql.com/cn/ 点击MySQL社区服务器 点击历史档案 下载完 解压 用管理员运行cmd&a…

腾讯云从业者认证考试考点——云网络产品

文章目录 腾讯云网络产品功能网络产品概述负载均衡&#xff08;Cloud Load Balancer&#xff09;私有网络&#xff08;Virtual Private Cloud&#xff0c;VPC&#xff09;专线接入弹性网卡&#xff08;多网卡热插拔服务&#xff09;NAT网关&#xff08;NAT Gateway&#xff09;…

打破常规:用PowerShell批量转换.thm文件

如果你使用数字相机拍摄照片&#xff0c;那么你可能会发现在每个文件夹中都有与照片对应的缩略图文件&#xff0c;它们的扩展名通常是.thm。虽然这些文件可以帮助你快速浏览和查找照片&#xff0c;但在某些情况下&#xff0c;你可能希望将它们转换为JPEG格式&#xff0c;以便更…

「AIGC」智能美学,AI绘画 API 激发无限创意

引言 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI绘画 API 正在以惊人的速度改变艺术创作的面貌。它不仅为艺术家和创作者提供了全新的创作工具&#xff0c;还激发了无限的创意和想象力。在这个智能美学的时代&#xff0c;让我们一起探索 AI 绘画 AP…

客服如何通过微信接收消息通知-唯一客服文档中心

当我们在自己网站上嵌入对接了客服代码&#xff0c;我们想要通过微信接收访客的消息提醒通知&#xff0c;可以通过扫描客服后台的微信二维码&#xff0c;即时收消息通知提醒。 我们网站地址&#xff1a;gofly.v1kf.com 客服后台 后台主页面板&#xff0c;就展示了一个微信二维码…