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

Verilog写的异步FIFO程序

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    Verilog写的异步FIFO程序
    ' r8 u, F$ C4 j5 O+ ]) M//-----------------------------------------------------5 J. W, O2 a* m( ?; X
       2 // Design Name : syn_fifo/ d& v3 L; t8 d: ^
       3 // File Name   : syn_fifo.v
    $ m9 Y6 V  `1 j/ a3 x  a   4 // Function    : Synchronous (single clock) FIFO# ^! B- W+ R: t1 [& X2 b
       5 // Coder       : Deepak Kumar Tala3 O8 x: R) B0 u; a- `
       6 //-----------------------------------------------------
      `" u4 [9 e6 q   7 module syn_fifo (
    # R- v- V$ m9 M, e0 i1 ~   8 clk      , // Clock input
    5 m8 S" D) f+ V7 C7 M  \. `   9 rst      , // Active high reset) X) Z6 k+ t$ I- e  ^0 ]
      10 wr_cs    , // Write chip select$ ~$ d/ c8 n$ m/ W+ M
      11 rd_cs    , // Read chipe select
    - `8 S8 k" s: V5 Y  12 data_in  , // Data input# S/ i# n; T% V! V
      13 rd_en    , // Read enable
    ! H! o/ O5 C9 t% I- e! H  14 wr_en    , // Write Enable
    0 G; j3 H" b; k2 M$ I  15 data_out , // Data Output2 F. E4 L& p+ ^6 q* v8 v
      16 empty    , // FIFO empty, F5 _1 g0 y9 U9 r4 D
      17 full       // FIFO full
    9 G5 h, l0 B; ~2 s) ]7 t  18 );    + m! M! U* u; m: S5 X9 f, u
      19  
    $ V4 W3 a' N7 x, `% O. [) \  20 // FIFO constants
    / N( i9 h9 w# k& ]6 k  21 parameter DATA_WIDTH = 8;1 f) k9 e1 \% |2 ~$ M
      22 parameter ADDR_WIDTH = 8;
    3 Z, v5 E, ^" [4 f; m  23 parameter RAM_DEPTH = (1 << ADDR_WIDTH);
    % g0 S3 N4 T2 h9 r  24 // Port Declarations
    ; w& f" v+ F7 A! ^! v  25 input clk ;7 @9 d" u# ~4 ~5 E% T
      26 input rst ;
    & F$ o4 c! k; r4 X! ~# p  p+ y  27 input wr_cs ;4 s; m* u0 c8 ?) a: f5 H4 V
      28 input rd_cs ;
    / J% U3 V/ R( E+ V6 K6 a9 O  29 input rd_en ;5 L& z/ ~. t* @7 t2 ?5 x' ^
      30 input wr_en ;
    ( A6 C. x* x& \( n' A& b  31 input [DATA_WIDTH-1:0] data_in ;/ Q7 [8 r' p% J) d
      32 output full ;# \, W: g5 T" {2 M/ O% J
      33 output empty ;
    7 C6 t$ o% x+ w& L  34 output [DATA_WIDTH-1:0] data_out ;
    % ?8 r+ r0 u* S- r$ G1 M, t  35   I  [. h: B' H6 p+ W1 ^
      36 //-----------Internal variables-------------------
    5 J. Z% G& ~& S  37 reg [ADDR_WIDTH-1:0] wr_pointer;
    % b; X" \% ^) ~* e7 ?. ?) z  38 reg [ADDR_WIDTH-1:0] rd_pointer;  d' E  E  z) K) N5 H: r2 q2 _
      39 reg [ADDR_WIDTH :0] status_cnt;- Z: v6 C# ~/ o
      40 reg [DATA_WIDTH-1:0] data_out ;# k: Y4 D! `# L( _/ n6 g9 Z# Z6 {' D
      41 wire [DATA_WIDTH-1:0] data_ram ;
    ( `: ~/ n0 h* `( k  42
    6 C& H( _+ L8 ], \( p5 b  43 //-----------Variable assignments---------------! L  T  s2 y0 E) D/ j, f8 y
      44 assign full = (status_cnt == (RAM_DEPTH-1));
    9 {0 l2 v( d$ I, V* p  45 assign empty = (status_cnt == 0);
    % ?; d" e7 u/ _6 D  46
    $ H: q) Q* I+ r: S6 V' Q% S' b* X0 f) x  47 //-----------Code Start---------------------------7 G# _: |, ^. G
      48 always @ (posedge clk or posedge rst)( M  Q! @( u# {* }. K9 n
      49 begin : WRITE_POINTER
    / q: M( x  X- D/ T! w! H  50   if (rst) begin( c- X' k# }, X
      51     wr_pointer <= 0;4 l$ e$ E9 {% Z9 [  ]
      52   end else if (wr_cs && wr_en ) begin
    6 l+ Y2 g/ M1 o4 g( ?4 X- f  53     wr_pointer <= wr_pointer + 1;+ a7 U7 J! k$ L5 ]
      54   end' g0 s: w. s; y" [" q; }( M
      55 end! M! U7 m  N" o) {( O+ @$ s3 e/ O
      56 8 I, k) y" f8 z
      57 always @ (posedge clk or posedge rst)
    ! }5 q7 \- a1 [- @  58 begin : READ_POINTER2 {1 A: u. F, x- {
      59   if (rst) begin8 I- Z# ?' u" ]  l
      60     rd_pointer <= 0;
    2 {( l' X" M: v( T, i  61   end else if (rd_cs && rd_en ) begin; [4 }. ?5 H- [
      62     rd_pointer <= rd_pointer + 1;* V( P& d0 `5 W8 D0 X% `+ S8 L
      63   end' ~# d( I$ e: o5 p+ Y& P
      64 end' e7 T; x! x5 d  Q" V6 v9 n7 `. ?
      65 0 B6 X# g, M6 L& d! L2 X9 c
      66 always  @ (posedge clk or posedge rst)9 w: b  X$ C+ k8 ?9 p" o9 |
      67 begin : READ_DATA. p; C' k' b+ g7 [8 e
      68   if (rst) begin
    & G; P+ |7 z+ w% n" t  69     data_out <= 0;
    & r6 J+ z1 M; S2 x) A0 P0 _  70   end else if (rd_cs && rd_en ) begin& z; Y0 E9 u/ p+ p: `# F2 F0 o
      71     data_out <= data_ram;/ P' J7 U5 l+ U: }) u
      72   end3 B, b& M" R$ X4 D2 R8 M; k
      73 end; ]/ T8 B" \  L' [1 u
      74
    ( n* Y$ @# V. h$ a  75 always @ (posedge clk or posedge rst); k' |7 X+ h+ D* G4 P+ Q, F+ z
      76 begin : STATUS_COUNTER. C0 n8 s% x/ R2 Q
      77   if (rst) begin1 p  n! w; Q5 J4 C  }
      78     status_cnt <= 0;' U, a) V: g: Y# d+ J- @
      79   // Read but no write.9 T) t: t1 X7 M# n% x% a% ^% R0 R
      80   end else if ((rd_cs && rd_en) && ! (wr_cs && wr_en)
      v2 D, I# T# \$ M  81                && (status_cnt ! = 0)) begin
    6 [8 I6 w6 }8 Q* k* [& `  82     status_cnt <= status_cnt - 1;
    3 |  |3 B* v( v  83   // Write but no read.; {' N# P/ {5 z# G; Q! v
      84   end else if ((wr_cs && wr_en) && ! (rd_cs && rd_en)
    ; p7 a" ]& S7 U0 Q- `: i/ Z( q5 Y  85               && (status_cnt ! = RAM_DEPTH)) begin
    / N3 x8 O/ ]- P3 J* ~3 r0 D) r  86     status_cnt <= status_cnt + 1;9 V( S# H! V6 D- b' T# |
      87   end
    & H' S* {1 u/ k3 C  88 end 4 Q& N3 g# X7 w6 D; [3 F8 a  Q
      89    ! w, ~% ^4 X" d  b. g
      90 ram_dp_ar_aw #(DATA_WIDTH,ADDR_WIDTH)DP_RAM (
    & w, V& q2 s$ ~$ f0 @) [9 M. d5 J  91 .address_0 (wr_pointer) , // address_0 input   @* Y" m4 m: Q( J9 \
      92 .data_0    (data_in)    , // data_0 bi-directional6 ?2 o) G( _# P& W, h3 I
      93 .cs_0      (wr_cs)      , // chip select
    0 M# H4 V+ h( J6 n  94 .we_0      (wr_en)      , // write enable
    % t( U  B% ^8 S  j- v7 W4 t9 v  95 .oe_0      (1'b0)       , // output enable
    % p( }) N9 Y' H  96 .address_1 (rd_pointer) , // address_q input0 ]+ E! L. o4 ]& H* T! N
      97 .data_1    (data_ram)   , // data_1 bi-directional0 c& d* e  M" @+ L; @
      98 .cs_1      (rd_cs)      , // chip select
    8 V. r( A4 u0 F, ^  99 .we_1      (1'b0)       , // Read enable3 a0 u) H% Z$ d% h/ ^
    100 .oe_1      (rd_en)        // output enable
    $ n$ ^8 L, z! m101 );     4 s7 Z8 S' w% D2 i- `* ]- [( k
    102
    8 ~, |- a% h7 m7 l! k  Y7 s103 endmodule: N: }5 W0 v3 f3 K4 V. Y

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-10 08:38 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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