~ubuntu-branches/ubuntu/trusty/gnuradio/trusty

« back to all changes in this revision

Viewing changes to usrp/fpga/inband_lib/rx_buffer_inband.v

  • Committer: Bazaar Package Importer
  • Author(s): Kamal Mostafa
  • Date: 2010-03-13 07:46:01 UTC
  • mfrom: (2.1.2 sid)
  • Revision ID: james.westby@ubuntu.com-20100313074601-zjsa893a87bozyh7
Tags: 3.2.2.dfsg-1ubuntu1
* Fix build for Ubuntu lucid (LP: #260406)
  - add binary package dep for libusrp0, libusrp2-0: adduser
  - debian/rules clean: remove pre-built Qt moc files

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//`include "../../firmware/include/fpga_regs_common.v"
 
2
//`include "../../firmware/include/fpga_regs_standard.v"
 
3
module rx_buffer_inband
 
4
  ( input usbclk,
 
5
    input bus_reset,
 
6
    input reset,  // DSP side reset (used here), do not reset registers
 
7
    input reset_regs, //Only reset registers
 
8
    output [15:0] usbdata,
 
9
    input RD,
 
10
    output wire have_pkt_rdy,
 
11
    output reg rx_overrun,
 
12
    input wire [3:0] channels,
 
13
    input wire [15:0] ch_0,
 
14
    input wire [15:0] ch_1,
 
15
    input wire [15:0] ch_2,
 
16
    input wire [15:0] ch_3,
 
17
    input wire [15:0] ch_4,
 
18
    input wire [15:0] ch_5,
 
19
    input wire [15:0] ch_6,
 
20
    input wire [15:0] ch_7,
 
21
    input rxclk,
 
22
    input rxstrobe,
 
23
    input clear_status,
 
24
    input [6:0] serial_addr, 
 
25
    input [31:0] serial_data, 
 
26
    input serial_strobe,
 
27
    output wire [15:0] debugbus,
 
28
        
 
29
    //Connection with tx_inband
 
30
    input rx_WR,
 
31
    input [15:0] rx_databus,
 
32
    input rx_WR_done,
 
33
    output reg rx_WR_enabled,
 
34
    //signal strength
 
35
    input wire [31:0] rssi_0, input wire [31:0] rssi_1,
 
36
    input wire [31:0] rssi_2, input wire [31:0] rssi_3,
 
37
    input wire [1:0] tx_underrun
 
38
    );
 
39
    
 
40
    parameter NUM_CHAN = 1;
 
41
    genvar i ;
 
42
    
 
43
    // FX2 Bug Fix
 
44
    reg [8:0] read_count;
 
45
    always @(negedge usbclk)
 
46
        if(bus_reset)
 
47
            read_count <= #1 9'd0;
 
48
        else if(RD & ~read_count[8])
 
49
            read_count <= #1 read_count + 9'd1;
 
50
        else
 
51
            read_count <= #1 RD ? read_count : 9'b0;
 
52
       
 
53
        // Time counter
 
54
        reg [31:0] timestamp_clock;
 
55
        always @(posedge rxclk)
 
56
                if (reset)
 
57
                        timestamp_clock <= 0;
 
58
                else
 
59
                        timestamp_clock <= timestamp_clock + 1;
 
60
     
 
61
  // USB side fifo
 
62
  wire [11:0] rdusedw;
 
63
  wire [11:0] wrusedw;
 
64
  wire [15:0] fifodata;
 
65
  wire [15:0] fifodata_il[0:NUM_CHAN];
 
66
  wire WR;
 
67
  wire have_space;
 
68
  reg sel;
 
69
  reg wr;
 
70
 
 
71
  always@(posedge rxclk)
 
72
    begin
 
73
      if(reset)
 
74
        begin
 
75
          sel<=1;
 
76
          wr<=0;
 
77
        end
 
78
      else if(rxstrobe)
 
79
        begin
 
80
          sel<=0;
 
81
          wr<=1;
 
82
        end
 
83
      else if(wr&~sel)
 
84
          sel<=1;
 
85
      else if(wr&sel)
 
86
          wr<=0;
 
87
      else
 
88
          wr<=0;
 
89
    end
 
90
 
 
91
  assign fifodata_il[0] = (sel)?ch_1:ch_0;
 
92
  assign fifodata_il[1] = (sel)?ch_3:ch_2;
 
93
 
 
94
  fifo_4kx16_dc rx_usb_fifo (
 
95
    .aclr ( reset ),
 
96
    .data ( fifodata ),
 
97
    .rdclk ( ~usbclk ),
 
98
    .rdreq ( RD & ~read_count[8] ),
 
99
    .wrclk ( rxclk ),
 
100
    .wrreq ( WR ),
 
101
    .q ( usbdata ),
 
102
    .rdempty (  ),
 
103
    .rdusedw ( rdusedw ),
 
104
    .wrfull (  ),
 
105
    .wrusedw ( wrusedw ) );
 
106
    
 
107
  assign have_pkt_rdy = (rdusedw >= 12'd256);
 
108
  assign have_space = (wrusedw < 12'd760);
 
109
         
 
110
  // Rx side fifos
 
111
  // These are of size [NUM_CHAN:0] because the extra channel is used for the
 
112
  // RX command channel.  If there were no command channel, they would be
 
113
  // NUM_CHAN-1.
 
114
  wire chan_rdreq;
 
115
  wire [15:0] chan_fifodata;
 
116
  wire [9:0] chan_usedw;
 
117
  wire [NUM_CHAN:0] chan_empty;
 
118
  wire [3:0] rd_select;
 
119
  wire [NUM_CHAN:0] rx_full;
 
120
         
 
121
  packet_builder #(NUM_CHAN) rx_pkt_builer (
 
122
    .rxclk ( rxclk ),
 
123
    .reset ( reset ),
 
124
    .timestamp_clock ( timestamp_clock ),
 
125
    .channels ( NUM_CHAN ),
 
126
    .chan_rdreq ( chan_rdreq ),
 
127
    .chan_fifodata ( chan_fifodata ),
 
128
    .chan_empty ( chan_empty ),
 
129
    .rd_select ( rd_select ),
 
130
    .chan_usedw ( chan_usedw ),
 
131
    .WR ( WR ),
 
132
    .fifodata ( fifodata ),
 
133
    .have_space ( have_space ),
 
134
      .rssi_0(rssi_0), .rssi_1(rssi_1),
 
135
      .rssi_2(rssi_2),.rssi_3(rssi_3), .debugbus(debug),
 
136
      .underrun(tx_underrun));
 
137
         
 
138
  // Detect overrun
 
139
  always @(posedge rxclk)
 
140
    if(reset)
 
141
      rx_overrun <= 1'b0;
 
142
    else if(rx_full[0])
 
143
      rx_overrun <= 1'b1;
 
144
    else if(clear_status)
 
145
      rx_overrun <= 1'b0;
 
146
 
 
147
                
 
148
  // FIXME: what is the purpose of these two lines?
 
149
  wire [15:0]ch[NUM_CHAN:0];
 
150
  assign ch[0] = ch_0;
 
151
        
 
152
  wire cmd_empty;
 
153
        
 
154
  always @(posedge rxclk)
 
155
    if(reset)
 
156
      rx_WR_enabled <= 1;
 
157
    else if(cmd_empty)
 
158
      rx_WR_enabled <= 1;
 
159
    else if(rx_WR_done)
 
160
      rx_WR_enabled <= 0;
 
161
 
 
162
 
 
163
  // Of Size 0:NUM_CHAN due to extra command channel.
 
164
  wire [15:0] dataout [0:NUM_CHAN];
 
165
  wire [9:0]  usedw     [0:NUM_CHAN];
 
166
  wire empty[0:NUM_CHAN];
 
167
        
 
168
  generate for (i = 0 ; i < NUM_CHAN; i = i + 1)
 
169
    begin : generate_channel_fifos
 
170
 
 
171
      wire rdreq;
 
172
 
 
173
      assign rdreq = (rd_select == i) & chan_rdreq;
 
174
 
 
175
      fifo_1kx16 rx_chan_fifo (
 
176
      .aclr ( reset ),
 
177
      .clock ( rxclk ),
 
178
      .data ( fifodata_il[i] ),
 
179
      .rdreq ( rdreq ),
 
180
      .wrreq ( ~rx_full[i] & wr),
 
181
      .empty (empty[i]),
 
182
      .full (rx_full[i]),
 
183
      .q ( dataout[i]),
 
184
      .usedw ( usedw[i]),
 
185
      .almost_empty(chan_empty[i])
 
186
      );
 
187
    end
 
188
  endgenerate
 
189
        
 
190
  wire [7:0] debug;
 
191
         
 
192
  fifo_1kx16 rx_cmd_fifo (
 
193
    .aclr ( reset ),
 
194
    .clock ( rxclk ),
 
195
    .data ( rx_databus ),
 
196
    .rdreq ( (rd_select == NUM_CHAN) & chan_rdreq ),
 
197
    .wrreq ( rx_WR & rx_WR_enabled),
 
198
    .empty ( cmd_empty),
 
199
    .full ( rx_full[NUM_CHAN] ),
 
200
    .q ( dataout[NUM_CHAN]),
 
201
    .usedw ( usedw[NUM_CHAN] )
 
202
  );
 
203
        
 
204
  assign chan_empty[NUM_CHAN] = cmd_empty | rx_WR_enabled;
 
205
  assign chan_fifodata = dataout[rd_select];
 
206
  assign chan_usedw = usedw[rd_select];
 
207
  assign debugbus = {4'd0, rxclk, rxstrobe, rx_full[0], rx_full[1], sel, wr};
 
208
 
 
209
endmodule