1 module data_packet_fifo
4 input [15:0]ram_data_in,
7 output reg [15:0]ram_data_out,
8 output reg pkt_waiting,
13 /* Some parameters for usage later on */
14 parameter DATA_WIDTH = 16 ;
15 parameter NUM_PACKETS = 4 ;
17 /* Create the RAM here */
18 reg [DATA_WIDTH-1:0] usb_ram [256*NUM_PACKETS-1:0] ;
20 /* Create the address signals */
21 reg [7:0] usb_ram_offset_out ;
22 reg [1:0] usb_ram_packet_out ;
23 reg [7:0] usb_ram_offset_in ;
24 reg [1:0] usb_ram_packet_in ;
26 wire [7-2+NUM_PACKETS:0] usb_ram_aout ;
27 wire [7-2+NUM_PACKETS:0] usb_ram_ain ;
30 assign usb_ram_aout = {usb_ram_packet_out, usb_ram_offset_out} ;
31 assign usb_ram_ain = {usb_ram_packet_in, usb_ram_offset_in} ;
33 // Check if there is one full packet to process
34 always @(usb_ram_ain, usb_ram_aout)
38 else if (usb_ram_ain >= usb_ram_aout)
39 pkt_waiting <= usb_ram_ain - usb_ram_aout >= 256;
41 pkt_waiting <= (usb_ram_ain + 10'b1111111111 - usb_ram_aout) >= 256;
44 // Check if there is room
45 always @(usb_ram_ain, usb_ram_aout)
49 else if (usb_ram_ain == usb_ram_aout)
50 have_space <= ~isfull;
51 else if (usb_ram_ain > usb_ram_aout)
52 have_space <= (usb_ram_ain - usb_ram_aout) <= 256 * (NUM_PACKETS - 1);
54 have_space <= (usb_ram_aout - usb_ram_ain) >= 256;
57 /* RAM Write Address process */
58 always @(posedge clock)
62 usb_ram_offset_in <= 0 ;
63 usb_ram_packet_in <= 0 ;
68 usb_ram_packet_in <= usb_ram_packet_in + 1;
69 usb_ram_offset_in <= 0;
71 else if( write_enable )
73 if (usb_ram_offset_in == 8'b11111111)
75 usb_ram_offset_in <= 0;
76 usb_ram_packet_in <= usb_ram_packet_in + 1;
79 usb_ram_offset_in <= usb_ram_offset_in + 1 ;
80 if (usb_ram_ain + 1 == usb_ram_aout)
85 /* RAM Writing process */
86 always @(posedge clock)
90 usb_ram[usb_ram_ain] <= ram_data_in ;
94 /* RAM Read Address process */
95 always @(posedge clock)
99 usb_ram_packet_out <= 0 ;
100 usb_ram_offset_out <= 0 ;
106 usb_ram_packet_out <= usb_ram_packet_out + 1 ;
107 usb_ram_offset_out <= 0 ;
109 else if(read_enable) begin
110 if( usb_ram_offset_out == 8'b11111111 )
112 usb_ram_offset_out <= 0 ;
113 usb_ram_packet_out <= usb_ram_packet_out + 1 ;
116 usb_ram_offset_out <= usb_ram_offset_out + 1 ;
118 if (usb_ram_ain == usb_ram_aout)
122 /* RAM Reading Process */
123 always @(posedge clock)
125 ram_data_out <= usb_ram[usb_ram_aout] ;