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,一经查实,立即删除!

相关文章

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

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

Kotlin基础(十):函数进阶

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

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

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

20230802-下载jdk1.8、jre

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

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

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

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

爬虫之所以分为高级和低级&#xff0c;主要是基于其功能、复杂性和灵活性的差异。根据我总结大概有下面几点原因&#xff1a; 功能和复杂性&#xff1a;高级爬虫通常提供更多功能和扩展性&#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;…

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

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

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

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

基于YOLOv5的S弯识别

基于YOLOv5的S弯识别 目录 基于YOLOv5的S弯识别技术背景算法介绍具体实现1、下载仓库2、配置环境3、数据处理4、转成engine文件5、使用代码实现识别 技术总结 技术背景 S弯识别是一个在自动驾驶和机器人领域中很常见的任务&#xff0c;它需要识别道路上的弯道&#xff0c;特别…

BUU CODE REVIEW 1

BUU CODE REVIEW 1 考点&#xff1a;PHP变量引用 源码直接给了 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->c…

Linux权限小结

Linux权限小结 权限的基本介绍 ls -l中显示的内容如下&#xff1a;drwxr-xr-x. 2 yinjun yinjun 87 8月 2 16:24 test&#xff0c;如下图所示 前十位介绍 其中&#xff0c;0-9位为drwxr-xr-x&#xff0c;其说明情况如下 第0位确定文件类型&#xff0c;包括d&#xff0c;-&a…

Linux —— 进程控制

目录 一&#xff0c;进程创建 写时拷贝 二&#xff0c;进程终止 三&#xff0c;进程等待 获取子进程status 一&#xff0c;进程创建 命令行启动命令&#xff08;程序、指令等&#xff09;&#xff1b;通过程序自身fork创建&#xff1b; #include<unistd.h> //子进程…

Spring Boot参数校验实现自定义响应类优雅处理

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Spring Boot参数校验实现自定义响应类优雅处理 ⏱️ 创作时间&#xf…

AnimateDiff论文解读-基于Stable Diffusion文生图模型生成动画

文章目录 1. 摘要2. 引言3. 算法3.1 Preliminaries3.2. Personalized Animation3.3 Motion Modeling Module 4. 实验5.限制6. 结论 论文&#xff1a; 《AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning》 github: https://g…

数据分析 VS 数据可视化:决战时刻

数据分析和数据可视化是数据科学领域中两个重要的组成部分&#xff0c;很多人不明白两者之间的关系&#xff0c;会误认为是一个东西&#xff0c;其实不然。本文就带大家简单了解一下它们的区别与联系吧&#xff01; 数据分析是指通过收集、处理和解释数据来获取有关特定问题或…

无涯教程-Lua - 嵌套if语句函数

在Lua编程中&#xff0c;您可以在另一个if or else if语句中使用一个if or else if语句。 nested if statements - 语法 嵌套if 语句的语法如下- if( boolean_expression 1) then--[ Executes when the boolean expression 1 is true --]if(boolean_expression 2)then--[ Ex…