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 3

Go to most recent revision | 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
     output [width-1:0] p_data
41
     );
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
  reg [width-1:0]        p_data;
52
  reg                   dly_rd_en;
53
  wire [asz-1:0]         rd_addr, wr_addr;
54
 
55
  always @(posedge c_clk)
56
    if (wr_en)
57
      mem[wr_addr] <= `SDLIB_DELAY c_data;
58
 
59
  assign mem_rddata = mem[rd_addr];
60
 
61
  sd_fifo_head_s #(depth, async) head
62
    (
63
     // Outputs
64
     .c_drdy                            (c_drdy),
65
     .wrptr_head                        (wrptr_head),
66
     .wr_en                             (wr_en),
67
     .wr_addr                           (wr_addr),
68
     // Inputs
69
     .clk                               (c_clk),
70
     .reset                             (c_reset),
71
     .c_srdy                            (c_srdy),
72
     .rdptr_tail                        (rdptr_tail_sync));
73
 
74
  sd_fifo_tail_s #(depth, async) tail
75
    (
76
     // Outputs
77
     .rdptr_tail                        (rdptr_tail),
78
     .rd_en                             (rd_en),
79
     .rd_addr                           (rd_addr),
80
     .p_srdy                            (p_srdy),
81
     // Inputs
82
     .clk                               (p_clk),
83
     .reset                             (p_reset),
84
     .wrptr_head                        (wrptr_head_sync),
85
     .p_drdy                            (p_drdy));
86
 
87
  always @(posedge p_clk)
88
    begin
89
      if (rd_en)
90
        p_data <= `SDLIB_DELAY mem_rddata;
91
    end
92
 
93
  generate
94
    if (async)
95
      begin : gen_sync
96
        reg [asz:0] r_sync1, r_sync2;
97
        reg [asz:0] w_sync1, w_sync2;
98
 
99
        always @(posedge p_clk)
100
          begin
101
            w_sync1 <= `SDLIB_DELAY wrptr_head;
102
            w_sync2 <= `SDLIB_DELAY w_sync1;
103
          end
104
 
105
        always @(posedge c_clk)
106
          begin
107
            r_sync1 <= `SDLIB_DELAY rdptr_tail;
108
            r_sync2 <= `SDLIB_DELAY r_sync1;
109
          end
110
 
111
        assign wrptr_head_sync = w_sync2;
112
        assign rdptr_tail_sync = r_sync2;
113
      end
114
    else
115
      begin : gen_nosync
116
        assign wrptr_head_sync = wrptr_head;
117
        assign rdptr_tail_sync = rdptr_tail;
118
      end
119
  endgenerate
120
 
121
endmodule // sd_fifo_s

powered by: WebSVN 2.1.0

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