首页 > 代码库 > FPGA采集LVDS视频(噪点去除)

FPGA采集LVDS视频(噪点去除)

        DM8168板上CameraLink视频输入部分是通过DS90CR288解串芯片和Cyclone IV配合工作的,初始调试之后,发现出现了噪点,这些点在明暗的交界之间闪烁,调整摄像头的光圈,还明显的发现有一圈圈的东西,网上查了查说是缺了数据线,于是就用SignalTap采了几次数据,发现以下现象:


        其中PORTA中的6位5位在相邻的两个下降沿,它们的值都改变,这貌似不正常,这种情况同样也发生在PORTB,而且除了5,6数据位,别的数据位也都会随机出现这种相邻两个下降沿数据突变的情况。估计视频上闪烁的点就是这些跳变的杰作。于是就是去找硬件原因,匹配电阻换了换值,换了换位置,测了差分对的幅度,还是无果而终。得出了几个可能性:

①DS90CR288解串芯片供电不足。

②差分线阻抗和100欧电阻不匹配(传输线短,可能性较小)。

③视频线不同步(做了等长处理,可能性小)

④TOP层走了视频数据线和时钟线,TTL信号对差分线上的电流造成了串扰?TTL离匹配电阻不够远?

        硬件上暂时没有确切的思路,希望有经验的前辈能看到我的现象给出指导,我这里先用Verilog想办法把这些相邻两个下降沿突变的点给抹平,也就是消除这些突变造成的闪点,再看看图像。添加三个缓存,用这三个缓存数据去判断,达到抹平以上突变点的目的。



要修改的原始代码:

always @ (negedge clk80m )
begin
        PORTA<=(220*in[23:16]+4096)>>8;
end

always @ (negedge clk80m )
begin
        PORTB<=(220*in[15:8]+4096)>>8;
end
修改后代码:

always @ (negedge clk80m )
begin
    PA<=(220*in[23:16]+4096)>>8;
	PA1<=PA;
	PA2<=PA1;
	if(PA[7]==PA2[7])PA2[7]<=PA[7];
	if(PA[6]==PA2[6])PA2[6]<=PA[6];
	if(PA[5]==PA2[5])PA2[5]<=PA[5];
	if(PA[4]==PA2[4])PA2[4]<=PA[4];
	if(PA[3]==PA2[3])PA2[3]<=PA[3];
	if(PA[2]==PA2[2])PA2[2]<=PA[2];
	if(PA[1]==PA2[1])PA2[1]<=PA[1];
	if(PA[0]==PA2[0])PA2[0]<=PA[0];
	PORTA<=PA2;
end
	
always@(negedge clk80m)
begin
	PB<=(220*in[15:8]+4096)>>8;
	PB1<=PB;
	PB2<=PB1;
	if(PB[7]==PB2[7])PB2[7]<=PB[7];
	if(PB[6]==PB2[6])PB2[6]<=PB[6];
	if(PB[5]==PB2[5])PB2[5]<=PB[5];
	if(PB[4]==PB2[4])PB2[4]<=PB[4];
	if(PB[3]==PB2[3])PB2[3]<=PB[3];
	if(PB[2]==PB2[2])PB2[2]<=PB[2];
	if(PB[1]==PB2[1])PB2[1]<=PB[1];
	if(PB[0]==PB2[0])PB2[0]<=PB[0];
	PORTB<=PB2;
end

        多牺牲了三个时钟周期,将相邻两个下降沿产生突变的点给去除之后,再次观察图像,发现噪点基本上全部去除,但是这种办法始终不可靠,硬件上产生的毛病用Verilog去弥补的方法只能是治标不治本。因为较之前的720P图像,现在的图像清晰度有所下降,下降多少还没有评估,先记录一下。

FPGA采集LVDS视频(噪点去除)