TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
利用RAM构建平滑窗口滤波方法 + m) j3 e9 t9 d( p. @' d. h. B9 K/ K6 G
; z( q1 @0 K- V/ v7 p
# A1 K. J2 S9 F3 i" Z# v6 }1 O6 J滑动窗口滤波是一种很好滤波方法。这种方法不影响数据的实效性,每个数据都与前面一段数据相关联,这样瞬间峰值或毛刺对下一个数据影响较小。
! u. f0 E, i$ U/ h Z1 h# G! }% v. f. ^9 H
在FPGA数据处理中,如果大量数据需要进行滑动滤波,如果定义寄存器来设计上面的算法,务必消耗大量的逻辑资源,影响FPGA中其他逻辑功能的实现。为了节省逻辑资源,考虑使用RAM来进行数据存储和移动,是一种不错的的方法。) f+ o3 m& L! \9 q( s
2 |0 |7 N) }6 n5 l 利用RAM完成平滑窗口滤波,需要考虑RAM的消耗的时间,在数据处理中,我们通常需要延迟最小,数据越实时越好。RAM 读写过程中,读通常耗时较多,一个读数据操作通常需要4个时钟来完成,而一个写操作仅需要一个时钟完成。为了节省时间,考虑使用流水线方法来处理数据,仅对RAM所有数据操作一次完成数据平滑。6 }: C4 j5 G( D% k2 Z' ?
7 A+ K# X0 d) t) o5 a
程序如下:* X9 h" `0 \! A. m8 S* L! d5 L! B
2 `. [, L2 L) s-----RAM 调用# \: Q2 Q$ ?/ I! d0 }( Q
Svg_Vol_Ins: lpm_Ram4096_16
' ~" D. q7 }* [# h1 R4 s PORT MAP
0 T0 a/ k ]; q: N$ b' a (
5 o0 D! L! E, I clock=>In_Clkmain,
. }5 e. h1 R( }! J' I# U! W j data=>Svg_Vol_Wr_Data16,
2 T$ s1 N! l5 H rdaddress_a=>Svg_Vol_Rd_Addr12, E' U$ v: {' D* W
rdaddress_b=>x"000",5 L3 B) k6 P2 G- M/ p2 |
wraddress=>Svg_Vol_Wr_Addr12,
( o A4 S2 x0 {# }. E wren=>'1',
0 _# i& E8 @5 ]# U" V B/ q7 x qa=>Svg_Vol_Rd_Data16
, }3 |2 Y5 e% _ d- S/ n --qb : OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
" f+ A8 T B7 j+ G" \% V );' I% d, R, d- t' S) V
- [# I: f" Y; x; `
if (D_Temp=x"01") then
* K: s- F1 I: o# R D_Update<='0'; . b! T' T% Y; K' k( H
D_Updata<='0';3 w8 x8 v( v* S! p0 l
if (M_State='1') then F& ~- S/ F; p& E: R
D_Temp<=x"02";
% V# f @2 S& V- F5 S-------RAM 地址初始化-------------------------
' @ A8 r) g# E/ S+ Q! X D_Svg_Vol<=Svg_Vol_Cal(15 downto 0); W+ D# c d. c& } J( W
Svg_Vol_Rd_Addr12<=x"1fe";
/ \0 l$ ]( c- q% F* Z* m( l Svg_Vol_Wr_Addr12<=x"200";% m$ ^/ @7 J0 B+ o, @8 w: _; H
Svg_Vol_Sum<=(others=>'0');# d' N; e0 y$ F0 f2 q: C6 c
end if;
' a/ \& Q( L/ ?) P! Z) D belsif (D_Temp=x"02") then
! H) U* I) F4 L5 `--------移动数据到RAM 地址从次高位到最高位------
1 [# H7 v8 P# B# M7 i Svg_Vol_Rd_Addr12<=Svg_Vol_Rd_Addr12-'1';( m! @# h2 Y! F
D_Temp<=x"03"; 2 F. k" A! C+ f( t4 x7 ~
elsif (D_Temp=x"03") then
0 D2 f" @8 i4 s: ^--------移动数据到RAM 地址从次高位到最高位------
" H0 m8 v: z$ q$ M* i0 F" I Svg_Vol_Rd_Addr12<=Svg_Vol_Rd_Addr12-'1';
3 g" v6 }7 Y3 V* E5 ~ D_Temp<=x"04"; 1 ?2 D1 M/ W* g! B+ m' O
elsif (D_Temp=x"04") then
+ c( [( S# I( ]3 S) P( L: ^: B" w) @-------数据流水线操作----------------------------
* f8 o) ^1 Q O x% V9 n Svg_Vol_Rd_Addr12<=Svg_Vol_Rd_Addr12-'1'; 3 {$ o: [/ G) ?7 N( f
Svg_Vol_Wr_Data16<=Svg_Vol_Rd_Data16;
: `$ Y9 } F% X ~ Svg_Vol_Sum<=Svg_Vol_Sum+Svg_Vol_Rd_Data16;+ Y/ l f: P N! S
Svg_Vol_Wr_Addr12<=Svg_Vol_Wr_Addr12-'1';
4 b0 L! V6 O* i) L' y6 R! A if (D_Cnt=x"01fe") then 3 E, w) d: M6 V; d7 d& f: U& s
D_Temp<=x"07";
5 c# Y# _# [9 Z- {" `' V else
" t2 x3 o8 G; h D_Cnt<=D_Cnt+'1';
; a3 A+ e. H. S7 u- q end if;
; i2 H* d7 ?6 Kelsif (D_Temp=x"07") then
6 l/ O* W; W* U# @ Svg_Vol_Wr_Data16<=Svg_Vol_Cal(15 downto 0);/ _6 T5 w J" Z7 V4 @9 _2 [
Svg_Vol_Sum<=Svg_Vol_Sum+Svg_Vol_Cal(15 downto 0);
8 p! w0 o2 X2 z6 Y6 H+ [; } Svg_Vol_Wr_Addr12<=Svg_Vol_Wr_Addr12-'1';# `' _3 g9 V$ p7 ^4 f! T
D_Temp<=x"08";, v" c( i$ K4 ?" ?: g
elsif (D_Temp=x"08") then
! Z' F) @+ P* D7 H+ W, j3 Q D_Svg_V_M(29 downto 0)<=Svg_Vol_Sum(26 downto 9)*x"6ee";
7 m; C* u$ i7 m9 u |3 `* l* m$ F( b D_Temp<=x"01";
) m" ` J( A" ~! [else. p+ ?, g- d$ O+ ]" `( u9 q+ n
D_Temp<=x"00";
/ E P' l( O, r1 xend if;
7 p0 S6 U1 l3 C g: J: X# V+ R$ o! M" M5 m. x: c
|
|