2417|0

6892

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

利用RAM构建平滑窗口滤波方法 [复制链接]

  滑动窗口滤波是一种很好滤波方法。这种方法不影响数据的实效性,每个数据都与前面一段数据相关联,这样瞬间峰值或毛刺对下一个数据影响较小。
  在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;
此帖出自FPGA/CPLD论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表