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

Verilog写的异步FIFO程序

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    Verilog写的异步FIFO程序
    " T0 {( M( a. K0 }//-----------------------------------------------------
    : H' d- Y7 b1 G5 M2 E! Q   2 // Design Name : syn_fifo
    , l/ m' O. b# F) I( z' x4 G   3 // File Name   : syn_fifo.v
    % `8 a% D! f+ y+ P* z* k   4 // Function    : Synchronous (single clock) FIFO' c+ p* B" X7 n
       5 // Coder       : Deepak Kumar Tala
    # k/ o; b3 x1 d5 v5 a1 j% U   6 //-----------------------------------------------------
    " i& V# u& s4 `, R# U   7 module syn_fifo (6 g1 e: [" ~1 D) {- h# ~
       8 clk      , // Clock input
    : R0 A) b0 x! a& ]  s+ S   9 rst      , // Active high reset! H3 A5 j! p' k8 s$ d
      10 wr_cs    , // Write chip select- Q! f2 w2 v" t1 G
      11 rd_cs    , // Read chipe select
    " k( _: n- I+ e& I3 \. e: X, I2 Y  12 data_in  , // Data input5 S# y' b6 \$ X* T3 p2 ?5 b
      13 rd_en    , // Read enable+ c# ~( O& J% E* k4 A- ?
      14 wr_en    , // Write Enable7 W9 r8 W6 N9 U) i! ~* q
      15 data_out , // Data Output5 o1 k, r: A! j  t+ x, g- _
      16 empty    , // FIFO empty
    , C/ `2 R* q3 v) C0 s! T  17 full       // FIFO full
    * a/ f( T; z+ K7 Q" _4 l; W  18 );    4 }1 C; z4 x8 \# F
      19  
    8 y# z# q# C+ N8 y. E  20 // FIFO constants
    - \6 ^  Z4 [3 h1 y  21 parameter DATA_WIDTH = 8;
    , P$ x# H: v* O  \6 z  22 parameter ADDR_WIDTH = 8;
    + K) S* D1 |6 q7 X  23 parameter RAM_DEPTH = (1 << ADDR_WIDTH);1 \9 b: n3 i/ X+ G" [* M
      24 // Port Declarations* A1 i! K- s' R  q$ Z! T+ Z1 y
      25 input clk ;, q2 J, f3 L  Z3 S+ G# H
      26 input rst ;5 c: y! u6 x; F5 G* n) c5 T
      27 input wr_cs ;
    1 h1 {2 Z) r6 c7 i+ z6 w. `! C/ A4 i  28 input rd_cs ;$ O. p* p. @7 a& f
      29 input rd_en ;4 S# M; @; j, s7 o& I. Y
      30 input wr_en ;
    1 u' L* O' K% `. W- F  31 input [DATA_WIDTH-1:0] data_in ;
    7 o# _$ j3 @6 ^2 d: s  32 output full ;" \. v7 p1 R* ?: ?- O2 x. l3 ?
      33 output empty ;
    9 d9 P7 v: g6 ], W! N+ w  34 output [DATA_WIDTH-1:0] data_out ;
    + `" f$ `, M0 d7 z7 _6 X  35 8 i. |( l; A5 N& O
      36 //-----------Internal variables-------------------
    + a1 t1 n5 U. q  37 reg [ADDR_WIDTH-1:0] wr_pointer;2 m% }, y8 |& y' m8 _
      38 reg [ADDR_WIDTH-1:0] rd_pointer;( \- r$ U# V4 p% F0 B& F: D
      39 reg [ADDR_WIDTH :0] status_cnt;
    # K# @8 j" M1 Z$ c$ A2 O6 v& T  40 reg [DATA_WIDTH-1:0] data_out ;6 m8 |- X7 S: H7 h% }, n6 u( [& j9 p1 }
      41 wire [DATA_WIDTH-1:0] data_ram ;& F' d* q1 n: H
      42   e8 r! a. G7 n+ X$ o( }
      43 //-----------Variable assignments---------------( ?% }& W* S4 S3 g! {4 Q0 @$ c/ C
      44 assign full = (status_cnt == (RAM_DEPTH-1));8 {( ~  ]; d: o% g
      45 assign empty = (status_cnt == 0);
    2 U  C* p/ G$ e0 j  K' k$ W* p  46 0 V2 A3 C6 L5 m8 G1 ]
      47 //-----------Code Start---------------------------, _4 |0 S$ ~% j) Y. @# d
      48 always @ (posedge clk or posedge rst)
    ; J# ]4 }  V) c9 m! z7 ?  49 begin : WRITE_POINTER! y5 f* W2 x4 Y, q
      50   if (rst) begin" c& @( p; Q/ g- b
      51     wr_pointer <= 0;) G  g9 P0 D2 \
      52   end else if (wr_cs && wr_en ) begin5 J0 O4 r5 T7 y6 i
      53     wr_pointer <= wr_pointer + 1;7 r1 a4 I2 X) Z2 J( H7 x
      54   end/ H" c9 L, r9 e' P; {
      55 end
    3 |5 c, z) t" l* v  E/ k  56
    ! d% `6 N- f; J" K7 o  57 always @ (posedge clk or posedge rst)
    9 v9 F1 y1 |; u, w9 x  58 begin : READ_POINTER
    5 f3 y* x- N( k$ E  59   if (rst) begin+ r! `* ~) J: J) F% @6 e" T3 a" @
      60     rd_pointer <= 0;$ k" Z* `# I. y  j! n0 Z
      61   end else if (rd_cs && rd_en ) begin  j; a7 |4 L& m% n" S' ~5 S/ z
      62     rd_pointer <= rd_pointer + 1;: T5 j9 @% S2 a3 ^  j
      63   end
    ) n- O! H, C3 S8 D# |  64 end9 [% z' D* s3 W5 w# n. C9 ^4 O2 O# p
      65 ' X1 M) l" ^+ b3 [
      66 always  @ (posedge clk or posedge rst)/ ^; B! T% B; \! s# C
      67 begin : READ_DATA
    0 x0 Z8 n. \7 W1 G  68   if (rst) begin
    / D3 S+ `4 v* I% J. i$ |& z  69     data_out <= 0;
    2 A1 [, N& E- s; {  70   end else if (rd_cs && rd_en ) begin
    % F7 e; J' g1 F+ A$ E  71     data_out <= data_ram;. w( o& h- z' r/ v" D* G0 }; D
      72   end4 @/ w  ~( N+ D4 \7 m
      73 end3 T/ ]) S" I4 }4 j
      74 1 @8 h0 s5 ]: O6 r7 C# l" w1 M" ?$ D& J
      75 always @ (posedge clk or posedge rst)
    9 [; Q1 q# x6 w; H2 x0 [  76 begin : STATUS_COUNTER  z/ c, m" P. Q
      77   if (rst) begin( a& J  F+ E8 e# ]" D0 U. m: ^
      78     status_cnt <= 0;
    1 g) {; I7 ?3 M6 x  79   // Read but no write.6 J: b9 n, Q  T+ m
      80   end else if ((rd_cs && rd_en) && ! (wr_cs && wr_en)
    * `3 O1 ]7 l& _; q; S1 T' h  81                && (status_cnt ! = 0)) begin
    ; O, H' a8 S8 `  82     status_cnt <= status_cnt - 1;7 a# T) \, C, p
      83   // Write but no read.+ f2 o2 q% V) o" w! x$ D
      84   end else if ((wr_cs && wr_en) && ! (rd_cs && rd_en)
    1 h1 O/ ?/ U: m$ |" j& u0 @9 C! [5 H  85               && (status_cnt ! = RAM_DEPTH)) begin
    : J/ x) p; q6 m  S* f, Y  86     status_cnt <= status_cnt + 1;
    & e9 {. C& n' a4 {: h) v  87   end( [9 r( F- l: J- o
      88 end - Z2 F  d7 Q: \& I
      89   
    % G! x7 s6 ?: [: ~# _  90 ram_dp_ar_aw #(DATA_WIDTH,ADDR_WIDTH)DP_RAM (' |3 |/ a0 z/ N6 o
      91 .address_0 (wr_pointer) , // address_0 input
    . W0 y7 v' L$ q: r% ]' r0 G5 `  92 .data_0    (data_in)    , // data_0 bi-directional9 @3 [5 h% n$ Q, v; u) q
      93 .cs_0      (wr_cs)      , // chip select* d  y2 X+ `6 I7 ?
      94 .we_0      (wr_en)      , // write enable( ^6 [: C* |9 B& P! w1 [
      95 .oe_0      (1'b0)       , // output enable. F" v. e3 ?. u1 B
      96 .address_1 (rd_pointer) , // address_q input; b% \: a5 C* X+ [- n( l9 @4 A
      97 .data_1    (data_ram)   , // data_1 bi-directional) E' I# ]# m( E5 x9 F
      98 .cs_1      (rd_cs)      , // chip select
    4 ^4 Y0 g2 E4 z& {  99 .we_1      (1'b0)       , // Read enable, _, Z; S; S% R" Y
    100 .oe_1      (rd_en)        // output enable4 i9 \/ C7 N* k8 n! u
    101 );     2 {/ u' |3 W" Y+ [4 \* [, k
    102 : d% U. o$ [) @- y% m5 W1 S9 d
    103 endmodule1 g7 L4 b! H$ G/ j: m

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-4 13:51 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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