OpenCores
URL https://opencores.org/ocsvn/srdydrdy_lib/srdydrdy_lib/trunk

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [rtl/] [verilog/] [buffers/] [sd_fifo_s.v] - Blame information for rev 14

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 ghutchis
//----------------------------------------------------------------------
2
// Srdy/Drdy FIFO "S"
3
//
4
// Building block for FIFOs.  The "S" (small or synchronizer) FIFO is 
5
// designed for smaller FIFOs based around memories or flops, with 
6
// sizes that are a power of 2.
7
//
8
// The "S" FIFO can be used as a two-clock asynchronous FIFO.  When the
9
// async parameter is set to 1, the pointers will be converted from
10
// binary to grey code and double-synchronized.
11
//
12
// Naming convention: c = consumer, p = producer, i = internal interface
13
//----------------------------------------------------------------------
14
// Author: Guy Hutchison
15
//
16
// This block is uncopyrighted and released into the public domain.
17
//----------------------------------------------------------------------
18
 
19
// delay unit for nonblocking assigns, default is to #1
20
`ifndef SDLIB_DELAY
21
 `define SDLIB_DELAY #1
22
`endif
23
 
24
module sd_fifo_s
25
  #(parameter width=8,
26
    parameter depth=16,
27
    parameter async=0
28
    )
29
    (
30
     input       c_clk,
31
     input       c_reset,
32
     input       c_srdy,
33
     output      c_drdy,
34
     input [width-1:0] c_data,
35
 
36
     input       p_clk,
37
     input       p_reset,
38
     output      p_srdy,
39
     input       p_drdy,
40 14 ghutchis
     output  [width-1:0] p_data
41 3 ghutchis
     );
42
 
43
  localparam asz = $clog2(depth);
44
 
45
  reg [width-1:0]        mem [0:depth-1];
46
  wire [width-1:0]       mem_rddata;
47
  wire                  rd_en;
48
  wire [asz:0]           rdptr_tail, rdptr_tail_sync;
49
  wire                  wr_en;
50
  wire [asz:0]           wrptr_head, wrptr_head_sync;
51
  wire [asz-1:0]         rd_addr, wr_addr;
52
 
53 14 ghutchis
/* -----\/----- EXCLUDED -----\/-----
54 3 ghutchis
  always @(posedge c_clk)
55
    if (wr_en)
56
      mem[wr_addr] <= `SDLIB_DELAY c_data;
57
 
58
  assign mem_rddata = mem[rd_addr];
59 14 ghutchis
 -----/\----- EXCLUDED -----/\----- */
60
  behave2p_mem #(width, depth) mem2p
61
    (.d_out (p_data),
62
     .wr_en (wr_en),
63
     .rd_en (rd_en),
64
     .wr_clk (c_clk),
65
     .wr_addr (wr_addr),
66
     .rd_clk  (p_clk),
67
     .rd_addr (rd_addr),
68
     .d_in    (c_data));
69 3 ghutchis
 
70 14 ghutchis
 
71 3 ghutchis
  sd_fifo_head_s #(depth, async) head
72
    (
73
     // Outputs
74
     .c_drdy                            (c_drdy),
75
     .wrptr_head                        (wrptr_head),
76
     .wr_en                             (wr_en),
77
     .wr_addr                           (wr_addr),
78
     // Inputs
79
     .clk                               (c_clk),
80
     .reset                             (c_reset),
81
     .c_srdy                            (c_srdy),
82
     .rdptr_tail                        (rdptr_tail_sync));
83
 
84
  sd_fifo_tail_s #(depth, async) tail
85
    (
86
     // Outputs
87
     .rdptr_tail                        (rdptr_tail),
88
     .rd_en                             (rd_en),
89
     .rd_addr                           (rd_addr),
90
     .p_srdy                            (p_srdy),
91
     // Inputs
92
     .clk                               (p_clk),
93
     .reset                             (p_reset),
94
     .wrptr_head                        (wrptr_head_sync),
95
     .p_drdy                            (p_drdy));
96
 
97 14 ghutchis
/* -----\/----- EXCLUDED -----\/-----
98 3 ghutchis
  always @(posedge p_clk)
99
    begin
100
      if (rd_en)
101
        p_data <= `SDLIB_DELAY mem_rddata;
102
    end
103 14 ghutchis
 -----/\----- EXCLUDED -----/\----- */
104 3 ghutchis
 
105
  generate
106
    if (async)
107
      begin : gen_sync
108
        reg [asz:0] r_sync1, r_sync2;
109
        reg [asz:0] w_sync1, w_sync2;
110
 
111
        always @(posedge p_clk)
112
          begin
113
            w_sync1 <= `SDLIB_DELAY wrptr_head;
114
            w_sync2 <= `SDLIB_DELAY w_sync1;
115
          end
116
 
117
        always @(posedge c_clk)
118
          begin
119
            r_sync1 <= `SDLIB_DELAY rdptr_tail;
120
            r_sync2 <= `SDLIB_DELAY r_sync1;
121
          end
122
 
123
        assign wrptr_head_sync = w_sync2;
124
        assign rdptr_tail_sync = r_sync2;
125
      end
126
    else
127
      begin : gen_nosync
128
        assign wrptr_head_sync = wrptr_head;
129
        assign rdptr_tail_sync = rdptr_tail;
130
      end
131
  endgenerate
132
 
133
endmodule // sd_fifo_s

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.