用Xilinx的FPGA实现HDMI(DVI)接收器

用Xilinx的FPGA实现HDMI(DVI)接收器

1. 问题-HDMI接收器

1.1 ADV7511

一般来说,如果要使用HDMI作为视频收发协议的话,会配置关于HDMI的编解码芯片。常见的有ADV7511(HDMI发送器)和ADV7611(HDMI接收器)。这样开发者关于HDMI的设计部分可以转化为与HDMI接收或者发送芯片的数据交互。利用FPGA进行设计时,有的FPGA有HDMI接口,却没有HDMI编解码芯片。这个时候要如何使用HDMI接口呢?
一种方案是通过FMC接口外置HDMI模块子卡,这样就可以使用上HDMi编解码芯片。另外一种方案,可以使用FPGA内置的HDMi的IP。接下来我将介绍利用Xilinx的IP实现HDMI接收器。
对于HDMI发送器的部分,当然也可以利用Xilinx的IP实现。

2. HDMI(DVI)接收器

2.1 IP的设置

本文使用的是digilent公司的genesys2开发板,使用的是digilent公司提供的IP。这里需要注意的是当你安装vivado的时候,digilent公司的IP不会集成在vivado的IP中,需要开发者自己手动下载,并添加到vivado中。

2.2 IP设置如下

在这里插入图片描述
首先要设置TMDS的工作频率。最重要的是要使能Enable DDC ROM,它会设置DVI接收端可以接受的分辨率,与DVI发送端连接时,发送端会自动从接收端读取接收端可以处理的分辨率。按照这个分辨率发送数据。如果不使能Enable DDC ROM,发送端将无法检测到HDMI接收端,无法发送数据。

3. HDMI转VGA

下面代码是一个简易的HDMI—VGA转换器。FPGA设置好后,连接到PC端,再将FPGA连接到一个VGA显示器,图片信息就会从PC端发出,经由FPGA,显示在VGA显示器上。


```handlebars
module  hdmi_input(
input             clk_in1_n,
input             clk_in1_p,
input  			  sys_rst,		//高电平复位

//dvi接口
  input TMDS_Clk_p,
  input TMDS_Clk_n               ,
  input [2:0]TMDS_Data_p         ,
  input [2:0]TMDS_Data_n         ,
    inout   DDC_0_scl_io,
  inout    DDC_0_sda_io,
  output   hpa,
  
  output   led1                  ,
	output				vga_hsync,
	output				vga_vsync,
	output[4:0]			vga_r,
	output[5:0]			vga_g,
	output[4:0]			vga_b  

);

wire  rst;
wire     clk_200m;
wire     locked;
assign  hpa = 1;
wire SDA_I ;
wire SDA_O ;
wire SDA_T ;
wire SCL_I ;
wire SCL_O ;
wire SCL_T ;

wire [23:0]vid_pData;
wire vid_pVDE;
wire  vid_pHSync;
wire  vid_pVSync;
  wire  PixelClk;
  wire  aPixelClkLckd;
reg   pRst;

reg [10:0]   hcnt;
reg [9:0]    ycnt;
sys_rst_hdmi     u_sys_rst(
.rst       (rst),
.sys_rst   (!locked & sys_rst),
.clk       (clk_200m)
    );

clk_hdmi   u_clk_hdmi(
  .clk_200m            (clk_200m)  ,
  .reset               (sys_rst)   ,
  .locked              (locked)    ,
  .clk_in1_p           (clk_in1_p) ,
  .clk_in1_n           (clk_in1_n)
  );
  IOBUF DDC_0_scl_iobuf
       (.I(SCL_O),
        .IO(DDC_0_scl_io),
        .O(SCL_I),
        .T(SCL_T));
  IOBUF DDC_0_sda_iobuf
       (.I(SDA_O),
        .IO(DDC_0_sda_io),
        .O(SDA_I),
        .T(SDA_T));
dvi2rgb_0  u_dvi2rgb(
  .TMDS_Clk_p                       (TMDS_Clk_p),
  .TMDS_Clk_n                       (TMDS_Clk_n),
  .TMDS_Data_p                      (TMDS_Data_p),
  .TMDS_Data_n                      (TMDS_Data_n),
  .RefClk                           (clk_200m),
  .aRst                             (rst),
  .vid_pData                        (vid_pData),    //输出数据
  .vid_pVDE                         (vid_pVDE),     //数据有效使能信号
  .vid_pHSync                       (vid_pHSync),
  .vid_pVSync                       (vid_pVSync),
  .PixelClk                         (PixelClk),
  .aPixelClkLckd                    (aPixelClkLckd),
  .SDA_I                            (SDA_I),
  .SDA_O                            (SDA_O),
  .SDA_T                            (SDA_T),
  .SCL_I                            (SCL_I),
  .SCL_O                            (SCL_O),
  .SCL_T                            (SCL_T), 
  
  
  .pRst								(pRst)
);
always@(posedge PixelClk)
begin
     pRst <=  rst;  
end
assign vga_hsync = vid_pHSync;
assign vga_vsync = vid_pVSync;
assign vga_r  = vid_pData[23:19];
 assign      vga_g  = vid_pData[15:10];
 assign      vga_b  = vid_pData[7:3];

endmodule

LZW(Lempel-Ziv-Welch)压缩算法是一种无损的数据压缩算法,可用于减小数据的存储空间和传输带宽。使用Xilinx FPGA(现场可编程门阵列)实现LZW压缩算法可以提供硬件加速和高性能。 在实现LZW压缩算法之前,我们首先需要了解算法的基本原理。LZW算法的核心是将输入的连续字符序列编码为较短的固定长度编码,以减小数据的表示。算法通过不断扩展编码本(码表)来实现。 使用Xilinx FPGA实现LZW压缩算法可以利用FPGA的并行处理和并行存储器来加速算法的执行。为了实现LZW压缩算法,我们可以将以下步骤化为硬件描述语言(HDL)代码: 1. 初始化编码本:在FPGA中,可以使用片上存储器(BRAM)来存储初始编码本。这些编码可以是ASCII字符集的所有单字符编码,也可以是预先设计好的更大的编码集。 2. 输入字符序列:通过逐字读取输入字符序列,将其传输到FPGA的输入缓冲区。 3. 编码匹配:使用硬件逻辑来实现编码本的搜索和匹配。如果当前输入字符序列在编码本中,则将其与之前的字符序列进行匹配,并更新匹配序列。 4. 生成输出编码:如果没有匹配,将当前输入字符序列的编码发送到输出缓冲区中。如果有匹配,继续读取输入字符,直到找到最长的匹配字符串。 5. 更新编码本:将匹配的输入字符序列和新的编码添加到编码本中,以扩展编码本。 6. 输出压缩数据:将生成的输出编码从输出缓冲区传输到外部存储器或其他设备。 通过将LZW压缩算法化为HDL代码并在Xilinx FPGA实现,可以获得高效的硬件加速。FPGA的并行处理和并行存储器特性能够极大地提高算法的执行速度和压缩效率。同时,由于FPGA的可编程性,也可以根据特定的需求进行优化和定制化,以实现更高的性能和更低的功耗。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值