一、做图像处理的同学都知道,无论是sobel、高斯、膨胀、腐蚀等这些算法都需要用到三乘三矩阵,而FPGA要实现就很麻烦,方法虽然有很多,但基于shift_ram_ip核这个方法我觉得比较容易理解,话不多说上干货
二、首先我们要理解什么是shift_ram,其实就是移位寄存器,而我们的三乘三矩阵就是利用这个原理建立的直接上代码
//=========================================
//==第二行
//=========================================
assign sec_clk = I_pixel_clk;
assign sec_en = (I_pixel_vld==1'b1);
assign sec_datain = I_pixel;
shift_ram second_line(
.clk (sec_clk ),
.en (sec_en ),
.datain (sec_datain ),
.dataout(sec_dataout )
);
//=========================================
//==第一行
//=========================================
assign fir_clk = I_pixel_clk;
assign fir_en = (vcnt>0 && I_pixel_vld==1'b1);
assign fir_datain = sec_dataout;
shift_ram first_line(
.clk (fir_clk ),
.en (fir_en ),
.datain (fir_datain ),
.dataout(fir_dataout )
);
//=========================================
//==产生3x3矩阵
//=========================================
always @(posedge I_pixel_clk or posedge I_rst) begin
if (I_rst==1'b1) begin
m10_r<=0;
m11_r<=0;
m12_r<=0;
m20_r<=0;
m21_r<=0;
m22_r<=0;
m30_r<=0;
m31_r<=0;
m32_r<=0;
end
else if (I_pixel_vld) begin
m10_r<=m11_r;
m11_r<=m12_r;
m12_r<=fir_dataout;
m20_r<=m21_r;
m21_r<=m22_r;
m22_r<=sec_dataout;
m30_r<=m31_r;
m31_r<=m32_r;
m32_r<=I_pixel;
end
end
原理其实很简单,我们先利用一个shift_ram存储三个字节,这是一行,然后在把这一行的输出在放到一个shift_ram里面,这第二个是第一行,第一个是第二行如图所示