FPGA 伽马校正算法实现

伽马矫正公式为:

为伽马矫正后Y通道输出数据, 为伽马矫正前Y通道输入数据,r为伽马矫正指数,若像素值处于暗处区域,则n取暗处区域最大值,若像素值处于亮处区域,则n取亮处区域最小值;

Matlab仿真曲线如图所示

 主要通过查找表的方式用ROM来实现。

`timescale 1ns / 1ps
//
//实现功能:  非线性Gamma校正       video_data_out = ((video_data_in/255)^exp)*255   ——exp是变化的
//
//输入接口
//video_clk          时钟
//rst_n              复位
//video_data_in      输入Y通道图像数据,12位,
//gamma_cmd          全局Gamma校正参数
//de                 使能信号


// gamma_cmd = 1   ——    全局反Gamma=1.0      
// gamma_cmd = 2   ——    全局反Gamma=1.05   
// gamma_cmd = 3   ——    全局反Gamma=1.1   
// gamma_cmd = 4   ——     全局反Gamma=1.15      
// gamma_cmd = 5   ——    全局反Gamma=1.2   
// gamma_cmd = 6   ——   全局反Gamma=1.25 
// gamma_cmd = 7   ——   全局反Gamma=1.3

//
//输出接口
//video_data_out   Gamma校正后输出Y通道视频数据,
//
//中间变量
//video_data_gamma10    全局反Gamma=1.0时读取出的ROM数据
//video_data_gamma11    全局反Gamma=1.1时读取出的ROM数据
//video_data_gamma12    全局反Gamma=1.2时读取出的ROM数据
//video_data_gamma105    全局反Gamma=1.05时读取出的ROM数据
//video_data_gamma115   全局反Gamma=1.15时读取出的ROM数据
//video_data_gamma125    全局反Gamma=1.25时读取出的ROM数据
//video_data_gamma13     全局反Gamma=1.3时读取出的ROM数据


//提示:共例化了七个ROM分别用于储存全局Gamma=1.0、1.05、1.1、1.15、1.2、1.25、1.3时的查找表输出数据
//
//备注:video_data_out延后video_data_in三个时钟周期
//


module gamma_correction(
input                      video_clk      ,
input                      rst            ,
input                      de_in          ,
input                      hync_in        ,
input                      vync_in        ,
input         [4:0]        gamma_cmd      ,
input         [47:0]       video_data_in_y,
input         [47:0]       video_data_in_u,
input         [47:0]       video_data_in_v,
output   reg               hync_out       ,
output   reg               vync_out       ,
output   reg               de_out         ,
output   reg  [47:0]       video_data_out_y,
output   reg  [47:0]       video_data_out_u,
output   reg  [47:0]       video_data_out_v    
    );
    

wire [11:0] video_data_gamma10_1;
wire [11:0] video_data_gamma10_2;
wire [11:0] video_data_gamma10_3;
wire [11:0] video_data_gamma10_4;

wire [11:0] video_data_gamma10_1_out;
wire [11:0] video_data_gamma10_2_out;
wire [11:0] video_data_gamma10_3_out;
wire [11:0] video_data_gamma10_4_out;


wire [11:0] video_data_gamma105_1;
wire [11:0] video_data_gamma105_2;
wire [11:0] video_data_gamma105_3;
wire [11:0] video_data_gamma105_4;

wire [11:0] video_data_gamma105_1_out;
wire [11:0] video_data_gamma105_2_out;
wire [11:0] video_data_gamma105_3_out;
wire [11:0] video_data_gamma105_4_out;



wire [11:0] video_data_gamma11_1;
wire [11:0] video_data_gamma11_2;
wire [11:0] video_data_gamma11_3;
wire [11:0] video_data_gamma11_4;

wire [11:0] video_data_gamma11_1_out;
wire [11:0] video_data_gamma11_2_out;
wire [11:0] video_data_gamma11_3_out;
wire [11:0] video_data_gamma11_4_out;


wire [11:0] video_data_gamma115_1;
wire [11:0] video_data_gamma115_2;
wire [11:0] video_data_gamma115_3;
wire [11:0] video_data_gamma115_4;

wire [11:0] video_data_gamma115_1_out;
wire [11:0] video_data_gamma115_2_out;
wire [11:0] video_data_gamma115_3_out;
wire [11:0] video_data_gamma115_4_out;


wire [11:0] video_data_gamma12_1;
wire [11:0] video_data_gamma12_2;
wire [11:0] video_data_gamma12_3;
wire [11:0] video_data_gamma12_4;

wire [11:0] video_data_gamma12_1_out;
wire [11:0] video_data_gamma12_2_out;
wire [11:0] video_data_gamma12_3_out;
wire [11:0] video_data_gamma12_4_out;


wire [11:0] video_data_gamma125_1;
wire [11:0] video_data_gamma125_2;
wire [11:0] video_data_gamma125_3;
wire [11:0] video_data_gamma125_4;

wire [11:0] video_data_gamma125_1_out;
wire [11:0] video_data_gamma125_2_out;
wire [11:0] video_data_gamma125_3_out;
wire [11:0] video_data_gamma125_4_out;


wire [11:0] video_data_gamma13_1;
wire [11:0] video_data_gamma13_2;
wire [11:0] video_data_gamma13_3;
wire [11:0] video_data_gamma13_4;

wire [11:0] video_data_gamma13_1_out;
wire [11:0] video_data_gamma13_2_out;
wire [11:0] video_data_gamma13_3_out;
wire [11:0] video_data_gamma13_4_out;

/
wire [11:0] video_data_zgamma10_1;
wire [11:0] video_data_zgamma10_2;
wire [11:0] video_data_zgamma10_3;
wire [11:0] video_data_zgamma10_4;

wire [11:0] video_data_zgamma10_1_out;
wire [11:0] video_data_zgamma10_2_out;
wire [11:0] video_data_zgamma10_3_out;
wire [11:0] video_data_zgamma10_4_out;


wire [11:0] video_data_zgamma105_1;
wire [11:0] video_data_zgamma105_2;
wire [11:0] video_data_zgamma105_3;
wire [11:0] video_data_zgamma105_4;

wire [11:0] video_data_zgamma105_1_out;
wire [11:0] video_data_zgamma105_2_out;
wire [11:0] video_data_zgamma105_3_out;
wire [11:0] video_data_zgamma105_4_out;



wire [11:0] video_data_zgamma11_1;
wire [11:0] video_data_zgamma11_2;
wire [11:0] video_data_zgamma11_3;
wire [11:0] video_data_zgamma11_4;

wire [11:0] video_data_zgamma11_1_out;
wire [11:0] video_data_zgamma11_2_out;
wire [11:0] video_data_zgamma11_3_out;
wire [11:0] video_data_zgamma11_4_out;


wire [11:0] video_data_zgamma115_1;
wire [11:0] video_data_zgamma115_2;
wire [11:0] video_data_zgamma115_3;
wire [11:0] video_data_zgamma115_4;

wire [11:0] video_data_zgamma115_1_out;
wire [11:0] video_data_zgamma115_2_out;
wire [11:0] video_data_zgamma115_3_out;
wire [11:0] video_data_zgamma115_4_out;


wire [11:0] video_data_zgamma12_1;
wire [11:0] video_data_zgamma12_2;
wire [11:0] video_data_zgamma12_3;
wire [11:0] video_data_zgamma12_4;

wire [11:0] video_data_zgamma12_1_out;
wire [11:0] video_data_zgamma12_2_out;
wire [11:0] video_data_zgamma12_3_out;
wire [11:0] video_data_zgamma12_4_out;



wire [11:0] video_data_zgamma125_1;
wire [11:0] video_data_zgamma125_2;
wire [11:0] video_data_zgamma125_3;
wire [11:0] video_data_zgamma125_4;

wire [11:0] video_data_zgamma125_1_out;
wire [11:0] video_data_zgamma125_2_out;
wire [11:0] video_data_zgamma125_3_out;
wire [11:0] video_data_zgamma125_4_out;



wire [11:0] video_data_zgamma13_1;
wire [11:0] video_data_zgamma13_2;
wire [11:0] video_data_zgamma13_3;
wire [11:0] video_data_zgamma13_4;

wire [11:0] video_data_zgamma13_1_out;
wire [11:0] video_data_zgamma13_2_out;
wire [11:0] video_data_zgamma13_3_out;
wire [11:0] video_data_zgamma13_4_out;

/

reg hync_r0;
reg hync_r1;
reg vync_r0;
reg vync_r1;
reg de_r0;
reg de_r1;
reg [47:0]  video_data_y_r0;
reg [47:0]  video_data_y_r1;
reg [47:0]  video_data_u_r0;
reg [47:0]  video_data_u_r1;
reg [47:0]  video_data_v_r0;
reg [47:0]  video_data_v_r1;

assign {video_data_gamma10_1,video_data_gamma10_2,video_data_gamma10_3,video_data_gamma10_4} = video_data_in_y;
assign {video_data_gamma105_1,video_data_gamma105_2,video_data_gamma105_3,video_data_gamma105_4} = video_data_in_y;
assign {video_data_gamma11_1,video_data_gamma11_2,video_data_gamma11_3,video_data_gamma11_4} = video_data_in_y;
assign {video_data_gamma115_1,video_data_gamma115_2,video_data_gamma115_3,video_data_gamma115_4} = video_data_in_y;
assign {video_data_gamma12_1,video_data_gamma12_2,video_data_gamma12_3,video_data_gamma12_4} = video_data_in_y;
assign {video_data_gamma125_1,video_data_gamma125_2,video_data_gamma125_3,video_data_gamma125_4} = video_data_in_y;
assign {video_data_gamma13_1,video_data_gamma13_2,video_data_gamma13_3,video_data_gamma13_4} = video_data_in_y;


assign {video_data_zgamma10_1,video_data_zgamma10_2,video_data_zgamma10_3,video_data_zgamma10_4} = video_data_in_y;
assign {video_data_zgamma105_1,video_data_zgamma105_2,video_data_zgamma105_3,video_data_zgamma105_4} = video_data_in_y;
assign {video_data_zgamma11_1,video_data_zgamma11_2,video_data_zgamma11_3,video_data_zgamma11_4} = video_data_in_y;
assign {video_data_zgamma115_1,video_data_zgamma115_2,video_data_zgamma115_3,video_data_zgamma115_4} = video_data_in_y;
assign {video_data_zgamma12_1,video_data_zgamma12_2,video_data_zgamma12_3,video_data_zgamma12_4} = video_data_in_y;
assign {video_data_zgamma125_1,video_data_zgamma125_2,video_data_zgamma125_3,video_data_zgamma125_4} = video_data_in_y;
assign {video_data_zgamma13_1,video_data_zgamma13_2,video_data_zgamma13_3,video_data_zgamma13_4} = video_data_in_y;



always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        video_data_u_r0 <= 48'd0;
        video_data_u_r1 <= 48'd0;
        video_data_out_u<= 48'd0;
    end
    else
    begin
        video_data_u_r0 <= video_data_in_u;
        video_data_u_r1 <= video_data_u_r0;
        video_data_out_u<= video_data_u_r1;
    end
end

always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        video_data_v_r0 <= 48'd0;
        video_data_v_r1 <= 48'd0;
        video_data_out_v<= 48'd0;
    end
    else
    begin
        video_data_v_r0 <= video_data_in_v;
        video_data_v_r1 <= video_data_v_r0;
        video_data_out_v<= video_data_v_r1;
    end
end

always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        video_data_y_r0 <= 48'd0;
        video_data_y_r1 <= 48'd0;
    end
    else
    begin
        video_data_y_r0 <= video_data_in_y;
        video_data_y_r1 <= video_data_y_r0;
    end
end


always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        hync_r0  <= 1'b0;
        hync_r1  <= 1'b0;
        hync_out <= 1'b0;
    end
    else
    begin
        hync_r0  <= hync_in;
        hync_r1  <= hync_r0;
        hync_out <= hync_r1;
    end
end

always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        vync_r0  <= 1'b0;
        vync_r1  <= 1'b0;
        vync_out <= 1'b0;
    end
    else
    begin
        vync_r0  <= vync_in;
        vync_r1  <= vync_r0;
        vync_out <= vync_r1;
    end
end

always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        de_r0  <= 1'b0;
        de_r1  <= 1'b0;
        de_out <= 1'b0;
    end
    else
    begin
        de_r0  <= de_in;
        de_r1  <= de_r0;
        de_out <= de_r1;
    end
end


always@(posedge video_clk or posedge rst)   
begin
    if(rst)
        video_data_out_y <= 48'b0;            
    else if((gamma_cmd == 5'd1)&&(de_out))
        video_data_out_y <= {video_data_gamma10_1_out,video_data_gamma10_2_out,video_data_gamma10_3_out,video_data_gamma10_4_out};
    else if((gamma_cmd == 5'd2)&&(de_out))
        video_data_out_y <= {video_data_gamma105_1_out,video_data_gamma105_2_out,video_data_gamma105_3_out,video_data_gamma105_4_out};
    else if((gamma_cmd == 5'd3)&&(de_out))
        video_data_out_y <= {video_data_gamma11_1_out,video_data_gamma11_2_out,video_data_gamma11_3_out,video_data_gamma11_4_out};
    else if((gamma_cmd == 5'd4)&&(de_out))
        video_data_out_y <= {video_data_gamma115_1_out,video_data_gamma115_2_out,video_data_gamma115_3_out,video_data_gamma115_4_out};
    else if((gamma_cmd == 5'd5)&&(de_out))
        video_data_out_y <= {video_data_gamma12_1_out,video_data_gamma12_2_out,video_data_gamma12_3_out,video_data_gamma12_4_out};
    else if((gamma_cmd == 5'd6)&&(de_out))
        video_data_out_y <= {video_data_gamma125_1_out,video_data_gamma125_2_out,video_data_gamma125_3_out,video_data_gamma125_4_out};
    else if((gamma_cmd == 5'd7)&&(de_out))
        video_data_out_y <= {video_data_gamma13_1_out,video_data_gamma13_2_out,video_data_gamma13_3_out,video_data_gamma13_4_out};
        
/
    else if((gamma_cmd == 5'd8)&&(de_out))
        video_data_out_y <= {video_data_zgamma10_1_out,video_data_zgamma10_2_out,video_data_zgamma10_3_out,video_data_zgamma10_4_out};
   else if((gamma_cmd == 5'd9)&&(de_out))
        video_data_out_y <= {video_data_zgamma105_1_out,video_data_zgamma105_2_out,video_data_zgamma105_3_out,video_data_zgamma105_4_out};
   else if((gamma_cmd == 5'd10)&&(de_out))
        video_data_out_y <={video_data_zgamma11_1_out,video_data_zgamma11_2_out,video_data_zgamma11_3_out,video_data_zgamma11_4_out};
   else if((gamma_cmd == 5'd11)&&(de_out))
        video_data_out_y <={video_data_zgamma115_1_out,video_data_zgamma115_2_out,video_data_zgamma115_3_out,video_data_zgamma115_4_out};
   else if((gamma_cmd == 5'd12)&&(de_out))
        video_data_out_y <={video_data_zgamma12_1_out,video_data_zgamma12_2_out,video_data_zgamma12_3_out,video_data_zgamma12_4_out};             
   else if((gamma_cmd == 5'd13)&&(de_out))
        video_data_out_y <={video_data_zgamma125_1_out,video_data_zgamma125_2_out,video_data_zgamma125_3_out,video_data_zgamma125_4_out};
   else if((gamma_cmd == 5'd14)&&(de_out))
        video_data_out_y <= {video_data_zgamma13_1_out,video_data_zgamma13_2_out,video_data_zgamma13_3_out,video_data_zgamma13_4_out};  
/        

   else
        video_data_out_y <= video_data_y_r1;
end


    
    
blk_mem_gen_0 gamma10_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma10_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma10_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_0 gamma10_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma10_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma10_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_0 gamma10_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma10_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma10_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_0 gamma10_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma10_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma10_4_out)  // output wire [11 : 0] douta
);



blk_mem_gen_1 gamma105_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma105_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma105_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_1 gamma105_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma105_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma105_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_1 gamma105_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma105_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma105_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_1 gamma105_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma105_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma105_4_out)  // output wire [11 : 0] douta
);


blk_mem_gen_2 gamma11_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma11_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma11_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_2 gamma11_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma11_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma11_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_2 gamma11_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma11_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma11_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_2 gamma11_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma11_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma11_4_out)  // output wire [11 : 0] douta
);



blk_mem_gen_3 gamma115_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma115_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma115_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_3 gamma115_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma115_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma115_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_3 gamma115_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma115_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma115_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_3 gamma115_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma115_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma115_4_out)  // output wire [11 : 0] douta
);




blk_mem_gen_4 gamma12_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma12_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma12_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_4 gamma12_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma12_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma12_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_4 gamma12_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma12_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma12_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_4 gamma12_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma12_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma12_4_out)  // output wire [11 : 0] douta
);



blk_mem_gen_5 gamma125_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma125_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma125_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_5 gamma125_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma125_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma125_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_5 gamma125_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma125_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma125_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_5 gamma125_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma125_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma125_4_out)  // output wire [11 : 0] douta
);




blk_mem_gen_6 gamma13_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma13_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma13_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_6 gamma13_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma13_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma13_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_6 gamma13_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma13_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma13_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_6 gamma13_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_gamma13_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma13_4_out)  // output wire [11 : 0] douta
);






/
blk_mem_gen_7 zgamma10_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma10_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma10_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_7 zgamma10_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma10_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma10_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_7 zgamma10_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma10_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma10_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_7 zgamma10_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma10_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma10_4_out)  // output wire [11 : 0] douta
);


blk_mem_gen_8 zgamma105_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma105_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma105_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_8 zgamma105_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma105_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma105_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_8 zgamma105_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma105_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma105_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_8 zgamma105_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma105_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma105_4_out)  // output wire [11 : 0] douta
);




blk_mem_gen_9 zgamma11_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma11_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma11_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_9 zgamma11_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma11_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma11_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_9 zgamma11_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma11_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma11_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_9 zgamma11_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma11_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma11_4_out)  // output wire [11 : 0] douta
);




blk_mem_gen_10 zgamma115_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma115_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma115_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_10 zgamma115_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma115_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma115_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_10 zgamma115_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma115_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma115_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_10 zgamma115_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma115_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma115_4_out)  // output wire [11 : 0] douta
);






blk_mem_gen_11 zgamma12_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma12_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma12_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_11 zgamma12_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma12_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma12_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_11 zgamma12_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma12_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma12_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_11 zgamma12_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma12_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma12_4_out)  // output wire [11 : 0] douta
);


blk_mem_gen_12 zgamma125_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma125_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma125_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_12 zgamma125_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma125_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma125_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_12 zgamma125_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma125_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma125_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_12 zgamma125_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma125_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma125_4_out)  // output wire [11 : 0] douta
);


/* 


blk_mem_gen_13 zgamma13_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma13_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma13_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_13 zgamma13_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma13_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma13_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_13 zgamma13_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma13_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma13_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_13 zgamma13_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_zgamma13_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma13_4_out)  // output wire [11 : 0] douta
);*/


endmodule

以上为伽马校正查找表代码,根据优化我们可以把亮部放入一个ROM中,暗部放入一个ROM中,如图所示

`timescale 1ns / 1ps
//
//实现功能:  非线性Gamma校正       video_data_out = ((video_data_in/255)^exp)*255   ——exp是变化的
//
//输入接口
//video_clk          时钟
//rst_n              复位
//video_data_in      输入Y通道图像数据,12位,
//gamma_cmd          全局Gamma校正参数
//de                 使能信号


// gamma_cmd = 1   ——    全局反Gamma=1.0      
// gamma_cmd = 2   ——    全局反Gamma=1.05   
// gamma_cmd = 3   ——    全局反Gamma=1.1   
// gamma_cmd = 4   ——     全局反Gamma=1.15      
// gamma_cmd = 5   ——    全局反Gamma=1.2   
// gamma_cmd = 6   ——   全局反Gamma=1.25 
// gamma_cmd = 7   ——   全局反Gamma=1.3

//
//输出接口
//video_data_out   Gamma校正后输出Y通道视频数据,
//
//中间变量
//video_data_gamma10    全局反Gamma=1.0时读取出的ROM数据
//video_data_gamma11    全局反Gamma=1.1时读取出的ROM数据
//video_data_gamma12    全局反Gamma=1.2时读取出的ROM数据
//video_data_gamma105    全局反Gamma=1.05时读取出的ROM数据
//video_data_gamma115   全局反Gamma=1.15时读取出的ROM数据
//video_data_gamma125    全局反Gamma=1.25时读取出的ROM数据
//video_data_gamma13     全局反Gamma=1.3时读取出的ROM数据


//提示:共例化了七个ROM分别用于储存全局Gamma=1.0、1.05、1.1、1.15、1.2、1.25、1.3时的查找表输出数据
//
//备注:video_data_out延后video_data_in四个时钟周期
//


module gamma_correction(
input                      video_clk      ,
input                      rst            ,
input                      de_in          ,
input                      hync_in        ,
input                      vync_in        ,
input         [4:0]        gamma_cmd      ,
input         [47:0]       video_data_in_y,
input         [47:0]       video_data_in_u,
input         [47:0]       video_data_in_v,
output   reg               hync_out       ,
output   reg               vync_out       ,
output   reg               de_out         ,
output   reg  [47:0]       video_data_out_y,
output   reg  [47:0]       video_data_out_u,
output   reg  [47:0]       video_data_out_v    
    );
    


reg [11:0] video_data_y_in_1;
reg [11:0] video_data_y_in_2;
reg [11:0] video_data_y_in_3;
reg [11:0] video_data_y_in_4;


wire [11:0] video_data_gamma10_1_out;
wire [11:0] video_data_gamma10_2_out;
wire [11:0] video_data_gamma10_3_out;
wire [11:0] video_data_gamma10_4_out;



wire [11:0] video_data_gamma105_1_out;
wire [11:0] video_data_gamma105_2_out;
wire [11:0] video_data_gamma105_3_out;
wire [11:0] video_data_gamma105_4_out;



wire [11:0] video_data_gamma11_1_out;
wire [11:0] video_data_gamma11_2_out;
wire [11:0] video_data_gamma11_3_out;
wire [11:0] video_data_gamma11_4_out;



wire [11:0] video_data_gamma115_1_out;
wire [11:0] video_data_gamma115_2_out;
wire [11:0] video_data_gamma115_3_out;
wire [11:0] video_data_gamma115_4_out;



wire [11:0] video_data_gamma12_1_out;
wire [11:0] video_data_gamma12_2_out;
wire [11:0] video_data_gamma12_3_out;
wire [11:0] video_data_gamma12_4_out;



wire [11:0] video_data_gamma125_1_out;
wire [11:0] video_data_gamma125_2_out;
wire [11:0] video_data_gamma125_3_out;
wire [11:0] video_data_gamma125_4_out;



wire [11:0] video_data_gamma13_1_out;
wire [11:0] video_data_gamma13_2_out;
wire [11:0] video_data_gamma13_3_out;
wire [11:0] video_data_gamma13_4_out;

/
wire [11:0] video_data_zgamma10_1_out;
wire [11:0] video_data_zgamma10_2_out;
wire [11:0] video_data_zgamma10_3_out;
wire [11:0] video_data_zgamma10_4_out;



wire [11:0] video_data_zgamma105_1_out;
wire [11:0] video_data_zgamma105_2_out;
wire [11:0] video_data_zgamma105_3_out;
wire [11:0] video_data_zgamma105_4_out;



wire [11:0] video_data_zgamma11_1_out;
wire [11:0] video_data_zgamma11_2_out;
wire [11:0] video_data_zgamma11_3_out;
wire [11:0] video_data_zgamma11_4_out;



wire [11:0] video_data_zgamma115_1_out;
wire [11:0] video_data_zgamma115_2_out;
wire [11:0] video_data_zgamma115_3_out;
wire [11:0] video_data_zgamma115_4_out;



wire [11:0] video_data_zgamma12_1_out;
wire [11:0] video_data_zgamma12_2_out;
wire [11:0] video_data_zgamma12_3_out;
wire [11:0] video_data_zgamma12_4_out;



wire [11:0] video_data_zgamma125_1_out;
wire [11:0] video_data_zgamma125_2_out;
wire [11:0] video_data_zgamma125_3_out;
wire [11:0] video_data_zgamma125_4_out;



wire [11:0] video_data_zgamma13_1_out;
wire [11:0] video_data_zgamma13_2_out;
wire [11:0] video_data_zgamma13_3_out;
wire [11:0] video_data_zgamma13_4_out;



wire [11:0] video_data_kgamma_1_out;
wire [11:0] video_data_kgamma_2_out;
wire [11:0] video_data_kgamma_3_out;
wire [11:0] video_data_kgamma_4_out;


/


reg hync_r0;
reg hync_r1;
reg hync_r2;
reg vync_r0;
reg vync_r1;
reg vync_r2;
reg de_r0;
reg de_r1;
reg de_r2;
reg [47:0]  video_data_y_r0;
reg [47:0]  video_data_y_r1;
reg [47:0]  video_data_y_r2;
reg [47:0]  video_data_u_r0;
reg [47:0]  video_data_u_r1;
reg [47:0]  video_data_u_r2;
reg [47:0]  video_data_v_r0;
reg [47:0]  video_data_v_r1;
reg [47:0]  video_data_v_r2;




always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        video_data_y_in_1 <= 12'b0; 
        video_data_y_in_2 <= 12'b0;
        video_data_y_in_3 <= 12'b0; 
        video_data_y_in_4 <= 12'b0;        
    end
    else if(gamma_cmd == 5'd16)
        {video_data_y_in_1,video_data_y_in_2,video_data_y_in_3,video_data_y_in_4} <= {video_data_in_y[47:36]+12'd1200,video_data_in_y[35:24]+12'd1200,video_data_in_y[23:12]+12'd1200,video_data_in_y[11:0]+12'd1200}; 
    else if(gamma_cmd == 5'd17)
        {video_data_y_in_1,video_data_y_in_2,video_data_y_in_3,video_data_y_in_4} <= {video_data_in_y[47:36]+12'd2800,video_data_in_y[35:24]+12'd2800,video_data_in_y[23:12]+12'd2800,video_data_in_y[11:0]+12'd2800}; 
    else
        {video_data_y_in_1,video_data_y_in_2,video_data_y_in_3,video_data_y_in_4} <= {video_data_in_y[47:36],video_data_in_y[35:24],video_data_in_y[23:12],video_data_in_y[11:0]};    
end








always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        video_data_u_r0 <= 48'd0;
        video_data_u_r1 <= 48'd0;
        video_data_u_r2 <= 48'd0;
        video_data_out_u<= 48'd0;
    end
    else
    begin
        video_data_u_r0 <= video_data_in_u;
        video_data_u_r1 <= video_data_u_r0;
        video_data_u_r2 <= video_data_u_r1;
        video_data_out_u<= video_data_u_r2;
    end
end

always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        video_data_v_r0 <= 48'd0;
        video_data_v_r1 <= 48'd0;
        video_data_v_r1 <= 48'd0;
        video_data_out_v<= 48'd0;
    end
    else
    begin
        video_data_v_r0 <= video_data_in_v;
        video_data_v_r1 <= video_data_v_r0;
        video_data_v_r2 <= video_data_v_r1;
        video_data_out_v<= video_data_v_r2;
    end
end

always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        video_data_y_r0 <= 48'd0;
        video_data_y_r1 <= 48'd0;
        video_data_y_r2 <= 48'd0;
    end
    else
    begin
        video_data_y_r0 <= video_data_in_y;
        video_data_y_r1 <= video_data_y_r0;
        video_data_y_r2 <= video_data_y_r1;
    end
end


always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        hync_r0  <= 1'b0;
        hync_r1  <= 1'b0;
        hync_r2  <= 1'b0;
        hync_out <= 1'b0;
    end
    else
    begin
        hync_r0  <= hync_in;
        hync_r1  <= hync_r0;
        hync_r2  <= hync_r1;
        hync_out <= hync_r2;
    end
end

always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        vync_r0  <= 1'b0;
        vync_r1  <= 1'b0;
        vync_r2  <= 1'b0;
        vync_out <= 1'b0;
    end
    else
    begin
        vync_r0  <= vync_in;
        vync_r1  <= vync_r0;
        vync_r2  <= vync_r1;
        vync_out <= vync_r2;
    end
end

always@(posedge video_clk or posedge rst)   
begin
    if(rst)
    begin
        de_r0  <= 1'b0;
        de_r1  <= 1'b0;
        de_r2  <= 1'b0;
        de_out <= 1'b0;
    end
    else
    begin
        de_r0  <= de_in;
        de_r1  <= de_r0;
        de_r2  <= de_r1;
        de_out <= de_r2;
    end
end





always@(posedge video_clk or posedge rst)   
begin
    if(rst)
        video_data_out_y <= 48'b0;            
    else if((gamma_cmd == 5'd1)&&(de_r2))
        video_data_out_y <= {video_data_gamma10_1_out,video_data_gamma10_2_out,video_data_gamma10_3_out,video_data_gamma10_4_out};
    else if((gamma_cmd == 5'd2)&&(de_r2))
        video_data_out_y <= {video_data_gamma105_1_out,video_data_gamma105_2_out,video_data_gamma105_3_out,video_data_gamma105_4_out};
    else if((gamma_cmd == 5'd3)&&(de_r2))
        video_data_out_y <= {video_data_gamma11_1_out,video_data_gamma11_2_out,video_data_gamma11_3_out,video_data_gamma11_4_out};
    else if((gamma_cmd == 5'd4)&&(de_r2))
        video_data_out_y <= {video_data_gamma115_1_out,video_data_gamma115_2_out,video_data_gamma115_3_out,video_data_gamma115_4_out};
    else if((gamma_cmd == 5'd5)&&(de_r2))
        video_data_out_y <= {video_data_gamma12_1_out,video_data_gamma12_2_out,video_data_gamma12_3_out,video_data_gamma12_4_out};
    else if((gamma_cmd == 5'd6)&&(de_r2))
        video_data_out_y <= {video_data_gamma125_1_out,video_data_gamma125_2_out,video_data_gamma125_3_out,video_data_gamma125_4_out};
    else if((gamma_cmd == 5'd7)&&(de_r2))
        video_data_out_y <= {video_data_gamma13_1_out,video_data_gamma13_2_out,video_data_gamma13_3_out,video_data_gamma13_4_out};
        
/
    else if((gamma_cmd == 5'd8)&&(de_r2))
        video_data_out_y <= {video_data_zgamma10_1_out,video_data_zgamma10_2_out,video_data_zgamma10_3_out,video_data_zgamma10_4_out};
   else if((gamma_cmd == 5'd9)&&(de_r2))
        video_data_out_y <= {video_data_zgamma105_1_out,video_data_zgamma105_2_out,video_data_zgamma105_3_out,video_data_zgamma105_4_out};
   else if((gamma_cmd == 5'd10)&&(de_r2))
        video_data_out_y <={video_data_zgamma11_1_out,video_data_zgamma11_2_out,video_data_zgamma11_3_out,video_data_zgamma11_4_out};
   else if((gamma_cmd == 5'd11)&&(de_r2))
        video_data_out_y <={video_data_zgamma115_1_out,video_data_zgamma115_2_out,video_data_zgamma115_3_out,video_data_zgamma115_4_out};
   else if((gamma_cmd == 5'd12)&&(de_r2))
        video_data_out_y <={video_data_zgamma12_1_out,video_data_zgamma12_2_out,video_data_zgamma12_3_out,video_data_zgamma12_4_out};             
   else if((gamma_cmd == 5'd13)&&(de_r2))
        video_data_out_y <={video_data_zgamma125_1_out,video_data_zgamma125_2_out,video_data_zgamma125_3_out,video_data_zgamma125_4_out};
   else if((gamma_cmd == 5'd14)&&(de_r2))
        video_data_out_y <= {video_data_zgamma13_1_out,video_data_zgamma13_2_out,video_data_zgamma13_3_out,video_data_zgamma13_4_out};  
/        
   else if((gamma_cmd == 5'd15)&&(de_r2))
        video_data_out_y <= {video_data_kgamma_1_out,video_data_kgamma_2_out,video_data_kgamma_3_out,video_data_kgamma_4_out};  
   else if((gamma_cmd == 5'd16)&&(de_r2))
        video_data_out_y <= {video_data_kgamma_1_out,video_data_kgamma_2_out,video_data_kgamma_3_out,video_data_kgamma_4_out};  
   else if((gamma_cmd == 5'd17)&&(de_r2))
        video_data_out_y <= {video_data_kgamma_1_out,video_data_kgamma_2_out,video_data_kgamma_3_out,video_data_kgamma_4_out};          
   else if(de_r2)
        video_data_out_y <= video_data_y_r2;
   else 
        video_data_out_y <= 48'b0;    
end


    
    
blk_mem_gen_0 gamma10_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma10_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_0 gamma10_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma10_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_0 gamma10_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma10_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_0 gamma10_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma10_4_out)  // output wire [11 : 0] douta
);



blk_mem_gen_1 gamma105_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma105_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_1 gamma105_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma105_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_1 gamma105_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma105_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_1 gamma105_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma105_4_out)  // output wire [11 : 0] douta
);


blk_mem_gen_2 gamma11_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma11_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_2 gamma11_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma11_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_2 gamma11_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma11_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_2 gamma11_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma11_4_out)  // output wire [11 : 0] douta
);



blk_mem_gen_3 gamma115_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma115_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_3 gamma115_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma115_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_3 gamma115_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma115_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_3 gamma115_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma115_4_out)  // output wire [11 : 0] douta
);




blk_mem_gen_4 gamma12_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma12_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_4 gamma12_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma12_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_4 gamma12_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma12_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_4 gamma12_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma12_4_out)  // output wire [11 : 0] douta
);



blk_mem_gen_5 gamma125_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma125_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_5 gamma125_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma125_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_5 gamma125_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma125_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_5 gamma125_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma125_4_out)  // output wire [11 : 0] douta
);




blk_mem_gen_6 gamma13_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [11 : 0] addra
  .douta(video_data_gamma13_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_6 gamma13_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [11 : 0] addra
  .douta(video_data_gamma13_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_6 gamma13_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [11 : 0] addra
  .douta(video_data_gamma13_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_6 gamma13_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [11 : 0] addra
  .douta(video_data_gamma13_4_out)  // output wire [11 : 0] douta
);






/
blk_mem_gen_7 zgamma10_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma10_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_7 zgamma10_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma10_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_7 zgamma10_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma10_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_7 zgamma10_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma10_4_out)  // output wire [11 : 0] douta
);


blk_mem_gen_8 zgamma105_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma105_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_8 zgamma105_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma105_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_8 zgamma105_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma105_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_8 zgamma105_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma105_4_out)  // output wire [11 : 0] douta
);




blk_mem_gen_9 zgamma11_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma11_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_9 zgamma11_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma11_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_9 zgamma11_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma11_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_9 zgamma11_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma11_4_out)  // output wire [11 : 0] douta
);




blk_mem_gen_10 zgamma115_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma115_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_10 zgamma115_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma115_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_10 zgamma115_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma115_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_10 zgamma115_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma115_4_out)  // output wire [11 : 0] douta
);






blk_mem_gen_11 zgamma12_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma12_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_11 zgamma12_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma12_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_11 zgamma12_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma12_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_11 zgamma12_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma12_4_out)  // output wire [11 : 0] douta
);


blk_mem_gen_12 zgamma125_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma125_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_12 zgamma125_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma125_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_12 zgamma125_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma125_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_12 zgamma125_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma125_4_out)  // output wire [11 : 0] douta
);





blk_mem_gen_13 zgamma13_1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [12 : 0] addra
  .douta(video_data_zgamma13_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_13 zgamma13_2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [12 : 0] addra
  .douta(video_data_zgamma13_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_13 zgamma13_3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [12 : 0] addra
  .douta(video_data_zgamma13_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_13 zgamma13_4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [12 : 0] addra
  .douta(video_data_zgamma13_4_out)  // output wire [11 : 0] douta
);


//

blk_mem_gen_14 kgamma1 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_1),  // input wire [11 : 0] addra
  .douta(video_data_kgamma_1_out)  // output wire [11 : 0] douta
);

blk_mem_gen_14 kgamma2 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_2),  // input wire [11 : 0] addra
  .douta(video_data_kgamma_2_out)  // output wire [11 : 0] douta
);

blk_mem_gen_14 kgamma3 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_3),  // input wire [11 : 0] addra
  .douta(video_data_kgamma_3_out)  // output wire [11 : 0] douta
);

blk_mem_gen_14 kgamma4 (
  .clka(video_clk),    // input wire clka
  .addra(video_data_y_in_4),  // input wire [11 : 0] addra
  .douta(video_data_kgamma_4_out)  // output wire [11 : 0] douta
);

endmodule

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校正是一种常用的图像处理方法,可以用于调整图像的亮度和对比度。而MSR算法则是基于校正的一种图像增强算法,可以提高图像的清晰度和对比度。以下是基于校正的MSR算法的matlab实现: ```matlab function [out_image] = MSR(image, gamma, alpha, beta) % image: 输入图像 % gamma: 校正参数 % alpha: 对比度增益参数 % beta: 空间域平滑参数 % 将图像转换为灰度图像 if size(image, 3) == 3 image = rgb2gray(image); end % 对图像进行校正 gamma_image = imadjust(image, [], [], gamma); % 计算图像的梯度幅值和方向 [Gmag, Gdir] = imgradient(gamma_image); % 对梯度幅值进行归一化 Gmag_norm = Gmag ./ max(Gmag(:)); % 计算梯度幅值的均值 Gmag_mean = mean(Gmag_norm(:)); % 计算局部对比度权重 contrast_weight = alpha * (Gmag_norm - Gmag_mean) + Gmag_mean; % 对权重进行空间域平滑处理 H = fspecial('gaussian', [5 5], beta); contrast_weight_smooth = imfilter(contrast_weight, H, 'replicate'); % 对图像进行MSR增强 out_image = gamma_image .* contrast_weight_smooth; % 对增强后的图像进行灰度级拉伸 out_image = imadjust(out_image, [], [], [0 1], []); ``` 其中,输入的参数gamma表示校正参数,alpha表示对比度增益参数,beta表示空间域平滑参数。该函数首先将输入图像转换为灰度图像,然后对图像进行校正。接着,计算图像的梯度幅值和方向,并对梯度幅值进行归一化。然后,计算梯度幅值的均值,并根据梯度幅值和均值计算局部对比度权重。对权重进行空间域平滑处理后,对图像进行MSR增强。最后,进行灰度级拉伸,输出增强后的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值