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

这篇具有很好参考价值的文章主要介绍了AX7A200教程(8): HDMI输入和输出显示1080p视频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

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

AX7A200教程(8): HDMI输入和输出显示1080p视频,AX7A200,ddr3,mig控制器,fifo,fpga开发

一, 突发读写命令

设置读写突发长度为64

//parameter define
 parameter  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)begin
            if(!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)begin
            if(!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)begin
        if(!rst)    
            vs_r    <=  1'b0;
        else
            vs_r    <=  vs_in;
end                

always@(posedge clk or negedge rst)begin
        if(!rst)    
            count    <=  3'd0;
        else if(count == 3'd3)
            count    <=  count;    
        else if(vs_in && !vs_r)
            count    <=  count + 1'b1;
end

assign  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)begin
        if(!rst_n)begin
            wr_load_r0   <=  1'd0;
            wr_load_r1   <=  1'd0;
            end
        else begin
            wr_load_r0   <=  vin_vs;
            wr_load_r1   <=  wr_load_r0;
            end
end 

always@(posedge ui_clk or negedge rst_n)begin
        if(!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)begin
        if(!rst_n)begin
            rd_load_r0   <=  1'd0;
            rd_load_r1   <=  1'd0;
            end
        else begin 
            rd_load_r0   <=  vout_vs;
            rd_load_r1   <=  rd_load_r0;
            end
end

always@(posedge ui_clk or negedge rst_n)begin
        if(!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页

AX7A200教程(8): HDMI输入和输出显示1080p视频,AX7A200,ddr3,mig控制器,fifo,fpga开发

而且地址是[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数。

AX7A200教程(8): HDMI输入和输出显示1080p视频,AX7A200,ddr3,mig控制器,fifo,fpga开发

1.mig控制器帧设置 

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

AX7A200教程(8): HDMI输入和输出显示1080p视频,AX7A200,ddr3,mig控制器,fifo,fpga开发

 2.ddr写帧缓存切换

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

always@(posedge ui_clk or negedge rst_n)begin
        if(!rst_n)begin
            wr_load_r0   <=  1'd0;
            wr_load_r1   <=  1'd0;
            end
        else begin
            wr_load_r0   <=  vin_vs;
            wr_load_r1   <=  wr_load_r0;
            end
end 

always @(posedge ui_clk or negedge rst_n) begin
         if(!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)begin
        if(!rst_n)begin
            rd_load_r0   <=  1'd0;
            rd_load_r1   <=  1'd0;
            end
        else begin 
            rd_load_r0   <=  vout_vs;
            rd_load_r1   <=  rd_load_r0;
            end
end

always @(posedge ui_clk or negedge rst_n) begin
         if(!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这样四种帧存切换,如下图所示。

AX7A200教程(8): HDMI输入和输出显示1080p视频,AX7A200,ddr3,mig控制器,fifo,fpga开发

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

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

AX7A200教程(8): HDMI输入和输出显示1080p视频,AX7A200,ddr3,mig控制器,fifo,fpga开发

四,硬件连接

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

AX7A200教程(8): HDMI输入和输出显示1080p视频,AX7A200,ddr3,mig控制器,fifo,fpga开发

 五,显示效果

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

AX7A200教程(8): HDMI输入和输出显示1080p视频,AX7A200,ddr3,mig控制器,fifo,fpga开发

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

如若转载,请注明出处文章来源地址https://www.toymoban.com/news/detail-623567.html

到了这里,关于AX7A200教程(8): HDMI输入和输出显示1080p视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持

    FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持 FPGA实现SDI视频编解码目前有两种方案: 一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简单,比如GS2971接收器直接将SDI解码为并行的YCRCB,GS2972发送器直接将并行的YCRCB编码为SDI视频,缺点是

    2024年02月08日
    浏览(51)
  • RK356x之HDMI显示出现输出信号不稳定、花屏、出现红条纹现象

    芯片:rk356x系列 显示器: HDMI接口显示器 HDMI显示器接到控制板上可以显示,但是会出现时不时出现闪烁,红条纹(就好像之前我们家里大块电视上的条纹)。 猜想1:HDMI显示器可能坏了 猜想2: 电路板上的某些器件影响了HDMI输出信号 猜想3:HDMI线的长度也有可能导致信号输出不

    2024年02月12日
    浏览(42)
  • C语言:从键盘任意输入a,b,c的值,编程计算并输出一元二次方程ax2+bx+c=0的根

    C语言实战题目:【if-else条件分支语句】 从键盘任意输入a,b,c的值,编程计算并输出一元二次方程ax2+bx+c=0的根,当a=0时,输出“该方程不是一元二次方程”,当a≠0时,分b2−4ac0、b2−4ac=0、b2−4ac0三种情况计算并输出方程的根。 **输入格式要求:\\\"%f,%f,%f\\\" 提示信息:“Ple

    2023年04月26日
    浏览(71)
  • FPGA实现AD9708和AD9280波形收发输出HDMI模拟示波器,串口协议帧控制显示,提供工程源码和技术支持

    AD9708 很简单,8 位分辨率,125MSPS 采样率,输入参考电压3~5V,内置 1.2V 参考电压,8bit数字信号输入,差分电流输出;芯片操作不需要软件配置,给个时钟信号就工作,简单得很,根据官方手册,内部结构如下: SLEEP引脚提供芯片休眠功能,当不需要使用该芯片时可拉高SLEEP以

    2024年02月02日
    浏览(58)
  • 计算机组成原理-外部设备(输入 输出 显示器)

    键盘按键产生电信号,电信号翻译成主机能接收的编码 鼠标光电式是光传感器 分辨率前面是宽后面是高 灰度级:根据比特位的不同对应的像素点颜色不同 灰度级位数:每个像素点对应的位数 显示存储器:存储接下来要在显示器上面播放的一帧的图像的信息 帧缓存深度就是

    2024年02月02日
    浏览(52)
  • XILINX XC7A200T-2FBG676C PLC可编程逻辑控制器

    FPGA, Artix-7, MMCM, PLL, 400 I/O, 628 MHz, 215360单元, 950 mV至1.05 V, FCBGA-676 XILINX Artix®-7 FPGA系列是一款高性价比FPGA,提供高性能/功耗比, 高收发器线路速率, DSP处理,集成AMS。该系列具有MicroBlaze™软处理器, 支持1066Mb/s DDR3,是成本和功耗敏感应用的最佳选择,例如软件定义无线电

    2024年02月07日
    浏览(48)
  • VGA驱动原理(以1080p显示器为例)

    1080p显示器的刷新率是60Hz(每秒刷新67500/1125=60帧图像),行频率是67.5KHz(每秒刷新148500000/2200=67 500行),像素频率是148.5MHz(每秒刷新148 500 000个像素点) 1080p显示器的驱动时序如下图所示, HSync,VSync信号为正极性 下图是基于1920 x 1080@60Hz这个分辨率的具体时序参数表 对照时序参数

    2024年03月20日
    浏览(63)
  • 【STM32教程】第二章 通用输入输出口GPIO

    资料下载链接: 链接:https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwd=jauj  提取码:jauj    GPIO(General Purpose Input Output)意思是通用输入输出口可配置为8种输入输出模式,其引脚电平:0V~3.3V,部分引脚可容忍5V(容忍5V的意思是可以在这个端口输入5V,相当于输入一个高电平,而输

    2024年02月09日
    浏览(52)
  • HDMI 输出实验

    第十四章 HDMI 输出实验 FPGA通过HDMI编码芯片输出彩条。 开发板有一个HDMI编码芯片,ADV7511,将 24 位 RGB 编码输出 TMDS 差分信号。 本实验使用其将RGB24视频数据显示出来。 硬件原理图如下: 结合前面,从原理图(或者看手册,这里只是大致分析一下)上可以分析出: 编码输入

    2024年02月09日
    浏览(28)
  • 【Java基础教程】(四十四)IO篇 · 上:File类、字节流与字符流,分析字节输出流、字节输入流、字符输出流和字符输入流的区别~

    掌握 java.io包中类的继承关系 ; 掌握 File类的使用,并且可以通过File类进行文件的创建、删除以及文件夹的列表等操作; 掌握字节流或字符流操作文件内容,字节流与字符流的区别; 在 java.io 包中,如果要进行文件自身的操作 (例如:创建、删除等), 只能依靠 java.io.File 类完

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包