HDMI接口驱动设计验证

HDMI接口驱动设计验证在 hdmi 的规格书中规定了 4 种接口类型 即 Hdmiatype 接口 Hdmibtype 接口 Hdmictype 接口 Hdmidtype 接口

大家好,欢迎来到IT知识分享网。

前言

        HDMI接口,high definition multimedia interface 译为高清多媒体接口。相较于vga接口,  Vga接口成本低,结构简单,应用灵活,传输数据是模拟信号,模拟信号在传输时极易受到外界干扰,受到影响后容易产生数据信号畸变,导致输出图像出现问题,另外vga接口体积较大,不利于便携设备使用。针对缺点出现了dvi接口,DVI接口又分DVIA(只传输模拟信号),DVID(只传输数字信号),DVII(兼容模拟信号数字信号),传输协议使用TMDS(最小化传输差分信号),实现无损高清传输, DVI接口主要服务于pc机,对电视平板等只支持计算机领域的RGB数字信号,对于数字化的色差信号无法支持,体积大于VGA,也不适用于便携设备, Dvi接口只能传输图像,不能传输音频信号。之后出现HDMI接口,传输协议仍然使用TMDS编码技术,首先缩小了体积,抗干扰能力也增强,在20米之内实现无争议传输,大幅度优化了分辨率和兼容性,在同一根线缆上,可以实现数字信号与音频信号的同步传输,降低系统成本和复杂程度。

正文

一、HDMI接口驱动设计验证

        1.项目需求

基于FPGA设计HDMI接口驱动实现640*480@60Hz图像显示。

        2.技术介绍

        在hdmi的规格书中规定了4种接口类型,即 Hdmi a type接口, Hdmi  b type 接口, Hdmi c type接口, Hdmi d type接口。 B type只出现在规格书中,市面上未使用,市面上经常使用acd接口,a接口较多。三种接口都使用19片引脚,三种接口不同于线序,其中体积最小的是 D type接口。

HDMI接口驱动设计验证

         对hdmi引脚,有19片引脚总共分为4类, Tmds类:进行音频视频数据传输和一些辅助数据;DDC类:相当于一个iic接口,常用作读取显示器的一方EEPROM内的显示器规格型号数据;CEC类:预留通道;其他类的通道(14保留引脚,18电源引脚,19热拔插检测引脚)。

 

HDMI接口驱动设计验证

HDMI接口驱动设计验证

HDMI接口驱动设计验证

        TMDS最小化传输差分信号,系统包括发送端与接收端,发送端接收到24位数据后在场同步信号与行同步信号,还有时钟一起进行一个编码和数据并传转换,将表示RGB信号的数据通过TMDS三路线传输出去,接收端接收到数据后,对数据进程串并转换,将并行数据传输到显示器控制器,对图像进行显示。

HDMI接口驱动设计验证

        对于4条通道,3条RGB通道,1条时钟通道数据进行编码,第一步:将8bit的视频音频数据转化为最小传输直流均衡(保证信道中直流偏移为0,使信道中包含1与0的个数区域相同,添加数据位数,减少电磁干扰,提高可靠性)的10bit数据(编码过程),第二步:将10bit数据转化为差分信号,并进行串行传输。

        在进行第二步时可以调用ip核ALTDDIO_OUT

HDMI接口驱动设计验证

        “ALTDDIO_OUT” 主要用于实现双向数据输入输出。ALTDDIO_OUT是一个专用的 I/O 元件,允许用户在 FPGA 中实现同时具备输入和输出功能的引脚。它通常用于需要双向数据传输的应用场景。可以配置为输入或输出模式。这允许设备根据需要接收或发送数据。可以在内部时钟信号的控制下进行数据的发送和接收,确保数据传输的时序稳定。支持不同的输出驱动能力及编程选项,用户可以根据电路设计的需要选择最合适的驱动方式。在串行接口(如 I2C、SPI)中常用于双向数据流。在设计总线结构(如数据总线)时,用于共享数据路径。用于连接各种传感器和外部设备,进行数据交互。

        3.顶层架构

HDMI接口驱动设计验证

HDMI接口驱动设计验证

        4.端口描述

clk 时钟信号
rst_n 复位信号(低电平有效)
r_p 红色差分数据
r_p 红色差分数据
g_p 绿色差分数据
g_n 绿色差分数据
b_p 蓝色差分数据
b_n 蓝色差分数据
clk_p 时钟差分数据
clk_n 时钟差分数据
ddc_scl IIC数据线
ddc_sda IIC数据线

二、代码验证

数据8bit数据转10bit数据并进行编码

module encode(//8bit数据转10bit数据并进行编码 input clk , input rst_n , input en , input hs ,//行同步信号 input vs ,//场同步信号 input[7:0] in ,//8bit数据输入 output reg[9:0]data //10bit数据输出 ); wire ctrl1;//条件判断标志信号 wire ctrl2;//条件判断标志信号 wire ctrl3;//条件判断标志信号 reg [3:0]data1;//计算数据中1的个数 reg [7:0]reg_data;//数据打排,使计算与数据同周期 wire [8:0]q_m;//8bit数据转9bit数据数据寄存器(添加编码位) reg [4:0]cnt;// reg [3:0]data2;//计算9bit数据低8位中1的个数 reg [3:0]data3;//计算9bit数据低8位中0的个数 reg [8:0]q_m_reg;//9bit数据打排 reg de_reg1;//使能信号打一排 reg de_reg2;//使能信号打两排 reg hs_reg1;//行同步信号打一排 reg hs_reg2;//行同步信号打两排 reg vs_reg1;//场同步信号打一排 reg vs_reg2;//场同步信号打两排 always@(posedge clk,negedge rst_n)//计算1的个数 begin if(rst_n == 0) data1 <= 4'd0; else data1 <= data[0] + data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7]; end always@(posedge clk,negedge rst_n)//输入数据进行打排 begin if(rst_n == 0) reg_data <= 8'd0; else reg_data <= in; end assign ctrl1 = ((data1 > 4'd4)||((data1 == 4'd4)&&(reg_data[0] == 1'b0)))? 1'b1:1'b0;//标志信号赋值 assign q_m[0] = reg_data[0]; assign q_m[1] = (ctrl1 == 1'b1)?(q_m[0]^~reg_data[1]):(q_m[0]^reg_data[1]); assign q_m[2] = (ctrl1 == 1'b1)?(q_m[1]^~reg_data[2]):(q_m[1]^reg_data[2]); assign q_m[3] = (ctrl1 == 1'b1)?(q_m[2]^~reg_data[3]):(q_m[2]^reg_data[3]); assign q_m[4] = (ctrl1 == 1'b1)?(q_m[3]^~reg_data[4]):(q_m[3]^reg_data[4]); assign q_m[5] = (ctrl1 == 1'b1)?(q_m[4]^~reg_data[5]):(q_m[4]^reg_data[5]); assign q_m[6] = (ctrl1 == 1'b1)?(q_m[5]^~reg_data[6]):(q_m[5]^reg_data[6]); assign q_m[7] = (ctrl1 == 1'b1)?(q_m[6]^~reg_data[7]):(q_m[6]^reg_data[7]); assign q_m[8] = (ctrl1 == 1'b1)?1'b0:1'b1; //8bit数据添加编码位,最高位表示数据进行异或/或操作 always@(posedge clk,negedge rst_n)//计算9bit数据低8位中1的个数,计算9bit数据低8位中0的个数 begin if(rst_n == 0) begin data2 <= 4'd0; data3 <= 4'd0; end else begin data2 <= q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7]; data3 <= 4'd8 - (q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7]); end end assign ctrl2 = ((cnt == 0 )||(data2 == data3))?1'b1:1'b0;//条件判断标志信号 assign ctrl3 = (((cnt[4] == 1'b0)&&(data2 > data3))||((cnt[4] == 1'b0)&&(data2 < data3)))?1'b1:1'b0;//条件判断标志信号 always@(posedge clk,negedge rst_n)//数据打排进行信号同步 begin if(rst_n == 0) begin q_m_reg <= 9'd0; de_reg1 <= 1'd0; de_reg2 <= 1'd0; hs_reg1 <= 1'd0; hs_reg2 <= 1'd0; vs_reg1 <= 1'd0; vs_reg2 <= 1'd0; end else begin q_m_reg <= q_m; de_reg1 <= en; de_reg2 <= de_reg1; hs_reg1 <= hs; hs_reg2 <= hs_reg1; vs_reg1 <= vs; vs_reg2 <= vs_reg1; end end always@(posedge clk,negedge rst_n)//数据输出 begin if(rst_n == 0) begin data <= 10'd0; cnt <= 5'd0; end else begin if(de_reg2 == 1) begin if(ctrl2 == 1) begin data[9] = ~q_m_reg[8]; data[8] = q_m_reg[8]; data[7:0] = (q_m_reg[8]) ? q_m_reg[7:0]:(~q_m_reg[7:0]); cnt <= (q_m_reg[8]== 1'b0)? (cnt + data3 - data2):(cnt + data2 - data3); end else begin if(ctrl3 == 1) begin data[9] = 1'b1; data[8] = q_m_reg[8]; data[7:0] = ~q_m_reg[7:0]; cnt <= cnt + {q_m_reg[8],1'b0} + (data3 - data2); end else begin data[9] = 1'b0; data[8] = q_m_reg[8]; data[7:0] = q_m_reg[7:0]; cnt <= cnt - {~q_m_reg[8],1'b0} + (data2 - data3); end end end else begin case({vs_reg2,hs_reg2}) 2'b00 : data <= 10'b0010_1010_11; 2'b01 : data <= 10'b1101_0101_00; 2'b10 : data <= 10'b0010_1010_10; default : data <= 10'b1101_0101_01; endcase end end end endmodule

单沿转双沿时钟

module par_yo_to_ser( input clk_5 ,//单沿转双沿时钟(传入10bit数据就需要10倍原时钟,在IP核的参与下,省调一半的时钟信号) input[9:0] data , output ser_p ,//差分信号 output ser_n //差分信号 ); wire [4:0]data_rist = {data[8],data[6],data[4],data[2],data[0]};//上升沿发送的数据 wire [4:0]data_fall = {data[9],data[7],data[5],data[3],data[1]};//下降沿发送的数据 reg [4:0]data_rist_s = 0; reg [4:0]data_fall_s = 0; reg [2:0]cnt = 0; always@(posedge clk_5)//数据移位(并行数据转为ip核需要的类串行数据) begin cnt <= (cnt[2] == 1'b1) ? 3'd0: (cnt + 1'b1) ; data_rist_s <= (cnt[2] == 1'b1) ? data_rist: data_rist_s[4:1] ; data_fall_s <= (cnt[2] == 1'b1) ? data_fall: data_fall_s[4:1] ; end my_ddio my_ddio_inst (//单沿数据转双沿数据 .datain_h ( data_rist_s[0] ), .datain_l ( data_fall_s[0] ), .outclock ( ~clk_5 ),//保证在数据稳定时进行传输 .dataout ( ser_p )//输出双沿数据 ); my_ddio my_ddio_inst2 (//单沿数据转双沿数据 .datain_h ( ~data_rist_s[0] ), .datain_l ( ~data_fall_s[0] ), .outclock ( ~clk_5 ),//保证在数据稳定时进行传输 .dataout ( ser_n )//输出双沿数据 ); endmodule

vga_ctrl显示驱动模块

module vga_ctrl( input clk , input rst_n , input[7:0] in_rgb , output volid_en , output vga_hs , output vga_vs , output[9:0] vga_h ,//坐标 output[9:0] vga_v ,//坐标 output[7:0] vga_rgb ); reg [9:0] cnt_hs;//列计数器 reg [9:0] cnt_vs;//行计数器 wire hs_en;//列有效显示区域 wire vs_en;//行有效显示区域 //wire volid_en;//有效显示区域 parameter hs_sync = 10'd96 ,//同步 hs_bask = 10'd40 ,//后沿 hs_left = 10'd8 ,//左边 hs_vali = 10'd640 ,//有效 hs_righ = 10'd8 ,//右边 hs_fpon = 10'd8 ,//前沿 hs_tota = 10'd800 ;//总共 parameter vs_sync = 10'd2 ,//同步 vs_bask = 10'd25 ,//后沿 vs_left = 10'd8 ,//上边 vs_vali = 10'd480 ,//有效 vs_righ = 10'd8 ,//底边 vs_fpon = 10'd2 ,//前沿 vs_tota = 10'd525 ;//总共 always @(posedge clk,negedge rst_n) begin if(rst_n == 0) cnt_hs <= 10'd0; else if(cnt_hs < hs_tota - 10'd1) cnt_hs <= cnt_hs + 10'd1; else cnt_hs <= 10'd0; end always @(posedge clk,negedge rst_n) begin if(rst_n == 0) cnt_vs <= 10'd0; else if(cnt_hs == hs_tota - 10'd1) if(cnt_vs < vs_tota - 10'd1) cnt_vs <= cnt_vs + 10'd1; else cnt_vs <= 10'd0; else cnt_vs <= cnt_vs; end assign vga_hs = (cnt_hs < hs_sync)?1'b0:1'b1;//行同步信号赋值 assign vga_h = (volid_en == 1'b1)?(cnt_hs - (hs_sync + hs_bask + hs_left)):10'd0;//行坐标(Y) assign vga_vs = (cnt_vs < vs_sync)?1'b0:1'b1;//场同步信号赋值 assign vga_v = (volid_en == 1'b1)?(cnt_vs - (vs_sync + vs_bask + vs_left)):10'd0;//列坐标(X) assign hs_en = ((cnt_hs >= hs_sync + hs_bask + hs_left )&&(cnt_hs <= hs_sync + hs_bask + hs_left + hs_vali))?1'b1:1'b0; assign vs_en = ((cnt_vs >= vs_sync + vs_bask + vs_left )&&(cnt_vs <= vs_sync + vs_bask + vs_left + vs_vali))?1'b1:1'b0; assign volid_en = hs_en & vs_en;//显示区域 assign vga_rgb = (volid_en == 1'b1)?in_rgb:8'd0; endmodule 

vga_data显示数据生成模块

module vga_data( input clk , input rst_n , input[9:0] pix_x , input[9:0] pix_y , output reg[7:0] vga_rgb ); parameter show_h = 10'd110,//定位点X坐标 show_v = 10'd100;//定位点Y坐标 parameter show_chan = 10'd256,//图片长度 show_kuan = 10'd32;//图片宽度 parameter show_1_rgb = 8'b000_000_00,//背景 show_0_rgb = 8'b111_100_00;//图片颜色 reg [255:0] char [31:0]; wire[9:0] char_x; wire[9:0] char_y; assign char_x =((pix_x >= show_h)&&(pix_x < (show_h + show_chan)))&&((pix_y >= show_v)&&(pix_y <(show_v + show_kuan)))?(pix_x - show_h):10'h3ff; assign char_y =((pix_x >= show_h)&&(pix_x < (show_h + show_chan)))&&((pix_y >= show_v)&&(pix_y <(show_v + show_kuan)))?(pix_y - show_v):10'h3ff; always@(posedge clk) begin char[0 ] <= 256'h000000000000000000000000000000000000010000; char[1 ] <= 256'h00000003FFFFFFFFF0000003FFFFFFFFF0000003FFFFFFFFF0000; char[2 ] <= 256'h003FFFFFFFFF0000000000000000000; char[3 ] <= 256'h00000000000000000000; char[4 ] <= 256'h00000000000030003C000000000030007E00000000; char[5 ] <= 256'h003803FFE000000000000003C000000000000003E000000000000; char[6 ] <= 256'h003F00003C00000000000000000000000000000000; char[7 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000; char[8 ] <= 256'h000000000000000000000000000000000000010000; char[9 ] <= 256'h00000003FFFFFFFFF0000003FFFFFFFFF0000003FFFFFFFFF0000; char[10 ] <= 256'h003FFFFFFFFF0000000000000000000; char[11 ] <= 256'h00000000000000000000; char[12 ] <= 256'h000000038000E000000000038000E00000000001C001C00000000; char[13 ] <= 256'h001E003C00000000000F80F0FFFF07FFF000000000; char[14 ] <= 256'h0001FFC00000000000007F000000000000000000000000000000000000000000; char[15 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000; char[16 ] <= 256'h00000000000000000000000000000000000000FFE000000000000FFFFE000000; char[17 ] <= 256'h00007FFFFFFFFFFFE000000003FE001FFE00000FC0000; char[18 ] <= 256'h000F0000003C0000001E0000000E0000001C00000000000070000; char[19 ] <= 256'h00000000000000000000; char[20 ] <= 256'h0000000000001C0001800E0000001E0001FFFC0000; char[21 ] <= 256'h001F8001FFFFF001FFF01FFF0; char[22 ] <= 256'h0000000000000000000000000000000; char[23 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000; char[24 ] <= 256'h00000000000000000000000001F0000; char[25 ] <= 256'h0000000001FF0000000000001FE01FC01FC0010000; char[26 ] <= 256'h000001FCC000000000001FC0C00000000001FC00C0000000001FC000C0000000; char[27 ] <= 256'h003E0000C0000000007F0000C0000000007FF000C0000000003FFF00C0000000; char[28 ] <= 256'h0001FFF0C000000000001FFFC0000000000001FFFC01FFFC10000; char[29 ] <= 256'h00000001FFFF0000000000000FFF00000000000000FF000000000000000F0000; char[30 ] <= 256'h0000000000000000000000000000000; char[31 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000; end always @(posedge clk,negedge rst_n) begin if(rst_n == 0) vga_rgb <= show_1_rgb; else if( ((pix_x >= show_h - 1'b1)&&(pix_x < (show_h + show_chan - 1'b1))) && ((pix_y >= show_v )&&(pix_y <(show_v + show_kuan))) && (char[char_y][10'd255 - char_x] == 1'b1)) vga_rgb <= show_0_rgb; else vga_rgb <= show_1_rgb; end endmodule 

HDMI数据整合

module hdmi_ctrl( input clk , input rst_n , input [7:0] r_data ,//红色分量 input [7:0] g_data ,//绿色分量 input [7:0] b_data ,//蓝色分量 input en , input hs ,//行同步信号 input vs ,//场同步信号 input clk_5x ,//5倍时钟 output r_p ,//红色差分数据 output r_n ,//红色差分数据 output g_p ,//绿色差分数据 output g_n ,//绿色差分数据 output b_p ,//蓝色差分数据 output b_n ,//蓝色差分数据 output clk_p ,//时钟差分数据 output clk_n //时钟差分数据 ); wire[9:0] r_data_in; wire[9:0] g_data_in; wire[9:0] b_data_in; encode encode1(//8bit数据转10bit数据并进行编码 .clk (clk ), .rst_n (rst_n ), .en (en ), .hs (hs ),//行同步信号 .vs (vs ),//场同步信号 .in (r_data ),//8bit数据输入 .data (r_data_in) //10bit数据输出 ); par_yo_to_ser par_yo_to_ser1( .clk_5 (clk_5x),//单沿转双沿时钟(传入10bit数据就需要10倍原时钟,在IP核的参与下,省调一半的时钟信号) .data (r_data_in), .ser_p (r_p),//差分信号 .ser_n (r_n) //差分信号 ); encode encode2(//8bit数据转10bit数据并进行编码 .clk (clk ), .rst_n (rst_n ), .en (en ), .hs (hs ),//行同步信号 .vs (vs ),//场同步信号 .in (g_data ),//8bit数据输入 .data (g_data_in) //10bit数据输出 ); par_yo_to_ser par_yo_to_ser2( .clk_5 (clk_5x),//单沿转双沿时钟(传入10bit数据就需要10倍原时钟,在IP核的参与下,省调一半的时钟信号) .data (g_data_in), .ser_p (g_p),//差分信号 .ser_n (g_n) //差分信号 ); encode encode3(//8bit数据转10bit数据并进行编码 .clk (clk ), .rst_n (rst_n ), .en (en ), .hs (hs ),//行同步信号 .vs (vs ),//场同步信号 .in (b_data ),//8bit数据输入 .data (b_data_in) //10bit数据输出 ); par_yo_to_ser par_yo_to_ser3( .clk_5 (clk_5x),//单沿转双沿时钟(传入10bit数据就需要10倍原时钟,在IP核的参与下,省调一半的时钟信号) .data (b_data_in), .ser_p (b_p),//差分信号 .ser_n (b_n) //差分信号 ); par_yo_to_ser par_yo_to_ser4( .clk_5 (clk_5x),//单沿转双沿时钟(传入10bit数据就需要10倍原时钟,在IP核的参与下,省调一半的时钟信号) .data (10'b11111_00000), .ser_p (clk_p),//差分信号 .ser_n (clk_n) //差分信号 ); endmodule

顶层模块

module hdmi_driver( input clk , input rst_n , output r_p ,//红色差分数据 output r_n ,//红色差分数据 output g_p ,//绿色差分数据 output g_n ,//绿色差分数据 output b_p ,//蓝色差分数据 output b_n ,//蓝色差分数据 output clk_p ,//时钟差分数据 output clk_n , //时钟差分数据 output ddc_scl , output ddc_sda ); wire clk_1; wire clK_5; wire clk_en; wire volid_en; wire[9:0] vga_h; wire[9:0] vga_v; wire[7:0] vga_rgb_in; wire[7:0] vga_rgb_out; wire vga_hs; wire vga_vs; assign ddc_scl = 1'b1; assign ddc_sda = 1'b1; my_pll my_pll_inst (//锁相环调用 .areset ( ~rst_n ), .inclk0 ( clk ), .c0 ( clk_1 ), .c1 ( clK_5 ), .locked ( clk_en ) ); vga_data vga_data( .clk (clk_1 ), .rst_n (clk_en ), .pix_x (vga_h ), .pix_y (vga_v ), .vga_rgb (vga_rgb_in) ); vga_ctrl vga_ctrl( .clk (clk_1 ), .rst_n (clk_en ), .in_rgb (vga_rgb_in ), .volid_en(volid_en ), .vga_hs (vga_hs ), .vga_vs (vga_vs ), .vga_h (vga_h ),//坐标 .vga_v (vga_v ),//坐标 .vga_rgb (vga_rgb_out)//332色彩分量 ); hdmi_ctrl hdmi_ctrl( .clk (clk_1), .rst_n (clk_en), .r_data ({vga_rgb_out[7:5],5'b0}),//红色分量 .g_data ({vga_rgb_out[4:2],5'b0}),//绿色分量 .b_data ({vga_rgb_out[1:0],6'b0}),//蓝色分量 .en (volid_en), .hs (vga_hs),//行同步信号 .vs (vga_vs),//场同步信号 .clk_5x (clK_5),//5倍时钟 .r_p (r_p ),//红色差分数据 .r_n (r_n ),//红色差分数据 .g_p (g_p ),//绿色差分数据 .g_n (g_n ),//绿色差分数据 .b_p (b_p ),//蓝色差分数据 .b_n (b_n ),//蓝色差分数据 .clk_p (clk_p),//时钟差分数据 .clk_n (clk_n) //时钟差分数据 ); endmodule

仿真代码

`timescale 1ns/1ps module hdmi_driver_tb(); reg clk ; reg rst_n ; wire r_p ; wire r_n ; wire g_p ; wire g_n ; wire b_p ; wire b_n ; wire clk_p ; wire clk_n ; wire ddc_scl; wire ddc_sda; hdmi_driver hdmi_driver( .clk (clk ), .rst_n (rst_n ), .r_p (r_p ),//红色差分数据 .r_n (r_n ),//红色差分数据 .g_p (g_p ),//绿色差分数据 .g_n (g_n ),//绿色差分数据 .b_p (b_p ),//蓝色差分数据 .b_n (b_n ),//蓝色差分数据 .clk_p (clk_p ),//时钟差分数据 .clk_n (clk_n ), //时钟差分数据 .ddc_scl (ddc_scl ), .ddc_sda (ddc_sda ) ); initial clk = 1'b1; always #10 clk = ~clk; initial begin rst_n = 0; #20 rst_n =1; # $stop; end endmodule

三、仿真验证

        由下图可得,数据输出正常,显示数据应为黑色背景下,屏幕上显示“FPGA”字符,数据生成模块和显示驱动模块调用之前基于VGA的字符显示实验。

HDMI接口驱动设计验证

由下图可以看出,数据在cnt = 0 将数据进行载入并按位分组,在之后cnt其他时刻进行移位输入至ddio ip核中进行双沿数据转换,通过ser_p,与ser_n可以看出,数据在时钟上升沿或下降沿都可进行输出,完成了在基于基础显示时钟频率的10倍时钟上进行数据传输,在差分的方式下数据更稳定。

HDMI接口驱动设计验证

参考资料

VGA接口驱动设计验证

HDMI

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/109869.html

(0)
上一篇 2026-02-04 10:20
下一篇 2026-02-04 10:35

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信