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

Subversion Repositories robust_axi2apb

[/] [robust_axi2apb/] [trunk/] [src/] [gen/] [prgen_fifo.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 eyalhoc
 
2
OUTFILE prgen_fifo.v
3
 
4
ITER DX 1 15
5
module prgen_fifo(PORTS);
6
 
7
   parameter                  WIDTH      = 8;
8
   parameter                  DEPTH_FULL = 8;
9
 
10
   parameter                  SINGLE     = DEPTH_FULL == 1;
11
   parameter                  DEPTH      = SINGLE ? 1 : DEPTH_FULL -1;
12
   parameter                  DEPTH_BITS =
13
                              (DEPTH <= EXPR(2^DX)) ? DX :
14
                              0; //0 is ilegal
15
 
16
   parameter                  LAST_LINE  = DEPTH-1;
17
 
18
 
19
 
20
   input                      clk;
21
   input                      reset;
22
 
23
   input                      push;
24
   input                      pop;
25
   input [WIDTH-1:0]           din;
26
   output [WIDTH-1:0]          dout;
27
   output                     empty;
28
   output                     full;
29
 
30
 
31
   wire                       reg_push;
32
   wire                       reg_pop;
33
   wire                       fifo_push;
34
   wire                       fifo_pop;
35
 
36
   reg [DEPTH-1:0]             fullness_in;
37
   reg [DEPTH-1:0]             fullness_out;
38
   reg [DEPTH-1:0]             fullness;
39
   reg [WIDTH-1:0]             fifo [DEPTH-1:0];
40
   wire                       fifo_empty;
41
   wire                       next;
42
   reg [WIDTH-1:0]             dout;
43
   reg                        dout_empty;
44
   reg [DEPTH_BITS-1:0]       ptr_in;
45
   reg [DEPTH_BITS-1:0]       ptr_out;
46
 
47
 
48
 
49
 
50
   assign                     reg_push  = push & fifo_empty & (dout_empty | pop);
51
   assign                     reg_pop   = pop & fifo_empty;
52
   assign                     fifo_push = !SINGLE & push & (~reg_push);
53
   assign                     fifo_pop  = !SINGLE & pop & (~reg_pop);
54
 
55
 
56
   always @(posedge clk or posedge reset)
57
     if (reset)
58
       begin
59
          dout       <= #FFD {WIDTH{1'b0}};
60
          dout_empty <= #FFD 1'b1;
61
       end
62
     else if (reg_push)
63
       begin
64
          dout       <= #FFD din;
65
          dout_empty <= #FFD 1'b0;
66
       end
67
     else if (reg_pop)
68
       begin
69
          dout       <= #FFD {WIDTH{1'b0}};
70
          dout_empty <= #FFD 1'b1;
71
       end
72
     else if (fifo_pop)
73
       begin
74
          dout       <= #FFD fifo[ptr_out];
75
          dout_empty <= #FFD 1'b0;
76
       end
77
 
78
   always @(posedge clk or posedge reset)
79
     if (reset)
80
       ptr_in <= #FFD {DEPTH_BITS{1'b0}};
81
     else if (fifo_push)
82
       ptr_in <= #FFD ptr_in == LAST_LINE ? 0 : ptr_in + 1'b1;
83
 
84
   always @(posedge clk or posedge reset)
85
     if (reset)
86
       ptr_out <= #FFD {DEPTH_BITS{1'b0}};
87
     else if (fifo_pop)
88
       ptr_out <= #FFD ptr_out == LAST_LINE ? 0 : ptr_out + 1'b1;
89
 
90
   always @(posedge clk)
91
     if (fifo_push)
92
       fifo[ptr_in] <= #FFD din;
93
 
94
 
95
   always @(*)
96
     begin
97
        fullness_in = {DEPTH{1'b0}};
98
        fullness_in[ptr_in] = fifo_push;
99
     end
100
 
101
   always @(*)
102
     begin
103
        fullness_out = {DEPTH{1'b0}};
104
        fullness_out[ptr_out] = fifo_pop;
105
     end
106
 
107
   always @(posedge clk or posedge reset)
108
     if (reset)
109
       fullness <= #FFD {DEPTH{1'b0}};
110
     else if (fifo_push | fifo_pop)
111
       fullness <= #FFD (fullness & (~fullness_out)) | fullness_in;
112
 
113
 
114
   assign next       = |fullness;
115
   assign fifo_empty = ~next;
116
   assign empty      = fifo_empty & dout_empty;
117
   assign full       = SINGLE ? !dout_empty : &fullness;
118
 
119
endmodule
120
 
121
 

powered by: WebSVN 2.1.0

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