一、系统结构概述
本文主要完成了FPGA对于图像PAL的采集,存储到DDR2,图像PAL输出的过程。
主要由以下几个模块构成:
1 PAL仿真数据
2 DDR2控制器
3 视频处理模块(包括输入和输出两个部分)
4 显示模块
系统结构框图:
二、PAL仿真数据产生
这里产生一个渐变的颜色0-255 由于PAL制式一行为720个像素 所以产生0-255 0-255 0-207的像素
产生的数据包括行同步、场同步等等标准的PAL制式的信号
module test_src
(
input clk,//27Mhz时钟
input rst_n,
input [2:0] mode_in,
output reg[7:0] data//BT.656输出
);
//时序参数定义
localparam H_BLANKING = 288; //每行消隐器长度
localparam H_ACTIVE = 1440; //像素有效期长度
localparam V_TOTLE = 625; //一个完整帧总行数
reg [11:0]h_cnt = 12'd0;
reg [9:0]v_cnt = 10'd0;
reg vs_reg;
reg de_reg;
reg de_reg_d0;
reg f_reg;
wire rd_clr;
wire rdfifoen;
wire [7:0]rddata;
reg odd_flag;
reg[7:0]rddata_t;
assign vs = vs_reg;
assign de =de_reg;
assign f = f_reg;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
rddata_t <= 8'd0;
else if (vs)
begin
if(mode_in == 3'd5)
rddata_t <= 8'd255;
else
rddata_t <= 8'd0;
end
else if (h_cnt == 13'd10 && mode_in < 3'd4)
rddata_t <= 8'd0;
else if (rdfifoen)
if (mode_in==3'd0)
rddata_t<=8'd0;
else if (mode_in==3'd1)
rddata_t<=8'd254;
else if (mode_in==3'd2 || mode_in==3'd4)
rddata_t<=rddata_t+8'd1;
else if (mode_in==3'd3 || mode_in==3'd5)
rddata_t<=rddata_t-8'd1;
else
rddata_t<=rddata_t+8'd1;
else
rddata_t<=rddata_t;
end
assign rddata=rddata_t;
/*行计数器,用于处理行相关*/
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
h_cnt <= 12'd0;
else if(h_cnt == H_ACTIVE + H_BLANKING)
h_cnt <= 12'd1;
else
h_cnt <= h_cnt + 12'd1;
end
/*场计数器,用于处理场相关*/
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
v_cnt <= 10'd0;
else if(h_cnt == H_ACTIVE + H_BLANKING)
if(v_cnt == V_TOTLE)
v_cnt <= 10'd1;
else
v_cnt <= v_cnt + 10'd1;
else
v_cnt <= v_cnt;
end
//数据同步产生
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
de_reg <= 1'b0;
else if(~vs_reg && h_cnt>H_BLANKING && h_cnt <= H_ACTIVE + H_BLANKING)
de_reg <= h_cnt[0];
else
de_reg <= 1'b0;
end
//EAV,SAV和数据生成
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
data <= 8'h00;
vs_reg<=1'b0;
f_reg<=1'b0;
end
else
begin
if(v_cnt>=1 && v_cnt<=22)
begin
f_reg<=1'b0;
vs_reg<=1'b1;
if( (h_cnt == 13'd1) || (h_cnt == H_BLANKING - 3))
data <= 8'hff;
else if((h_cnt == 13'd2) || (h_cnt == 13'd3) || (h_cnt == H_BLANKING - 2) || (h_cnt == H_BLANKING - 1))
data <= 8'h00;
else if(h_cnt == 13'd4)
data <=8'hb6;
else if( h_cnt == H_BLANKING)
data <=8'hab;
else
data <= h_cnt[0] ? 8'h80 : 8'h10;
end
if(v_cnt>=23 && v_cnt<=310)
begin
f_reg<=1'b0;
vs_reg<=1'b0;
if( (h_cnt == 13'd1) || (h_cnt == H_BLANKING - 3))
data <= 8'hff;
else if((h_cnt == 13'd2) || (h_cnt == 13'd3) || (h_cnt == H_BLANKING - 2) || (h_cnt == H_BLANKING - 1))
data <= 8