[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r5467 - in gnuradio/branches/developers/jcorgan/snd/gr
From: |
jcorgan |
Subject: |
[Commit-gnuradio] r5467 - in gnuradio/branches/developers/jcorgan/snd/gr-sounder/src: fpga fpga/lib fpga/top python |
Date: |
Mon, 14 May 2007 16:53:03 -0600 (MDT) |
Author: jcorgan
Date: 2007-05-14 16:53:02 -0600 (Mon, 14 May 2007)
New Revision: 5467
Removed:
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/rbf/
Modified:
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/Makefile.am
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/lfsr_constants.v
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/sounder.v
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/sounder_rx.v
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/top/Makefile.am
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/top/usrp_sounder.v
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/python/usrp_sounder.py
Log:
Work in progress.
Modified:
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/Makefile.am
===================================================================
---
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/Makefile.am
2007-05-14 18:22:31 UTC (rev 5466)
+++
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/Makefile.am
2007-05-14 22:53:02 UTC (rev 5467)
@@ -28,3 +28,4 @@
sounder_rx.v \
sounder_tx.v
+MOSTLYCLEANFILES = *~
\ No newline at end of file
Modified:
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/lfsr_constants.v
===================================================================
---
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/lfsr_constants.v
2007-05-14 18:22:31 UTC (rev 5466)
+++
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/lfsr_constants.v
2007-05-14 22:53:02 UTC (rev 5467)
@@ -24,8 +24,9 @@
output reg [15:0] mask_o;
output wire [15:0] len_o;
- assign len_o = (16'b1 << degree_i) - 1;
-
+ wire [31:0] len = (32'b1 << degree_i) - 32'b1;
+ assign len_o = len[15:0];
+
always @*
case (degree_i)
5'd00: mask_o = 16'h0000;
Modified:
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/sounder.v
===================================================================
--- gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/sounder.v
2007-05-14 18:22:31 UTC (rev 5466)
+++ gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/sounder.v
2007-05-14 22:53:02 UTC (rev 5467)
@@ -22,63 +22,64 @@
`include "../../../../usrp/firmware/include/fpga_regs_common.v"
`include "../../../../usrp/firmware/include/fpga_regs_standard.v"
-module
sounder(clk_i,saddr_i,sdata_i,s_strobe_i,tx_rst_i,tx_enable_i,tx_strobe_i,
- tx_dac_i_o,tx_dac_q_o,
- rx_rst_i,rx_enable_i,rx_strobe_i,rx_strobe_o,
- rx_adc_i_i,rx_adc_q_i,rx_imp_i_o,rx_imp_q_o);
+module sounder(clk_i, saddr_i, sdata_i, s_strobe_i,
+ tx_strobe_i, tx_dac_i_o,tx_dac_q_o,
+ rx_strobe_i, rx_adc_i_i,rx_adc_q_i,
+ rx_strobe_o, rx_imp_i_o,rx_imp_q_o,
+ reset_o);
// System interface
input clk_i; // Master clock @ 64 MHz
input [6:0] saddr_i; // Configuration bus address
input [31:0] sdata_i; // Configuration bus data
input s_strobe_i; // Configuration bus write
+ output reset_o; // Passes up internal reset to top level module
// Transmit subsystem
- input tx_rst_i; // Independent subsystem reset
- input tx_enable_i; // Turn on transmitter functionality
input tx_strobe_i; // Generate an transmitter output sample
output [15:0] tx_dac_i_o; // I channel transmitter output to DAC
output [15:0] tx_dac_q_o; // Q channel transmitter output to DAC
// Receive subsystem
- input rx_rst_i; // Independent subsystem reset
- input rx_enable_i; // Turn on receiver functionality
input rx_strobe_i; // Indicates receive sample ready from ADC
output rx_strobe_o; // Indicates output samples ready for Rx FIFO
input [15:0] rx_adc_i_i; // I channel input from ADC
input [15:0] rx_adc_q_i; // Q channel input from ADC
output [15:0] rx_imp_i_o; // I channel impulse response to Rx FIFO
output [15:0] rx_imp_q_o; // Q channel impulse response to Rx FIFO
+
+ // Internal variables
+ wire transmit;
+ wire receive;
+ wire loopback;
+ wire [4:0] degree;
+ wire [15:0] mask;
+ wire [15:0] len;
- // Configuration
- wire [4:0] degree; // LFSR register length
- wire [15:0] mask; // LFSR parity mask
- wire [15:0] len; // PN code sequence length
- wire loopback; // Enable digital loopback
+ setting_reg #(`FR_USER_0) sr_mode
+ (
.clock(clk_i),.reset(1'b0),.strobe(s_strobe_i),.addr(saddr_i),.in(sdata_i),
+ .out({loopback,receive,transmit,reset_o}) );
+ setting_reg #(`FR_USER_1) sr_lfsr_degree
+ (
.clock(clk_i),.reset(1'b0),.strobe(s_strobe_i),.addr(saddr_i),.in(sdata_i),.out(degree)
);
+
+ lfsr_constants constants(.degree_i(degree),.mask_o(mask),.len_o(len));
+
// Loopback implementation
wire [15:0] tx_i, tx_q, rx_i, rx_q; // Internal transmit and receive data
bus
- assign tx_dac_i_o = loopback ? 16'b0 : tx_i;
- assign tx_dac_q_o = loopback ? 16'b0 : tx_q;
- assign rx_i = loopback ? tx_i : rx_adc_i_i;
- assign rx_q = loopback ? tx_q : rx_adc_q_i;
+ assign tx_dac_i_o = loopback ? 16'b0 : tx_i;
+ assign tx_dac_q_o = loopback ? 16'b0 : tx_q;
+ assign rx_i = loopback ? tx_i : rx_adc_i_i;
+ assign rx_q = loopback ? tx_q : rx_adc_q_i;
- setting_reg #(`FR_USER_0) sr_lfsr_degree
- (
.clock(clk_i),.reset(1'b0),.strobe(s_strobe_i),.addr(saddr_i),.in(sdata_i),.out(degree)
);
-
- setting_reg #(`FR_USER_1) sr_mode
- (
.clock(clk_i),.reset(1'b0),.strobe(s_strobe_i),.addr(saddr_i),.in(sdata_i),
- .out({loopback}) );
-
- lfsr_constants constants(.degree_i(degree),.mask_o(mask),.len_o(len));
-
sounder_tx transmitter
- (
.clk_i(clk_i),.rst_i(tx_rst_i),.ena_i(tx_enable_i),.strobe_i(tx_strobe_i),.mask_i(mask),
+ ( .clk_i(clk_i),.rst_i(reset_o),.ena_i(transmit),
+ .strobe_i(tx_strobe_i),.mask_i(mask),
.tx_i_o(tx_i),.tx_q_o(tx_q) );
sounder_rx receiver
- ( .clk_i(clk_i),.rst_i(rx_rst_i),.ena_i(rx_enable_i),
+ ( .clk_i(clk_i),.rst_i(reset_o),.ena_i(receive),
.rx_strobe_i(rx_strobe_i),.tx_strobe_i(tx_strobe_i),.mask_i(mask),.len_i(len),
.rx_in_i_i(rx_i),.rx_in_q_i(rx_q),.rx_i_o(rx_imp_i_o),.rx_q_o(rx_imp_q_o),
.rx_strobe_o(rx_strobe_o) );
Modified:
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/sounder_rx.v
===================================================================
---
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/sounder_rx.v
2007-05-14 18:22:31 UTC (rev 5466)
+++
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/lib/sounder_rx.v
2007-05-14 22:53:02 UTC (rev 5467)
@@ -37,48 +37,27 @@
output [15:0] rx_q_o; // Q channel of impulse response
output rx_strobe_o; // Impulse response value ready
- // LFSR phase counter
- reg [15:0] count;
- wire cycle = (count == (len_i - 1));
-
+ // Just count up for debugging
+ reg [2:0] decim;
+ reg [31:0] counter;
+
always @(posedge clk_i)
if (rst_i | ~ena_i)
- count <= 16'b0;
+ decim <= 0;
+ else if (decim == 7)
+ decim <= 0;
else
- if (cycle)
- count <= 16'b0;
- else
- count <= count + 16'b1;
-
- // Retard LFSR phase once per cycle
- wire lfsr_strobe = (tx_strobe_i & ~cycle);
+ decim <= decim + 1;
- // Recreate local reference of transmitted PN code
- wire pn;
- lfsr reference
- (
.clk_i(clk_i),.rst_i(rst_i),.ena_i(ena_i),.strobe_i(lfsr_strobe),.mask_i(mask_i),.pn_o(pn)
);
-
- wire [31:0] rx_i_ext, rx_q_ext;
- sign_extend #(16,32) i_extend(rx_in_i_i, rx_i_ext);
- sign_extend #(16,32) q_extend(rx_in_q_i, rx_q_ext);
-
- reg [31:0] accum;
always @(posedge clk_i)
if (rst_i | ~ena_i)
- accum <= 32'b0;
- else
- if (rx_strobe_i)
- if (cycle)
- accum <= 32'b0;
- else
- if (pn)
- accum <= accum + rx_i_ext;
- else
- accum <= accum - rx_i_ext;
-
- assign rx_i_o = accum[31:16];
- assign rx_q_o = accum[15:0];
- assign rx_strobe_o = rx_strobe_i & cycle;
+ counter <= 32'b0;
+ else
+ counter <= counter + 32'b1;
+ assign rx_i_o = counter[31:16];
+ assign rx_q_o = counter[15:0];
+ assign rx_strobe_o = (decim == 7);
+
endmodule // sounder_rx
Modified:
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/top/Makefile.am
===================================================================
---
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/top/Makefile.am
2007-05-14 18:22:31 UTC (rev 5466)
+++
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/top/Makefile.am
2007-05-14 22:53:02 UTC (rev 5467)
@@ -21,23 +21,43 @@
include $(top_srcdir)/Makefile.common
+datadir = $(prefix)/share/usrp
+
EXTRA_DIST = \
config.vh \
usrp_sounder.v \
usrp_sounder.csf \
usrp_sounder.esf \
usrp_sounder.psf \
- usrp_sounder.qpf
+ usrp_sounder.qpf \
+ $(RBFS)
+RBFS = usrp_sounder.rbf
+
+install-data-local:
+ @for file in $(RBFS); do \
+ echo "$(INSTALL_DATA) $(srcdir)/$$file
$(DESTDIR)$(datadir)/rev2/$$file"; \
+ $(INSTALL_DATA) $(srcdir)/$$file
$(DESTDIR)$(datadir)/rev2/$$file; \
+ echo "$(INSTALL_DATA) $(srcdir)/$$file
$(DESTDIR)$(datadir)/rev4/$$file"; \
+ $(INSTALL_DATA) $(srcdir)/$$file
$(DESTDIR)$(datadir)/rev4/$$file; \
+ done
+
+uninstall-local:
+ @for file in $(rbfs); do \
+ echo "$(RM) $(DESTDIR)$(datadir)/rev2/$$file"; \
+ $(RM) $(DESTDIR)$(datadir)/rev2/$$file; \
+ echo "$(RM) $(DESTDIR)$(datadir)/rev4/$$file"; \
+ $(RM) $(DESTDIR)$(datadir)/rev4/$$file; \
+ done
+
MOSTLYCLEANFILES = \
db/* \
*.rpt \
*.summary \
- *.rbf \
*.qws \
*.smsg \
*.done \
*.pin \
- *.sof
+ *.sof \
+ *~
-
Modified:
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/top/usrp_sounder.v
===================================================================
---
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/top/usrp_sounder.v
2007-05-14 18:22:31 UTC (rev 5466)
+++
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/fpga/top/usrp_sounder.v
2007-05-14 22:53:02 UTC (rev 5467)
@@ -149,12 +149,16 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Top level application
+ wire sounder_reset;
+ assign tx_dsp_reset = sounder_reset;
+ assign rx_dsp_reset = sounder_reset;
+
sounder sounder
(
.clk_i(clk64),.saddr_i(serial_addr),.sdata_i(serial_data),.s_strobe_i(serial_strobe),
-
.tx_rst_i(tx_dsp_reset),.tx_enable_i(enable_tx),.tx_strobe_i(tx_sample_strobe),
- .tx_dac_i_o(tx_i),.tx_dac_q_o(tx_q),
-
.rx_rst_i(rx_dsp_reset),.rx_enable_i(enable_rx),.rx_strobe_i(rx_sample_strobe),.rx_strobe_o(rx_strobe),
-
.rx_adc_i_i(rx_adc0_i),.rx_adc_q_i(rx_adc0_q),.rx_imp_i_o(rx_buf_i),.rx_imp_q_o(rx_buf_q)
+ .tx_strobe_i(tx_sample_strobe),.tx_dac_i_o(tx_i),.tx_dac_q_o(tx_q),
+
.rx_strobe_i(rx_sample_strobe),.rx_adc_i_i(rx_adc0_i),.rx_adc_q_i(rx_adc0_q),
+ .rx_strobe_o(rx_strobe),.rx_imp_i_o(rx_buf_i),.rx_imp_q_o(rx_buf_q),
+ .reset_o(sounder_reset)
);
@@ -180,7 +184,7 @@
( .master_clk(clk64),.usbclk(usbclk),
.serial_addr(serial_addr),.serial_data(serial_data),.serial_strobe(serial_strobe),
.tx_bus_reset(tx_bus_reset),.rx_bus_reset(rx_bus_reset),
- .tx_dsp_reset(tx_dsp_reset),.rx_dsp_reset(rx_dsp_reset),
+ .tx_dsp_reset(),.rx_dsp_reset(), // These are no longer used, reset
created in sounder module
.enable_tx(enable_tx),.enable_rx(enable_rx),
.interp_rate(),.decim_rate(),
.tx_sample_strobe(tx_sample_strobe),.strobe_interp(),
Modified:
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/python/usrp_sounder.py
===================================================================
---
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/python/usrp_sounder.py
2007-05-14 18:22:31 UTC (rev 5466)
+++
gnuradio/branches/developers/jcorgan/snd/gr-sounder/src/python/usrp_sounder.py
2007-05-14 22:53:02 UTC (rev 5467)
@@ -28,68 +28,138 @@
n2s = eng_notation.num_to_str
-# Set to 0 for 32 MHz tx clock, 1 for 64 MHz tx clock
-# Must match config.vh in FPGA code
-TX_RATE_MAX = 0
-_tx_freq_divisor = 32e6*(TX_RATE_MAX+1)
+FR_MODE = usrp.FR_USER_0
+bmFR_MODE_RESET = 1 << 0 # bit 0: active high reset
+bmFR_MODE_TX = 1 << 1 # bit 1: enable transmitter
+bmFR_MODE_RX = 1 << 2 # bit 2: enable receiver
+bmFR_MODE_LP = 1 << 3 # bit 3: enable digital loopback
-class sounder_tx:
- def __init__(self, frequency, degree, loopback):
- self.trans = usrp.sink_s(fpga_filename='usrp_sounder.rbf')
- self.subdev_spec = usrp.pick_tx_subdevice(self.trans)
- self.subdev = usrp.selected_subdev(self.trans, self.subdev_spec)
- self.trans.tune(0, self.subdev, frequency)
- self.set_degree(degree);
- self.set_loopback(loopback)
-
- def turn_on(self):
- self.trans.start()
+FR_DEGREE = usrp.FR_USER_1
+
+class sounder:
+ def __init__(self, options):
+ self._options = options
+ self._mode = 0
- def turn_off(self):
- self.trans.stop()
+ self._u = None
+ self._trans = None
+ self._rcvr = None
+ self._transmitting = False
+ self._receiving = False
+
+ if options.transmit:
+ print "Creating sounder transmitter."
+ self._trans = usrp.sink_s(fpga_filename='usrp_sounder.rbf')
+ self._trans_subdev_spec = usrp.pick_tx_subdevice(self._trans)
+ self._trans_subdev = usrp.selected_subdev(self._trans,
self._trans_subdev_spec)
+ self._trans.start()
+ self._u = self._trans
+
+ if options.receive:
+ print "Creating sounder receiver."
+ self._fg = gr.flow_graph()
+ self._rcvr = usrp.source_s(fpga_filename='usrp_sounder.rbf')
+ self._rcvr_subdev_spec = usrp.pick_rx_subdevice(self._rcvr)
+ self._rcvr_subdev = usrp.selected_subdev(self._rcvr,
self._rcvr_subdev_spec)
+ self._sink = gr.file_sink(gr.sizeof_short, "output.dat")
- def set_degree(self, value):
- return self.trans._write_fpga_reg(usrp.FR_USER_0, value);
+ if options.samples >= 0:
+ self._head = gr.head(gr.sizeof_short,
2*options.samples*gr.sizeof_short)
+ self._fg.connect(self._rcvr, self._head, self._sink)
+ else:
+ self._fg.connect(self._rcvr, self._sink)
+ self._u = self._rcvr # either receiver or transmitter object will do
+
+ self.set_reset(True)
+ self.set_freq(options.frequency)
+ self.set_degree(options.degree)
+ self.set_loopback(options.loopback)
+ self.set_reset(False)
+
+ def set_freq(self, frequency):
+ print "Setting center frequency to", n2s(frequency)
+ if self._rcvr:
+ self._rcvr.tune(0, self._rcvr_subdev, frequency)
+
+ if self._trans:
+ self._trans.tune(0, self._trans_subdev, frequency)
+ def set_degree(self, degree):
+ print "Setting PN code degree to", degree
+ self._u._write_fpga_reg(FR_DEGREE, degree);
+
+ def _write_mode(self):
+ print "Writing mode register with:", hex(self._mode)
+ self._u._write_fpga_reg(FR_MODE, self._mode)
+
+ def enable_tx(self, value):
+ if value:
+ print "Enabling transmitter."
+ self._mode |= bmFR_MODE_TX
+ self._transmitting = True
+ else:
+ print "Disabling transmitter."
+ self._mode &= ~bmFR_MODE_TX
+ self._write_mode()
+
+ def enable_rx(self, value):
+ if value:
+ print "Starting receiver flow graph."
+ self._mode |= bmFR_MODE_RX
+ self._write_mode()
+ self._fg.start()
+ self._receiving = True
+ else:
+ print "Stopping receiver flow graph."
+ self._fg.stop()
+ print "Waiting for threads..."
+ self._fg.wait()
+ print "Receiver flow graph stopped."
+ self._mode &= ~bmFR_MODE_RX
+ self._write_mode()
+ self._receiving = False
+
def set_loopback(self, value):
- return self.trans._write_fpga_reg(usrp.FR_USER_1, value==True);
+ if value:
+ print "Enabling digital loopback."
+ self._mode |= bmFR_MODE_LP
+ else:
+ print "Disabling digital loopback."
+ self._mode &= ~bmFR_MODE_LP
+ self._write_mode()
-class sounder_rx:
- def __init__(self, frequency, degree, samples):
- self.fg = gr.flow_graph()
- self.rcvr = usrp.source_s(fpga_filename='usrp_sounder.rbf',
decim_rate=8)
- self.subdev_spec = usrp.pick_rx_subdevice(self.rcvr)
- self.subdev = usrp.selected_subdev(self.rcvr, self.subdev_spec)
- self.rcvr.tune(0, self.subdev, frequency)
- self.set_degree(degree);
- self.sink = gr.file_sink(gr.sizeof_short, "output.dat")
-
- if samples >= 0:
- self.head = gr.head(gr.sizeof_short, 2*samples*gr.sizeof_short)
- self.fg.connect(self.rcvr, self.head, self.sink)
+ def set_reset(self, value):
+ if value:
+ print "Asserting reset."
+ self._mode |= bmFR_MODE_RESET
else:
- self.fg.connect(self.rcvr, self.sink)
+ print "De-asserting reset."
+ self._mode &= ~bmFR_MODE_RESET
+ self._write_mode()
- def receive(self):
- self.fg.run()
-
- def set_degree(self, value):
- return self.rcvr._write_fpga_reg(usrp.FR_USER_0, value);
-
+ def __del__(self):
+ if self._transmitting:
+ self.enable_tx(False)
+
+ if self._receiving:
+ self.enable_rx(False)
+
+#
------------------------------------------------------------------------------
+
def main():
parser = OptionParser(option_class=eng_option)
parser.add_option("-f", "--frequency", type="eng_float", default=0.0,
help="set frequency to FREQ in Hz, default is %default",
metavar="FREQ")
+ parser.add_option("-d", "--degree", type="int", default=16,
+ help="set souding sequence degree (len=2^degree-1),
default is %default")
+
parser.add_option("-t", "--transmit", action="store_true", default=False,
help="enable sounding transmitter")
parser.add_option("-r", "--receive", action="store_true", default=False,
help="enable sounding receiver")
- parser.add_option("-d", "--degree", type="int", default=16,
- help="set souding sequence degree (len=2^degree-1),
default is %default")
-
parser.add_option("-n", "--samples", type="int", default=-1,
help="number of samples to capture on receive, default
is infinite")
@@ -105,26 +175,15 @@
print "Using PN code degree of", options.degree, "length",
2**options.degree-1
print "Sounding frequency range is", n2s(options.frequency-16e6), "to",
n2s(options.frequency+16e6)
- if (options.transmit):
- print "Enabling sounder transmitter."
- if (options.loopback):
- print "Enabling digital loopback."
- tx = sounder_tx(options.frequency, options.degree, options.loopback)
- tx.turn_on()
-
- try:
- if (options.receive):
- print "Enabling sounder receiver."
- rx = sounder_rx(options.frequency, options.degree, options.samples)
- rx.receive()
- else:
- if (options.transmit):
- while (True): time.sleep(1.0)
+ s = sounder(options)
- except KeyboardInterrupt:
- if (options.transmit):
- tx.turn_off()
+ if options.transmit:
+ s.enable_tx(True)
+ if options.receive:
+ s.enable_rx(True)
+
+ raw_input("Press enter to exit.")
if __name__ == "__main__":
main()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r5467 - in gnuradio/branches/developers/jcorgan/snd/gr-sounder/src: fpga fpga/lib fpga/top python,
jcorgan <=