找回密码
 注册
关于网站域名变更的通知
查看: 323|回复: 1
打印 上一主题 下一主题

Verilog写的异步FIFO程序

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 15:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2019-5-31 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    Verilog写的异步FIFO程序% d! E9 ~' C% Y$ S1 K- D5 H- J/ v
    //-----------------------------------------------------
    1 T5 A+ @* e4 A. H+ h) f   2 // Design Name : syn_fifo
    * ?3 t* m5 N: Q6 V8 f. h   3 // File Name   : syn_fifo.v: I# Y6 P& t: S% ?, w* ~; w) C
       4 // Function    : Synchronous (single clock) FIFO
    - X# O0 p- D9 I( f1 X& ]' _   5 // Coder       : Deepak Kumar Tala
    5 x* h. s0 x7 k5 {   6 //-----------------------------------------------------
    3 k& N: i1 n$ X" ]. N7 @   7 module syn_fifo (
    # ]" v) i8 c' c+ G( ^  B. B   8 clk      , // Clock input7 y, ^& ?; \6 B% s
       9 rst      , // Active high reset
    & V" J$ [7 z$ A: ^# p! R$ s  10 wr_cs    , // Write chip select
    " l; q7 C9 ]  B) t8 g5 `* b  11 rd_cs    , // Read chipe select
    * a7 c- v1 g/ l- U) z  12 data_in  , // Data input
    3 n) D% F; D# }$ F  13 rd_en    , // Read enable/ q' Y4 w  e$ G- y- ]
      14 wr_en    , // Write Enable. c! ~; F5 `# m0 r4 a3 M
      15 data_out , // Data Output9 V7 j; j0 Z5 b4 Q& F
      16 empty    , // FIFO empty
    9 O6 x2 M5 h6 ?+ A2 k# s6 [4 O  17 full       // FIFO full
    * ^( @+ j1 H, {5 I  18 );   
    ( I/ ^4 h4 A5 f, w. {8 Z( \; g  19  
    . e3 N' N# Q' m! F& h/ \  20 // FIFO constants
    2 K. c9 G, V7 n$ n3 e4 c. q# ~  21 parameter DATA_WIDTH = 8;9 T, j# E. N- j0 p; ]" K: ?
      22 parameter ADDR_WIDTH = 8;
    3 ^1 v# c$ F6 y+ k, y+ L1 X  23 parameter RAM_DEPTH = (1 << ADDR_WIDTH);2 d" b( p& R  N  Q; s/ O+ J
      24 // Port Declarations
    8 P4 @9 q7 B  L  J  25 input clk ;
    6 U( D8 N* X' ?& C  26 input rst ;
    5 @4 \" r. p+ c1 P3 f: V/ d  27 input wr_cs ;
    ; q2 _4 b4 W: B# _  28 input rd_cs ;  m5 m4 O# K( T4 n
      29 input rd_en ;) A# X% y! R0 s- ^7 ?+ y/ @
      30 input wr_en ;
    ) S. d( b5 u+ n& R8 E) h/ t  31 input [DATA_WIDTH-1:0] data_in ;
    $ R# t- d( l; c# L; ?2 I6 c  32 output full ;
    5 a3 I  t' d' |  33 output empty ;5 y( W1 z) ~( x0 a- F
      34 output [DATA_WIDTH-1:0] data_out ;  @# @, |: Q/ I' I+ K
      35
      c0 d1 W7 R5 y: I  36 //-----------Internal variables-------------------* r$ H" b! n% c( v* ?! P
      37 reg [ADDR_WIDTH-1:0] wr_pointer;
    ; l) y# C3 g1 Q9 y7 Y& B: e! k# v7 z9 d8 T  38 reg [ADDR_WIDTH-1:0] rd_pointer;0 s) _" ]% S- m. x* q
      39 reg [ADDR_WIDTH :0] status_cnt;
      q; ?: D/ v- d( ?. Q+ H5 T1 u8 V  40 reg [DATA_WIDTH-1:0] data_out ;! _1 U+ C* L' ?; {
      41 wire [DATA_WIDTH-1:0] data_ram ;
    $ Z3 ]. R8 j0 O5 P  42
    : [! u# H9 s: j* Q4 \2 X- K  43 //-----------Variable assignments---------------
    " K7 D8 M: S! i1 G  44 assign full = (status_cnt == (RAM_DEPTH-1));0 n+ X3 i' m3 l) g! i3 m0 H' W
      45 assign empty = (status_cnt == 0);1 o4 e! L0 t* E! U. C
      46
    + ?7 I' ~, ?- [) u. `6 W  47 //-----------Code Start---------------------------
    ( x) ^: X/ ], B# M8 k  48 always @ (posedge clk or posedge rst)( ?3 G9 t% c* x3 F: p! m% m: F
      49 begin : WRITE_POINTER8 ]" @5 k. s3 E9 `  @0 l# t
      50   if (rst) begin4 d  \, n9 p8 ?! e. z( j
      51     wr_pointer <= 0;4 k1 K, J8 r" T6 b9 R. |
      52   end else if (wr_cs && wr_en ) begin3 V  v. B$ K# B4 L& N) r8 C/ }
      53     wr_pointer <= wr_pointer + 1;
    3 \8 w" C8 }1 g6 d, p2 Z8 m/ M  54   end) O- c5 e+ j2 q# k3 J
      55 end
    0 A$ D9 V/ A6 T, X2 Q' n6 D0 ?  56 # q! D7 y/ I& ~6 q7 `$ a
      57 always @ (posedge clk or posedge rst)# I  E) o% x" ^5 ]- J
      58 begin : READ_POINTER
    1 g6 M9 Z$ \3 u0 o: r! X  59   if (rst) begin
      b; O4 Z* s7 t  K  60     rd_pointer <= 0;
    8 M$ I7 P" s' q: \, E4 D  61   end else if (rd_cs && rd_en ) begin
    3 ]% J, ^" P7 I* x  62     rd_pointer <= rd_pointer + 1;
    4 J& i( e) g' a& A% i0 ~0 x1 h  63   end
    / h- \7 R* _+ h: r$ X. q  64 end
    ( Z, p" |/ x5 T; i- M  65 # W! y) E" m4 I' U% e* w9 g
      66 always  @ (posedge clk or posedge rst)+ a. h7 X) i( m" m
      67 begin : READ_DATA% b7 D" x$ j$ \8 Y. W0 A8 `/ M8 _$ N
      68   if (rst) begin' W  C" a9 R7 h8 q
      69     data_out <= 0;, F' u" W% \, r* M
      70   end else if (rd_cs && rd_en ) begin
    . w" a7 H1 D& H3 y' n  71     data_out <= data_ram;
    6 P7 m8 j7 U; M' p( {  72   end( x% M7 z% q" k& l
      73 end# ~+ ^& \# Y6 {
      74 : `6 N3 R: }4 j! i' t
      75 always @ (posedge clk or posedge rst)
    0 n/ f% X% P, ~- ~; D  76 begin : STATUS_COUNTER4 P5 R! ~+ k7 |- z
      77   if (rst) begin
    2 L3 _4 m; S4 N4 l7 D  78     status_cnt <= 0;
    / b% f/ W& {" s  79   // Read but no write.1 q* T- r8 x5 {: j- x# P; W
      80   end else if ((rd_cs && rd_en) && ! (wr_cs && wr_en)
    , [' x- L0 @! C& p* r6 I: m8 j  81                && (status_cnt ! = 0)) begin6 u# E( e- s/ A
      82     status_cnt <= status_cnt - 1;
    $ H+ r9 `- X/ e  83   // Write but no read.
    6 T3 d/ ~, l, x8 p5 G  ^; M  84   end else if ((wr_cs && wr_en) && ! (rd_cs && rd_en) - j0 j3 w5 d9 _/ _& o6 w! x
      85               && (status_cnt ! = RAM_DEPTH)) begin& u' T' n8 V3 d4 J, l" a, ]" p
      86     status_cnt <= status_cnt + 1;4 M+ l* a3 }$ K- J* `1 H3 Q
      87   end
    : Q* k2 f2 {* k9 g4 U  88 end ; Q0 P/ K3 v" v6 s8 ^8 B
      89   
    , R) ~. |: W2 d* |  m  90 ram_dp_ar_aw #(DATA_WIDTH,ADDR_WIDTH)DP_RAM (2 T" W+ v4 I$ k  u
      91 .address_0 (wr_pointer) , // address_0 input
    - q- B$ C; {' r3 ^( x; r8 l  92 .data_0    (data_in)    , // data_0 bi-directional
    ! K! s  d9 D. Y# Q& F( p  93 .cs_0      (wr_cs)      , // chip select: E$ }6 o, p, C9 X5 o3 A
      94 .we_0      (wr_en)      , // write enable
    % x" U) F/ S- u* {3 l  95 .oe_0      (1'b0)       , // output enable
    : ?2 l' P' S9 M  96 .address_1 (rd_pointer) , // address_q input
    . w1 q! J% o6 h) n  97 .data_1    (data_ram)   , // data_1 bi-directional
    - x& s- L2 ~8 p0 h- W" p" E4 d$ J  98 .cs_1      (rd_cs)      , // chip select1 @4 c0 ~6 f) g( Q
      99 .we_1      (1'b0)       , // Read enable7 m8 @  y% G, f
    100 .oe_1      (rd_en)        // output enable
    ! t' v8 I4 \" y) ~. r$ T; {101 );     + k6 c# L3 }. J
    102
    1 s1 J9 S3 M3 h' n5 ^7 L103 endmodule: Y1 q3 `* h% v: ~7 I8 H) y& G

    该用户从未签到

    2#
    发表于 2019-5-31 16:06 | 只看该作者
    这个代码要怎么用啊
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-12 04:44 , Processed in 0.109375 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表