跳转至

基础 -6-HDMI 显示

3062 个字 331 行代码 16 张图片 预计阅读时间 14 分钟

章节导读

随着多媒体技术的快速发展,高清显示已成为嵌入式系统与 FPGA 应用中不可或缺的一部分。HDMI(High-Definition Multimedia Interface)作为目前最主流的视频数字传输标准,广泛应用于电视、显示器、笔记本、摄像头等各类终端设备中。相比传统的模拟 VGA 接口,HDMI 具有传输带宽高、支持音视频同步、无压缩信号传输等优点,能更好地满足现代图像处理和显示系统的需求。

FPGA 开发中,掌握 HDMI 显示技术不仅是实现图像 / 视频输出的基础能力,更是后续图像识别、视频监控、图形用户界面(GUI)等复杂系统设计的前提。因此,本实验以 HDMI 显示为核心内容,带领大家从零开始构建一个完整的视频输出链路。通过配置显示参数、生成时序控制信号、输出 RGB 图像数据等关键步骤,最终实现在 HDMI 接口上稳定输出画面。

在本次实验中我们将学习利用实验板的 HDMI 接口和 MS7210 芯片,进行 HDMI 显示实验的设计。

理论学习

VGA 时序

VGA 显示是在行同步和帧同步(场同步)的信号同步下,按照从上到下,从左到右的顺序,扫描到显示屏上。VGA 扫描方式见下图所示:

VGA扫描顺序

Figure 1. VGA 扫描顺序

如上图所示,每一帧图像都是从左上角开始,逐行扫描形成,所以规定最左上角的像素点为第一个像素点,坐标是(0,0,以这个像素为起点,向右 x 坐标逐渐增大,向下 y 坐标逐渐增大,重复若干次后扫描到右下角完成一帧图像的扫描,扫描完成后进行图像消隐,随后指针跳回左上角重新进行新一帧的扫描。

在扫描的过程中会对每一个像素点进行单独赋值,使每个像素点显示对应色彩信息,当扫描速度足够快,加之人眼的视觉暂留特性,我们会看到一幅完整的图片,这就是 VGA 显示的原理。

VGA 显示除了要有像素点的信息,还需要有行同步(HSync)和场同步(VSync)两个信号辅助显示。行同步信号规定了一行像素的开始与结束,场同步信号规定了一帧图像的开始与结束。在 VESA DMT 1.12 版本的标准文档中给出的 VGA 时序图如下图所示:

VGA标准时序

Figure 2. VGA 标准时序

行同步时序如下图所示:

行同步时序

Figure 3. 行同步时序

行同步的一个扫周期要经过 6 个部分,分别是 Sync(同步、 Back Porch(后沿、 Left Border(左边框、 “Addressable” Video(有效图像、 Right Border(右边框、 Front Porch(前沿,这些过程的长度都是以像素为单位的,也就是以像素时钟为单位,例如 Sync 的值为 96,也就意味着 Sync 阶段要经历 96 个像素时钟。HSync 信号会在 Sync 同步阶段拉高(不同的芯片可能有不同标准)以确定新一行的开始与上一行的结束。而完整的一行像素很多,但有效的真正能显示在屏幕上的像素只有 “Addressable” Video(有效图像)部分的像素,其他阶段的像素均无效,无法显示在屏幕中。

场同步时序如下图所示:

场同步时序

Figure 4. 场同步时序

场同步时序与行同步时序相同,也是分为 6 个部分,在 Sync 同步阶段拉高,标志着一帧的结束和新一帧的开始,其中像素只有在“Addressable” Video(有效图像)阶段才有效,其他阶段均无效。而场同步信号的基本单位是行,比如 Sync 的值为 2,也就意味着 Sync 同步阶段要经历两行。

那么我们将行同步和场同步信号结合起来,遍可以得到一帧图像的样貌,如下图所示:

一帧图像组成示意图

Figure 5. 一帧图像组成示意图

可以看到在行场同步信号构成了一个二维坐标系,原点在左上方,中间遍形成了一帧图像,而真正能显示在屏幕中的图像只有 “Addressable” Video(有效图像)部分。

现在我们知道了行同步和场同步都要经历 6 个部分,那么这些部分的长度都是如何规定的呢?VGA 行时序对行同步时间、 消隐时间、 行视频有效时间和行前肩时间有特定的规范, 场时序也是如此。 常用 VGA 分辨率时序参数如下表所示:

常用VGA分辨率时序参数

Table 1. 常用 VGA 分辨率时序参数

MS7210 芯片

MS7210 是一款 HD 发送芯片,支持 4K@30Hz 的视频 3D 传输格式。可以支持的最高分辨率高达 4K@30Hz,最高采样率达到 300MHzMS7210 支持 YUV RGB 之间的色彩空间转换,数字接口支持 YUV 以及 RGB 格式输入。MS7210 IIS 接口以及 S/PDIF 接口支持高清音频的传输,其中 S/PDIF 接口既可以兼容 IEC61937 标准下的压缩音频传输,同时还支持高比特音频(HBR)的传输,在高比特音频(HBR)模式下,音频采样率最高为 768KHzMS7210 IIC 地址可以根据 SA 引脚进行选择。当 SA 引脚上拉到电源电压或者悬空时,地址为 OxB2。当 SA 引脚连接到 GND 时,地址为 0x56

MS7210芯片

Figure 6. MS7210 芯片

MS7210功能框图

Figure 7. MS7210 功能框图

MS7210 芯片可以通过 IIC 协议对内部寄存器进行配置,有关芯片寄存器配置需要向芯片厂家进行申请。

实战演练

实验目标

硬件资源

实验板共有一个 HDMI-OUT 接口,由 MS7210 驱动,一个 HDMI-IN 接口,由 MS7200 驱动。

板载HDMI芯片

Figure 8. 板载 HDMI 芯片

实验箱配备一个小型 HDMI 显示器,该显示器 HDMI 接口与 HDMI-OUT 接口连接,图像可以显示在显示屏中,通过摄像头可以在网站观察现象

实验箱显示器

Figure 9. 实验箱显示器

程序设计

在设计程序时,我们先对本实验工程有一个整体认知,首先来看一下 HDMI 彩条显示实验的整体框图。

HDMI彩条显示整体框图

Figure 10. HDMI 彩条显示整体框图

可见整个实验一共由好多个模块组成,下面是各个模块简介:

模块名称 功能描述 备注
hdmi_top 顶层模块
ms7210_ctrl_iic_top ms7210 芯片配置和 iic 顶层模块 参考小眼睛例程
ms7210_ctl ms7210 芯片配置和时序控制模块 使用小眼睛例程
iic_dri iic 驱动模块 使用小眼睛例程
vga_ctrl vga 时序信号生成模块 参考野火例程
vga_pic vga 像素数据生成模块 参考野火例程

Table 2. HDMI 彩条显示模块简介表

本次实验主要完成 vga_ctrl vga_pic 模块的设计。

对于 vga_ctrl 模块,我们主要完成 hsyncvsync 信号,xy 坐标,数据有效 rgb_valid 信号的设计。经过我们前面的学习已经对 vga 时序有了一定的了解,我们可以想象到这几个信号也只是一种计数器而已。

本实验要实现 640x480 的彩条显示,相关参数如下所示:

Verilog
//parameter define
parameter H_SYNC    =   10'd96  ,   //行同步
          H_BACK    =   10'd40  ,   //行时序后沿
          H_LEFT    =   10'd8   ,   //行时序左边框
          H_VALID   =   10'd640 ,   //行有效数据
          H_RIGHT   =   10'd8   ,   //行时序右边框
          H_FRONT   =   10'd8   ,   //行时序前沿
          H_TOTAL   =   10'd800 ;   //行扫描周期
parameter V_SYNC    =   10'd2   ,   //场同步
          V_BACK    =   10'd25  ,   //场时序后沿
          V_TOP     =   10'd8   ,   //场时序上边框
          V_VALID   =   10'd480 ,   //场有效数据
          V_BOTTOM  =   10'd8   ,   //场时序下边框
          V_FRONT   =   10'd2   ,   //场时序前沿
          V_TOTAL   =   10'd525 ;   //场扫描周期

首先设计两个计数器cnt_hcnt_v分别对像素和行进行计数,一个像素时钟过后cnt_h加一,一行过后cnt_v加一,扫描完一帧之后,计数器归零。

而其他的状态信号则可以根据计数器的计数进行设计。hsync 信号只要cnt_h < H_SYNC就拉高,vsync 信号类似。当计数到有效数据部分数据有效信号 rgb_valid 就可以拉高,注意,由于时序逻辑有一个时钟周期的反应时间,所以 xy 的坐标变化比 rgb_valid 提前一个时钟周期。参考代码如下所示:

Verilog
`timescale  1ns/1ns
////////////////////////////////////////////////////////////////////////
// Author        : EmbedFire
// 实验平台: 野火FPGA系列开发板
// 公司    : http://www.embedfire.com
// 论坛    : http://www.firebbs.cn
// 淘宝    : https://fire-stm32.taobao.com
////////////////////////////////////////////////////////////////////////

module  vga_ctrl
(
    input   wire            vga_clk     ,   //输入工作时钟,频率25MHz
    input   wire            sys_rst_n   ,   //输入复位信号,低电平有效
    input   wire    [15:0]  pix_data    ,   //输入像素点色彩信息

    output  wire    [11:0]  pix_x       ,   //输出VGA有效显示区域像素点X轴坐标
    output  wire    [11:0]  pix_y       ,   //输出VGA有效显示区域像素点Y轴坐标
    output  wire            hsync       ,   //输出行同步信号
    output  wire            vsync       ,   //输出场同步信号
    output  wire            rgb_valid   ,
    output  wire    [15:0]  rgb             //输出像素点色彩信息
);

//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//parameter define
parameter H_SYNC    =   10'd96  ,   //行同步
          H_BACK    =   10'd40  ,   //行时序后沿
          H_LEFT    =   10'd8   ,   //行时序左边框
          H_VALID   =   10'd640 ,   //行有效数据
          H_RIGHT   =   10'd8   ,   //行时序右边框
          H_FRONT   =   10'd8   ,   //行时序前沿
          H_TOTAL   =   10'd800 ;   //行扫描周期
parameter V_SYNC    =   10'd2   ,   //场同步
          V_BACK    =   10'd25  ,   //场时序后沿
          V_TOP     =   10'd8   ,   //场时序上边框
          V_VALID   =   10'd480 ,   //场有效数据
          V_BOTTOM  =   10'd8   ,   //场时序下边框
          V_FRONT   =   10'd2   ,   //场时序前沿
          V_TOTAL   =   10'd525 ;   //场扫描周期

//wire  define
wire            pix_data_req    ;   //像素点色彩信息请求信号

//reg   define
reg     [11:0]  cnt_h           ;   //行同步信号计数器
reg     [11:0]  cnt_v           ;   //场同步信号计数器

//********************************************************************//
//***************************** Main Code ****************************//
//********************************************************************//

//cnt_h:行同步信号计数器
always@(posedge vga_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt_h   <=  12'd0   ;
    else    if(cnt_h == H_TOTAL - 1'd1)
        cnt_h   <=  12'd0   ;
    else
        cnt_h   <=  cnt_h + 1'd1   ;

//hsync:行同步信号
assign  hsync = (cnt_h  <=  H_SYNC - 1'd1) ? 1'b1 : 1'b0  ;

//cnt_v:场同步信号计数器
always@(posedge vga_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt_v   <=  12'd0 ;
    else    if((cnt_v == V_TOTAL - 1'd1) &&  (cnt_h == H_TOTAL-1'd1))
        cnt_v   <=  12'd0 ;
    else    if(cnt_h == H_TOTAL - 1'd1)
        cnt_v   <=  cnt_v + 1'd1 ;
    else
        cnt_v   <=  cnt_v ;

//vsync:场同步信号
assign  vsync = (cnt_v  <=  V_SYNC - 1'd1) ? 1'b1 : 1'b0  ;

//rgb_valid:VGA有效显示区域
assign  rgb_valid = (((cnt_h >= H_SYNC + H_BACK + H_LEFT)
                    && (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID))
                    &&((cnt_v >= V_SYNC + V_BACK + V_TOP)
                    && (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))
                    ? 1'b1 : 1'b0;

//pix_data_req:像素点色彩信息请求信号,超前rgb_valid信号一个时钟周期
assign  pix_data_req = (((cnt_h >= H_SYNC + H_BACK + H_LEFT - 1'b1)
                    && (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID - 1'b1))
                    &&((cnt_v >= V_SYNC + V_BACK + V_TOP)
                    && (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))
                    ? 1'b1 : 1'b0;

//pix_x,pix_y:VGA有效显示区域像素点坐标
assign  pix_x = (pix_data_req == 1'b1)
                ? (cnt_h - (H_SYNC + H_BACK + H_LEFT - 1'b1)) : 12'hfff;
assign  pix_y = (pix_data_req == 1'b1)
                ? (cnt_v - (V_SYNC + V_BACK + V_TOP)) : 12'hfff;

//rgb:输出像素点色彩信息
assign  rgb = (rgb_valid == 1'b1) ? pix_data : 16'b0 ;

endmodule

对于 vga_pic 模块,我们可以根据 x 坐标范围(0~639)分成十份,每一份输出不同的颜色。参考代码如下所示:

Verilog
`timescale  1ns/1ns
////////////////////////////////////////////////////////////////////////
// Author        : EmbedFire
// 实验平台: 野火FPGA系列开发板
// 公司    : http://www.embedfire.com
// 论坛    : http://www.firebbs.cn
// 淘宝    : https://fire-stm32.taobao.com
////////////////////////////////////////////////////////////////////////

module  vga_pic
(
    input   wire            vga_clk     ,   //输入工作时钟,频率25MHz
    input   wire            sys_rst_n   ,   //输入复位信号,低电平有效
    input   wire    [11:0]  pix_x       ,   //输入VGA有效显示区域像素点X轴坐标
    input   wire    [11:0]  pix_y       ,   //输入VGA有效显示区域像素点Y轴坐标

    output  reg     [15:0]  pix_data        //输出像素点色彩信息
);

//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//parameter define
parameter   H_VALID =   12'd640 ,   //行有效数据
            V_VALID =   12'd480 ;   //场有效数据

parameter   RED     =   16'hF800,   //红色
            ORANGE  =   16'hFC00,   //橙色
            YELLOW  =   16'hFFE0,   //黄色
            GREEN   =   16'h07E0,   //绿色
            CYAN    =   16'h07FF,   //青色
            BLUE    =   16'h001F,   //蓝色
            PURPPLE =   16'hF81F,   //紫色
            BLACK   =   16'h0000,   //黑色
            WHITE   =   16'hFFFF,   //白色
            GRAY    =   16'hD69A;   //灰色

//********************************************************************//
//***************************** Main Code ****************************//
//********************************************************************//
//pix_data:输出像素点色彩信息,根据当前像素点坐标指定当前像素点颜色数据
always@(posedge vga_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        pix_data    <= 16'd0;
    else    if((pix_x >= 0) && (pix_x < (H_VALID/10)*1))
        pix_data    <=  RED;
    else    if((pix_x >= (H_VALID/10)*1) && (pix_x < (H_VALID/10)*2))
        pix_data    <=  ORANGE;
    else    if((pix_x >= (H_VALID/10)*2) && (pix_x < (H_VALID/10)*3))
        pix_data    <=  YELLOW;
    else    if((pix_x >= (H_VALID/10)*3) && (pix_x < (H_VALID/10)*4))
        pix_data    <=  GREEN;
    else    if((pix_x >= (H_VALID/10)*4) && (pix_x < (H_VALID/10)*5))
        pix_data    <=  CYAN;
    else    if((pix_x >= (H_VALID/10)*5) && (pix_x < (H_VALID/10)*6))
        pix_data    <=  BLUE;
    else    if((pix_x >= (H_VALID/10)*6) && (pix_x < (H_VALID/10)*7))
        pix_data    <=  PURPPLE;
    else    if((pix_x >= (H_VALID/10)*7) && (pix_x < (H_VALID/10)*8))
        pix_data    <=  BLACK;
    else    if((pix_x >= (H_VALID/10)*8) && (pix_x < (H_VALID/10)*9))
        pix_data    <=  WHITE;
    else    if((pix_x >= (H_VALID/10)*9) && (pix_x < H_VALID))
        pix_data    <=  GRAY;
    else
        pix_data    <=  BLACK;

endmodule

在顶层模块,我们首先要利用 PLL ip 核生成 iic 的驱动时钟进行初始化,由于 ms7210 芯片的需要,我们通过计数设置一个延迟复位信号,由于我们的彩条颜色是按照 RGB565 格式生成的,所以需要向 RGB888 进行转换,只需要填 0 补位即可,同时由于板载时钟是 27M 25.175M 相差不大,所以直接使用板载时钟作为像素时钟输出。然后我们将输出的行场同步信号,像素时钟,像素数据,像素数据有效信号等与模块相连接即可完成设计。顶层模块参考代码如下:

Verilog
`timescale 1ns / 1ns
module hdmi_top(
    input wire          sys_clk       ,// input system clock 50MHz   
    input               rstn_in       , 
    output              rstn_out      ,
    output              hd_scl        ,
    inout               hd_sda        ,
    output              led_int       ,

//hdmi_out 
    output              pixclk_out    ,//pixclk                           
    output  wire        vs_out        , 
    output  wire        hs_out        , 
    output  wire        de_out        ,
    output  wire [7:0]  r_out         , 
    output  wire [7:0]  g_out         , 
    output  wire [7:0]  b_out         

);
wire                        cfg_clk    ;
wire                        locked     ;
wire                        rstn       ;
wire                        init_over  ;
reg  [15:0]                 rstn_1ms   ;
//**********************************************//
//*****************MS7210初始化******************//
//**********************************************//
//**************仿真时不编译此部分***************//
`ifndef SIM
//初始化成功标志
assign    led_int    =     init_over;
//生成10M IIC时钟
PLL u_pll (
  .clkout0(cfg_clk),    // output
  .lock(locked),          // output
  .clkin1(sys_clk)       // input
);
//ms7210初始化模块
ms7210_ctrl_iic_top ms7210_ctrl_iic_top_inst(
    .clk         (  cfg_clk    ), //input       clk,
    .rst_n       (  rstn_out   ), //input       rstn,

    .init_over   (  init_over  ), //output      init_over,
    .iic_scl     (  hd_scl    ), //output      iic_scl,
    .iic_sda     (  hd_sda    )  //inout       iic_sda
);
//延迟复位
always @(posedge cfg_clk)
begin
    if(!locked)
        rstn_1ms <= 16'd0;
    else
    begin
        if(rstn_1ms == 16'h2710)
            rstn_1ms <= rstn_1ms;
        else
            rstn_1ms <= rstn_1ms + 1'b1;
    end
end
assign rstn_out = (rstn_1ms == 16'h2710) && rstn_in;
//**********************************************//
`else
assign led_int  =     1;
assign rstn_out = rstn_in;

`endif
//**********************************************//
//**********************************************//
//**********************************************//
//**********************************************//
wire [15:0] rgb565;
wire [15:0] pix_data ;
wire [11:0] pix_x;
wire [11:0] pix_y;
//vga行场同步控制模块
vga_ctrl  vga_ctrl_inst (
    .vga_clk        (sys_clk        ),
    .sys_rst_n      (rstn_out       ),
    .pix_data       (pix_data       ),
    .pix_x          (pix_x          ),
    .pix_y          (pix_y          ),
    .hsync          (hs_out         ),
    .vsync          (vs_out         ),
    .rgb_valid      (de_out         ),
    .rgb            (rgb565         )
  );
//彩条数据生成模块
vga_pic  vga_pic_inst (
    .vga_clk        (sys_clk        ),
    .sys_rst_n      (rstn_out       ),
    .pix_x          (pix_x          ),
    .pix_y          (pix_y          ),
    .pix_data_out   (pix_data       )
  );
//RGB565转RGB888
    assign pixclk_out   =  sys_clk    ;//直接使用27M时钟,与25.175相差不大
    assign r_out = {rgb565[15:11],3'b0};
    assign g_out = {rgb565[10: 5],2'b0};
    assign b_out = {rgb565[ 4: 0],3'b0};
endmodule

仿真验证

由于仿真不需要对 MS7210 芯片进行初始化,所以我们在 top 文件中加入条件编译指令,并且在仿真文件中定义 SIM 宏,那么就可以在仿真中不编译 ms7210 初始化相关代码,只对 vga 时序进行仿真。我们只需要提供时钟和复位,即可对模块进行仿真。仿真文件如下所示:

Verilog
`timescale 1ns / 1ns
`define SIM
module hdmi_top_tb;

  // Parameters

  //Ports
  reg  sys_clk;
  reg rstn_in;
  wire rstn_out;
  wire hd_scl;
  wire hd_sda;
  wire led_int;
  wire pixclk_out;
  wire  vs_out;
  wire  hs_out;
  wire  de_out;
  wire [7:0] r_out;
  wire [7:0] g_out;
  wire [7:0] b_out;

  initial begin
    sys_clk = 0;
    rstn_in = 0;
    #100
    rstn_in = 1;
  end
  always #(500/27) sys_clk = ~sys_clk;
  hdmi_top  hdmi_top_inst (
    .sys_clk(sys_clk),
    .rstn_in(rstn_in),
    .rstn_out(rstn_out),
    .hd_scl(hd_scl),
    .hd_sda(hd_sda),
    .led_int(led_int),
    .pixclk_out(pixclk_out),
    .vs_out(vs_out),
    .hs_out(hs_out),
    .de_out(de_out),
    .r_out(r_out),
    .g_out(g_out),
    .b_out(b_out)
  );

endmodule

直接点击 sim 文件夹下 hebav 文件夹中的 do.bat 文件即可利用 ModuleSim 对模块进行仿真,仿真波形如下:

仿真波形(一)

Figure 11. 仿真波形(一)

从上图我们可以发现 vsync 信号拉高了两个行同步信号的长度,与设计相符

仿真波形(二)

Figure 12. 仿真波形(二)

仿真波形(三)

Figure 13. 仿真波形(三)

从图 11 12 中我们可以看到当 cnt_h 信号计数结束后会恢复 0cnt_v 会加一,hsync 信号会拉高 96 个像素时钟(0~95)cnt_h hsync 与设计相符。

仿真波形(四)

Figure 14. 仿真波形(四)

如图 13 所示,当 cnt_h 计数到 H_SYNC + H_BACK + H_LEFT,也就是 144 时,rgb_valid 拉高,xy 轴坐标比 rgb_valid 提前一个时钟周期,以便 pix_data 准备好数据,符合设计。

仿真波形(五)

Figure 15. 仿真波形(五)

从每一行看,每一行被分成了 10 个部分,每部分像素数据分别对应不同颜色,符合设计要求。可以进行下一步上板验证。

上板验证

仿真已经通过,可以进行上板验证,上板前要先进行管脚约束。端口与对应管脚如下表所示:

端口名称 信号类型 对应管脚 功能
sysclk Input D18 27M 时钟
rstn_in Input C22 外部输入复位
rstn_out Output G25 输出 ms7210 复位
hd_scl Output K22 iic SCL 信号
hd_sda Output K23 iic SDA 信号
led_int Output A20 配置完成信号
pixclk_out Output G25 像素时钟输出
vs_out Output R21 Vsync 输出
hs_out Output R20 Hsync 输出
de_out Output N19 RGB_valid 输出
r_out[0] Output N21 RGB888 输出
r_out[1] Output L23 RGB888 输出
r_out[2] Output L22 RGB888 输出
r_out[3] Output L25 RGB888 输出
r_out[4] Output L24 RGB888 输出
r_out[5] Output K26 RGB888 输出
r_out[6] Output K25 RGB888 输出
r_out[7] Output P16 RGB888 输出
g_out[0] Output T25 RGB888 输出
g_out[1] Output P25 RGB888 输出
g_out[2] Output R25 RGB888 输出
g_out[3] Output P24 RGB888 输出
g_out[4] Output P23 RGB888 输出
g_out[5] Output N24 RGB888 输出
g_out[6] Output N23 RGB888 输出
g_out[7] Output N22 RGB888 输出
b_out[0] Output P19 RGB888 输出
b_out[1] Output P21 RGB888 输出
b_out[2] Output P20 RGB888 输出
b_out[3] Output M22 RGB888 输出
b_out[4] Output M21 RGB888 输出
b_out[5] Output N18 RGB888 输出
b_out[6] Output R22 RGB888 输出
b_out[7] Output T22 RGB888 输出

Table 3. HDMI 彩条显示管脚表

管脚分配可以直接编写 .fdc 文件,也可以使用 PDS 内置的工具进行分配。完成管脚分配之后就可以生成 sbit 文件,将文件提交到网站后点击烧录,即可将 sbit 下载到实验板中,在摄像头页面即可观察到显示屏中显示出彩条。

章末总结

本次实验主要学习 VGA 时序的相关知识,并使用 HD 硬核进行 HDMI 显示,感兴趣的同学可以尝试使用 HDMI 显示其他图像。

评论