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 V
module 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 O
output 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% S
reg [DSIZE-1:0] mem[0: (1<<ASIZE)-1];
^8 G! f9 U' @9 o8 M
wire [ASIZE-1:0] waddr, raddr;
2 L5 |+ \& z# x) ~: k- s2 w
wire [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& x
assign rdata=mem[raddr];
, X" n2 p$ T {* `8 |
always@(posedge wclk)
& @8 x8 X. s" a4 F4 B
if (winc && !wfull) mem[waddr] <= wdata;
4 d; B7 B( j U: W( e
4 e4 G: ~* i% v, i+ }5 J
always @(posedge wclk or negedge wrst_n)
! M7 N! O8 ~+ o& u+ v! w
if (!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 f
always @(posedge rclk or negedge rrst_n)
1 L: |0 f( P. d( v# R: [% K
if (!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. R
assign raddr = rbin[ASIZE-1:0];
7 L; A3 h0 ^: r
assign 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' R
begin
\: 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" K
always @(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 H
else {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 K
assign waddr = wbin[ASIZE-1:0];
- Q. w1 r) u& S4 t
assign wbinnext = wbin + (winc & ~wfull);
) F1 i+ l8 K! Q, B
assign wgraynext = (wbinnext>>1) ^ wbinnext;
! @5 J% m$ p& S5 v
assign 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/ f
endmodule
2 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-1
8 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