基于FPGA的VGA和HDMI视频拼接系统设计 下载本文

内容发布更新时间 : 2024/5/18 9:23:41星期一 下面是文章的全部内容请认真阅读。

.clipper_width(12'd512), .clipper_top(12'd0), .clipper_height(12'd768),

vin_x_cnt和vin_y_cnt分别为点计数和行计数,然后满足

assign clipper_wr_en = (vin_x_cnt > clipper_left) && (vin_x_cnt <= clipper_left + clipper_width) && (vin_y_cnt > clipper_top) && (vin_y_cnt <= clipper_top + clipper_height);

则clipper_wr_en使能,把数据写入DDR2中,完成剪切的功能。

4.2 图像存储模块

要使用DDR2,则需要初始化、写数据、读数据等等步骤,由于DDR的时序要求

非常严格,所以操作DDR2是一个困难的工作。但是我们可以选择Altera提供的IP核,来完成设计。

IP(IntelleetualProperty)就是常说的知识产权,在可编程逻辑领域,IP核是指将数字电路中一些常用但比较复杂的功能模块,比如FIR滤波器、快速傅立叶变换、PCI接口等。本设计采用的IP核就是软IP。图4.2。1为根据DDR的使用手册来设置DDR IP核参数。

18

图4.1 设置DDR2 IP

设置好IP之后,就相当于一个盒子,我们只需要代入相应的参数,就可以实现

数据的存储,程序代码如下:

vin_frame_buffer_ctrl vin_frame_buffer_ctrl_m0(

19

.rst_n(rst_n),

.vin_clk(buffer_f_rdclk), .vin_vs(vs), .vin_f(f),

.vin_de(vfb_vin_de), .vin_data(vfb_vin_data), .vin_width(clipper_width), .vin_height(clipper_height), .fifo_afull(vfb_fifo_afull), .mem_clk(mem_clk),

.wr_burst_req(wr_burst_req), .wr_burst_len(wr_burst_len),

);

.wr_burst_addr(wr_burst_addr), .wr_burst_data_req(wr_burst_data_req), .wr_burst_data(wr_burst_data), .burst_finish(burst_finish), .wr_max_line(wr_max_line), .base_addr(base_addr), .frame_addr(frame_addr)

4.3 图像显示模块

从DDR2读出的视频数据,经过插值算法处理后,VGA和HDMI两路信号的分辨率为1024x768,需要根据2.2.2中的视频时序对数据进行处理,才能把视频显示出来。代码如下:

assign hs_net = (h_cnt > h_fp - 12'd1) && (h_cnt < h_fp + h_sync);/*行同步产生*/

assign h_video = (h_cnt >= h_fp + h_sync + h_bp) && (h_cnt < h_total); assign v_video = (v_cnt >= v_fp + v_sync + v_bp) && (v_cnt < v_total); assign vs_net = (v_cnt > v_fp - 12'd1) && (v_cnt < v_fp + v_sync);/*场同步产生*/

assign de_net = h_video && v_video;/*视频有效数据产生*/ assign hs = hs_reg; assign vs = vs_reg; assign de = de_reg;

/*行计数器,用于处理行相关*/

always@(posedge dp_clk or negedge rst_n) begin

20

if(!rst_n)

h_cnt <= 12'd0;

else if(h_cnt == h_total - 12'd1)

h_cnt <= 12'd0;

else

h_cnt <= h_cnt + 12'd1;

end

/*场计数器,用于处理场相关*/

always@(posedge dp_clk or negedge rst_n) begin

if(!rst_n)

v_cnt <= 12'd0;

else if(h_cnt == h_total - 12'd1)

if(v_cnt == v_total - 12'd1)

v_cnt <= 12'd0;

else

v_cnt <= v_cnt + 12'd1;

else

v_cnt <= v_cnt;

end

4.4 软件总体框图

图4.2为代码经过综合之后,生成的原理图,即代码的流程图。

21

图4.2 综合后的原理图

22