1 module data_packet_fifo
4 input [31:0]ram_data_in,
7 output reg [31:0]ram_data_out,
8 output reg pkt_waiting,
10 output reg [1:0]usb_ram_packet_out,
11 output reg [1:0]usb_ram_packet_in,
16 /* Some parameters for usage later on */
17 parameter DATA_WIDTH = 32 ;
18 parameter PKT_DEPTH = 128 ;
19 parameter NUM_PACKETS = 4 ;
21 /* Create the RAM here */
22 reg [DATA_WIDTH-1:0] usb_ram [PKT_DEPTH*NUM_PACKETS-1:0] ;
24 /* Create the address signals */
25 reg [6:0] usb_ram_offset_out ;
26 //reg [1:0] usb_ram_packet_out ;
27 reg [6:0] usb_ram_offset_in ;
28 //reg [1:0] usb_ram_packet_in ;
30 wire [6-2+NUM_PACKETS:0] usb_ram_aout ;
31 wire [6-2+NUM_PACKETS:0] usb_ram_ain ;
34 assign usb_ram_aout = {usb_ram_packet_out, usb_ram_offset_out} ;
35 assign usb_ram_ain = {usb_ram_packet_in, usb_ram_offset_in} ;
37 // Check if there is one full packet to process
38 always @(usb_ram_ain, usb_ram_aout, isfull)
40 if (usb_ram_ain == usb_ram_aout)
41 pkt_waiting <= isfull ;
42 else if (usb_ram_ain > usb_ram_aout)
43 pkt_waiting <= (usb_ram_ain - usb_ram_aout) >= PKT_DEPTH;
45 pkt_waiting <= (usb_ram_ain + 10'b1000000000 - usb_ram_aout) >= PKT_DEPTH;
48 // Check if there is room
49 always @(usb_ram_ain, usb_ram_aout, isfull)
51 if (usb_ram_ain == usb_ram_aout)
52 have_space <= ~isfull;
53 else if (usb_ram_ain > usb_ram_aout)
54 have_space <= ((usb_ram_ain - usb_ram_aout) <= PKT_DEPTH * (NUM_PACKETS - 1))? 1'b1 : 1'b0;
56 have_space <= (usb_ram_aout - usb_ram_ain) >= PKT_DEPTH;
61 /* RAM Writing/Reading process */
62 always @(posedge clock)
66 usb_ram[usb_ram_ain] <= ram_data_in ;
68 ram_data_out <= usb_ram[usb_ram_aout] ;
71 /* RAM Write/Read Address process */
72 always @(posedge clock)
76 usb_ram_packet_out <= 0 ;
77 usb_ram_offset_out <= 0 ;
78 usb_ram_offset_in <= 0 ;
79 usb_ram_packet_in <= 0 ;
86 usb_ram_packet_out <= usb_ram_packet_out + 1 ;
87 usb_ram_offset_out <= 0 ;
92 if( usb_ram_offset_out == 7'b1111111 )
95 usb_ram_offset_out <= 0 ;
96 usb_ram_packet_out <= usb_ram_packet_out + 1 ;
99 usb_ram_offset_out <= usb_ram_offset_out + 1 ;
103 usb_ram_packet_in <= usb_ram_packet_in + 1 ;
104 usb_ram_offset_in <= 0 ;
105 if ((usb_ram_packet_in + 2'b1) == usb_ram_packet_out)
108 else if( write_enable )
110 if (usb_ram_offset_in == 7'b1111111)
111 usb_ram_offset_in <= 7'b1111111 ;
113 usb_ram_offset_in <= usb_ram_offset_in + 1 ;