书接上回,前面简单介绍了红外图像均衡化算法的操作步骤,现在就在FPGA上实现均衡化算法,不同的是由于FPGA内部存储空间有限就不能用当前统计的查找表,只能用上一张图片的统计的查找表来映射本张图像。
fpga实现方法
计算方法上一回已经讲过,这里简单叙述一下fpga上的操作。假设相机是14位640*512的,首先建立一个16383个地址的RAM,图像数据到来时按像素值对RAM相应地址内的数据进行累加,例如图像当前像素值为10,则把地址为10的数据自加1,这样一张图像输出完后就统计出了每个像素值有多少个像素点了。在帧空闲时进行累加,读出前一个地址和当前地址内存储的数据进行加和结果存入当前地址,依次从地址0进行到16383,就完成了累计。最后一步当下一帧图像到来时按像素值进行替换,即取出当前像素值地址对应的累加数除以x作为该像素的像素值,这样就输出了处理后的图像。其中x为上一篇所提到的参数,具体看你想映射到多少位,如果还想映射到14位,以本文为例x就是20.
代码示例
老规矩不废话直接上码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/01/12 09:51:37
// Design Name:
// Module Name: img_enhance
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module img_enhance(
input I_clk,
input I_mem_clk,
input I_reset,
input I_clk_test,
input[15:0] I_video_data,
input I_frame_valid,
input I_line_valid,
output reg[15:0] O_video_data,
output reg O_line_valid,
output reg O_frame_valid,
output wire O_vblank,
output wire O_hblank
);
parameter C_idle = 0,
C_valid = 1,
C_sum = 2,
C_result = 3;
reg[16:0] S_high,
S_low;
reg[7:0] S_state;
reg[15:0] S_cnt;
reg[13:0] S_re_cnt, S_video_data_d0;
reg S_mem0_wen;
wire[13:0] S_mem0_addr;
reg[18:0] S_mem0_din;
wire[18:0] S_mem0_dout;
reg S_mem1_wen;
wire[13:0] S_mem1_addr;
reg[18:0] S_mem1_din;
wire[18:0] S_mem1_dout;
reg S_frame_valid_d0;
reg S_line_valid_d0;
reg[15:0] S_video_out;
reg[18:0] S_mem0_data;
reg[18:0] S_read_temp;
reg S_frame_valid_d1;
reg S_frame_valid_d2;
reg S_line_valid_d1;
reg S_line_valid_d2;
reg S_frame_d0;
wire S_frame_edge;
reg S_addr_sw;
reg S_frame_valid, S_line_valid;
reg[15:0] S_video_data;
assign O_hblank = (~O_line_valid) & O_frame_valid;
assign O_vblank = ~O_frame_valid;
assign S_frame_edge = (S_frame_d0 == 1)&(I_frame_valid == 0);
assign S_mem0_addr = (S_addr_sw == 1) ? S_re_cnt : S_video_data_d0;
assign S_mem1_addr = (S_addr_sw == 1) ? S_re_cnt : S_video_data_d0;
///
//ila_4 ila_4_i(
// .clk(I_mem_clk),
// .probe0(O_line_valid),
// .probe1(O_frame_valid),
// .probe2(S_state),
// .probe3(O_video_data),
// .probe4(I_frame_valid),
// .probe5(I_line_valid),
// .probe6(I_video_data),
// .probe7(S_re_cnt),
// .probe8(S_low),
// .probe9(S_high),
// .probe10(S_mem0_dout),
// .probe11(S_cnt),
// .probe12(S_mem0_din),
// .probe13(S_mem0_addr),
// .probe14(S_mem1_addr),
// .p