af7ed394a722c1af8ffc5e85f07ebddc5faeb9ea
[debian/gnuradio] / usrp / fpga / inband_lib / tx_buffer_inband.v
1 module tx_buffer_inband
2   ( usbclk, bus_reset, reset, usbdata, WR, have_space, 
3     tx_underrun, channels, tx_i_0, tx_q_0, tx_i_1, tx_q_1,
4     tx_i_2, tx_q_2, tx_i_3, tx_q_3, txclk, txstrobe,
5     clear_status, tx_empty, debugbus, 
6         rx_databus, rx_WR, rx_WR_done, rx_WR_enabled, reg_io_enable,
7         reg_data_in, reg_data_out, reg_addr, rssi_0, rssi_1, rssi_2, 
8     rssi_3, threshhold
9    );
10
11         //CHAN_WIDTH is the width of the channel
12         //NUM_CHAN is the number of data channel (index from 0 to NUM_CHAN-1)
13         //index NUM_CHAN is reserved for command
14         
15         parameter CHAN_WIDTH =          2 ;
16     parameter NUM_CHAN   =      2 ;
17         /* Debug paramters */
18     parameter STROBE_RATE_0 =   8'd1 ;
19     parameter STROBE_RATE_1 =   8'd2 ;
20     
21     input   wire                usbclk ;
22     input   wire                bus_reset ; // Used here for the 257-Hack to fix the FX2 bug
23     input   wire                reset ; // standard DSP-side reset
24     input   wire         [15:0] usbdata ;
25     input   wire                WR ;
26     input   wire                txclk ;
27     input   wire                txstrobe ;
28         input   wire                            rx_WR_enabled;
29     /* Not used yet */
30     input   wire          [3:0] channels ;
31     input   wire                clear_status ;
32     /*register io*/
33     input   wire          [31:0]reg_data_out;
34     // rssi
35     input       wire              [31:0]rssi_0;
36     input       wire              [31:0]rssi_1;
37     input       wire              [31:0]rssi_2;
38     input       wire              [31:0]rssi_3;
39     input       wire              [31:0]threshhold;
40
41     output  wire                have_space ;
42     output  wire                tx_underrun ;
43     output  wire                tx_empty ;
44     output  wire         [15:0] tx_i_0 ;
45     output  wire         [15:0] tx_q_0 ;
46     output  wire         [15:0] tx_i_1 ;
47     output  wire         [15:0] tx_q_1 ;
48     output  wire         [15:0] debugbus ;
49     /* Not used yet */
50     output  wire         [15:0] tx_i_2 ;
51     output  wire         [15:0] tx_q_2 ;
52     output  wire         [15:0] tx_i_3 ;
53     output  wire         [15:0] tx_q_3 ;
54
55         output  wire             [15:0] rx_databus ;
56         output  wire                            rx_WR;
57         output  wire                            rx_WR_done;
58     /* reg_io */
59     output  wire         [31:0] reg_data_in;
60     output  wire         [6:0]  reg_addr;
61     output  wire         [1:0]  reg_io_enable;
62
63     /* To generate channel readers */
64     genvar i ;
65     
66     /* These will eventually be external register */
67     reg                  [31:0] adc_time ;
68     wire                  [7:0] txstrobe_rate [CHAN_WIDTH-1:0] ;
69     wire                                 [31:0] rssi [3:0];
70     assign rssi[0] = rssi_0;
71     assign rssi[1] = rssi_1;
72     assign rssi[2] = rssi_2;
73     assign rssi[3] = rssi_3;
74    
75         always @(posedge txclk)
76                 if (reset)
77                         adc_time <= 0;
78                 else if (txstrobe)
79                         adc_time <= adc_time + 1;
80
81
82     /* Connections between tx_usb_fifo_reader and
83        cnannel/command processing blocks */
84     wire                 [31:0] tx_data_bus ;
85     wire           [CHAN_WIDTH:0] chan_WR ;
86     wire           [CHAN_WIDTH:0] chan_done ;
87     
88     /* Connections between data block and the
89        FX2/TX chains */
90     wire           [CHAN_WIDTH:0] chan_underrun ;
91     wire           [CHAN_WIDTH:0] chan_txempty ;
92    
93     /* Conections between tx_data_packet_fifo and
94        its reader + strobe generator */
95     wire                 [31:0] chan_fifodata [CHAN_WIDTH:0] ;
96     wire                        chan_pkt_waiting [CHAN_WIDTH:0] ;
97     wire                        chan_rdreq [CHAN_WIDTH:0] ;
98     wire                        chan_skip [CHAN_WIDTH:0] ;
99     wire           [CHAN_WIDTH:0] chan_have_space ;
100     wire                        chan_txstrobe [CHAN_WIDTH-1:0] ;
101
102         wire                            [14:0]  debug;
103     
104     /* Outputs to transmit chains */
105     wire                 [15:0] tx_i [CHAN_WIDTH-1:0] ;
106     wire                 [15:0] tx_q [CHAN_WIDTH-1:0] ;
107     
108         /* TODO: Figure out how to write this genericly */
109     assign have_space = chan_have_space[0] & chan_have_space[1];
110     assign tx_empty = chan_txempty[0] & chan_txempty[1] ;
111     assign tx_underrun = chan_underrun[0] | chan_underrun[1] ;
112     assign tx_i_0 = chan_txempty[0] ? 16'b0 : tx_i[0] ;
113     assign tx_q_0 = chan_txempty[0] ? 16'b0 : tx_q[0] ;
114     assign tx_i_1 = chan_txempty[1] ? 16'b0 : tx_i[1] ;
115     assign tx_q_1 = chan_txempty[1] ? 16'b0 : tx_q[1] ;
116         
117     /* Debug statement */
118     assign txstrobe_rate[0] = STROBE_RATE_0 ;
119     assign txstrobe_rate[1] = STROBE_RATE_1 ;
120         assign tx_q_2 = 16'b0 ;
121         assign tx_i_2 = 16'b0 ;
122         assign tx_q_3 = 16'b0 ;
123         assign tx_i_3 = 16'b0 ;
124         assign tx_i_3 = 16'b0 ;
125         
126         assign debugbus = {debug, txclk};
127
128         wire [31:0] usbdata_final;
129         wire            WR_final;
130
131         tx_packer tx_usb_packer
132         (
133                                 .bus_reset                      (bus_reset),
134                                 .usbclk                         (usbclk),
135                                 .WR_fx2                         (WR),
136                                 .usbdata                        (usbdata),
137                                 .reset                          (reset),
138                                 .txclk                          (txclk),
139                                 .usbdata_final          (usbdata_final),
140                                 .WR_final                       (WR_final)
141         );
142         
143         channel_demux channel_demuxer
144         (
145                                 .usbdata_final          (usbdata_final),
146                                 .WR_final                       (WR_final),
147                                 .reset                          (reset),
148                                 .txclk                          (txclk),
149                 .WR_channel         (chan_WR),
150                 .WR_done_channel    (chan_done),
151                 .ram_data           (tx_data_bus)                               
152         );
153         
154     generate for (i = 0 ; i < NUM_CHAN; i = i + 1)
155     begin : generate_channel_readers
156         channel_ram tx_data_packet_fifo 
157             (      .reset               (reset),
158                    .txclk               (txclk), 
159                    .datain              (tx_data_bus),
160                    .WR                  (chan_WR[i]),
161                    .WR_done             (chan_done[i]),
162                    .have_space          (chan_have_space[i]),
163                    .dataout             (chan_fifodata[i]),
164                    .packet_waiting      (chan_pkt_waiting[i]),
165                    .RD                  (chan_rdreq[i]),
166                    .RD_done             (chan_skip[i])
167              );
168
169         chan_fifo_reader tx_chan_reader 
170            (       .reset               (reset),
171                    .tx_clock            (txclk),
172                    .tx_strobe           (txstrobe),
173                    .adc_time            (adc_time),
174                    .samples_format      (4'b0),
175                    .tx_q                (tx_q[i]),
176                    .tx_i                (tx_i[i]),
177                    .underrun            (chan_underrun[i]),
178                    .skip                (chan_skip[i]),
179                    .rdreq               (chan_rdreq[i]),
180                    .fifodata            (chan_fifodata[i]),
181                    .pkt_waiting         (chan_pkt_waiting[i]),
182                    .tx_empty            (chan_txempty[i]),
183                    .rssi                                (rssi[i]),
184                    .threshhold                  (threshhold)
185             );      
186         
187     end
188     endgenerate
189
190
191         channel_ram tx_cmd_packet_fifo 
192             (      .reset               (reset),
193                    .txclk               (txclk), 
194                    .datain              (tx_data_bus),
195                    .WR                  (chan_WR[NUM_CHAN]),
196                    .WR_done             (chan_done[NUM_CHAN]),
197                    .have_space          (chan_have_space[NUM_CHAN]),
198                    .dataout             (chan_fifodata[NUM_CHAN]),
199                    .packet_waiting      (chan_pkt_waiting[NUM_CHAN]),
200                    .RD                  (chan_rdreq[NUM_CHAN]),
201                    .RD_done             (chan_skip[NUM_CHAN])
202              );
203
204
205         cmd_reader tx_cmd_reader
206                 (               .reset                                  (reset),
207                                 .txclk                                  (txclk),
208                                 .adc_time                               (adc_time),
209                                 .skip                                   (chan_skip[NUM_CHAN]),
210                                 .rdreq                                  (chan_rdreq[NUM_CHAN]),
211                                 .fifodata                               (chan_fifodata[NUM_CHAN]),
212                                 .pkt_waiting                    (chan_pkt_waiting[NUM_CHAN]),
213                                 .rx_databus                             (rx_databus),
214                                 .rx_WR                                  (rx_WR),
215                                 .rx_WR_done                             (rx_WR_done),
216                                 .rx_WR_enabled                  (rx_WR_enabled),
217                                 .reg_data_in                    (reg_data_in),
218                                 .reg_data_out                   (reg_data_out),
219                                 .reg_addr                               (reg_addr),
220                                 .reg_io_enable                  (reg_io_enable),
221                                 .debug                                  (debug)
222                 );
223                                 
224                 
225    
226 endmodule // tx_buffer
227