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

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [rtl/] [verilog/] [buffers/] [sd_fifo_head_s.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 ghutchis
//----------------------------------------------------------------------
2
// Srdy/Drdy FIFO Head "S"
3
//
4
// Building block for FIFOs.  The "S" (big) FIFO is design for smaller
5
// FIFOs based around memories or flops, with sizes that are a power of 2.
6
//
7
// The "S" FIFO can be used as a two-clock asynchronous FIFO.
8
//
9
// Naming convention: c = consumer, p = producer, i = internal interface
10
//----------------------------------------------------------------------
11
// Author: Guy Hutchison
12
//
13
// This block is uncopyrighted and released into the public domain.
14
//----------------------------------------------------------------------
15
 
16
// Clocking statement for synchronous blocks.  Default is for
17
// posedge clocking and positive async reset
18
`ifndef SDLIB_CLOCKING
19
 `define SDLIB_CLOCKING posedge clk or posedge reset
20
`endif
21
 
22
// delay unit for nonblocking assigns, default is to #1
23
`ifndef SDLIB_DELAY
24
 `define SDLIB_DELAY #1
25
`endif
26
 
27
module sd_fifo_head_s
28
  #(parameter depth=16,
29
    parameter async=0,
30
    parameter asz=$clog2(depth)
31
    )
32
    (
33
     input       clk,
34
     input       reset,
35
     input       c_srdy,
36
     output      c_drdy,
37
 
38
     output [asz:0]     wrptr_head,
39
     output [asz-1:0]   wr_addr,
40
     output reg         wr_en,
41
     input [asz:0]      rdptr_tail
42
 
43
     );
44
 
45
  reg [asz:0]            wrptr, nxt_wrptr;
46
  reg [asz:0]            wrptr_p1;
47
  reg                   empty, full;
48
  wire [asz:0]           rdptr;
49
 
50
  assign c_drdy = !full;
51
  assign wr_addr = wrptr[asz-1:0];
52
 
53
  always @*
54
    begin
55
      wrptr_p1 = wrptr + 1;
56
 
57
      full = ((wrptr[asz-1:0] == rdptr[asz-1:0]) &&
58
              (wrptr[asz] == ~rdptr[asz]));
59
 
60
      if (c_srdy & !full)
61
        nxt_wrptr = wrptr_p1;
62
      else
63
        nxt_wrptr = wrptr;
64
 
65
      wr_en = (c_srdy & !full);
66
    end
67
 
68
  always @(`SDLIB_CLOCKING)
69
    begin
70
      if (reset)
71
        begin
72
          wrptr <= `SDLIB_DELAY 0;
73
        end
74
      else
75
        begin
76
          wrptr <= `SDLIB_DELAY nxt_wrptr;
77
        end // else: !if(reset)
78
    end // always @ (posedge clk)
79
 
80
  function [asz:0] bin2grey;
81
    input [asz:0] bin_in;
82
    integer       b;
83
    begin
84
      bin2grey[asz] = bin_in[asz];
85
      for (b=0; b<asz; b=b+1)
86
        bin2grey[b] = bin_in[b] ^ bin_in[b+1];
87
    end
88
  endfunction // for
89
 
90
  function [asz:0] grey2bin;
91
    input [asz:0] grey_in;
92
    integer       b;
93
    begin
94
      grey2bin[asz] = grey_in[asz];
95
      for (b=asz-1; b>=0; b=b-1)
96
        grey2bin[b] = grey_in[b] ^ grey2bin[b+1];
97
    end
98
  endfunction
99
 
100
  assign wrptr_head = (async) ? bin2grey(wrptr) : wrptr;
101
  assign rdptr = (async)? grey2bin(rdptr_tail) : rdptr_tail;
102
 
103
endmodule

powered by: WebSVN 2.1.0

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