Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-9-4 11:24:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
请问其中ASIZE为什么是4?我觉得应该是3.我在一本书上看到也是4.
& M, j; L/ v- G# m4 B' Jmodule fifo1(rdata, wfull, rempty, wdata, winc, wclk, wrst_n,rinc, rclk, rrst_n);
9 }8 R2 i2 Q0 U" n' B7 Y- X' {parameter DSIZE = 8; parameter ASIZE = 4;
; q9 e& X6 s2 [* O% loutput [DSIZE-1:0] rdata;
' j2 o2 A+ G" r, d( goutput wfull;
% R. k; a  Q" A8 Soutput rempty; $ s- I1 p0 K* m4 v; R
input [DSIZE-1:0] wdata;
0 n: Q* \. d7 d" }9 k. W/ {2 ?+ ?input winc, wclk, wrst_n;
  [8 o8 K+ F, }/ Uinput rinc, rclk, rrst_n;
; e1 ?" g# Y, e, Dreg wfull,rempty; , U1 c% {6 J- F. `
reg [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr, wq1_rptr,rq1_wptr;
( ?5 p. d/ a! K4 Ureg [ASIZE:0] rbin, wbin; " a# f3 a! U9 J) c# Z0 ]2 @
reg [DSIZE-1:0] mem[0: (1<<ASIZE)-1]; ' n; ~2 |; O, ?- v, ]7 I5 r
wire [ASIZE-1:0] waddr, raddr; # e. l' \4 i8 _
wire [ASIZE:0] rgraynext, rbinnext,wgraynext,wbinnext;
% t. B/ u* M+ g1 j4 T$ wwire rempty_val,wfull_val;
: K+ r6 C5 ?/ F, k7 i( H) b2 R. V) b8 W5 W- c7 M
assign rdata=mem[raddr];
+ s7 I/ X# [) g( ]always@(posedge wclk)   @; `! k& i* d$ H  q2 @
if (winc && !wfull) mem[waddr] <= wdata;
0 [1 b" I( k% s& \5 v/ K) ], |0 F" k! p+ \- @
always @(posedge wclk or negedge wrst_n)
, G% k5 a5 r3 N2 Xif (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;   D3 k5 m! W. W, q4 T+ O7 d/ r8 `# j
else {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
( a0 ^1 _) e1 B0 e/ N
7 T( s3 e% [% _always @(posedge rclk or negedge rrst_n) 0 v: K% B2 G- d7 l) p' s& d
if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0; 8 B7 h: {* k4 X% S1 J4 F& x
else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
/ E2 d' `0 k1 X! @/ J4 o" G5 r2 g$ v. R8 r) l8 B

3 z; ~( H' u8 y1 q* c  valways @(posedge rclk or negedge rrst_n) // GRAYSTYLE2 pointer
; r' d. J+ ^4 T! Abegin
5 w  Y' f' z4 P4 H' e; Oif (!rrst_n) {rbin, rptr} <= 0; " O# ]/ P  X" X" ^% S0 z$ J
else {rbin, rptr} <= {rbinnext, rgraynext};
1 a8 ]* L  b, F/ o/ q& }- [5 Hend 8 }6 I. \0 {0 _: z8 @: S

8 \6 Z' P2 [, y" H; G8 @) S& K; z) `' U: F, j
assign raddr = rbin[ASIZE-1:0]; , N$ |7 h  X: f; a( A5 e
assign rbinnext = rbin + (rinc & ~rempty); & j* @; E9 r5 L8 n7 M4 O4 H
assign rgraynext = (rbinnext>>1) ^ rbinnext; 7 h8 R, \( C* \$ N! f* T

# r0 o" Z: A6 [$ n- Q
4 U* K$ T+ [, R6 \4 c" cassign rempty_val = (rgraynext == rq2_wptr);
* ~* e( D) x5 i1 Ealways @(posedge rclk or negedge rrst_n)
# l: N& V* I( M, j) k* {begin ; x( t% q( \; ~# G! @
if (!rrst_n) rempty <= 1'b1;   N+ Z* [* S- @+ W  I4 {
else rempty <= rempty_val;
; J- M1 r8 t3 u/ t' H8 b5 S$ K7 F7 mend
- V$ B! B( W: y1 n) y- K1 M. x9 x( O% J2 K4 z- n
! h1 \1 P% q: L6 M
always @(posedge wclk or negedge wrst_n) // GRAYSTYLE2 pointer
- O3 Y, X/ D5 k: @1 \! dif (!wrst_n) {wbin, wptr} <= 0;
3 I* o" _, N  selse {wbin, wptr} <= {wbinnext, wgraynext};
4 p: m' L8 U, I2 ^6 P6 E" y1 ]6 m5 y. P# Y; H- n; F
6 U" k9 U6 L: Q. Z" ~
assign waddr = wbin[ASIZE-1:0];
- V9 [; Y- M2 C* r% Q' Oassign wbinnext = wbin + (winc & ~wfull);
, R' _) b3 x$ a- n5 Yassign wgraynext = (wbinnext>>1) ^ wbinnext; % L: p/ \" ^! ^7 m( Q# }
assign wfull_val = (wgraynext=={~wq2_rptr[ASIZE:ASIZE-1], wq2_rptr[ASIZE-2:0]}); //:ASIZE-1]
6 |0 G/ P+ P, _' l+ z; T7 {always @(posedge wclk or negedge wrst_n) , O  y: f! u1 @- G: `2 r
if (!wrst_n) wfull <= 1'b0;
8 e5 c. H" B* ~else wfull <= wfull_val; * _% E( T3 p9 @( w# r4 `$ g+ L
endmodule
/ F6 Z7 S8 h, k' Y  [
0 L  \6 t3 o" g" c[ 本帖最後由 xuduo6845 於 2009-9-4 11:25 AM 編輯 ]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2009-9-8 21:17:39 | 只看該作者
您好/ J/ ~* `  W: S* ]& [3 ~9 V

% u- j) m/ x& a% M4 o8 W, I. J8 k9 ^這個好久前有大概看過,現在忘了差不多了,只剩模糊印像,$ {) R. T* U" `. B% v
ASIZE = 4,實際memory address為ASIZE-1
4 P3 b) X- ~* U# Q主要是這做法用了反射式gray 碼的原故,所以memory address為4bit  t6 M' @3 C- t, ^- \
轉換為反射式gray 碼就要變成5bit,最高bit可被用來做判斷.......細節你% r/ ]  K5 M! G' l1 }; T$ e
要在找看看,抱歉我只記得這樣
3#
發表於 2009-9-29 16:21:07 | 只看該作者
多一個bit主要是要用來計算 FIFO Full or Empty
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-1 02:59 PM , Processed in 0.157009 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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