TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
利用RAM构建平滑窗口滤波方法
# t4 y7 k" v5 Z' A/ o: \* }9 ?8 b4 W7 r3 P% g @
2 f' S; a: |( l1 N) u3 P% Y8 i8 G滑动窗口滤波是一种很好滤波方法。这种方法不影响数据的实效性,每个数据都与前面一段数据相关联,这样瞬间峰值或毛刺对下一个数据影响较小。$ D. B* v- \# B8 s
. I ^$ y$ X* L/ ~
在FPGA数据处理中,如果大量数据需要进行滑动滤波,如果定义寄存器来设计上面的算法,务必消耗大量的逻辑资源,影响FPGA中其他逻辑功能的实现。为了节省逻辑资源,考虑使用RAM来进行数据存储和移动,是一种不错的的方法。6 ~4 I# b, }/ W: T& C: J* I5 K
+ |# { D8 u2 c: n$ {* g* W
利用RAM完成平滑窗口滤波,需要考虑RAM的消耗的时间,在数据处理中,我们通常需要延迟最小,数据越实时越好。RAM 读写过程中,读通常耗时较多,一个读数据操作通常需要4个时钟来完成,而一个写操作仅需要一个时钟完成。为了节省时间,考虑使用流水线方法来处理数据,仅对RAM所有数据操作一次完成数据平滑。2 o( Q+ _1 d1 M) e2 W2 c
$ _1 e: U& F0 l8 J* w程序如下: U3 a0 {; K7 e3 j6 u# k
. M1 F; p, x) p6 l-----RAM 调用
4 `* W7 n6 N, s" u6 S4 hSvg_Vol_Ins: lpm_Ram4096_16 0 S9 L2 s2 ~' G
PORT MAP. F' Q4 [8 {4 V3 r" t
(9 X7 q& l( y+ L- p$ z+ Z. q% z
clock=>In_Clkmain,
% U8 U6 M. e- t& {/ C data=>Svg_Vol_Wr_Data16,3 ]" C5 `, ^& O& O/ ]
rdaddress_a=>Svg_Vol_Rd_Addr12,
4 V$ `% w# m7 t" H, {4 @0 Q rdaddress_b=>x"000",% D5 y# F; R$ A/ x1 }
wraddress=>Svg_Vol_Wr_Addr12,5 p ]& ^% o, X5 R% A3 W1 C
wren=>'1',
. h0 D: o0 I0 e. @: [ qa=>Svg_Vol_Rd_Data16/ y4 l/ E! @" n0 H# W. ^* b$ j
--qb : OUT STD_LOGIC_VECTOR (15 DOWNTO 0) W( I3 I1 I2 K- P
);
1 v8 g% q# G, w2 K8 {
: E" x' ?+ |& d0 ` if (D_Temp=x"01") then
9 k. a |- I9 Q9 \$ { D_Update<='0';
R: R. x) E, ]" \ D_Updata<='0';
7 w% b+ J, q5 {3 h if (M_State='1') then
; h8 q2 d( k& \( ?: h, v D_Temp<=x"02";9 u. b# c/ C0 D! ^
-------RAM 地址初始化------------------------- 7 E, m9 Z! c6 }0 Z1 J t
D_Svg_Vol<=Svg_Vol_Cal(15 downto 0);
7 V" r, _# Y5 M# b- i2 r Svg_Vol_Rd_Addr12<=x"1fe";( f3 ^( X5 }) E6 C1 Q
Svg_Vol_Wr_Addr12<=x"200";
n! H9 [9 }6 ?1 ]) @6 U4 s Q Svg_Vol_Sum<=(others=>'0');% B9 x: a% ]$ v& Q
end if;
1 C K* B! z2 n! H0 [elsif (D_Temp=x"02") then3 e T6 I# h5 d6 m' b" X H, T
--------移动数据到RAM 地址从次高位到最高位------
0 N9 n5 L" R) O, `2 L& }, F Svg_Vol_Rd_Addr12<=Svg_Vol_Rd_Addr12-'1'; K6 ?3 M' H' \! C4 j
D_Temp<=x"03";
3 E6 Z( c; j0 Y: @& ~% D7 _* M* Zelsif (D_Temp=x"03") then z! Z+ g* Z. N: K
--------移动数据到RAM 地址从次高位到最高位------
' G4 @3 X" \3 x0 o5 x2 x Svg_Vol_Rd_Addr12<=Svg_Vol_Rd_Addr12-'1';
: v" J/ O/ G& f4 ~# n! V D_Temp<=x"04"; / d# ~2 Q0 k" e
elsif (D_Temp=x"04") then
9 p- P( B% m* G5 y% k7 m" D- F" n6 e0 b8 |-------数据流水线操作----------------------------
: J0 S* Y! g4 B2 ]1 a% F Svg_Vol_Rd_Addr12<=Svg_Vol_Rd_Addr12-'1';
: \+ E' u0 ^# |' c* X6 k0 _6 A Svg_Vol_Wr_Data16<=Svg_Vol_Rd_Data16;
+ J0 q) M9 {" U, f8 d! i) z/ C Svg_Vol_Sum<=Svg_Vol_Sum+Svg_Vol_Rd_Data16;
3 C* ]! v' R# E3 Q7 }8 w# _ Svg_Vol_Wr_Addr12<=Svg_Vol_Wr_Addr12-'1'; " _) f6 F$ {" K9 W0 O9 e$ u
if (D_Cnt=x"01fe") then
! a. d8 V2 B: q& @" ?: c( B/ t D_Temp<=x"07"; 1 |/ z$ Z% d+ L& \$ [
else
: f; z6 U$ `0 }7 t' g D_Cnt<=D_Cnt+'1';
/ m- r u; a# f& a end if;
" X8 Q6 Z1 J$ a; ]& Nelsif (D_Temp=x"07") then * b, z* x: f# Z# F9 x
Svg_Vol_Wr_Data16<=Svg_Vol_Cal(15 downto 0);
: D- o; }9 _8 C$ A! J, P Svg_Vol_Sum<=Svg_Vol_Sum+Svg_Vol_Cal(15 downto 0);/ u( ]8 S; w+ ?2 N$ I
Svg_Vol_Wr_Addr12<=Svg_Vol_Wr_Addr12-'1';
) k" n+ [# E# q0 S: Z/ @ D_Temp<=x"08";
0 m E, E8 ?- T. w9 ~ Oelsif (D_Temp=x"08") then l2 ^* j) d0 B
D_Svg_V_M(29 downto 0)<=Svg_Vol_Sum(26 downto 9)*x"6ee";
1 M1 j6 V, z% G9 @3 G# r D_Temp<=x"01";
. _ ^; q+ R; P0 Q7 v% Y% Welse: `3 B3 W( Z, L9 P$ J! R
D_Temp<=x"00";
2 q2 j0 T' b% i* Qend if;+ e5 |0 B0 s, ]2 \" C, Q
' N" v9 F" O$ T
|
|