建设网站教程视频下载,企业所得税税率2019,上海十大外贸公司,石家庄新闻综合频道1一、HDMI接口简介 一种数字音视频接口标准#xff0c;提供高质量的数字音视频传输#xff0c;同时支持多通道音频、高分辨率视频和其他数据传输功能。提供更高的数据传输带宽#xff08;带宽#xff1a;1s内传输多少比特数据#xff09; 数字传输#xff1a; HDMI是一种全…一、HDMI接口简介 一种数字音视频接口标准提供高质量的数字音视频传输同时支持多通道音频、高分辨率视频和其他数据传输功能。提供更高的数据传输带宽带宽1s内传输多少比特数据 数字传输 HDMI是一种全数字接口通过数字信号传输音频和视频数据。这有助于防止信号损失并提供更高的图像和音频质量。 高清晰度视频 HDMI支持高分辨率视频包括标准高清晰度HD和超高清晰度UHD分辨率。常见的分辨率包括720p、1080p、4K等。 多通道音频 HDMI支持多通道音频传输包括立体声和环绕声格式。这允许用户在一个单一的HDMI连接上传输高质量音频。 双向通信 HDMI不仅能够从源设备如电脑、蓝光播放器发送信号到显示设备还能够支持反向通信使得显示设备可以发送控制信号到源设备。 支持色彩深度和色域 HDMI支持不同的色彩深度比如8位、10位、12位和广色域有助于提供更丰富的颜色和更高的图像质量。 多功能 HDMI接口除了传输音视频信号外还可以支持一些其他功能如以太网传输HDMI with Ethernet、ARCAudio Return Channel音频回传通道等。 HDMI 向下兼容 DVI。DVI 数字视频接口只能用来传输视频而不能同时传输音频
二、YUV颜色表示 与 RGB红绿蓝不同YUV 将颜色信息分成亮度Y代表亮度和色度U、V代表色度两部分。YUV 表示的基本思想是人眼对亮度变化更为敏感而对色度变化相对不敏感。因此通过将颜色信息分离可以更有效地压缩和传输图像。RGB与YUV的转换如下 三、TMDS协议
一概念 最小化传输差分信号 Transition Minimized Differential Signaling DVI 和 HDMI 接口协议在物理层均使用 TMDS 标准传输音视频数据。 差分信号传输 TMDS使用差分信号传输方式使用两个引脚来传输一路信号利用这两个引脚间的电压差的正负极性和大小来决定传输数据的数值 0 或 1 。这种方式可以减小电磁辐射和抗干扰性更强。 过渡最小化编码 TMDS采用过渡最小化编码Transition Minimized CodingTMC技术以减小信号的过渡时间。这有助于减小电磁干扰特别是对于高频率的数字信号而言。 数据通道 TMDS协议通常使用三个数据通道分别用于红色R、绿色G和蓝色B的视频信息传输。此外还有一个时钟通道用于同步数据。 TMDS时钟 TMDS时钟通道是一个单独的差分信号通道用于同步数据通道的传输。它的频率通常是数据通道的两倍。 数据帧 数据在TMDS中以数据帧的形式传输其中包括视频和音频信息。数据帧由特定的同步和控制信息组成。 带宽和分辨率 TMDS协议的带宽和分辨率直接关联带宽的增加通常支持更高分辨率的视频传输。不同版本的HDMI和DVI标准支持不同的带宽和分辨率。
二信号传输
TMDS 连接从逻辑功能上可以划分成两个阶段“编 / 解码” 和 “并 / 串转换” 。在信号源处完成编码操作并将数据转为串行传输出去。在接受处完成解码并将数据转换为并行数据在编码阶段编码器将视频源中的像素数据、 HDMI 的音频 / 附加数据以及行同步和场同步信号分别编码成 10 位的字符流。在并串转换阶段将上述的 10 位字符流转换成串行数据流并将其从三个差分输出通道发送出去。这个 10:1 的并转串过程所生成的串行数据速率是实际像素时钟速率的 10 倍。 三DVI编码 DVI 或 HDMI 视频传输所使用的 TMDS 连接通过四个串行通道实现。对于 DVI 来说其中三个通道分别用于传输视频中每个像素点的红、绿、蓝三个颜色分量RGB 4:4:4 格式。 HDMI 默认也是使用三个 RGB 通道但是它同样可以选择传输像素点的亮度和色度信息YCrCb 4:4:4 或 YCrCb 4:2:2 格式。第四个通道是时钟通道用于传输像素时钟。独立的 TMDS时钟通道为接收端提供接收的参考频率保证数据在接收端能够正确恢复。 四HDMI编码 当VDE被拉高时传输视频有效像素当ADE被拉高时传输音频有效数据。 对于 DVI 传输整个视频的消隐期都用来传输控制字符。而 HDMI 传输的消隐期除了控制字符之外还可以用于传输音频或者其他附加数据比如字幕信息等。这就是 DVI 和 HDMI 协议之间最主要的差别。 五TMDS编码算法 这种算法可以减小传输信号过程的上冲和下冲而 DC 平衡使信号对传输线的电磁干扰减少可以用低成本的专用电缆实现长距离、高质量的数字信号传输。 TMDS 连接从逻辑功能上可以划分成两个阶段编码和并串转换 编码阶段算法流程图如下 每个通道 8-bit 的像素数据都将被转换成 460 个特定 10-bit 字符中的一个。 这个编码机制大致上实现了传输过程中的直流平衡即一段时间内传输的高电平数字“ 1” 的个 数大致等于低电平数字“ 0” 的个数。 每个编码后的 10-bit 字符中状态跳转“由 1 到 0” 或者“由 0 到 1” 的次数将被限制在五次以内。 每个通道 2-bit 控制信号的状态也要进行编码编码后分别对应四个不同的 10-bit 控制字 符分别是 10b1101010100 10b0010101011 10b0101010100 和10b1010101011 。 每个控制字符都有七次以上的状态跳转。 视频字符和控制字符状态跳转次数的不同将会被用于发送和接收设备的同步。 在编码之后3 个通道的 10-bit 字符将进行并串转换这一过程是通过调用 Quartus 软件中的 ALTDDIO_OUT IP 核来实现。 六引脚定义 四、实验目标 使用HDMI接口显示彩条
五、程序设计
一系统框图 二时序图 三RGB转DVI RGB 转 DVI 模块包括 异步复位模块、 DVI 编码模块和 10 位并行转串行模块。设计框图如下 整个系统需要两个输入时钟一个是视频的像素时钟 Pixel Clk 另外一个时钟 Pixel Clk x5 的频率是像素时钟的五倍。并串转换过程实现的是 10:1 的转换率理论上转换器需要一个 10 倍像素时钟频率的串行时钟。这里我们只用了一个 5 倍的时钟频率这是因为 ALTDDIO_OUT IP 核 可以实现 DDR 的功能即它在五倍时钟频率的基础上又实现了双倍数据速率。 编码部分代码 timescale 1 ps / 1psmodule dvi_encoder (input clkin, // pixel clock inputinput rstin, // async. reset input (active high)input [7:0] din, // data inputs: expect registeredinput c0, // c0 inputinput c1, // c1 inputinput de, // de inputoutput reg [9:0] dout // data outputs
);// Counting number of 1s and 0s for each incoming pixel// component. Pipe line the result.// Register Data Input so it matches the pipe lined adder// outputreg [3:0] n1d; //number of 1s in dinreg [7:0] din_q;//计算像素数据中“1”的个数always (posedge clkin) beginn1d #1 din[0] din[1] din[2] din[3] din[4] din[5] din[6] din[7];din_q #1 din;end///// Stage 1: 8 bit - 9 bit// Refer to DVI 1.0 Specification, page 29, Figure 3-5///wire decision1;assign decision1 (n1d 4h4) | ((n1d 4h4) (din_q[0] 1b0));wire [8:0] q_m;assign q_m[0] din_q[0];assign q_m[1] (decision1) ? (q_m[0] ^~ din_q[1]) : (q_m[0] ^ din_q[1]);assign q_m[2] (decision1) ? (q_m[1] ^~ din_q[2]) : (q_m[1] ^ din_q[2]);assign q_m[3] (decision1) ? (q_m[2] ^~ din_q[3]) : (q_m[2] ^ din_q[3]);assign q_m[4] (decision1) ? (q_m[3] ^~ din_q[4]) : (q_m[3] ^ din_q[4]);assign q_m[5] (decision1) ? (q_m[4] ^~ din_q[5]) : (q_m[4] ^ din_q[5]);assign q_m[6] (decision1) ? (q_m[5] ^~ din_q[6]) : (q_m[5] ^ din_q[6]);assign q_m[7] (decision1) ? (q_m[6] ^~ din_q[7]) : (q_m[6] ^ din_q[7]);assign q_m[8] (decision1) ? 1b0 : 1b1;/// Stage 2: 9 bit - 10 bit// Refer to DVI 1.0 Specification, page 29, Figure 3-5/reg [3:0] n1q_m, n0q_m; // number of 1s and 0s for q_malways (posedge clkin) beginn1q_m #1 q_m[0] q_m[1] q_m[2] q_m[3] q_m[4] q_m[5] q_m[6] q_m[7];n0q_m #1 4h8 - (q_m[0] q_m[1] q_m[2] q_m[3] q_m[4] q_m[5] q_m[6] q_m[7]);endparameter CTRLTOKEN0 10b1101010100;parameter CTRLTOKEN1 10b0010101011;parameter CTRLTOKEN2 10b0101010100;parameter CTRLTOKEN3 10b1010101011;reg [4:0] cnt; //disparity counter, MSB is the sign bitwire decision2, decision3;assign decision2 (cnt 5h0) | (n1q_m n0q_m);/// [(cnt 0) and (N1q_m N0q_m)] or [(cnt 0) and (N0q_m N1q_m)]/assign decision3 (~cnt[4] (n1q_m n0q_m)) | (cnt[4] (n0q_m n1q_m));// pipe line alignmentreg de_q, de_reg;reg c0_q, c1_q;reg c0_reg, c1_reg;reg [8:0] q_m_reg;always (posedge clkin) beginde_q #1 de;de_reg #1 de_q;c0_q #1 c0;c0_reg #1 c0_q;c1_q #1 c1;c1_reg #1 c1_q;q_m_reg #1 q_m;end///// 10-bit out// disparity counter///always (posedge clkin or posedge rstin) beginif(rstin) begindout 10h0;cnt 5h0;end else beginif (de_reg) beginif(decision2) begindout[9] #1 ~q_m_reg[8]; dout[8] #1 q_m_reg[8]; dout[7:0] #1 (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];cnt #1 (~q_m_reg[8]) ? (cnt n0q_m - n1q_m) : (cnt n1q_m - n0q_m);end else beginif(decision3) begindout[9] #1 1b1;dout[8] #1 q_m_reg[8];dout[7:0] #1 ~q_m_reg[7:0];cnt #1 cnt {q_m_reg[8], 1b0} (n0q_m - n1q_m);end else begindout[9] #1 1b0;dout[8] #1 q_m_reg[8];dout[7:0] #1 q_m_reg[7:0];cnt #1 cnt - {~q_m_reg[8], 1b0} (n1q_m - n0q_m);endendend else begincase ({c1_reg, c0_reg})2b00: dout #1 CTRLTOKEN0;2b01: dout #1 CTRLTOKEN1;2b10: dout #1 CTRLTOKEN2;default: dout #1 CTRLTOKEN3;endcasecnt #1 5h0;endendendendmodule 四ALTDDIO_OUT IP 核简介 TMDS 编码之后的数据由 serializer_10_to_1 模块进行并串转换 serializer_10_to_1 模块实现 10:1 的并串转换并实现 DDRDouble Data Rate 数据输出其中 DDR 数据的输出是通过调用 ALTDDIO_OUT IP 核来实现。ALTDDIO_OUT IP 核用于实现 DDR 输出接口的功能实现了将两路单沿信号转换为双沿信号即在参考时钟的上升沿和下降沿发送数据。由此实现两倍速率的输出。 datain_h 在 outclock 时钟上升沿输入的数据输入数据的位宽为 WIDTH datain_l 在 outclock 时钟下降沿输入的数据输入数据的位宽为 WIDTH outclock 用于寄存数据输出的时钟信号在 outclock 时钟信号的每个电平输出 DDR 数据到 dataout 端口 dataout DDR 输出数据端口位宽为 WIDTH 。 dataout 端口应该直接提供顶层设计的输出引脚。 五十倍速率转换模块 每个通道上的颜色数据将通过 编码器来转换成一个 10 位的像素字符后。需要通过 并串转 换器转换成串行数据最后由 TMDS 数据通道发送出去。因此串行输出的时钟频率需要是并行输入的10倍。
timescale 1ns / 1psmodule serializer_10_to_1(input serial_clk_5x, // 输入串行数据时钟input [9:0] paralell_data, // 输入并行数据output serial_data_p, // 输出串行差分数据Poutput serial_data_n // 输出串行差分数据N);//reg define
reg [2:0] bit_cnt 0;
reg [4:0] datain_rise_shift 0;
reg [4:0] datain_fall_shift 0;//wire define
wire [4:0] datain_rise;
wire [4:0] datain_fall;//*****************************************************
//** main code
//*****************************************************//上升沿发送Bit[8]/Bit[6]/Bit[4]/Bit[2]/Bit[0]
assign datain_rise {paralell_data[8],paralell_data[6],paralell_data[4],paralell_data[2],paralell_data[0]};//下降沿发送Bit[9]/Bit[7]/Bit[5]/Bit[3]/Bit[1]
assign datain_fall {paralell_data[9],paralell_data[7],paralell_data[5],paralell_data[3],paralell_data[1]};//位计数器赋值
always (posedge serial_clk_5x) beginif(bit_cnt 3d4)bit_cnt 1b0;elsebit_cnt bit_cnt 1b1;
end //移位赋值发送并行数据的每一位
always (posedge serial_clk_5x) beginif(bit_cnt 3d4) begin datain_rise_shift datain_rise;datain_fall_shift datain_fall; end else begindatain_rise_shift datain_rise_shift[4:1];datain_fall_shift datain_fall_shift[4:1];end
end //例化DDIO_OUT IP核
ddio_out u_ddio_out_p(.datain_h (datain_rise_shift[0]),.datain_l (datain_fall_shift[0]),.outclock (serial_clk_5x),.dataout (serial_data_p));//例化DDIO_OUT IP核
ddio_out u_ddio_out_n(.datain_h (~datain_rise_shift[0]),.datain_l (~datain_fall_shift[0]),.outclock (serial_clk_5x),.dataout (serial_data_n)); endmodule 六、HDMI方块移动实验 为完成方块的显示需要同时使用像素点的横坐标和纵坐标来绘制方块所在的矩形区域另外还需要知道矩形区域左上角的顶点坐标。由于视频显示的图像在行场同步信号的同步下不停的刷新因此只要连续改变方块左上角顶点的坐标并在新的坐标点处重新绘制方块即可实现方块移动的效果。 方块移动部分代码如下 //当方块移动到边界时改变移动方向
always (posedge pixel_clk ) begin if (!sys_rst_n) beginh_direct 1b1; //方块初始水平向右移动v_direct 1b1; //方块初始竖直向下移动endelse beginif(block_x SIDE_W - 1b1) //到达左边界时水平向右h_direct 1b1; else //到达右边界时水平向左if(block_x H_DISP - SIDE_W - BLOCK_W)h_direct 1b0; elseh_direct h_direct;if(block_y SIDE_W - 1b1) //到达上边界时竖直向下v_direct 1b1; else //到达下边界时竖直向上if(block_y V_DISP - SIDE_W - BLOCK_W)v_direct 1b0; elsev_direct v_direct;end
end//根据方块移动方向改变其纵横坐标
always (posedge pixel_clk ) begin if (!sys_rst_n) beginblock_x SIDE_W; //方块初始位置横坐标block_y SIDE_W; //方块初始位置纵坐标endelse if(move_en) beginif(h_direct) block_x block_x 1b1; //方块向右移动elseblock_x block_x - 1b1; //方块向左移动if(v_direct) block_y block_y 1b1; //方块向下移动elseblock_y block_y - 1b1; //方块向上移动endelse beginblock_x block_x;block_y block_y;end
end ###本文参考正点原子视频仅用于自己学习复习如有侵权请联系删除。