Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 4054|回復: 2
打印 上一主題 下一主題

[問題求助] 网上一个经典异步FIFO程序

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-9-4 11:24:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
请问其中ASIZE为什么是4?我觉得应该是3.我在一本书上看到也是4.
: {  T( S- f: Cmodule fifo1(rdata, wfull, rempty, wdata, winc, wclk, wrst_n,rinc, rclk, rrst_n); ; Z: Q' \; Q9 p
parameter DSIZE = 8; parameter ASIZE = 4; ' F& O* c' d- F  \$ r* G
output [DSIZE-1:0] rdata;
- c  Z6 _& k) [% s7 i% |/ o4 e  ]output wfull; - Q9 |# W9 P" R6 M6 K( L3 j* R
output rempty; % O6 [8 z; y2 Q: b- E/ _6 z( a
input [DSIZE-1:0] wdata; + x2 l! i2 B& w8 B, |5 J7 `
input winc, wclk, wrst_n;
8 D  p: P( V$ R- H2 Uinput rinc, rclk, rrst_n; 1 ?! T$ g6 k+ r5 u! y
reg wfull,rempty; . i0 p8 t2 Y# V! d% }1 M  r1 F
reg [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr, wq1_rptr,rq1_wptr;
9 Q# d. }# W4 [  b0 breg [ASIZE:0] rbin, wbin; ( m6 Q6 W! o# y- `
reg [DSIZE-1:0] mem[0: (1<<ASIZE)-1];
- Q0 c; E+ t3 C7 M4 hwire [ASIZE-1:0] waddr, raddr;
. s1 z% q6 ^1 m, A! K% J/ v( ]wire [ASIZE:0] rgraynext, rbinnext,wgraynext,wbinnext;
5 b. A( d& z; ewire rempty_val,wfull_val; ( H0 D" u3 ?: b& ?2 v4 b! U

4 U3 q/ i, v& X+ u. ^$ U2 _% B- I5 x% [assign rdata=mem[raddr];
/ T: B* o" e4 w, B) H0 W) ]always@(posedge wclk) + g  E$ _# |. h7 k
if (winc && !wfull) mem[waddr] <= wdata;
6 V$ ~: S# z$ w% f/ ?8 Y. h* V+ ]! Q1 g
5 ?/ Y7 y4 d, I) e( T0 Yalways @(posedge wclk or negedge wrst_n) 8 W. F& f8 f6 p% Q
if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;
- u, b6 w+ ~" U; Yelse {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
0 ~. q6 R$ O# i" r. ^
; H# _: C/ l; {always @(posedge rclk or negedge rrst_n) 0 F2 c  i0 _3 J: w
if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0; + z$ y( G/ E9 a7 a9 G! m8 |
else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
& o5 h0 l8 a  d0 r6 k. Q: ]& l
  r# {; K+ a) n7 H( N6 J# D1 H9 i3 ?+ R
always @(posedge rclk or negedge rrst_n) // GRAYSTYLE2 pointer # D% ~/ M# q( p" K5 u. T
begin % l& u/ m8 u6 N, l. }) S/ G& [, M0 s
if (!rrst_n) {rbin, rptr} <= 0; * P" y& b3 p3 `7 Y) v
else {rbin, rptr} <= {rbinnext, rgraynext};
$ A# H8 n1 W1 W* `end 6 }8 u9 O) U3 k  r7 B
4 v6 {5 Q2 [5 G# c: }
( D6 R/ L7 v1 V/ h+ Z0 ^
assign raddr = rbin[ASIZE-1:0];
1 ?1 y; j9 x; J3 A' T9 Q9 Kassign rbinnext = rbin + (rinc & ~rempty);
. b1 G7 P% J! v% ^- iassign rgraynext = (rbinnext>>1) ^ rbinnext;
  }6 i8 W+ R( Y! t) E& B( a2 |7 t& h# [$ E$ L/ A
! C- f+ L( r: O7 o: {3 a1 w: Y
assign rempty_val = (rgraynext == rq2_wptr);
& M  ^, e/ ~9 Q" I4 m' l+ Palways @(posedge rclk or negedge rrst_n)
& N, X/ G7 M- Nbegin 5 b1 i, P; a/ P
if (!rrst_n) rempty <= 1'b1;
0 h  D, Y8 @0 x; s  U* Qelse rempty <= rempty_val;
! C& T. P7 h8 r; W0 Fend
" ?: h4 u, a* k" j6 ?; @; W5 |5 X# u4 r6 k$ K4 k3 G& _5 E

2 F7 ]0 _; r" Q; valways @(posedge wclk or negedge wrst_n) // GRAYSTYLE2 pointer
$ a/ G6 a2 G" g6 Xif (!wrst_n) {wbin, wptr} <= 0; ) z: Y2 F' C- p/ k
else {wbin, wptr} <= {wbinnext, wgraynext}; , D1 g( C0 U! s" t

. v0 z7 @- k! B+ L8 b) a! v  u" G
assign waddr = wbin[ASIZE-1:0]; " `" N" o+ s5 g; n0 h3 G
assign wbinnext = wbin + (winc & ~wfull);
0 N0 ~0 L7 i2 F2 t4 ^! |assign wgraynext = (wbinnext>>1) ^ wbinnext; ; i* C1 n7 s& p! [) b) ]$ M
assign wfull_val = (wgraynext=={~wq2_rptr[ASIZE:ASIZE-1], wq2_rptr[ASIZE-2:0]}); //:ASIZE-1]5 ~9 F4 u$ W3 }
always @(posedge wclk or negedge wrst_n) : N1 d1 Z. m" P3 @
if (!wrst_n) wfull <= 1'b0; ' q$ f! k( h: B$ p( }0 w
else wfull <= wfull_val; ; W& W/ i0 l5 `3 Q  K9 a
endmodule* u  U( O/ ]5 o3 w( n

: d2 F4 D, U* }6 J[ 本帖最後由 xuduo6845 於 2009-9-4 11:25 AM 編輯 ]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2009-9-8 21:17:39 | 只看該作者
您好
  u0 q  r: O; l( O" d/ s9 |$ ^! N. ~& ?( r3 Y2 A
這個好久前有大概看過,現在忘了差不多了,只剩模糊印像,- D" j7 n6 J6 k" H( }; K
ASIZE = 4,實際memory address為ASIZE-1. D6 u' S3 i: |0 g6 `
主要是這做法用了反射式gray 碼的原故,所以memory address為4bit/ t6 O; `, v. L- }6 Y( i- J  ^3 O
轉換為反射式gray 碼就要變成5bit,最高bit可被用來做判斷.......細節你4 B3 f/ o! a9 |) M) P
要在找看看,抱歉我只記得這樣
3#
發表於 2009-9-29 16:21:07 | 只看該作者
多一個bit主要是要用來計算 FIFO Full or Empty
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-5-7 01:33 AM , Processed in 0.099006 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表