Chip123 科技應用創新平台

標題: 网上一个经典异步FIFO程序 [打印本頁]

作者: xuduo6845    時間: 2009-9-4 11:24 AM
標題: 网上一个经典异步FIFO程序
请问其中ASIZE为什么是4?我觉得应该是3.我在一本书上看到也是4.
% l/ \2 R4 J$ ]# b6 R  u7 Y( v, J' P4 Vmodule fifo1(rdata, wfull, rempty, wdata, winc, wclk, wrst_n,rinc, rclk, rrst_n); % ?. n$ I3 O# m8 n1 ^+ y6 z
parameter DSIZE = 8; parameter ASIZE = 4; 1 A. D$ @  i7 M, ?, W/ \. q3 E& b: `' E
output [DSIZE-1:0] rdata;
8 q6 I* Q8 Z' `output wfull;
+ P& R; p7 {3 @* X9 e! `1 Ooutput rempty; 8 E2 x" I4 s$ J1 b  f
input [DSIZE-1:0] wdata; . {$ ~; d/ n# V
input winc, wclk, wrst_n;
2 |# y' f: {1 ]input rinc, rclk, rrst_n; , {6 Y2 u: q3 T; r
reg wfull,rempty; ; r7 h" W) Y1 B8 n5 i7 u8 t
reg [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr, wq1_rptr,rq1_wptr; / L, L! P+ d2 i
reg [ASIZE:0] rbin, wbin;
5 j: Y$ a/ M" t% Sreg [DSIZE-1:0] mem[0: (1<<ASIZE)-1];
  ^8 G! f9 U' @9 o8 Mwire [ASIZE-1:0] waddr, raddr;
2 L5 |+ \& z# x) ~: k- s2 wwire [ASIZE:0] rgraynext, rbinnext,wgraynext,wbinnext;   W3 v* A1 v4 U
wire rempty_val,wfull_val; $ a/ H# |0 L; H  j/ K1 M1 N! F

( o1 p0 m  y' |- i& xassign rdata=mem[raddr]; , X" n2 p$ T  {* `8 |
always@(posedge wclk)
& @8 x8 X. s" a4 F4 Bif (winc && !wfull) mem[waddr] <= wdata;
4 d; B7 B( j  U: W( e4 e4 G: ~* i% v, i+ }5 J
always @(posedge wclk or negedge wrst_n)
! M7 N! O8 ~+ o& u+ v! wif (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;
& M3 L8 t% w7 D# ?else {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
7 r4 s" N- y* P6 A3 |
4 h- R+ Y) f+ g9 falways @(posedge rclk or negedge rrst_n)
1 L: |0 f( P. d( v# R: [% Kif (!rrst_n) {rq2_wptr,rq1_wptr} <= 0; ( s7 m, R7 a0 v6 s# m
else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr}; , a% ]9 r5 @& Q

: ~, o* `; n9 F+ D+ B5 C! ^; c4 a; d3 B% @4 Z  C
always @(posedge rclk or negedge rrst_n) // GRAYSTYLE2 pointer ; N( @! W; M" _+ j
begin . {& _+ q7 ?5 l: \3 n# u* x
if (!rrst_n) {rbin, rptr} <= 0; & J9 \  f; {+ M  o
else {rbin, rptr} <= {rbinnext, rgraynext}; " {; n8 X  {1 R5 E% I7 U. b
end
) e3 J+ S  O' z: g: Y9 x
1 p; ?7 |; N) d2 h
4 @, C3 a4 B4 H4 Z/ K. Rassign raddr = rbin[ASIZE-1:0];
7 L; A3 h0 ^: rassign rbinnext = rbin + (rinc & ~rempty); , E7 a. J- l# i& E' b
assign rgraynext = (rbinnext>>1) ^ rbinnext;
; \6 |$ {/ N! K0 c! P7 G$ Y2 N: L
- G3 V2 J  c( ~# j+ b! X& o
assign rempty_val = (rgraynext == rq2_wptr); 9 _6 N+ m# Q4 p: F
always @(posedge rclk or negedge rrst_n)
+ ^7 H2 [( I' P6 v2 ~! z' Rbegin
  \: a$ ?6 @! Y9 x9 `if (!rrst_n) rempty <= 1'b1; ' q) X2 c' Y, j2 A9 F
else rempty <= rempty_val;
- ^9 N" R# s. ~9 ^end
8 j5 ~5 p9 h) k, u* s4 x$ b/ Y
7 g9 W: B6 D# Q+ B, _* v/ @+ n+ U* w
% ~( X2 u4 t  ?. F! w* Y" Kalways @(posedge wclk or negedge wrst_n) // GRAYSTYLE2 pointer # y( @  D9 v; J$ l
if (!wrst_n) {wbin, wptr} <= 0;
4 I% D0 s/ D$ P' a6 Helse {wbin, wptr} <= {wbinnext, wgraynext};
2 Q6 }/ ?2 m/ f/ H+ Z; h: r8 b$ ]* }8 h2 q0 B* D2 X+ j

' l' q3 w, W) S6 ?1 Kassign waddr = wbin[ASIZE-1:0];
- Q. w1 r) u& S4 tassign wbinnext = wbin + (winc & ~wfull);
) F1 i+ l8 K! Q, Bassign wgraynext = (wbinnext>>1) ^ wbinnext;
! @5 J% m$ p& S5 vassign wfull_val = (wgraynext=={~wq2_rptr[ASIZE:ASIZE-1], wq2_rptr[ASIZE-2:0]}); //:ASIZE-1]: L7 R2 k) @$ m1 f* ?8 A$ n
always @(posedge wclk or negedge wrst_n) 2 X- n2 B6 U3 ^4 m
if (!wrst_n) wfull <= 1'b0; / {6 V- p4 z! W# Z% G2 }
else wfull <= wfull_val;
- R; `( ^, s! y( m/ fendmodule2 u' w% M4 k8 f0 W% ?5 C

2 V9 Z  H( q* a! f[ 本帖最後由 xuduo6845 於 2009-9-4 11:25 AM 編輯 ]
作者: addn    時間: 2009-9-8 09:17 PM
您好2 A$ ^! |9 q" X: {( g& c

$ y; r9 c+ h% f! k' x6 R這個好久前有大概看過,現在忘了差不多了,只剩模糊印像,( q$ Z6 a( H  B  s8 ]
ASIZE = 4,實際memory address為ASIZE-18 p5 v! r% e  x3 y
主要是這做法用了反射式gray 碼的原故,所以memory address為4bit
/ o. ^- a& e9 \) R# j轉換為反射式gray 碼就要變成5bit,最高bit可被用來做判斷.......細節你
9 I7 C; O. d6 D9 V+ m: |# Q要在找看看,抱歉我只記得這樣
作者: tommy123    時間: 2009-9-29 04:21 PM
多一個bit主要是要用來計算 FIFO Full or Empty




歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/) Powered by Discuz! X3.2