3 #(parameter BUS_WIDTH = 16,
4 parameter NUM_CHAN = 2,
5 parameter FIFO_WIDTH = 32)
15 output reg [NUM_CHAN:0] WR_channel,
16 output reg [FIFO_WIDTH-1:0] ram_data,
17 output reg [NUM_CHAN:0] WR_done_channel );
20 reg [8:0] write_count;
23 always @(posedge usbclk)
24 if(bus_reset) // Use bus reset because this is on usbclk
26 else if(WR_fx2 & ~write_count[8])
27 write_count <= #1 write_count + 9'd1;
29 write_count <= #1 WR_fx2 ? write_count : 9'b0;
32 reg [15:0]usbdata_fixed;
34 always @(posedge usbclk)
36 WR_fx2_fixed <= WR_fx2 & ~write_count[8];
37 usbdata_fixed <= usbdata;
40 /* Used to convert 16 bits bus_data to the 32 bits wide fifo */
42 reg [BUS_WIDTH-1:0] usbdata_delayed ;
44 wire [FIFO_WIDTH-1:0] usbdata_packed ;
47 always @(posedge usbclk)
54 else if (WR_fx2_fixed)
61 usbdata_delayed <= usbdata_fixed ;
69 assign usbdata_packed = {usbdata_fixed, usbdata_delayed} ;
70 assign WR_packed = word_complete & writing ;
72 /* Make sure data are sync with usbclk */
73 reg [31:0]usbdata_usbclk;
76 always @(posedge usbclk)
79 usbdata_usbclk <= usbdata_packed;
80 WR_usbclk <= WR_packed;
83 /* Cross clock boundaries */
84 reg [FIFO_WIDTH-1:0] usbdata_tx ;
88 reg [31:0] usbdata_final;
91 always @(posedge txclk) usbdata_tx <= usbdata_usbclk;
93 always @(posedge txclk)
99 always @(posedge txclk)
105 always @(posedge txclk)
110 WR_tx <= WR_1 & ~WR_2;
113 always @(posedge txclk)
121 usbdata_final <= usbdata_tx;
125 /* Parse header and forward to ram */
126 reg [3:0]reader_state;
128 reg [9:0]read_length ;
130 parameter IDLE = 4'd0;
131 parameter HEADER = 4'd1;
132 parameter WAIT = 4'd2;
133 parameter FORWARD = 4'd3;
135 `define CHANNEL 20:16
138 always @(posedge txclk)
144 WR_done_channel <= 0;
150 reader_state <= HEADER;
153 // Store channel and forware header
155 channel <= (usbdata_final[`CHANNEL] == 5'h1f ? NUM_CHAN : usbdata_final[`CHANNEL]) ;
156 WR_channel[(usbdata_final[`CHANNEL] == 5'h1f ? NUM_CHAN : usbdata_final[`CHANNEL])] <= 1;
157 //channel <= usbdata_final[`CHANNEL] ;
158 //WR_channel[usbdata_final[`CHANNEL]] <= 1;
159 ram_data <= usbdata_final;
160 read_length <= 10'd4 ;
162 reader_state <= WAIT;
166 WR_channel[channel] <= 0;
168 if (read_length == `PKT_SIZE)
169 reader_state <= IDLE;
171 reader_state <= FORWARD;
175 WR_channel[channel] <= 1;
176 ram_data <= usbdata_final;
177 read_length <= read_length + 10'd4;
179 reader_state <= WAIT;