Imported Upstream version 3.2.2
[debian/gnuradio] / usrp / fpga / models / fifo.v
1 // Model of FIFO in Altera
2
3 module fifo( data, wrreq, rdreq, rdclk, wrclk, aclr, q,
4                     rdfull, rdempty, rdusedw, wrfull, wrempty, wrusedw);
5    
6    parameter width = 16;
7    parameter depth = 1024;
8    parameter addr_bits = 10;
9    
10    //`define rd_req 0;  // Set this to 0 for rd_ack, 1 for rd_req
11    
12    input [width-1:0] data;
13    input             wrreq;
14    input             rdreq;
15    input             rdclk;
16    input             wrclk;
17    input             aclr;
18    output [width-1:0] q;
19    output             rdfull;
20    output             rdempty;
21    output reg [addr_bits-1:0]  rdusedw;
22    output wrfull;
23    output wrempty;
24    output reg [addr_bits-1:0]  wrusedw;
25    
26    reg [width-1:0] mem [0:depth-1];
27    reg [addr_bits-1:0]        rdptr;
28    reg [addr_bits-1:0]        wrptr;
29    
30 `ifdef rd_req
31    reg [width-1:0]    q;
32 `else
33    wire [width-1:0]   q;
34 `endif
35    
36    integer            i;
37    
38    always @( aclr)
39      begin
40         wrptr <= #1 0;
41         rdptr <= #1 0;
42         for(i=0;i<depth;i=i+1)
43           mem[i] <= #1 0;
44      end
45    
46    always @(posedge wrclk)
47      if(wrreq)
48        begin
49           wrptr <= #1 wrptr+1;
50           mem[wrptr] <= #1 data;
51        end
52    
53    always @(posedge rdclk)
54      if(rdreq)
55        begin
56           rdptr <= #1 rdptr+1;
57 `ifdef rd_req
58           q <= #1 mem[rdptr];
59 `endif
60        end
61    
62 `ifdef rd_req
63 `else
64    assign q = mem[rdptr];
65 `endif
66    
67    // Fix these
68    always @(posedge wrclk)
69      wrusedw <= #1 wrptr - rdptr;
70    
71    always @(posedge rdclk)
72      rdusedw <= #1 wrptr - rdptr;
73    
74    assign wrempty = (wrusedw == 0);
75    assign wrfull = (wrusedw == depth-1);
76    
77    assign rdempty = (rdusedw == 0);
78    assign rdfull = (rdusedw == depth-1);
79    
80 endmodule // fifo
81
82