滑动窗口滤波是一种很好滤波方法。这种方法不影响数据的实效性,每个数据都与前面一段数据相关联,这样瞬间峰值或毛刺对下一个数据影响较小。
在FPGA数据处理中,如果大量数据需要进行滑动滤波,如果定义寄存器来设计上面的算法,务必消耗大量的逻辑资源,影响FPGA中其他逻辑功能的实现。为了节省逻辑资源,考虑使用RAM来进行数据存储和移动,是一种不错的的方法。
利用RAM完成平滑窗口滤波,需要考虑RAM的消耗的时间,在数据处理中,我们通常需要延迟最小,数据越实时越好。RAM 读写过程中,读通常耗时较多,一个读数据操作通常需要4个时钟来完成,而一个写操作仅需要一个时钟完成。为了节省时间,考虑使用流水线方法来处理数据,仅对RAM所有数据操作一次完成数据平滑。
程序如下:
-----RAM 调用
Svg_Vol_Ins: lpm_Ram4096_16 PORT MAP ( clock=>In_Clkmain, data=>Svg_Vol_Wr_Data16, rdaddress_a=>Svg_Vol_Rd_Addr12, rdaddress_b=>x"000", wraddress=>Svg_Vol_Wr_Addr12, wren=>'1', qa=>Svg_Vol_Rd_Data16 --qb : OUT STD_LOGIC_VECTOR (15 DOWNTO 0) );
if (D_Temp=x"01") then D_Update<='0'; D_Updata<='0'; if (M_State='1') then D_Temp<=x"02";
-------RAM 地址初始化-------------------------
D_Svg_Vol<=Svg_Vol_Cal(15 downto 0); Svg_Vol_Rd_Addr12<=x"1fe"; Svg_Vol_Wr_Addr12<=x"200"; Svg_Vol_Sum<=(others=>'0'); end if; elsif (D_Temp=x"02") then
--------移动数据到RAM 地址从次高位到最高位------ Svg_Vol_Rd_Addr12<=Svg_Vol_Rd_Addr12-'1'; D_Temp<=x"03"; elsif (D_Temp=x"03") then
--------移动数据到RAM 地址从次高位到最高位------ Svg_Vol_Rd_Addr12<=Svg_Vol_Rd_Addr12-'1'; D_Temp<=x"04"; elsif (D_Temp=x"04") then
-------数据流水线操作---------------------------- Svg_Vol_Rd_Addr12<=Svg_Vol_Rd_Addr12-'1'; Svg_Vol_Wr_Data16<=Svg_Vol_Rd_Data16; Svg_Vol_Sum<=Svg_Vol_Sum+Svg_Vol_Rd_Data16; Svg_Vol_Wr_Addr12<=Svg_Vol_Wr_Addr12-'1'; if (D_Cnt=x"01fe") then D_Temp<=x"07"; else D_Cnt<=D_Cnt+'1'; end if; elsif (D_Temp=x"07") then Svg_Vol_Wr_Data16<=Svg_Vol_Cal(15 downto 0); Svg_Vol_Sum<=Svg_Vol_Sum+Svg_Vol_Cal(15 downto 0); Svg_Vol_Wr_Addr12<=Svg_Vol_Wr_Addr12-'1'; D_Temp<=x"08"; elsif (D_Temp=x"08") then D_Svg_V_M(29 downto 0)<=Svg_Vol_Sum(26 downto 9)*x"6ee"; D_Temp<=x"01";
else
D_Temp<=x"00";
end if;
|