Bee2 branch landing: step 1
[fleet.git] / src / edu / berkeley / fleet / fpga / ramfifo.inc
1 module `MODULE_NAME(clk, rst, 
2                in_r, in_a_, in_d,
3                out_r_, out_a, out_d_); 
4     input  clk;
5     input  rst; 
6     input  in_r;
7     output in_a_;
8     output out_r_;
9     input  out_a;
10     input  [(`WIDTH-1):0] in_d;
11     output [(`WIDTH-1):0] out_d_;
12
13     reg in_a;
14     reg out_r;
15     assign in_a_ = in_a;
16     assign out_r_ = out_r;
17
18     wire[((1<<(`ADDR_BITS))-1):0] controlx;
19     reg[((1<<(`ADDR_BITS))-1):0] control;
20     initial control = 0;
21
22     genvar i;
23     generate
24       if (`ADDR_BITS > 1) begin: OUT
25       for(i=1; i<=((1<<`ADDR_BITS)-2) ; i=i+1) begin : OUT
26         assign controlx[i] =
27            ( control[i-1] && !control[i]                 ) ? 1 :
28            (                  control[i] && !control[i+1]) ? 0 :
29            control[i];
30       end
31       end
32     endgenerate
33
34     reg[3:0] addr;
35     initial  addr = 4'b1111;
36
37     reg inchead;
38     reg inctail;
39     reg[3:0] count;
40
41     genvar j;
42     generate
43       for(j=0; j<`WIDTH ; j=j+1) begin : OUTX
44          SRL16E SRL16E (.Q (out_d_[j]),
45                         .A0 (addr[0]),
46                         .A1 (addr[1]),
47                         .A2 (addr[2]),
48                         .A3 (addr[3]),
49                         .CE (in_r && !in_a && !control[0] && count==0),
50                         .CLK (clk),
51                         .D (in_d[j]));
52          defparam SRL16E.INIT = 0;
53       end
54     endgenerate
55
56     assign controlx[(1<<`ADDR_BITS)-1] =
57         !control[(1<<`ADDR_BITS)-1] ? control[(1<<`ADDR_BITS)-2] : (!out_r && !out_a) ? 0 : control[(1<<`ADDR_BITS)-1];
58
59     always @(posedge clk) begin 
60         if (rst) begin
61           out_r <= 0;
62           in_a <= 0;
63           control <= 0;
64           addr <= 4'b1111;
65
66         end else if (count!=0) begin
67           count <= count-1;
68
69         end else begin
70
71           count <= `DELAY;
72
73           inchead = 0;
74           inctail = 0;
75           if (!in_r && in_a) in_a <= 0;
76           if (control[0]) begin
77              if (!control[1]) control[0] <= 0;
78           end else if (in_r && !in_a) begin
79             control[0] <= 1;
80             inctail = 1;
81             in_a <= 1;
82           end
83   
84           control[(1<<`ADDR_BITS)-1:1] <= controlx[(1<<`ADDR_BITS)-1:1];
85   
86           if (control[(1<<`ADDR_BITS)-1] && !out_r && !out_a) begin
87             out_r <= 1;
88           end
89           if (out_r && out_a) begin
90             out_r <= 0;
91             inchead = 1;
92           end
93           if (          inchead && !inctail) begin
94             addr <= addr-1;
95           end else if (!inchead &&  inctail) begin
96             addr <= addr+1;
97           end
98       end
99     end
100 endmodule