2 // FIFO Interface to the 2K buffer RAMs
3 // Read port is read-acknowledge
4 // FIXME do we want to be able to interleave reads and writes?
7 #(parameter BUF_NUM = 0,
8 parameter BUF_SIZE = 9)
12 input [31:0] ctrl_word,
22 output reg [BUF_SIZE-1:0] addr_o,
23 output [31:0] dat_to_buf,
24 input [31:0] dat_from_buf,
26 // Write FIFO Interface
27 input [31:0] wr_data_i,
28 input [3:0] wr_flags_i,
32 // Read FIFO Interface
33 output [31:0] rd_data_o,
34 output [3:0] rd_flags_o,
49 if(go & (ctrl_word[31:28] == BUF_NUM))
50 ctrl_reg <= ctrl_word;
52 wire [BUF_SIZE-1:0] firstline = ctrl_reg[BUF_SIZE-1:0];
53 wire [BUF_SIZE-1:0] lastline = ctrl_reg[2*BUF_SIZE-1:BUF_SIZE];
55 wire read = ctrl_reg[22];
56 wire write = ctrl_reg[23];
57 wire clear = ctrl_reg[24];
58 //wire [2:0] port = ctrl_reg[27:25]; // Ignored in this block
59 //wire [3:0] buff_num = ctrl_reg[31:28]; // Ignored here ?
61 localparam IDLE = 3'd0;
62 localparam PRE_READ = 3'd1;
63 localparam READING = 3'd2;
64 localparam WRITING = 3'd3;
65 localparam ERROR = 3'd4;
66 localparam DONE = 3'd5;
70 wire wr_sop, wr_eop, wr_error;
98 else if(go_reg & write)
107 addr_o <= addr_o + 1;
117 addr_o <= addr_o + 1;
118 if(addr_o == lastline)
121 // FIXME assign occ here
134 addr_o <= addr_o + 1;
138 // Save OCC flags here
140 else if((addr_o == lastline)||wr_eop)
142 end // if (wr_ready_i)
145 endcase // case(state)
147 assign dat_to_buf = wr_data_i;
148 assign rd_data_o = dat_from_buf;
150 assign rd_flags_o = { rd_occ[1:0], rd_eop, rd_sop };
151 assign rd_ready_o = (state == READING);
153 assign wr_sop = wr_flags_i[0];
154 assign wr_eop = wr_flags_i[1];
155 assign wr_occ = wr_flags_i[3:2];
156 assign wr_error = wr_sop & wr_eop;
157 assign wr_ready_o = (state == WRITING);
159 assign we_o = (state == WRITING);
160 //assign we_o = (state == WRITING) && wr_ready_i; // always write to avoid timing issue
162 assign en_o = ~((state==READING)& ~rd_ready_i); // FIXME potential critical path
164 assign done = (state == DONE);
165 assign error = (state == ERROR);
166 assign idle = (state == IDLE);
168 endmodule // buffer_int