Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-9-4 11:24:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
请问其中ASIZE为什么是4?我觉得应该是3.我在一本书上看到也是4." `  r! H6 D9 l0 S9 b5 h, r1 r. X
module fifo1(rdata, wfull, rempty, wdata, winc, wclk, wrst_n,rinc, rclk, rrst_n); % M# G" D" u) T3 s% u
parameter DSIZE = 8; parameter ASIZE = 4; 9 f9 {9 P# t4 E& W. n' G: l
output [DSIZE-1:0] rdata;
; [8 H& p2 `2 N# uoutput wfull;   B) b  m2 B: ~, ~# G
output rempty; 8 s6 J( I( B: i: S2 T8 P% f+ G
input [DSIZE-1:0] wdata;
' Y4 I6 f) I, Z9 v* u. R/ x- ainput winc, wclk, wrst_n;
, e& S$ O" E* w" a4 L) ~) ]2 X0 minput rinc, rclk, rrst_n;
' U3 V& f5 y, w& v" [" preg wfull,rempty; 8 i; Y+ _  u- |+ R3 J8 `+ B; }1 w
reg [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr, wq1_rptr,rq1_wptr;
9 u( f$ |+ c& z6 U0 a  ireg [ASIZE:0] rbin, wbin; 3 v6 s$ j5 z0 U7 a" ~" l
reg [DSIZE-1:0] mem[0: (1<<ASIZE)-1]; . b4 \7 I/ e* o. n0 A+ }1 }$ B. E& b
wire [ASIZE-1:0] waddr, raddr;
( l" D) ^+ ~4 m( a% }- `  ?6 Gwire [ASIZE:0] rgraynext, rbinnext,wgraynext,wbinnext;
! y% l" e$ N1 P' h0 t& m0 Zwire rempty_val,wfull_val;
+ j4 A! f# e7 s6 W
. k% ]3 j: K  a/ ]& A2 Sassign rdata=mem[raddr]; ! L9 t0 j* }: A
always@(posedge wclk)
% F+ @8 P/ E: u/ w1 gif (winc && !wfull) mem[waddr] <= wdata;
3 q$ K& s6 U6 e4 U" r! ~& u$ V- a1 S- `3 ~# q- P+ U
always @(posedge wclk or negedge wrst_n)
( K" G' ~" Y' p4 k) }# Dif (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;
+ P  _$ i$ J2 ]) w  d( Zelse {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
" M- W  [; z: d4 _8 w9 v( s
  P2 ~+ w. P) N% q8 Aalways @(posedge rclk or negedge rrst_n) / k& m5 u8 e+ ^: p" ?
if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0; 0 W6 X/ T$ F7 d4 t4 M7 m
else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
! |) ?" `; I3 w/ _8 }2 c+ c3 d& w/ h
" C4 q: k) [' k* |4 C0 R" U
always @(posedge rclk or negedge rrst_n) // GRAYSTYLE2 pointer : R+ o" k, Y; B+ V. S
begin
* ^/ k& a+ e7 Y: s! qif (!rrst_n) {rbin, rptr} <= 0;
' i. z8 N  U6 y. j3 j. I6 |else {rbin, rptr} <= {rbinnext, rgraynext}; : U# ?; h9 h! v3 j; C4 o. `/ w
end 3 b+ n. T( n, b# t1 g  E) @. z: |* I

( P# E3 l' q2 Y" E
" P' t: n% X9 L+ c7 @5 a. Nassign raddr = rbin[ASIZE-1:0]; 3 Q) \. v: T" `$ @9 `; U
assign rbinnext = rbin + (rinc & ~rempty);
7 b/ D: |7 C  |1 }# X' E) r! dassign rgraynext = (rbinnext>>1) ^ rbinnext;
/ Z- |) d+ s6 O& H! _: y: n% m/ o
1 E& B" E- E5 n3 X9 f& h$ y
- V  }/ |% i+ m4 o+ ~/ V& I1 Qassign rempty_val = (rgraynext == rq2_wptr); $ L6 T0 T: V% G5 W* E+ t0 O/ q
always @(posedge rclk or negedge rrst_n) 1 q  z  u5 E, E* p* U$ t
begin 1 q1 i3 k. }$ F6 U$ J1 t$ Q. e0 C
if (!rrst_n) rempty <= 1'b1; ! y' g! Z3 T& G9 Z7 q# ~* m6 d
else rempty <= rempty_val; / y  g; |) R1 C, J
end
+ x& D0 t4 ]5 Z1 d
( k2 |1 C, @+ e. S* U: _2 b% T! E% ~: d+ Y3 _8 c2 E' \
always @(posedge wclk or negedge wrst_n) // GRAYSTYLE2 pointer
  ]% E0 V2 u! b* q; ?! Q7 Yif (!wrst_n) {wbin, wptr} <= 0; 2 |5 n: D6 r  ]$ N+ B- V
else {wbin, wptr} <= {wbinnext, wgraynext};
! ~. Q( J6 i  K8 G7 V- \/ i
; f: x& ], N) j  v1 S
% f5 e1 |5 s' q6 v0 B6 sassign waddr = wbin[ASIZE-1:0];
1 C2 d3 k& X5 L! C4 C9 a& yassign wbinnext = wbin + (winc & ~wfull);
( ~! z+ R5 O( S% c6 \assign wgraynext = (wbinnext>>1) ^ wbinnext; ( Z( s, k6 I5 b; @* P; x9 Z
assign wfull_val = (wgraynext=={~wq2_rptr[ASIZE:ASIZE-1], wq2_rptr[ASIZE-2:0]}); //:ASIZE-1]8 E1 G# J/ z4 {' z9 b
always @(posedge wclk or negedge wrst_n) / t6 ~# ~3 q% C0 Q. T
if (!wrst_n) wfull <= 1'b0; " M2 {% p# ]' Z) r% ~  Q
else wfull <= wfull_val;
( h* i1 z  O3 \0 d/ D* U8 aendmodule! ?1 y0 h5 B" s3 Z
, d; c: `( x' @* D6 O0 ]  z
[ 本帖最後由 xuduo6845 於 2009-9-4 11:25 AM 編輯 ]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2009-9-8 21:17:39 | 只看該作者
您好
9 T+ {* f$ x- {" B' H
+ l1 o: W$ M  L) Z4 \* u- [這個好久前有大概看過,現在忘了差不多了,只剩模糊印像," }  b; V; R$ d) a* q' \
ASIZE = 4,實際memory address為ASIZE-1
! Y0 R9 b6 ?9 {( o8 A主要是這做法用了反射式gray 碼的原故,所以memory address為4bit& E9 H# f: I, ~) B5 E* @
轉換為反射式gray 碼就要變成5bit,最高bit可被用來做判斷.......細節你
+ ]- b; m7 x/ G& E2 C/ n: A* K" m: t( }  v要在找看看,抱歉我只記得這樣
3#
發表於 2009-9-29 16:21:07 | 只看該作者
多一個bit主要是要用來計算 FIFO Full or Empty
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-1 12:51 PM , Processed in 0.178010 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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