From 2711e51f33e4c83b07d8293ceca5d6db7830656e Mon Sep 17 00:00:00 2001 From: jcorgan Date: Mon, 21 May 2007 05:58:05 +0000 Subject: [PATCH] Merged r5463:5504 from jcorgan/snd into trunk. Work in progress, adds digital loopback and receive to FPGA code. Host receive code is still debugging only. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@5505 221aa14e-8319-0410-a670-987f0aec2ac5 --- config/grc_gr_sounder.m4 | 2 +- gr-sounder/src/fpga/Makefile.am | 2 +- gr-sounder/src/fpga/lib/Makefile.am | 1 + gr-sounder/src/fpga/lib/dac_interface.v | 8 +- gr-sounder/src/fpga/lib/lfsr_constants.v | 4 +- gr-sounder/src/fpga/lib/sounder.v | 74 +++--- gr-sounder/src/fpga/lib/sounder_rx.v | 87 +++---- gr-sounder/src/fpga/lib/sounder_tx.v | 12 +- gr-sounder/src/fpga/lib/strobe.v | 48 ++++ gr-sounder/src/fpga/rbf/rev2/usrp_sounder.rbf | Bin 109446 -> 0 bytes gr-sounder/src/fpga/rbf/rev4/usrp_sounder.rbf | Bin 109446 -> 0 bytes gr-sounder/src/fpga/{rbf => tb}/Makefile.am | 26 +-- gr-sounder/src/fpga/tb/sounder_tb.sav | 34 +++ gr-sounder/src/fpga/tb/sounder_tb.sh | 7 + gr-sounder/src/fpga/tb/sounder_tb.v | 212 ++++++++++++++++++ gr-sounder/src/fpga/tb/sounder_tb_wave.sh | 2 + gr-sounder/src/fpga/top/Makefile.am | 28 ++- gr-sounder/src/fpga/top/usrp_sounder.qsf | 7 +- gr-sounder/src/fpga/top/usrp_sounder.rbf | Bin 0 -> 112186 bytes gr-sounder/src/fpga/top/usrp_sounder.v | 13 +- gr-sounder/src/python/Makefile.am | 2 +- gr-sounder/src/python/test_lp.sh | 4 + gr-sounder/src/python/test_rx.sh | 4 + gr-sounder/src/python/test_tx.sh | 3 + gr-sounder/src/python/usrp_sounder.py | 195 ++++++++++------ 25 files changed, 588 insertions(+), 187 deletions(-) create mode 100644 gr-sounder/src/fpga/lib/strobe.v delete mode 100755 gr-sounder/src/fpga/rbf/rev2/usrp_sounder.rbf delete mode 100755 gr-sounder/src/fpga/rbf/rev4/usrp_sounder.rbf rename gr-sounder/src/fpga/{rbf => tb}/Makefile.am (61%) create mode 100644 gr-sounder/src/fpga/tb/sounder_tb.sav create mode 100755 gr-sounder/src/fpga/tb/sounder_tb.sh create mode 100644 gr-sounder/src/fpga/tb/sounder_tb.v create mode 100755 gr-sounder/src/fpga/tb/sounder_tb_wave.sh create mode 100755 gr-sounder/src/fpga/top/usrp_sounder.rbf create mode 100755 gr-sounder/src/python/test_lp.sh create mode 100755 gr-sounder/src/python/test_rx.sh create mode 100755 gr-sounder/src/python/test_tx.sh diff --git a/config/grc_gr_sounder.m4 b/config/grc_gr_sounder.m4 index a821ce4a..929be53a 100644 --- a/config/grc_gr_sounder.m4 +++ b/config/grc_gr_sounder.m4 @@ -27,7 +27,7 @@ AC_DEFUN([GRC_GR_SOUNDER],[ gr-sounder/src/fpga/Makefile \ gr-sounder/src/fpga/top/Makefile \ gr-sounder/src/fpga/lib/Makefile \ - gr-sounder/src/fpga/rbf/Makefile \ + gr-sounder/src/fpga/tb/Makefile \ gr-sounder/src/lib/Makefile \ gr-sounder/src/python/Makefile \ gr-sounder/src/python/run_tests diff --git a/gr-sounder/src/fpga/Makefile.am b/gr-sounder/src/fpga/Makefile.am index f4cd4fd4..2e8d8e3f 100644 --- a/gr-sounder/src/fpga/Makefile.am +++ b/gr-sounder/src/fpga/Makefile.am @@ -21,4 +21,4 @@ include $(top_srcdir)/Makefile.common -SUBDIRS = top lib rbf +SUBDIRS = top lib tb diff --git a/gr-sounder/src/fpga/lib/Makefile.am b/gr-sounder/src/fpga/lib/Makefile.am index 450981f1..0a03147a 100644 --- a/gr-sounder/src/fpga/lib/Makefile.am +++ b/gr-sounder/src/fpga/lib/Makefile.am @@ -28,3 +28,4 @@ EXTRA_DIST = \ sounder_rx.v \ sounder_tx.v +MOSTLYCLEANFILES = *~ \ No newline at end of file diff --git a/gr-sounder/src/fpga/lib/dac_interface.v b/gr-sounder/src/fpga/lib/dac_interface.v index b97ffa77..9042e1c5 100644 --- a/gr-sounder/src/fpga/lib/dac_interface.v +++ b/gr-sounder/src/fpga/lib/dac_interface.v @@ -27,16 +27,16 @@ module dac_interface(clk_i,rst_i,ena_i,strobe_i,tx_i_i,tx_q_i,tx_data_o,tx_sync_ input ena_i; input strobe_i; - input [15:0] tx_i_i; - input [15:0] tx_q_i; + input [13:0] tx_i_i; + input [13:0] tx_q_i; - output [15:0] tx_data_o; + output [13:0] tx_data_o; output tx_sync_o; `ifdef TX_RATE_MAX wire clk128; reg clk64_d; - reg [15:0] tx_data_o; + reg [13:0] tx_data_o; // Create a 128 MHz clock dacpll pll128(.areset(rst_i),.inclk0(clk_i),.c0(clk128)); diff --git a/gr-sounder/src/fpga/lib/lfsr_constants.v b/gr-sounder/src/fpga/lib/lfsr_constants.v index 79fcb1a2..55ee613d 100755 --- a/gr-sounder/src/fpga/lib/lfsr_constants.v +++ b/gr-sounder/src/fpga/lib/lfsr_constants.v @@ -24,8 +24,8 @@ module lfsr_constants(degree_i,mask_o,len_o); output reg [15:0] mask_o; output wire [15:0] len_o; - assign len_o = (16'b1 << degree_i) - 1; - + assign len_o = (1 << degree_i) - 1; + always @* case (degree_i) 5'd00: mask_o = 16'h0000; diff --git a/gr-sounder/src/fpga/lib/sounder.v b/gr-sounder/src/fpga/lib/sounder.v index ea4007cb..58b56344 100644 --- a/gr-sounder/src/fpga/lib/sounder.v +++ b/gr-sounder/src/fpga/lib/sounder.v @@ -22,10 +22,10 @@ `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); // System interface input clk_i; // Master clock @ 64 MHz @@ -34,53 +34,59 @@ module sounder(clk_i,saddr_i,sdata_i,s_strobe_i,tx_rst_i,tx_enable_i,tx_strobe_i input s_strobe_i; // Configuration bus write // 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 + output [13:0] tx_dac_i_o; // I channel transmitter output to DAC + output [13: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 + input [15:0] rx_adc_i_i; // I channel input from ADC interface module + input [15:0] rx_adc_q_i; // Q channel input from ADC interface module 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 reset; + wire transmit; + wire receive; + wire loopback; - // 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 + wire [4:0] degree; + wire [15:0] mask; + wire [15:0] len; - // Loopback implementation - wire [15:0] tx_i, tx_q, rx_i, rx_q; // Internal transmit and receive data bus + 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}) ); - 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 + 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)); - 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}) ); + // Loopback implementation + wire [13:0] tx_i, tx_q; + wire [15:0] tx_i_ext, tx_q_ext; + wire [15:0] rx_i, rx_q; - lfsr_constants constants(.degree_i(degree),.mask_o(mask),.len_o(len)); + sign_extend #(14,16) tx_i_extender(tx_i, tx_i_ext); + sign_extend #(14,16) tx_q_extender(tx_q, tx_q_ext); + assign tx_dac_i_o = loopback ? 14'b0 : tx_i; + assign tx_dac_q_o = loopback ? 14'b0 : tx_q; + assign rx_i = loopback ? tx_i_ext : rx_adc_i_i; + assign rx_q = loopback ? tx_q_ext : rx_adc_q_i; + 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),.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), - .rx_strobe_i(rx_strobe_i),.tx_strobe_i(tx_strobe_i),.mask_i(mask),.len_i(len), + ( .clk_i(clk_i),.rst_i(reset),.ena_i(receive), + .rx_strobe_i(rx_strobe_i),.tx_strobe_i(tx_strobe_i),.mask_i(mask),.degree_i(degree),.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) ); - + .rx_strobe_o(rx_strobe_o),.loop_i(loopback)); + endmodule // sounder diff --git a/gr-sounder/src/fpga/lib/sounder_rx.v b/gr-sounder/src/fpga/lib/sounder_rx.v index b7c5f487..338afd55 100644 --- a/gr-sounder/src/fpga/lib/sounder_rx.v +++ b/gr-sounder/src/fpga/lib/sounder_rx.v @@ -19,8 +19,9 @@ // Foundation, Inc., 51 Franklin Street, Boston, MA 02110-1301 USA // -module sounder_rx(clk_i,rst_i,ena_i,rx_strobe_i,tx_strobe_i,mask_i,len_i, - rx_in_i_i,rx_in_q_i,rx_i_o,rx_q_o,rx_strobe_o); +module sounder_rx(clk_i,rst_i,ena_i,rx_strobe_i,tx_strobe_i,mask_i,degree_i,len_i, + rx_in_i_i,rx_in_q_i,rx_i_o,rx_q_o,rx_strobe_o, + loop_i); input clk_i; // Master clock input rst_i; // Subsystem reset @@ -29,6 +30,7 @@ module sounder_rx(clk_i,rst_i,ena_i,rx_strobe_i,tx_strobe_i,mask_i,len_i, input tx_strobe_i; // Strobe every transmitted sample input [15:0] mask_i; // PN code LFSR mask + input [4:0] degree_i; // PN code LFSR sequency degree input [15:0] len_i; // PN code LFSR sequence length input [15:0] rx_in_i_i; // I channel on receive input [15:0] rx_in_q_i; // Q channel on receive @@ -37,48 +39,57 @@ module sounder_rx(clk_i,rst_i,ena_i,rx_strobe_i,tx_strobe_i,mask_i,len_i, 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)); + input loop_i; // Implement loopback + + wire strobe_in = loop_i ? tx_strobe_i : rx_strobe_i; + wire [16:0] len = loop_i ? (len_i - 1) : ((len_i << 1) - 2); + + strobe #(17) phase_strobe(.clk_i(clk_i),.rst_i(rst_i),.ena_i(ena_i), + .rate_i(len),.strobe_i(strobe_in),.strobe_o(rx_strobe_o), + .count_o()); - always @(posedge clk_i) - if (rst_i | ~ena_i) - count <= 16'b0; - else - if (cycle) - count <= 16'b0; - else - count <= count + 16'b1; - - // Retard LFSR phase once per cycle - wire lfsr_strobe = (tx_strobe_i & ~cycle); + wire pn_ref; + wire ref_strobe = tx_strobe_i & ~rx_strobe_o; // Retard reference phase once per period + lfsr ref_code + ( .clk_i(clk_i),.rst_i(rst_i),.ena_i(ena_i),.strobe_i(ref_strobe),.mask_i(mask_i),.pn_o(pn_ref) ); - // 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 [5:0] offset = (5'd16-degree_i); + + reg [31:0] sum_i, sum_q; + reg [31:0] total_i, total_q; + wire [31:0] scaled_i = total_i << offset; + wire [31:0] scaled_q = total_q << offset; + wire [31:0] i_ext, q_ext; - 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); + sign_extend #(16,32) i_extender(rx_in_i_i, i_ext); + sign_extend #(16,32) q_extender(rx_in_q_i, q_ext); - reg [31:0] accum; + wire [31:0] prod_i = pn_ref ? i_ext : -i_ext; + wire [31:0] prod_q = pn_ref ? q_ext : -q_ext; + 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; + begin + sum_i <= 0; + sum_q <= 0; + total_i <= 0; + total_q <= 0; + end + else if (rx_strobe_o) + begin + total_i <= sum_i + prod_i; + total_q <= sum_q + prod_q; + sum_i <= 0; + sum_q <= 0; + end + else if (strobe_in) + begin + sum_i = sum_i + prod_i; + sum_q = sum_q + prod_q; + end + + assign rx_i_o = scaled_i[31:16]; + assign rx_q_o = scaled_q[31:16]; - assign rx_i_o = accum[31:16]; - assign rx_q_o = accum[15:0]; - assign rx_strobe_o = rx_strobe_i & cycle; - endmodule // sounder_rx diff --git a/gr-sounder/src/fpga/lib/sounder_tx.v b/gr-sounder/src/fpga/lib/sounder_tx.v index d5300fec..46165dde 100644 --- a/gr-sounder/src/fpga/lib/sounder_tx.v +++ b/gr-sounder/src/fpga/lib/sounder_tx.v @@ -22,8 +22,8 @@ `include "../../../../usrp/firmware/include/fpga_regs_common.v" `include "../../../../usrp/firmware/include/fpga_regs_standard.v" -`define MAX_VALUE 16'h7FFF // 2s complement -`define MIN_VALUE 16'h8000 +`define MAX_VALUE 14'h1FFF // 2s complement +`define MIN_VALUE 14'h2001 module sounder_tx(clk_i,rst_i,ena_i,strobe_i,mask_i,tx_i_o,tx_q_o); input clk_i; @@ -31,15 +31,15 @@ module sounder_tx(clk_i,rst_i,ena_i,strobe_i,mask_i,tx_i_o,tx_q_o); input ena_i; input strobe_i; input [15:0] mask_i; - output [15:0] tx_i_o; - output [15:0] tx_q_o; + output [13:0] tx_i_o; + output [13:0] tx_q_o; wire pn; lfsr pn_code ( .clk_i(clk_i),.rst_i(rst_i),.ena_i(ena_i),.strobe_i(strobe_i),.mask_i(mask_i),.pn_o(pn) ); - assign tx_i_o = pn ? `MAX_VALUE : `MIN_VALUE; // Bipolar - assign tx_q_o = 16'b0; + assign tx_i_o = ena_i ? (pn ? `MAX_VALUE : `MIN_VALUE) : 14'b0; // Bipolar + assign tx_q_o = 14'b0; endmodule // sounder_tx diff --git a/gr-sounder/src/fpga/lib/strobe.v b/gr-sounder/src/fpga/lib/strobe.v new file mode 100644 index 00000000..ed07f21f --- /dev/null +++ b/gr-sounder/src/fpga/lib/strobe.v @@ -0,0 +1,48 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2007 Corgan Enterprises LLC +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Boston, MA 02110-1301 USA +// + +module strobe(clk_i,rst_i,ena_i,rate_i,strobe_i,strobe_o,count_o); + parameter width = 16; + + input clk_i; + input rst_i; + input ena_i; + input [width-1:0] rate_i; // Desired period minus one + input strobe_i; + output strobe_o; + output [width-1:0] count_o; + + + reg [width-1:0] counter; + + always @(posedge clk_i) + if(rst_i | ~ena_i) + counter <= 32'hFFFFFFFF; // First period is short by one + else if(strobe_i) + if(counter == rate_i) + counter <= 0; + else + counter <= counter + 1; + + assign strobe_o = (counter == rate_i) & strobe_i; + assign count_o = counter; + +endmodule // strobe diff --git a/gr-sounder/src/fpga/rbf/rev2/usrp_sounder.rbf b/gr-sounder/src/fpga/rbf/rev2/usrp_sounder.rbf deleted file mode 100755 index 47a0c98fb527f741c17b15cf2564c2303713f80f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109446 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

MB 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

MB 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 sounder_tb.out && \ +grep 'rst=0' sounder_tb.out | grep 'clk=1' > sounder_tb.out2 && \ +grep 'tx_strobe=1' sounder_tb.out2 > sounder_tb.out3 + diff --git a/gr-sounder/src/fpga/tb/sounder_tb.v b/gr-sounder/src/fpga/tb/sounder_tb.v new file mode 100644 index 00000000..045791e4 --- /dev/null +++ b/gr-sounder/src/fpga/tb/sounder_tb.v @@ -0,0 +1,212 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2007 Corgan Enterprises LLC +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Boston, MA 02110-1301 USA +// + +`timescale 1ns/1ps + +`include "../lib/sounder.v" + +`define FR_MODE 7'd64 +`define bmFR_MODE_RESET 32'h0001 +`define bmFR_MODE_TX 32'h0002 +`define bmFR_MODE_RX 32'h0004 +`define bmFR_MODE_LP 32'h0008 + +`define FR_DEGREE 7'd65 + +module sounder_tb; + + // System bus + reg clk; + reg rst; + reg ena; + + // Configuration bus + reg [6:0] saddr; + reg [31:0] sdata; + reg s_strobe; + + // DAC bus + reg tx_strobe; + wire [13:0] tx_dac_i; + wire [13:0] tx_dac_q; + + // ADC bus + reg rx_strobe; + reg [15:0] rx_adc_i; + reg [15:0] rx_adc_q; + + // FIFO bus + wire fifo_strobe; + wire [15:0] fifo_i; + wire [15:0] fifo_q; + + // Configuration shadow registers + reg [31:0] mode; + reg [31:0] degree; + + sounder uut + (.clk_i(clk),.saddr_i(saddr),.sdata_i(sdata),.s_strobe_i(s_strobe), + .tx_strobe_i(tx_strobe),.tx_dac_i_o(tx_dac_i),.tx_dac_q_o(tx_dac_q), + .rx_strobe_i(rx_strobe),.rx_adc_i_i(rx_adc_i),.rx_adc_q_i(rx_adc_q), + .rx_strobe_o(fifo_strobe),.rx_imp_i_o(fifo_i),.rx_imp_q_o(fifo_q)); + + // Drive tx_strobe @ half clock rate + always @(posedge clk) + tx_strobe <= ~tx_strobe; + + // Start up initialization + initial + begin + clk = 0; + rst = 0; + ena = 0; + saddr = 0; + sdata = 0; + s_strobe = 0; + tx_strobe = 0; + rx_strobe = 1; + rx_adc_i = 0; + rx_adc_q = 0; + mode = 0; + degree = 0; + + @(posedge clk); + rst = 1; + @(posedge clk); + rst = 0; + @(posedge clk); + ena = 1; + end + + always + #5 clk <= ~clk; + + initial + begin + $monitor($time, " clk=%b rst=%b tx_strobe=%b fifo_strobe=%b phs=%x pn_o=%b pn_ref=%b fifo_i=%x fifo_q=", + clk, uut.reset, tx_strobe, fifo_strobe, uut.receiver.phase_strobe.count_o, + uut.transmitter.pn, uut.receiver.pn_ref, fifo_i, fifo_q); + $dumpfile("sounder_tb.vcd"); + $dumpvars(0, sounder_tb); + end + + // Test tasks + task write_cfg_register; + input [6:0] regno; + input [31:0] value; + + begin + @(posedge clk); + saddr <= regno; + sdata <= value; + s_strobe <= 1'b1; + @(posedge clk); + s_strobe <= 0; + end + endtask // write_cfg_register + + // Application reset line + task set_reset; + input reset; + + begin + mode = reset ? (mode | `bmFR_MODE_RESET) : (mode & ~`bmFR_MODE_RESET); + write_cfg_register(`FR_MODE, mode); + end + endtask // reset + + // Set the PN code degree + task set_degree; + input [5:0] degree; + begin + write_cfg_register(`FR_DEGREE, degree); + end + endtask // set_degree + + // Turn on or off the transmitter + task enable_tx; + input tx; + + begin + mode = tx ? (mode | `bmFR_MODE_TX) : (mode & ~`bmFR_MODE_TX); + write_cfg_register(`FR_MODE, mode); + end + endtask // enable_tx + + // Turn on or off the receiver + task enable_rx; + input rx; + + begin + mode = rx ? (mode | `bmFR_MODE_RX) : (mode & ~`bmFR_MODE_RX); + write_cfg_register(`FR_MODE, mode); + end + endtask // enable_rx + + + // Turn on or off digital loopback + task enable_lp; + input lp; + + begin + mode = lp ? (mode | `bmFR_MODE_LP) : (mode & ~`bmFR_MODE_LP); + write_cfg_register(`FR_MODE, mode); + end + endtask // enable_lp + + // Test transmitter functionality + task test_tx; + input [5:0] degree; + + begin + #20 set_reset(1); + #20 set_degree(degree); + #20 enable_tx(1); + #20 set_reset(0); + #(uut.len*20); // One PN code period + + end + endtask // test_tx + + // Test loopback functionality + task test_lp; + input [5:0] degree; + + begin + #20 set_reset(1); + #20 set_degree(degree); + #20 enable_tx(1); + #20 enable_rx(1); + #20 enable_lp(1); + #20 set_reset(0); + #((uut.len+1)*uut.len*20); + end + endtask // test_lp + + // Execute tests + initial + begin + #20 test_tx(12); + #20 test_lp(12); + #100 $finish; + end +endmodule + diff --git a/gr-sounder/src/fpga/tb/sounder_tb_wave.sh b/gr-sounder/src/fpga/tb/sounder_tb_wave.sh new file mode 100755 index 00000000..4551d5c5 --- /dev/null +++ b/gr-sounder/src/fpga/tb/sounder_tb_wave.sh @@ -0,0 +1,2 @@ +#!/bin/sh +gtkwave sounder_tb.vcd sounder_tb.sav diff --git a/gr-sounder/src/fpga/top/Makefile.am b/gr-sounder/src/fpga/top/Makefile.am index 69f6fef9..9498d434 100644 --- a/gr-sounder/src/fpga/top/Makefile.am +++ b/gr-sounder/src/fpga/top/Makefile.am @@ -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 \ + *~ diff --git a/gr-sounder/src/fpga/top/usrp_sounder.qsf b/gr-sounder/src/fpga/top/usrp_sounder.qsf index bda317db..5ff52583 100755 --- a/gr-sounder/src/fpga/top/usrp_sounder.qsf +++ b/gr-sounder/src/fpga/top/usrp_sounder.qsf @@ -368,15 +368,16 @@ set_instance_assignment -name CLOCK_SETTINGS master_clk -to master_clk set_instance_assignment -name PARTITION_HIERARCHY no_file_for_top_partition -to | -section_id Top set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top -set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/sign_extend.v +set_global_assignment -name VERILOG_FILE ../lib/strobe.v set_global_assignment -name VERILOG_FILE ../lib/lfsr_constants.v -set_global_assignment -name VERILOG_FILE ../lib/sounder.v set_global_assignment -name VERILOG_FILE ../lib/lfsr.v -set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/atr_delay.v set_global_assignment -name VERILOG_FILE ../lib/dac_interface.v set_global_assignment -name VERILOG_FILE ../lib/dacpll.v set_global_assignment -name VERILOG_FILE ../lib/sounder_rx.v set_global_assignment -name VERILOG_FILE ../lib/sounder_tx.v +set_global_assignment -name VERILOG_FILE ../lib/sounder.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/atr_delay.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/sign_extend.v set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/rx_buffer.v set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/setting_reg.v set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/strobe_gen.v diff --git a/gr-sounder/src/fpga/top/usrp_sounder.rbf b/gr-sounder/src/fpga/top/usrp_sounder.rbf new file mode 100755 index 0000000000000000000000000000000000000000..b6f494227a291b5b6ed254fcab7583f9a32e3d55 GIT binary patch literal 112186 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

-6+J`z_F72BwfouA{axdgYmyVDLas+-jGxga zf984RwG7jj)Q4xj-7-D@?crO~o|j6>N^>9O7z^w}pFO-0Hg@;^y4zzpzN7gKom1@X zn~&cwD;fHqctaA?W4Nj6Mu&nYBABN({NUfWLfez`AsjxT`&84a2!`JP$6lcRUPTk^ueFV|8FN zC^+JS8QsTI47v|UIH3E$MdOj5OHOyYCia2dtQ)>Qg&xXV4-%924BX+)GcytsBt%-0 z`jS--6Z$d^J%l?gZar19@FSOZbU8Fq>E~QC=C=CBATiZ@eIQKrKMVIN0b$BzF+H?h z1*h8J%)O%C__?Iuk<%X_Yh|72Hnx!(NkId}ZA^pHis{=>Xre~b+zFv>>LQhZK3ho8 zR@X>`c$KM{T|Ya^Rc`w^ZL{b?T?nL4Ffi5pE+)A!k$@OBqe53(ZGNl&uY>fq~V`;qR^lk+r(0&23pv;l+GSlaYI! zsBsNdbuxHpAe#5 z=6WF;ph?9$2(;oeq{lY*oQjo-6r4AWQiwXt$p z!2lJRBb7)r48(eVXC_dnghF+&X9AYz5h|#Dc|jv%F^QgVus~2hfB-&&Q9)%{`6R0G z2`9d-r)k=yaKVK2|L+ehBnUvP$ncL@o^<1WH1G<%C$6S1?;Ce7x%>{AB&xkT>hFz& zCS^9n4r0x8uDhS;b$2cAt}Weg3J(-tPG3HncD{aO`-}J;wwQ?c6!(sVubptA78IMJ z+&>Ya57UhebgAQK8l0V-bBr(V_#2+|X*DtPlS}J~h+jugpKIRQW_s;M;l1v+4GqPP zD=(v_yPX@jmp5JjMxkrDe189{-dr^Hj5wfuzurCa6H(AnYzP#ieeQ5F z;?!B=RInr0m5emIx|WOO6C*fY>tI=f)WW0XADKi!R|J`(IM}6#$ z&)W$LJ%X=Hn7J*}62q<($%3B=paW!!UCb3%JX153&bglLKIU@4GHiHt{r~<6kRo8d z3w!6=EGcUskVX#zQP4FDuP{<7MZg#!M5oG;#N-jw7d#HI?oJJbVl;eGgXFx#A_**t}LtX#U(-rzsyPYX=KA&{YgN$-l?#)KMrW_7T9_wiVi0q_xD-2% z6dErgeQ~Lxh?|ky>`?m>Q>c@X)Zy04^0qAJL>(L=mP`GwUGM_kmfsUP?>gQ?Z!BFx(z=)D?VzY=>EZf_hnJ6hxi4 zp06)*W|>{;yX3+?E}T6QooK)kuvMzcQRGnSd)S@8jjC`YTdi&*j$Se62T4~~b>qSS zb1tu4nCN7*Y=SbOk z9f7&rr&UR8Lu?Ht>_kUHXCraFWawq|8`h2`QOD5rPC%6ChcIc>e?%9d>k$${vM8_o zBREx)2oq1FGF+fD5m#ZZW?m(&M(X9EckxE-7_J%-_n>XD=M=_N(@_`FL46}eb|C!H zXD_{sx2A`x)qc~Pcm9ab%ROGCZlA1y?(oI(wKusK_fUBwx)$fa!zwfXDRDy!jk9ySDd5GAca?da4KFu!k}e{R88DL z&>_B;&UC(KGJHhL$y$tyIDA?%qe`Jo*%whM4MBni@)^Dq9YSR5Fl8H3Ee1z*q#kdk zV>(>$e7xuC%Q7mKj>hTmrG?5gZDuLU%TD6#{*HVV#Rk^*XgE^2baspORWi@08#Q;QprL?S>-R?+-FD0^)b ztI)HiFY9INIgV{)HFEPTO1c5fI$ggeT) z<+x@8w@x)|+;0Dey*Jh9aS(s`w%HS8jc7im2DQXEo!YJFtIdq zcX&|$%InQ#*`CC}p3}ZvtLA5Bh$AP4&{A6yI+i)uJH;fFxc1n*`@|CK3oYZ+-3D~@ z=wEqrCt-0MO|OeA%&vVWZbcen7+}2-#Ig}f<=~3jajNTr2iNTnt0|-0x+EiK_%w>8 z!}%Qcg{=z5H%^=B9U@>VKgyI(gcWC_lmLP6Gu4riWqge^i4%#aVl14AF2x~9-_49S zGDP-*iw29z7l_25=0?VX`Z!_j9`U;o#|iV+s-nspec$FS;1&=~f$<^x@r*X%4%d#| zxGfq+FYRDFix$+}K?lqeseG$QHLb8HyO(H-3|4#{zEY)j$F9?5#>5V=XNc3frt%{O zzJNu)WzSIiI<#R_?(>!%w%`V$k7H6Nc{e|g6{;WL>)sy_6>gF^cXYp}NmyKAe zCd9hXeReK3PUOskwe9?N*ThpROIA+WLnEpu!{-$c z{#C2$O80zsdAvL{KCkuiS#=w-u58KLv2*9>iQ>x{2PcX**55ojPS3R3*2Q%@{;3ML ztsYMcZn!+2=8s>{`tP@5li8o%_Wp@(X!KhW#(sKep)5A<#zmQPzSdbb`0b$<^I+{r z+YmoOOxp9#e(k;g{GZPIlXbpqWzSsyGqL^Fo#r17j<2G)d85eW^V=d2|5N4&_0;rtp2QdX8~vNZ$B+S~e^pRx^U0O{qZ11a5pQnC-Y4%cZ&JhGmu3HE&N+g$ za%B!racCe?Qh0NDUhV5h47J$0_?dWgtj}}sdTXW^dT$U8(RbE%eSCk-(naM3kEo~u z)>jmk@v~otfi_z1-DX=C+$D}YJw7ilB8lHVr;q7j2E)rjuBXlm3GFtIE?VjO9agYh z74gx4)e8iKBY`)=gpBWdD`N~{?k>a7;uk~QZEq6=sQTgCJNiYhQ+x07!i^6`KrbAB zW8Nc2Vp9G5NmtB^$RhnUKZz|-gW`a)_4$+qKLv+E+hV_1^rl(HL z_#B}L?VM>s<7V_b$BZUt{{6da57fpQuUG(I(7Ap$LpG>~h7xE9&7kFpQ%gWGoTTAl zd^7YZ-^_P_Lr}uwd;pJ=29E$$C+t%eZR|$O8}wJ4-^Er`HaaCa0sVL8hu%i z*XBG3MK5<0BB7~F5_6BCL+vi3!--uKB1h5&1onx5-a>1%JPxJN7h%a!4H``{qX>u~ zuz!kM#ur1^>Pq8W1|QRs$ka9QuHS8rfS=MhyXp3saMoQm?em~==O`iq!AO@XMwkRd zMEa-$N-ia_8hws=#)b>4I9i(5$!vZiRtW-Cu^wwA2Wl`?+T4SI%?ujE{DpO{kX9Gn$A_{~GdkD2-fCc5N;47m01`q$LB^j!`3@RAb(d>Q2xm#5 zvZyAO`|BuAnaH~dz5UADZC7z8(|C+(j%8*`FrYfzMld@rtjFqM3@;%1PK+QWSd|V( zAlpR72+#2h@MsZ62ic-rlB!_y8T~wA2GH}vkAGNb<4gp?H({Y_T!+#`fT=i|1NkeU z94&T+iUKFypRYk=o8(nov6w;xJn9AtEh^$B4=^ z;7!G)IZQEwnQNZ%YffVEx2Dr`cIGzpPBM<`U7dN#6b zrr!ohWSI*mB+4dE)Vt(Z6hDVCYFSFMUW?KiS!XuHct9L9{}BS>Dfr8=$3G{8NW>*o z%`*LQ?UPlUmBtJV!v)jw1Z$4IkG-gZdP_)zWKsnlER9tq=n~YZi)gp6?^x!f6Z29! zu_|Y|Q!MLns;;8?;H&uuuo~LsJ++0(WtmIc(SM-Wmw1saL9i3*pGiV0R1apy(lJ1@WTp;NO;4$d{WtT92Vj zUXwti}5Y)n%9F<^qa+24%3gi{6LaszEpqw;EK>DDdmSZ9t%Kni?5I|<2;v8x4 z>_k>js-g)>&Zn%s$V;keG5hb3JrvNW*`x@QABF|@bP!g{A@$M}6DqEdN>mC|Uj%SA zS)+!P0eNg0^rA2YiIiy^w20Nn)iTCeFYUP4ewLN5LU50O_C+)Jg<@m{7kZhgLCR4l z_KNWzq5wW=Jj#ljNU2I;X8Mp^24~e$0S-}tMMD#aN?uWfJL6_kAywh<!4-zK-1eD-Xjg(_dQbrGyF{~1!tE2%}8MK0s18<{(4dMVs8OmHG07=Ej z)^|tvxlt%N!sU{ubkMob9gmTC2koN9KkoJ&!uimhlS8&-%w?yLe$#c8#)Cf})c z&erz|9bzD{RZ!q+HRA#>*(vv{XSrD+3=z)4G>}oxiWTgnoA?V8gtjpHD1j>`c(p^o zBw`}Aj11rrmc(#I)<7V)2{&_!aoZ}Sh@Ktcgfybb5REf0(^`(VE^|4uiHM*7%VZZ; zAz5x5%M?`?FcOh77*REV+L`wlu8fg8vaGHwAP!?HGXj{7qa3Gd!jG}~5fKp_BF^p) zDy(!uHBJ*#P8{1$>St$d$6f4MoRp@Zl_O+^e_4w}UrRcXL0X0p7{(g8MSw-2;KNTQ ze38Roe>{MGLzNPAk#oKCi%N2^@o8r&z)vKBU|L|-FjzJw>ZOEQ227QrmTg~32ns_e zl7Kk`G~tlBWiX8#@8%FB0Jqc6;W8qD17l+}O!;a!nI4gXgiTN=O3Fybz7`^f+00cb zYLV?cOoR4E9?VCKtIkE0;>?dtqSMU_X(5ba z8uTR5h~)<3gwp=iEow0xTFNt}K?8UnPo8i)!WkjRbUS#H5Lt>2k{?(vC>I1J)<#`!5QT-jL0ditxRQF7-M5(17YJ*)YZaDM4jK9hcnGaE*^8M zg0fnG+9tXw12V*vVdbHMm*DELa+)8+`*3v{qn5@XIF%ZOY6(06Fj{0X1H^*{*BMdE z*RZ#1@3_Q6{1?5cr;=XQjvgw*o3C{ooC+atr5`!{3${2qlZslcPBn0^s8|!0Ut>Ya zg1*A-(eX^A6*HA{Q%KlTNOGT)h*}Y(i^u9qX%9gvy$L;IB z{dC)yr!4cINu}s^)SH<-Ebc7WyY6wwny=k|GcM(JZ=Brti{+@t6yDXg!qp)9bJn)z zl?6VwWc{LkdgId!teSkuuZrGn9Q%Hp{-G|qE_z{1205AfeDc}zFL;z|rrZ3%+E&## zx~50)m*0MS;p)@qeb4Rbm&UO@4fvyhpn_g6v$df4;aB#OpT^g{WEq_(U)%7`_d+8* z<`{2DkGy@yZ(6>$$o@&sX^%mfG0*nfdC#;T@>$zR2T&x|L_D%Q;w`5K{xvjIW*pe* zS7(+uZdmgCAS5;V%|Wl{^f#B~O-EQVzO!!HIib$n>&P2^`u%nDr<*2XV>1qV9dnlK zNZg)rd^{w*q1zL(29&6?<7?7;K790HUC#**s?9j=Idi@1>xYNW_4pqQPfsrYnkl(4 zaqaQg_xIoUSIOtoFRuRO%dW)xZ@ilP?ZNkB=1{Gee|h#;+pUIk{D{hz7FN>X&r!w@ zlg1LqKw)Xbc6@4e!N)76b@xLUG(V1af1JNz&@vs^lO{y3R~w*7Hap5@7S|s&-96N`5tsN^iF%eY-srHc3Nxo zTd#fat!jKxesZk zzPr(Lqt1hvTMzkjR<-&DUfsEBi8>tH7Pz}~ZS!8VMnsl z7rf@&lyx~o%;MMdIK9`;_S8<1X#Cso>|gghxZZlpx8#Ga%Y%6n8;z}|$A4c^LjR_< zTYm8kuKs%yn1x%Sw}kZE{Nw!P4TvwD8b-QQyNnRBS`0SF1z>ah*~65NC3={A;7Bz0 z&xma$hVtciA;bj+$A@S(T-d~_!{mwIAzS7d_B{gk{2!2m`K$CP90>xnT4REr8$2{ODN~w5|C4?g{(rXzL$$F zq{Ha|htU3mXZX-D*HNyGufnCoTg+m#!pWli>>NAJ3X~YeLe$GBWtd3#*&>$9kP`kF zsw_h~*$`$u;JdU~3`Xg@$xDag14gdXffrIkhC zrL5|vrLjZ@L2w71ZnAcc=sE?`i?p&()EQC%Nbm#T^Oy{LUfcl$awq$V19U(dhUbf! z0x4jeN}<9xYY*UJmGrC|TgDT5IW8tb5(vNTl-ESDq_om;sj>qJ`U^!|Mfb6aY>ckq z=rSeU=GF+K0 zU@LE?26T-yhH5w|g^+|Ki9$i8Q7C1C@j5RfYoFxr3BemaLn~5gQBaA4?N5dZcL*sV zwgEap6d(*=%mN@^|Kw$-Hcq@q8wQ*VM4iLZ+$d?3r3#6tURou0U^wk$g?g+Li-yCr zvFm$1CC+m)T3)psO{HoObe}ZRDyXw4YZWY^2y#;BXZ##d zi*uVWg6*S{h30nUNE<7nipy!yDTqys5tLBGT);3O1u#TtK3>i08C=A$a?B;gpG)8u z`ctR?aEo$cv;wbarc}sPkabjw1Jq^UgEa@_<0eplrIb;juO|so8ipq@R``t|#{`lD z+*c#~R%&Jki}HOg-{q$zps>|*=xlK8N;z;VYUCP0W|X1;cdw8_c(DRA6k`?A6oe(h zc*!zB(}r_Od4NN-OC(G!=F;I8?{27-g>L7iRjDLL0*%FzpO+buF0 zI{bZ#{AxC5Q9}oAv}1awjbNgq+E6WrGAJxz2`Z&-^U@$`P?b}q2(#A(N&PW1g zt8GqIA-jwmZ3N7nNHG*9iDUrlA&HYQE*HkT0&t;O2#^Ez@SgW1yuvZ$0BV*=BnZq- zB@zd3oaab+QdU zJg}%n1aCl3&$*5ZO<0a$z?#aK;UKF;gNG_gK`g=u0}x}*HI(Hc=%|~GNFh^{t&1m3 z^qWMb*A^E$O4#d&s^v~Jx}_+30G^q9#9MLQNH6heD9wiv5!@_G-@7NobqQH^{+Wr4 z=r680jEQ&#_N{oD9br>Vj0I~;%|#B_a|ZCLA)q$qd?WNB4UCmHKnt{>ctx=g2$p=c z9Hhs<(i(Set6&|-%~F@4UtQjK`;8Nu7E7$Q6C)z?( z*SFq&Vi~`W?iLBJ>!al_uRvOnRHBCQ#2S##ndLiZIhoE}RW%nd)`7gzpr=$}3o85U z`}rEtX%)h`<*CT!4kfByAvUP2x6yb~{}vS|Ju3K+ElL0rCoK$4jjV5@-$g3#;zZiD zBy;UA&a%rM2Yrb;-cdOxp|Yx2NODy(t;+uzn;by~`uwHHbO%)65$?%6UH_4B`|}{O zaA_99xE1*nyWvCZ1y(;N&i&do^wi{wiyAULL1F!j-x^e>3dcX^jx<*n^^fK~TSAp$ zUVHHOqlruEHY6XP+E{Dt3M54)8$mg(L0&T#LCvE#+`ujLPZ7I*R&u6m|A8#XCFUGl>Gh^HsR zgCbJLmn$=N?_Bt3t}Y_ezaSx#P10GEWvd?MnnQPDe+u*E7{hWt4;#KT{$iSC$g^r~ zf1@V|??2?R=3IWt*k!kuY`n=1tk}6?a;c@KcQRrA^d;}sjl<|fZ1SVz>7wnKQ|5xb zrw2aVZW#wq#o+Xy_q!ij|M~-STeyoqynDYjWcv9F4Qr+sCw~3iux;X(NBswX`rE{* z;)cG7oZJ86`|C%qyiZNn!TE#mnHQDBcrB~D2wzruMvTYuLO;{|{1MUY#h~MGKXufX zAKIY$Slws7)z^RHrfYIhe(Ryqe4o)8f%qIjpK`-_Lvwr)YsSP4#M6$wr32Uf$d>7y z-rdvFjlS58!*=iPf=8CIk)62@Es4V?hSEnnyc<;o#)*Wl`v3VbH`KxiBQ+BXRy8Qk z;+~G~F@u-dxN@k#w*9EDqucW717F$U3$7o8KL=R~QX>*?JzCX2Ic`H*PxwRD^qk*e z^ZeeMq_2O-zc|13(geP$wa>!`h2(|qT;*FERzTUc zJEI2+J!G~+FxE`euLLy(zJAA1_XP)vK%EnPqacqw1pGtQOp^ik`QIi(>A3b-&D2a(6};u` zSpI)J>d(~k!D~2Qd<=K_8TyheAVz@pawX$;yCHHj;c*~SR}Sh++RWGQN{=P>_l(!? z4D0482wznJ$U5HLV3-2)py5K(CxE@a+W&^R_jhApQ6Um7BbmT`p*k9qa5D{vR4=bU zH?opOdgiY&Ui!b9Oe2X&f}F}tY$GIq?lG>=W*3&F$a+PL^oR!!h%DFz4Wn!tzi6Q; z=g+)Zh90E`-QS@M1ts37Qfg{*SjhnhwzDd_nFG5sL-!#B7sHTf11Ep05aAD$lLXN4 zmg4zXaga2GlDNpF0$FUW#M)SxHH(!rb%B@H+(x`Wi8hN;7Wq0qpi0Wn9AZ<0-%q** z{1$n`djJ%5G$zEL7ep2@#(qVBpI#(Zy<4ic6>$3tfvc zf&m;mTLPyxQuBmRVGj~Ch*U3a)&Nph0`@ytWq|9Y>s6xOp<0Sdz-rp`s8?HnM(zIegFJ6k&yWQ)t@LIDJk3w7QU@H?3fvw7gQ}-53P?fU;O3*9T zvnVXcLTr${3IlwxM3jUgQb=bIDbQ*J$U~tX0Nez15d*|CxXOUk-3Bx>4bb)GPV0e8 zCy|88@laBRsst;lx5A{FqmD89%3kX-3cE;LCUx4_CqlWRC`PQ5U4+#R6>>ND3SlMI z6Evf-fmpTox;&gCBAo-3BDWP)w-{FuG7jbUV{WJzmtTz~+|Uzlo5~%j;4v zV&p|+Kc)x18+H{Z(4Z$J)mTEI1EuKCD*NKrw_^eM+;$CC27~$(aHkk4)}31GCTU5w zsE1uJe5`{1g$U54QU}-oMhAEVt`=9HBhxza4u5rl&~-JqGY{OgSixvWBcye{w|TQGyhez!T$oGA0i~nFb$#r zDqTAX>p&8sY_Qp|LI#h*Yv8x$5{t1V6nuUb?S1xIiUtpFejUW}j0 zIFy1z&;{6v3JJ750!EXw;>uu3a*>wk##oQvhsPAK5scKeXhwRWP7B%X*d=#F8 zEWt)s$O<*Ii;}wPMc04at(aAu)k$XY(q3|D$MPIk2Ry?v+T@hc7oV4qnau$rJX;lV zJ%|6BQ@Wg5?&uSkSO`5f2$2DFA5QLb&C=X)y3**%3xGkWy(_eL#L0t2m%MoRfviHN zA&BFQMy5Ya$cxc7cA1N+v2w+0PxEp%x{YI=<+(`NvQya{o7EhfB@ZcrPZ9yhmSP+S z9zu|X|4;#o7b`#kkcc}3K^iPYHBVN+^U49vr4N=-!nFZGgOSpxK8AgcL}h@Rm*`oW ztAdnkX2r=gv(nZ(D^MEfhsSE$$MR-X5N)9vIlPd7l)?0>^>Pj#P|vfBf{tLtunlRfmqp5pd7;6{C?vs@APeWeaJA!cgD&S`R~=dJl*I{(3t7c`<~W~3 zgDJ7io>ke03i%fqF^D>2>oAbjP7_{S1*XG%*E&XZdzF`^j;K!Pa`1abuD*%MX6x9( zAnJOxcP7X92lw<> zy;Bzat$3qzW#r+)< z_7%UVOYV4zr9<$l8?2B`flH3G2c-A8-VHdMIKl44KM%HFn!@}L+yuY-s0l8iOvfRwP)}CIqAoDU#X=} zJ)1t>Ui4m?r#v4R&+As#)QB4aGR%z_fFciE#os8JSEDo`0;2dX|s# z<`m~r)06(ESMI$vnQ6|L>tC~`C(pmxFg@;7ErusFTD@dv1Tvl+I6dKiVRJ_J<28;5 zb$9WEc}p@iksjPoeXe{QP*IiNIXyHS&TkirTdR*N@$k++|62Qa%2oIH?G17N-Zuq@ z+x6p}J!iRhuKu-M^(=Mpv$U7;8wiih)>SnkoXbDCvf<>V^qAw3$0I{`mwHlHcfIK$ zqgt`1sOYNdyqqy87lEX_L>?3y>Bqe6Eqcs$S0bKVob zp+~&gGU4DG(8)F0=ZoA}FE%|Zd#rX}j4_aCp_O+vE@W{S5uQu#^FjbyZ3`ck7 z?)&tczkSd(-}dD@tM(j^nI4tJ7(!v-|2cDf0G}7W-*NfQ|CQ73g-^vs05jS<0%)}> zN#guZCacQT}T-{ zQ$%~0IQDD%7v7@ByLar@&P?6YEN|^_Om&0asb#c!+|*^>M58=C(@XZE^C*c3jnBXkHh zza4;LbrEo&IUWh9fjSyVVfZ$f@Y`KcOqQb^ayfTt2YiB7X>*b&RwEKKvOuMr{YLy9 z(*|IJnK@?IjWh5$Ua^$VMgcf8*jUw*``_&;wfRJ+0L2I3 zkph5Gc7WFm&=it}!YU0ZE{Y^2iYZtPaF1XYv?zn!UXr-JoQtp%10b{Ok=PDK(mIfS zq)$&{usxfF3IeK{04WO~D^Wlzr3q3vLOqSjL>O7h!?RL&2=3r%AS&=YQz6%MGBpYm zm?*ep@16hHH*?S=9QMqyS4cIS3^>giDT+vz@e=0uYGmf0C~De4N`TUYm8=(o78G`p zY^6+6AvobWg02xTmDQiX;J#bPKSN=6)>rE7OW*DGd7nm7V(m_w;kFekh-Lt*g;3~@><7&7Q)Fhl270}CZ zm*ni8?SWocTt&`!Nq)KrM)HXX5)*^>^O9LuE+kO_iAgT!of3`l3^@iR{?`16{=V;3 z_w4MjvpcByCHeg**q-jHSFc|Ed+$}%tEz5mp)&kbBh{!xl^dGFEf#iX!p&eT7+MD_ zhqy>m1wh+X#Jg0^vyrsYw+?nO|SvGf6@Lvv1{Bg@bXMSBVbYQ?dtAu<_6 z$6%%T;#)kZm|N3#t6En)jqK~ovhGJQf@_OKEL50tit2V5!g0mjY9=$%Q?u-y$vl2x6=r>3-@k7_apreU0hp|RpZG_1heo++rrI9Ry>L77g~)QMt9TD zp6zKj@)%M$pv4ZS^SBAz&Sum|*Z5@W%fq{{eiawF`>Dx039oL`e3crftGa1d-&$v5 zBZ&~RTZdubq1rIXhf9X@8jkS8eR}i-sxZx+3@vdm7J#nbs^Ttl%70RM>8)AMqXe=V zf&~=NaK}#gyBU-tV%@D?h}-0-#PI>rlqCM4TZZCsOB9~@3qgG#jmchtoV0jxwIiJK z90j9_PA4?ed1&}cZA+aDGPqq0VFa>W%_TsQo43>s2b*{@$+RL~m@%1Yl#e9FIap%Y zn#LS5uCl|~8AMkMWrrq7L{Qn)DA%8V7OL5IZaO_aB7g_V{Q6XRo2&RvA#lcbO zLVaQKSKWAeZTN1@A#Ma+*0OP147B29t}D`?_Le#-Mi@1UYcF*=92^>ed&5Jxi#{XT zwj`V}YMZHUtphhe-F^E}l(kT^wiD9qG_-uDW4gd3bS zZEpK~5BoDlY8cUUt8T}`iPu&L3b7 zyX)c(On9{6UK%E3lQhx<{|SR^Op* z-Y~MYqh|BWjyLP;$E&@DmhQMAJK>@9%}*?wg-v0acf?xOxq6!B{Lox?Q|IcpmRaj! zSFKt%<=kmAH&32b-YKGz+iz5B-PLQHPB*b5hHLzK ztWNhvx6|oD^NC zio5D^i#$X?W5Qp&W0L`M7*$=9U6bov1KXJF8x|@4<2PSzb&b3ElbasXHmAnaKchP9 zwUNDAeOr9h9NapUZvTe%^VQ#3`HAdf>OqG~2O*?;Ur*ptd;kvys>bl`tC)8^6ya{2=btgPwjlb-EbzN+o zaTSW-24}rB_o%h(R%?w*MH0qXM|0P!>#eqb1PxQIHBNl)mPMV;Z(6POt!tdzD(f}p zZ(!K${EfP*wbxqJnZ2X6cbSG_(zMKizklS8n!1OtZXIJ>b>Z^KM>PW%^ChO%)INdR zIewVB>-Ohg)284I-r+|{FMA-x)0~IeR>gZ@gK;3yP*aPmilLWXvmW}}*hd$-q?X-^ zJNb(0+k~5fn~%SLu;G7QsWRNXiBXRN-8jBT1hb}Q&9Rv`UD5qjE4<1 z*EDX6;Yz-m6+cWJzUTAW-Y0R*2bqVn8TwY}Q?KKXtTQH(bq4IuVPfGwmcj_#kOt_* z8#`QSgwBTRew1Si*eU}jP{E*sqx4<;2fOvRaH#L{Hgd` z(Ao^BZ}D%}zB6s<*o)5;8kvbl;wsr$ILWXLwT<)`ZP!hiHaARW8CaxJX-@Rx;P+6= z>L4YgFJI>YE(+Z*-ZASZ9TT={j(3sfObE3>RL~qp8ZrjFsROd^A`KIeb^=#ov?+5T z=Q6_1ISLj_ZN(XxQZljOSI1ub3?}Ko<8cQs@jkHZWcE}%J3`5jy%I-@+KC7xrdU7< z2$UpZi4MeQEZ+R#oOQ~G2$rCQi4DmKJ!I(!jNuy~ILt%0Lb`(KN)uvU$J8En2j7D` zV~=b##d0@7+CfM+z|1jK8H<2v+aXOfVgV5$5JNR#$Qw0Q2b#jfk&}p#KQR05Sp}#;ZB(VZb_i}(bQ3u&Lhb1P95|j+eoC*el zC4sN=!IV+i-E>A}BgZB^Qae!P@xD2|X$#a4OXn>2}*jFznoyg~ zgz72H%0-|QtMV_*`cF_0!yhTQuC3sLMYIY{bVFltmU_Z+lLqGJMASp%78iu=#9uP; zBV(9o45JjW?bVJ)uz@}d^+&A9E~!&9TG9ERspa6gz}7{P&ni1*wSE z{LdN{v;a!D&!HySWspZILl_nyde`#Yi7LcLj@HF{FK9Xpv;v$%(5SEy?i}}J%g`h^De~7~N=`tDW3W3AQa`1}Z z8U=NYd(%=OC_YoejG>t2xOHaNk|4LK9FSs7StCP zPkkMW51JRo`KC}AqACgr=R1=#@kga2M6ymk7^#Si70`i42$MaR}4x9$cqDoxM1dQk(+2_y@tM)=C;DH7#z{Be40>< z>Fb)hZ^A>n*-&mU6sjbQ8T0I1>>j>2A6?cV0DM&(o#7P!8_sKD`tfot@va*_k!wshNk(iNimw9gQ22O;1&`4Hj9w0x z;cnxzL5OyAakQeOB9bYZ2+{X%8h>gk8kRgmN3afr=iv_yvKpL#JVhPW6vZU+dn2|Z zNy{42IeFq37|kM>NFg@lb1;gphxX05_@mKqikSvSadCJ_5-2eX)^2opL5G{3FK&pl`Q8L<22zn!;k;Vl5i73aA7$u`ZaN`px zcEz8b^^cqlzYhF&ut+L#ID;PiCfvgIAJA8c1DHW%as_e`>yQux5Z&`hL)bTf`3W(0 zV`7yNi7L{)(hU2VLJJLPd~Ci#oI-H9JTlSCtBZ->1x+2#e_mjg>-)>@=BUV%U| z95k1gs8ze{;Vwqo$GPxY$V5Hglo9$c)?XcgR*q&1y|(cT(To()DL{s3ro_kt`T9Ie zwW#Ar4?xVpB4R{(Xn4Ex-%b(QoGc zMMM|GF+TI(YLo4OMnrwCyAL@rMB&f6J^OD3W6pyc??9`xdpB&D_>mdZl;>sMsG}x~ zz4mkFd>$o;zWVlt4b&+RFfW7dGFUWB3b=P*K#+f8`1KC@GtR9KQD4;zbXIg6@rEw7*`IDqm_1&6Uz|K=^@4e)&T=|)VvL(QwiVUXsec#Kck3wI4XNXE(FKNu$O_ zPtTcD_JS1&-K903{>p{#hg_B@AtosoBD%`JTs(+|i8CYdOHeVX#Aqn%vuM;8$_bSe z03e4PKKoyg_iEg+hK6duP-J_n1kCRxmQjs+_vtDDPZBvqah@#6!3*eQn;g7+PWJ90 z%14}JK|_?#NftDC0i9$)gO|@q7BocpoMb^m70^i*GYL zNftDC37up?gO|@q7BocpoHz?I3@o-J%!JaU=$48VZ<=j3qNZgoYQ||Hw33S%UYhwe z6|w^$lM7dLO#gSLB&ryO;ZONGG`HMhwwO(eJnU7E_$%jzX<~xd#o8^FhxN$53(w}5 zx)M#8N(-j!92dZtr#3Nv7gcgNet;*hO*2X!NDfAik^DPk`oXjrxWf!@Javu~qlrXw z#C2hof(PcMDLtB(g)98!7XAekj>CYJEo^sW2r}Ib1ddMmMKD}0LV?E`uH`6rV7EP% z59AEJf!X&crn@-_0ze8b5$A~OvuDW|Krd6E)Cp&g=m{3Cco_vtZiu5sE|`2X$1r(P zpXT*lnnmaQf_Tb3<}fK6m`jI!hfApz#;lad(BdXelRy$7G8dwyNZj}u#px3vtaic^ z7E393=ih8RlY&8OD3+uMfI~2Six{pQz&=cl0t8W-X)Js@OH>;KNV&(G>l&aOugFgn z20x~sHTr4yb6)`y)et`_14&iqwat`TIUZRT2xkbge z!aHy(z^FM;G&~Gy01hba5wOBSl61ZxQ6t+fT4Ujv9N_%Yq!Q$bXqU6$f^itqTAURl?HmmLw;zs3tMSe^q#)J&<&IBVQ|*bCq-o@~PT zbyKha#<-0nA`mQ`fxFPD4A3T|4?YDM3r+lsv*9gFJm?pJ^i%HOO%aY={Hqo#i4Mw3 zLs6KxkuNgqcQ=m4%fopXO}kVo*Vmq+$FVkH*~1}F*jObi7DL6 z6xfIvMh4pyfT5cZFcF8QJ|E2tqZF80M&T())7Ba}9l4nXM()5lQlXq2>0&54u12PaNc z*de)6iFZ3x*f14AJ`BYfz#%nq`G4Geif&n!7nX2bdK?mmB$!M7r7=R(7OUMZVMZ(_4)YAazka!^;O$`+d6YUl#TtE^q zvpCq25v!uOg)4qc{*Z|HfQ=Gj0u*!+X$+hrKxWr-W5nU~ND?*~vu=#!z!4+pi+Tk6 zE(jc8k|O#+B}6q^4MPrq#{thlYJYbnYM^652hwwMYQ2%yIhqQ;3U`G39_$+nbO zfpw)PNV_m>2_KsS*E!z=u$-cieHGbu;*QLA;`h&7;BnvEs|?hWbQ z0vC!ytJmUT8Mg!0Td+MNvMDFP*^XfJ5UjuI_;T9oYe*8bcmaEsr zTsG|xHNzFrF!gHyZUIR!galQO!RD-(Hrs`PrYHgg9-x#T0L<+H&NVKgp`~@Y-)c?4 zLJb1fAp^<8i(iag}#^9z5PU44d#y#E1;07V@*cb;*{D}vgXLB-QXH?)GCQrv1~y|j_r&+xY7{-O)|>yzjU5^+ zqyquL>{9jz>KxQ9(UG{L%8oBuVuz=a43>OP_I^^DsN-?3;dk!;Qs(5}dh?3bj~FrF zfr8YoK=n!NBlBfQIyjvy#M}fTK+Xs=VFC&3KIZI$;VeNwdQ-obf6Q%&AXhB+h&Cof zGKl2v>RitQ>F7d_JB@)nqj8HNt z6v`H7OeV`;^hkC$JRZ_XCQ*T*kVvl}!gVMipMNE*2WsRCN4o8cL$8xU3CNhUlUO8kV?0Q-APM@iLvc_;Z=bDy3qF1w zQlLx+Pe>~p)khwb09;2%e0Roagu>vuVNd@-r9rP81<5c?`QIME@QJF5f>?CW3!L9i zf*u7QRlr7h?_Ts8R0_i&W$q^U0E={)bRq(FF(G$uNOZ7)@}W!rn}|hj0W38*A_eqt zfg&V8=NDVy^+!0DoHa>xQQo4_hL~8&28oAc3fBA1!Fy)ZpadaUP^RdCJ}I0Aq%q_K z!2_X-O#v~qRP1DR7{k~H&O)bDBTX1&P^x6$4RDagNN6Ml)}BOlljeu!fdl(Q8%}k| zzr71Fd{NE~ip;#Zh>=lh!Bm%!TY$Hnx>$tvCDp8WEAU_-RzwV$%@N3rHr@qfbPm;GxElRQ7P)lC#fSA(aq%p&eVrQgiO0$do0@ zWD1)HYn+4Uo$(0oyRXG|txu16dMVj$o4mcs->v0uuUa*kHfufCw^?iYl|?A`!T-KC z%bU7LGUK4Dseu*v?q2URtPkv;+0Dk{=d4`%CAlXb0{l6*p{DocgOg@H)eKqeZ?%u# z(*6c-y!v3|G41ZUe`02c-Ca`X`@6fyCj9L**@XMTo22*(+S~QcTyPa6bU`R`;}z1>u%j#PNLi0AqZt<_@_#e@G|5%aNSGJli#P-Q@sm2CuB%VA4A4LW>2WZI#e;A zaScJ79N$?O$M19ms*M<5{wIwgW4VeMIiSanL2Mg`;8Ur9nPV6}o(P5R;Dw?%qzs~o zLNInaE3$k3I zqn&{OqBIz-Y&w)G&Ts&6gf$sT9?_o1i(%qHQ(+{`xs-iU$eRT`eYaC2b?WA`03B7$ zM8uR?CLm4-Pl5wfO$w)=p-41n0%&!k!n7rTwPE^!qfb;5fQVoR5*dXHAx!Z*LT>HF z<3MUOp@N<03Te3rB2FZ^a@0{Atrcu#-si%YMMfHwtPb&w76Os( z0D=;LBtm2odJyHLX_4H+eA4)0`Fy)73pqu&Lj@h$gQ0d8@FijwKUzI8nr0WR$CuaB|!0;~08k+)Tr6 z2w(`ib+NIzklViBgM_Ma>TB8^XN9Vz?x}AytUcQvKf}cII?!58i=H-gq?2f7@x_V) zP|`2aOk;SoEc}sV$Jkm5?e%I+DzwIF+Z0XfsA3|S=NsW&2B6c|lT zK%*dC$ii#|6-_Fn0@-$T1r;Rr{I?xM!Xve%&U$s^+pqs%`LrJ6aN|y6bNA9;8uEA> z9)Z*LEE+S9Tk%(Psw4~WUC(W7sQJ>YF<%;aXooMr7rGBV8Uxto6@g@i0LM12N1WP! z7_(<-cW3?drU&@sNx9t%65L1UOYn|aV;ZKt(z9(oos&aSeExmf;KSoy-f-m~cXLni z%o~5h6-L!OY^M=5M$>$FBnIIukNXDUeB)PaBb_zL`?O?~t^Sto*GcH_gwWr$qvmM6 z`&I0<-cj>J?LUt>`uSxffyaYCvs~5{n}^`Isfk6nG?~W6V1JWV(=tqQ+9_NsY>;#y z$qtSZCk*xD?po$i$D!Vh-t03YbQ)$2)R}0E;)^468q(P!%yMl@h0i=Q|$9Z$mlnx zoCyI)&cr@#frBEj5E6-EhfG4?<{?T9x&iOqPSK7qOi_!yPY@d;SDFdwQ+#qVpRJ$G z9=Zxz08E}#OaToPSbUH6K8knxL_ru7L~@$bkR<~~MhUu@?!;I|h(|A8ASrMRT_I37 zKoAD{gCi-z@01hg#p%Hg7WQ>4hABRX(~`@uFh17s2_Pp)SOg$^MTaUcy22Cf99CK! zrSC;RKrIDUX3u?|rKkeRDfG5uSbyT25HdeYebG1t-#35x6fOa#whXdg4lpgc;}#$T z>mf`KtE@dRRw;Xnv1JDHTN-I?ixVr!GDj%OW8rNKVzaqdF6k$j?LH3Q(} zi}#ND8l;-*qafc$<_nW{^He8VY_(dV?tZ)#EgfWL{au z;uyR%w!VLU!$ZQRz5+)=0uj+X z8T}FX_>ccNxmW7=G7-flim?1$QXCEh*5B`gGN_|!_1)omzpn%ym3~ib&qu(pv43z} z2)Qka3-AS`K*4hrF!a9g`~;fouIT8riolJX@@I^JBtjnomQhHmm_QfK&?pUm>XKi2 z0g3^BOH$B}JaSo|IH*0rGbD<$jD1Hv9XA(Q=|GA;c`)tR0E>kF&_NzmkI_aMr>^!i zs8VqtPw*T-98^lApE&qyW8Ux1F6I1GAHiu6Xj%Oi2>S#?Kd`5!{)o;x9LPzQQw(W| zeT-)Q26D`lN&*fw?9#(Hg)#;9&*o3^U?*bQ2_BdLR>uONu9)EDI`-TPz4zVO$w&!~ z%CDoZy{FDVv@ix6K6WWwVuYO~4lo0Nu;Z+AT8b-t@1e>FOGDnXU1&i30L{F$Qn{5T zjQ4VG?V}1Xmq6#gR#ab0diGCz<*fhrmO0ATqm0=v}#s-mA4>Sb+J%vs-WOxha_ zTR1JK==4yk_|7kNti01?L2C5Q{y~+#sGFv2r4&)3G!4Yl<4|^ZaVq*;YFGuCR)&Ay zJtNu&%a_$R21rcY8-~`O4B1jO_c8g)3`JI*m9j9ueOEArRF-7Kni2 zXIIbtyKvkYA|ZkN+Q)}t9>o+ApZv=2SNZo(jV(7<=o0|D4>bD5fdkA1?ZzRkZv^MM zzAsJwJq#D5Z6KK!EdBmJk39OLci$WT=d)sY*pUCbNgoI|DQ!M|`VoIj_Bp!Ks( zPO3WI`mIACX5H9bXZ2&&Qh_hU8N82vR_;u}C_=IM{4!xv0Jn;+T%^xbC$o6smh z@j+)CQ%cnxJA}4ac%aG>suCr-Md8I`)e8YRKa>EAUR?jTC1o;De}fO&r^{69E8 zR2~cZ9wvWA|HtsNyg_O^2tr%E^XWeuN{CBnIRZdul`Jd+Rw$ihzNM=G@L&F;)3biK z|1*$=>Cr0oX!XE{fJ5T*nIZunkC(EvZACfa{>c=-Fa(gt>A`29w2OeEF!5jL!vYt^ z6dGpYi40!K_!NI%y+`S1IE%MapWZ76g=O&kbqI~_{T3q z$-u7g(D(agDCtp*0o@C;r;xuL$X*d$r%VyVVTBM@dF?$?Wh6hMHf}CZO5&GYUwBK9n6z1}vfC~YSfU16A^s#py zWz2UKNk({nBdv~A<4S}p-Qri#>7o4Njk1AcyF5=&KSJ*Kcfd&RwzJlPj3e0Ne*?n7 z)1J{wLD{ttZ*3&IcB@C_t!?$Xye$3(j1>(PuKzd-3Dinttm|#{5YNkA6vxk6d}Y^e zaH*08A4hx%YkhE(B*o+ZcBJ?!Uj`&Vh|cqe(ZIk4p`%=iOO&szkK2-#wKJvX-~{9! zfBaP7@1k53lcmpq8hW7;9Ka2Xjw&oE3^dcU^XGn-N1F!g zq-sGAINo7qs3rEv1u~!yq5=cRU)I=xdmC_p7L^kjksF}g8>at*1R3gCRO|byu|ky3&aCQ0 zPt?oAr+FgTvpp|D)RJhZEFPLK{VAo$%-PS$0Hp*7w2fbF3y5QK2go>wN3r3o_GN!I zJHRz3+j@T{a0Lc8WNrFp2br}5KyCB=JH_n-ndP~w8h#l zxKua&SBlBn3Ctl_Nj^4<$4H)+1!W{XyCByf?Xua5*%^D^*IyXCdp>Aa1r$5 zeF0RU(F~fVJ?l!!Lv}5678WKb5tb`Se1iPr^U6NA-7@gvMPsjj`N6Bf!0LT)VrjDj&S8+d8lQTi$Qoh3iN}bZf!ZQ~x5P-UHr+SnxQexf9Rf z#{+$r8T|gF3Z}0ldk#_;l3)Em-)DUiB~}1g~ElK77jH zy@g{@oYD8+Lw6jMy7TXU#-@H|6r2g+CW?{S!Cwc53q$IjGro8QGyHwTkZUa5G6YM;7I>q^Fko&Pk=}aBA)&A;3XJ@o>=9a=<0G) zDF6JFV0T=QWQAWUSI7mq0#eyHs!TX6p1QRHzB2E`uaEtH*Di(}QyiOi?EQ@?V*j_s z6ce`$lVghhN718tN=;VfN%<9q8G~3Z^{bd@s3msIrTx4rexR+kS(39s)tAc`($dXz-%ek3<=fjztt)xOfY=){}D{Au)3Rwxx)$*GHR3ae)z zb({EN$%1b&xb$W8jJ9yV1CwAvcC?X;1#BVWOOXPUXW z00u?z!omBnQ_Wpc!)Y(*G=p&!rngC*J?NQX8r zMjW{k`k7r#rM)(8y&9Y91Wg|88V9nH0TDTV>cpc>{E>ewarjr5da)>!9Id>V`&TKPfRin}Dlfkj(}^X-OC1r>bpni84`CRPzmIp6 z7x7enIjPwH=_>Y>Yt;`yE02cuy?9oo#r*yV*!~F9D5+BKejjpr1v>?RIQ8!bk`b^$ zIQ05}83s{VKFAM*w(P(0RID8{u0(Kwa1k?*fy0LhS}qMdxbV!OdoY0yu?ZnVFw*Hq zKKpCh9W3P&1dt!*GjC7CEn+a4fEnf2?ZWm3n+G9GUx4WN-^ADNqP2jeKVXqX0uOdc zoZM{Lz=XMd=?+~y4N87B`D=-F)?UhYD}VHS;0zgasgdZ1puY1U3$aozIJO65&venpU5k&k)d6ia6l>fcG2F?tAg> zf1Gk+%$TNgp1P!X^~>OyLxZw4K5eK>bd-JeNfHtatp^9k8iWG-A9y;)oEWQy;V<9G)~Tv<)pyuM-~X^?<2&oF|9~{$&lQL ziwT}|Jz8<}xfN56#tmuBN3;1&%)d(5gefx)S zX(AHlO}{>D#{ZQ+#ceQ!1rNhVBf`ni&R(9N@n>l;vU0IkEeaa2Ioi^R%;~=fUzq%@03i>T_(KN} zT%QMjc8kn43tO4 zPr$k?Edtf2*HR^xoExRbB(?A>*^H5phq~VR1Ogckrfev_bT}hKzL@;OM2P%3n~PIA zF$v(u^kbF$Tz>=W;FJj>r=0p22jI*>4$1#+VPgnjeVPpX0TDwqyt#yd4k9%D-@?uQ zK5D}3TO!C;qtK&*_~E`-e$JVtmIF9ic9FoH6|GyHBUE@%OoZZemBNn^=?4=0t3DXXl%d zoutput.hex diff --git a/gr-sounder/src/python/test_rx.sh b/gr-sounder/src/python/test_rx.sh new file mode 100755 index 00000000..21998b4d --- /dev/null +++ b/gr-sounder/src/python/test_rx.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +usrp_sounder.py -r -n5000 -d12 +hexdump output.dat >output.hex diff --git a/gr-sounder/src/python/test_tx.sh b/gr-sounder/src/python/test_tx.sh new file mode 100755 index 00000000..f29ba1f3 --- /dev/null +++ b/gr-sounder/src/python/test_tx.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +usrp_sounder.py -t -f 16M -d12 diff --git a/gr-sounder/src/python/usrp_sounder.py b/gr-sounder/src/python/usrp_sounder.py index ca722a49..31e766ef 100755 --- a/gr-sounder/src/python/usrp_sounder.py +++ b/gr-sounder/src/python/usrp_sounder.py @@ -28,68 +28,141 @@ import sys, time 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) - -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_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 + +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() - - def set_degree(self, value): - return self.trans._write_fpga_reg(usrp.FR_USER_0, value); - + 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', decim_rate=128) + 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") + + if options.samples >= 0: + self._head = gr.head(gr.sizeof_short, 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 + if self._options.samples >= 0: + self._fg.wait() + else: + print "Stopping receiver flow graph." + if self._options.samples < 0: + 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); - -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) + if value: + print "Enabling digital loopback." + self._mode |= bmFR_MODE_LP else: - self.fg.connect(self.rcvr, self.sink) - - def receive(self): - self.fg.run() - - def set_degree(self, value): - return self.rcvr._write_fpga_reg(usrp.FR_USER_0, value); - + print "Disabling digital loopback." + self._mode &= ~bmFR_MODE_LP + self._write_mode() + + def set_reset(self, value): + if value: + print "Asserting reset." + self._mode |= bmFR_MODE_RESET + else: + print "De-asserting reset." + self._mode &= ~bmFR_MODE_RESET + self._write_mode() + + 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 +178,16 @@ def main(): 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) + + if options.transmit: + s.enable_tx(True) - except KeyboardInterrupt: - if (options.transmit): - tx.turn_off() + if options.receive: + s.enable_rx(True) + if options.samples < 0: + raw_input("Press enter to exit.") if __name__ == "__main__": main() -- 2.30.2