aboutsummaryrefslogtreecommitdiffstats
path: root/control_lib/medfifo.v
blob: 5a77e8c16990f6d5eae93dd69f26e674ce2be2cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
module medfifo
  #(parameter WIDTH=32,
    parameter DEPTH=1)
    (input clk, input rst,
     input [WIDTH-1:0] datain,
     output [WIDTH-1:0] dataout,
     input read,
     input write,
     input clear,
     output full,
     output empty,
     output [7:0] space,
     output [7:0] occupied);

   localparam 		NUM_FIFOS = (1<<DEPTH);
   
   wire [WIDTH-1:0] 	dout [0:NUM_FIFOS-1];
   wire [0:NUM_FIFOS-1] full_x;
   wire [0:NUM_FIFOS-1] empty_x;

   shortfifo #(.WIDTH(WIDTH))
     head (.clk(clk),.rst(rst),
	   .datain(datain),.write(write),.full(full),
	   .dataout(dout[0]),.read(~empty_x[0] & ~full_x[1]),.empty(empty_x[0]),
	   .clear(clear),.space(space[4:0]),.occupied() );
   
   shortfifo #(.WIDTH(WIDTH))
     tail (.clk(clk),.rst(rst),
	   .datain(dout[NUM_FIFOS-2]),.write(~empty_x[NUM_FIFOS-2] & ~full_x[NUM_FIFOS-1]),.full(full_x[NUM_FIFOS-1]),
	   .dataout(dataout),.read(read),.empty(empty),
	   .clear(clear),.space(),.occupied(occupied[4:0]) );

   genvar 		i;
   generate
      for(i = 1; i < NUM_FIFOS-1 ; i = i + 1)
	begin : gen_depth
	   shortfifo #(.WIDTH(WIDTH))
	     shortfifo (.clk(clk),.rst(rst),
			.datain(dout[i-1]),.write(~full_x[i] & ~empty_x[i-1]),.full(full_x[i]),
			.dataout(dout[i]),.read(~full_x[i+1] & ~empty_x[i]),.empty(empty_x[i]),
			.clear(clear),.space(),.occupied() );
	end
   endgenerate

   assign space[7:5] = 0;
   assign occupied[7:5] = 0;
   
endmodule // medfifo