基于FPGA对图像边沿检测

1.sobel算子是一个基于3*3矩阵。属于精简的图像边沿检测,这里简述其原理。主要是对FPGA中的ip核,这次涉及到双fifo流水处理图片对其边沿进行检测。需要对数据进行延时,其原理为:

         当前的输入数据pi_data由于fifo1和fifo2的读使能来源于写使能延时,而写使能来源于当前数据的标志位,即pi_flag(截图中没有)。所以当前数据要根据读使能延时跟当前的fifo1、fifo2的输出数据同步。而输出数据需要延时2次才可以产生3*3的矩阵。产生矩阵才可以对矩阵中间的数据进行数据检测,最终根据设定好的阈值判断是否为边缘。

2.sobel算子的原理如下:

3.这次仿真波形信号比较多,而且用到之前的模块,最终要实现在显示屏上。主要用到了分频模块,需要将芯片的50M时钟转换为25M,还有2个fifo流水传递数据进行边缘检测,最终将数据送到ram核中,ram核最终将数据传递给vga显示器上。

4.不同的是这次的测试文件不好写,由于时钟周期为25M计数器需要记到2600左右(主要是针对波特率为9600)。所以p出整个顶层的测试代码。

`timescale	1ns/1ns
module	tb_top_vga;
        reg		sclk;
        reg		rst_n;
        reg		rx_in;
        
initial
		begin
			sclk=0;
			rst_n<=0;
			rx_in<=0;
			#300
			rst_n<=1;
			
		end
always #10 sclk=~sclk;


parameter	CNT=9;
parameter   BIT_CNT=4;
reg [4:0] 	cnt;
reg [3:0]  	bit_cnt;

always@(posedge sclk or negedge rst_n)
		if(!rst_n)
			cnt<=5'd0;
		else if(cnt==CNT)
			cnt<=5'd0;
			else cnt<=cnt+1'b1;

always@(posedge sclk or negedge rst_n)
		if(!rst_n)
			bit_cnt<=4'd0;
			else if(bit_cnt==BIT_CNT&&cnt==CNT)
				bit_cnt<=4'd0;
				else if(cnt==CNT)
					bit_cnt<=bit_cnt+1'b1;

always@(posedge sclk or negedge rst_n) //产生随机数
		if(!rst_n)
			rx_in<=1'b1;
		else if(bit_cnt==0&&cnt==CNT)
				rx_in<=1'b0;
			else if(bit_cnt>=1&&bit_cnt<=8&&cnt==CNT)//case (bit_cnt)
			 	rx_in<={$random};
				else if(bit_cnt==9&&cnt==CNT)
					rx_in<=1'b1;
	
defparam 	top_sobel_inst.rx_crtl_inst.CNT=9;
defparam	top_sobel_inst.rx_crtl_inst.bit_flag_cnt=4;
defparam 	top_sobel_inst.tx_crtl_inst.CNT=9;
	
top_sobel	top_sobel_inst(
		
		.sclk_in		(sclk),//sclk_in,
		.rst_n		(rst_n),
		.rx_data	(rx_in)
		
);
		
endmodule

5.多仿真,多看仿真。

猜你喜欢

转载自blog.csdn.net/Headogerz/article/details/82081114
今日推荐