From 48fefc9b6e294c0ecb3cdd826b5a2f4b008fa829 Mon Sep 17 00:00:00 2001 From: jcorgan Date: Fri, 8 Feb 2008 23:48:25 +0000 Subject: [PATCH] Merged r7611:7614 from jcorgan/gpio into trunk. Adds custom FPGA build for streaming digital I/O to/from GPIO pins through LSB of I and Q datastreams, with example programs of use. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@7618 221aa14e-8319-0410-a670-987f0aec2ac5 --- config/Makefile.am | 1 + config/grc_gr_gpio.m4 | 49 ++ configure.ac | 1 + gr-gpio/Makefile.am | 24 + gr-gpio/src/Makefile.am | 22 + gr-gpio/src/fpga/Makefile.am | 22 + gr-gpio/src/fpga/include/Makefile.am | 24 + .../include/common_config_2rxhb_2txdig.vh | 71 +++ .../src/fpga/include/common_config_bottom.vh | 133 +++++ gr-gpio/src/fpga/lib/Makefile.am | 28 ++ gr-gpio/src/fpga/lib/gpio_input.v | 80 +++ gr-gpio/src/fpga/lib/io_pins.v | 55 +++ gr-gpio/src/fpga/lib/rx_chain_dig.v | 43 ++ gr-gpio/src/fpga/lib/tx_chain_dig.v | 42 ++ gr-gpio/src/fpga/top/Makefile.am | 64 +++ gr-gpio/src/fpga/top/config.vh | 57 +++ gr-gpio/src/fpga/top/usrp_gpio.csf | 444 +++++++++++++++++ gr-gpio/src/fpga/top/usrp_gpio.esf | 14 + gr-gpio/src/fpga/top/usrp_gpio.psf | 312 ++++++++++++ gr-gpio/src/fpga/top/usrp_gpio.qpf | 29 ++ gr-gpio/src/fpga/top/usrp_gpio.qsf | 410 +++++++++++++++ gr-gpio/src/fpga/top/usrp_gpio.rbf | Bin 0 -> 181332 bytes gr-gpio/src/fpga/top/usrp_gpio.v | 467 ++++++++++++++++++ gr-gpio/src/lib/Makefile.am | 87 ++++ gr-gpio/src/lib/gpio.i | 28 ++ gr-gpio/src/lib/gpio_and_const_ss.cc | 71 +++ gr-gpio/src/lib/gpio_and_const_ss.h | 54 ++ gr-gpio/src/python/Makefile.am | 50 ++ gr-gpio/src/python/__init__.py | 34 ++ gr-gpio/src/python/gpio.py | 3 + gr-gpio/src/python/gpio_rx_sfile.py | 121 +++++ gr-gpio/src/python/gpio_usrp_fft.py | 333 +++++++++++++ gr-gpio/src/python/gpio_usrp_siggen.py | 209 ++++++++ gr-gpio/src/python/qa_gpio.py | 36 ++ gr-gpio/src/python/run_tests.in | 10 + 35 files changed, 3428 insertions(+) create mode 100644 config/grc_gr_gpio.m4 create mode 100644 gr-gpio/Makefile.am create mode 100644 gr-gpio/src/Makefile.am create mode 100644 gr-gpio/src/fpga/Makefile.am create mode 100644 gr-gpio/src/fpga/include/Makefile.am create mode 100644 gr-gpio/src/fpga/include/common_config_2rxhb_2txdig.vh create mode 100644 gr-gpio/src/fpga/include/common_config_bottom.vh create mode 100644 gr-gpio/src/fpga/lib/Makefile.am create mode 100644 gr-gpio/src/fpga/lib/gpio_input.v create mode 100644 gr-gpio/src/fpga/lib/io_pins.v create mode 100644 gr-gpio/src/fpga/lib/rx_chain_dig.v create mode 100644 gr-gpio/src/fpga/lib/tx_chain_dig.v create mode 100644 gr-gpio/src/fpga/top/Makefile.am create mode 100644 gr-gpio/src/fpga/top/config.vh create mode 100644 gr-gpio/src/fpga/top/usrp_gpio.csf create mode 100644 gr-gpio/src/fpga/top/usrp_gpio.esf create mode 100644 gr-gpio/src/fpga/top/usrp_gpio.psf create mode 100644 gr-gpio/src/fpga/top/usrp_gpio.qpf create mode 100644 gr-gpio/src/fpga/top/usrp_gpio.qsf create mode 100644 gr-gpio/src/fpga/top/usrp_gpio.rbf create mode 100644 gr-gpio/src/fpga/top/usrp_gpio.v create mode 100644 gr-gpio/src/lib/Makefile.am create mode 100644 gr-gpio/src/lib/gpio.i create mode 100644 gr-gpio/src/lib/gpio_and_const_ss.cc create mode 100644 gr-gpio/src/lib/gpio_and_const_ss.h create mode 100644 gr-gpio/src/python/Makefile.am create mode 100644 gr-gpio/src/python/__init__.py create mode 100644 gr-gpio/src/python/gpio.py create mode 100755 gr-gpio/src/python/gpio_rx_sfile.py create mode 100755 gr-gpio/src/python/gpio_usrp_fft.py create mode 100755 gr-gpio/src/python/gpio_usrp_siggen.py create mode 100755 gr-gpio/src/python/qa_gpio.py create mode 100644 gr-gpio/src/python/run_tests.in diff --git a/config/Makefile.am b/config/Makefile.am index 6c5dd28c..676183aa 100644 --- a/config/Makefile.am +++ b/config/Makefile.am @@ -41,6 +41,7 @@ m4macros = \ grc_gr_audio_portaudio.m4 \ grc_gr_audio_windows.m4 \ grc_gr_comedi.m4 \ + grc_gr_gpio.m4 \ grc_gr_gsm_fr_vocoder.m4 \ grc_gr_radar_mono.m4 \ grc_gr_radio_astronomy.m4 \ diff --git a/config/grc_gr_gpio.m4 b/config/grc_gr_gpio.m4 new file mode 100644 index 00000000..f16e00c7 --- /dev/null +++ b/config/grc_gr_gpio.m4 @@ -0,0 +1,49 @@ +dnl Copyright 2007,2008 Free Software Foundation, Inc. +dnl +dnl This file is part of GNU Radio +dnl +dnl GNU Radio is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 3, or (at your option) +dnl any later version. +dnl +dnl GNU Radio is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with GNU Radio; see the file COPYING. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, +dnl Boston, MA 02110-1301, USA. + +AC_DEFUN([GRC_GR_GPIO],[ + GRC_ENABLE([gr-gpio]) + + AC_CONFIG_FILES([ \ + gr-gpio/Makefile \ + gr-gpio/src/Makefile \ + gr-gpio/src/fpga/Makefile \ + gr-gpio/src/fpga/include/Makefile \ + gr-gpio/src/fpga/top/Makefile \ + gr-gpio/src/fpga/lib/Makefile \ + gr-gpio/src/lib/Makefile \ + gr-gpio/src/python/Makefile \ + gr-gpio/src/python/run_tests + ]) + + passed=yes + # Don't do gr-gpio if usrp skipped + for dir in $skipped_dirs + do + if test x$dir = xusrp; then + AC_MSG_RESULT([Component gr-gpio requires usrp, which is not being built.]) + passed=no + fi + done + + GRC_BUILD_CONDITIONAL([gr-gpio],[ + dnl run_tests is created from run_tests.in. Make it executable. + AC_CONFIG_COMMANDS([run_tests_gpio], [chmod +x gr-gpio/src/python/run_tests]) + ]) +]) diff --git a/configure.ac b/configure.ac index f8ba7f41..6e493e5e 100644 --- a/configure.ac +++ b/configure.ac @@ -235,6 +235,7 @@ GRC_GR_AUDIO_WINDOWS GRC_GR_ATSC GRC_GR_COMEDI GRC_GR_CVSD_VOCODER +GRC_GR_GPIO GRC_GR_GSM_FR_VOCODER GRC_GR_PAGER GRC_GR_RADAR_MONO diff --git a/gr-gpio/Makefile.am b/gr-gpio/Makefile.am new file mode 100644 index 00000000..d800383e --- /dev/null +++ b/gr-gpio/Makefile.am @@ -0,0 +1,24 @@ +# +# Copyright 2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +include $(top_srcdir)/Makefile.common + +SUBDIRS = src diff --git a/gr-gpio/src/Makefile.am b/gr-gpio/src/Makefile.am new file mode 100644 index 00000000..8a361801 --- /dev/null +++ b/gr-gpio/src/Makefile.am @@ -0,0 +1,22 @@ +# +# Copyright 2007 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +SUBDIRS = lib python fpga diff --git a/gr-gpio/src/fpga/Makefile.am b/gr-gpio/src/fpga/Makefile.am new file mode 100644 index 00000000..363f19f3 --- /dev/null +++ b/gr-gpio/src/fpga/Makefile.am @@ -0,0 +1,22 @@ +# +# Copyright 2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +SUBDIRS = include lib top diff --git a/gr-gpio/src/fpga/include/Makefile.am b/gr-gpio/src/fpga/include/Makefile.am new file mode 100644 index 00000000..70920c3b --- /dev/null +++ b/gr-gpio/src/fpga/include/Makefile.am @@ -0,0 +1,24 @@ +# +# Copyright 2007 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +EXTRA_DIST = \ + common_config_2rxhb_2txdig.vh \ + common_config_bottom.vh diff --git a/gr-gpio/src/fpga/include/common_config_2rxhb_2txdig.vh b/gr-gpio/src/fpga/include/common_config_2rxhb_2txdig.vh new file mode 100644 index 00000000..580082c9 --- /dev/null +++ b/gr-gpio/src/fpga/include/common_config_2rxhb_2txdig.vh @@ -0,0 +1,71 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2006,2007 Matt Ettus +// Copyright (C) 2008 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 +// + +// ------------------------------------------------------------ +// If TX_ON is not defined, there is *no* transmit circuitry built + `define TX_ON + +// ------------------------------------------------------------ +// Define 1 and only one of TX_SINGLE, TX_DUAL and TX_QUAD +// to respectively enable 1, 2 or 4 transmit channels. +// [Please note that only TX_SINGLE and TX_DUAL are currently valid] +//`define TX_SINGLE + `define TX_DUAL +//`define TX_QUAD + +// ------------------------------------------------------------ +// If TX_DIG_ON is defined each transmit channel sends its I lsb and Q lsb to gpio pins +// The lsb bits of the analog output signal are truncated + `define TX_DIG_ON +// ------------------------------------------------------------ +// Define TX_HB_ON to enable the transmit halfband filter +// [Not implemented] +//`define TX_HB_ON + +// ------------------------------------------------------------ +// IF RX_ON is not defined, there is *no* receive circuitry built + `define RX_ON + +// ------------------------------------------------------------ +// Define 1 and only one of RX_SINGLE, RX_DUAL and RX_QUAD +// to respectively define 1, 2 or 4 receive channels. + +//`define RX_SINGLE + `define RX_DUAL +//`define RX_QUAD + +// ------------------------------------------------------------ +// Define RX_HB_ON to enable the receive halfband filter + `define RX_HB_ON + +// ------------------------------------------------------------ +// Define RX_NCO_ON to enable the receive Numerical Controlled Osc + `define RX_NCO_ON + +// ------------------------------------------------------------ +// Define RX_CIC_ON to enable the receive Cascaded Integrator Comb filter + `define RX_CIC_ON + +// ------------------------------------------------------------ +// If RX_DIG_ON is defined each receive channel sends has its I lsb and Q lsb replaced by digital input from gpio pins +// So the analog signals are truncated to 15 bits + `define RX_DIG_ON diff --git a/gr-gpio/src/fpga/include/common_config_bottom.vh b/gr-gpio/src/fpga/include/common_config_bottom.vh new file mode 100644 index 00000000..9e032642 --- /dev/null +++ b/gr-gpio/src/fpga/include/common_config_bottom.vh @@ -0,0 +1,133 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2006,2007 Matt Ettus +// Copyright (C) 2008 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 +// + +// ==================================================================== +// This is the common tail for standard configuation +// ==================================================================== +// +// >>>> DO NOT EDIT BELOW HERE <<<< +// +// N.B., *all* the remainder of the code should be conditionalized +// only in terms of: +// +// TX_ON, TX_EN_0, TX_EN_1, TX_EN_2, TX_EN_3, TX_CAP_NCHAN, TX_CAP_HB, +// RX_ON, RX_EN_0, RX_EN_1, RX_EN_2, RX_EN_3, RX_CAP_NCHAN, RX_CAP_HB, +// RX_NCO_ON, RX_CIC_ON +// ==================================================================== + +`ifdef TX_ON + + `ifdef TX_SINGLE + `define TX_EN_0 + `ifdef TX_DIG_ON + `define TX_EN_DIG_0 + `define TX_CAP_DIG 1 + `endif + `define TX_CAP_NCHAN 3'd1 + `endif + + `ifdef TX_DUAL + `define TX_EN_0 + `define TX_EN_1 + `define TX_CAP_NCHAN 3'd2 + `ifdef TX_DIG_ON + `define TX_EN_DIG_0 + `define TX_EN_DIG_1 + `define TX_CAP_DIG 1 + `endif + `endif + + `ifdef TX_QUAD + `define TX_EN_0 + `define TX_EN_1 + `define TX_EN_2 + `define TX_EN_3 + `ifdef TX_DIG_ON + `define TX_EN_DIG_0 + `define TX_EN_DIG_1 + `define TX_CAP_DIG 1 + `endif + `define TX_CAP_NCHAN 3'd4 + `endif + + `ifdef TX_HB_ON + `define TX_CAP_HB 1 + `else + `define TX_CAP_HB 0 + `endif + +`else // !ifdef TX_ON + + `define TX_CAP_NCHAN 3'd0 + `define TX_CAP_HB 0 + +`endif // !ifdef TX_ON + +// -------------------------------------------------------------------- + +`ifdef RX_ON + + `ifdef RX_SINGLE + `define RX_EN_0 + `define RX_CAP_NCHAN 3'd1 + `ifdef RX_DIG_ON + `define RX_EN_DIG_0 + `define RX_CAP_DIG 1 + `endif + `endif + + `ifdef RX_DUAL + `define RX_EN_0 + `define RX_EN_1 + `define RX_CAP_NCHAN 3'd2 + `ifdef RX_DIG_ON + `define RX_EN_DIG_0 + `define RX_EN_DIG_1 + `define RX_CAP_DIG 1 + `endif + `endif + + `ifdef RX_QUAD + `define RX_EN_0 + `define RX_EN_1 + `define RX_EN_2 + `define RX_EN_3 + `define RX_CAP_NCHAN 3'd4 + `ifdef RX_DIG_ON + `define RX_EN_DIG_0 + `define RX_EN_DIG_1 + `define RX_CAP_DIG 1 + `endif + `endif + + `ifdef RX_HB_ON + `define RX_CAP_HB 1 + `else + `define RX_CAP_HB 0 + `endif + +`else // !ifdef RX_ON + + `define RX_CAP_NCHAN 3'd0 + `define RX_CAP_HB 0 + +`endif // !ifdef RX_ON diff --git a/gr-gpio/src/fpga/lib/Makefile.am b/gr-gpio/src/fpga/lib/Makefile.am new file mode 100644 index 00000000..db5fbd4a --- /dev/null +++ b/gr-gpio/src/fpga/lib/Makefile.am @@ -0,0 +1,28 @@ +# +# Copyright 2007 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +SUBDIRS = + +EXTRA_DIST = \ + gpio_input.v \ + io_pins.v \ + rx_chain_dig.v \ + tx_chain_dig.v \ No newline at end of file diff --git a/gr-gpio/src/fpga/lib/gpio_input.v b/gr-gpio/src/fpga/lib/gpio_input.v new file mode 100644 index 00000000..871fe326 --- /dev/null +++ b/gr-gpio/src/fpga/lib/gpio_input.v @@ -0,0 +1,80 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2008 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 +// + +`include "../../../../usrp/firmware/include/fpga_regs_common.v" +`include "../../../../usrp/firmware/include/fpga_regs_standard.v" + +module gpio_input + (input clock, input reset, input enable, + input out_strobe, + input wire [6:0] serial_addr, input wire [31:0] serial_data, input serial_strobe, + input wire [15:0] io_rx_a_in, input wire [15:0] io_rx_b_in, + //input wire [15:0] io_tx_a_in, input wire [15:0] io_tx_b_in, + output reg rx_dig0_i, output reg rx_dig0_q, + output reg rx_dig1_i, output reg rx_dig1_q ); + + // Buffer at input to chip + + reg rx_dig_rx_a_a,rx_dig_rx_b_a,rx_dig_rx_a_b,rx_dig_rx_b_b; + //TODO possibly use a flancter here + //This code can optionally be extended to do streaming input from gpio of tx boards + //The code can also be extended to input more bits + + always @(posedge clock) + begin + //This is the first point where is determined which physical input gpio pins are used for streaming digital input + //The other point is the code which overrides these pins as input (oe = 0) + //rx_dig_tx_a_a <= #1 io_tx_a_in[14]; + //rx_dig_tx_b_a <= #1 io_tx_a_in[15]; + rx_dig_rx_a_a <= #1 io_rx_a_in[14]; + rx_dig_rx_b_a <= #1 io_rx_a_in[15]; + //rx_dig_tx_a_b <= #1 io_tx_b_in[14]; + //rx_dig_tx_b_b <= #1 io_tx_b_in[15]; + rx_dig_rx_a_b <= #1 io_rx_b_in[14]; + rx_dig_rx_b_b <= #1 io_rx_b_in[15]; + end + + // Now mux to the appropriate outputs + wire [3:0] ddc3mux,ddc2mux,ddc1mux,ddc0mux; + wire rx_realsignals; + wire [3:0] rx_numchan;//not used here + //TODO This setting reg readout is a duplicate of the one in adc_interface.v. + // Change code so this is done in only one place, or give this code its own register. + setting_reg #(`FR_RX_MUX) sr_rxmux(.clock(clock),.reset(reset),.strobe(serial_strobe),.addr(serial_addr), + .in(serial_data),.out({ddc3mux,ddc2mux,ddc1mux,ddc0mux,rx_realsignals,rx_numchan[3:1]})); + //assign rx_numchan[0] = 1'b0; + + always @(posedge clock) + if (out_strobe) //out_strobe determines the time at which the digital inputs are sampled (with a delay of one sample) + begin + rx_dig0_i <= #1 ddc0mux[1] ? (ddc0mux[0] ? rx_dig_rx_b_b : rx_dig_rx_a_b) : (ddc0mux[0] ? rx_dig_rx_b_a : rx_dig_rx_a_a); + rx_dig0_q <= #1 rx_realsignals ? 1'b0 : ddc0mux[3] ? (ddc0mux[2] ? rx_dig_rx_b_b : rx_dig_rx_a_b) : (ddc0mux[2] ? rx_dig_rx_b_a : rx_dig_rx_a_a); + rx_dig1_i <= #1 ddc1mux[1] ? (ddc1mux[0] ? rx_dig_rx_b_b : rx_dig_rx_a_b) : (ddc1mux[0] ? rx_dig_rx_b_a : rx_dig_rx_a_a); + rx_dig1_q <= #1 rx_realsignals ? 1'b0 : ddc1mux[3] ? (ddc1mux[2] ? rx_dig_rx_b_b : rx_dig_rx_a_b) : (ddc1mux[2] ? rx_dig_rx_b_a : rx_dig_rx_a_a); + //rx_dig2_i <= #1 ddc2mux[1] ? (ddc2mux[0] ? rx_dig_rx_b_b : rx_dig_rx_a_b) : (ddc2mux[0] ? rx_dig_rx_b_a : rx_dig_rx_a_a); + //rx_dig2_q <= #1 rx_realsignals ? 1'b0 : ddc2mux[3] ? (ddc2mux[2] ? rx_dig_rx_b_b : rx_dig_rx_a_b) : (ddc2mux[2] ? rx_dig_rx_b_a : rx_dig_rx_a_a); + //rx_dig3_i <= #1 ddc3mux[1] ? (ddc3mux[0] ? rx_dig_rx_b_b : rx_dig_rx_a_b) : (ddc3mux[0] ? rx_dig_rx_b_a : rx_dig_rx_a_a); + //rx_dig3_q <= #1 rx_realsignals ? 1'b0 : ddc3mux[3] ? (ddc3mux[2] ? rx_dig_rx_b_b : rx_dig_rx_a_b) : (ddc3mux[2] ? rx_dig_rx_b_a : rx_dig_rx_a_a); + end + +endmodule // gpio_input + + diff --git a/gr-gpio/src/fpga/lib/io_pins.v b/gr-gpio/src/fpga/lib/io_pins.v new file mode 100644 index 00000000..9d857902 --- /dev/null +++ b/gr-gpio/src/fpga/lib/io_pins.v @@ -0,0 +1,55 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2005,2006 Matt Ettus +// Copyright (C) 2008 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 +// + +`include "../../../../usrp/firmware/include/fpga_regs_common.v" +`include "../../../../usrp/firmware/include/fpga_regs_standard.v" + +module io_pins + ( inout wire [15:0] io_0, inout wire [15:0] io_1, inout wire [15:0] io_2, inout wire [15:0] io_3, + input wire [15:0] reg_0, input wire [15:0] reg_1, input wire [15:0] reg_2, input wire [15:0] reg_3, + input wire [15:0] io_0_force_output, input wire [15:0] io_2_force_output, + input wire [15:0] io_1_force_input, input wire [15:0] io_3_force_input, + input clock, input rx_reset, input tx_reset, + input [6:0] serial_addr, input [31:0] serial_data, input serial_strobe); + + reg [15:0] io_0_oe,io_1_oe,io_2_oe,io_3_oe; + + bidir_reg bidir_reg_0 (.tristate(io_0),.oe(io_0_oe | io_0_force_output),.reg_val(reg_0)); + bidir_reg bidir_reg_1 (.tristate(io_1),.oe(io_1_oe & (~io_1_force_input)),.reg_val(reg_1)); + bidir_reg bidir_reg_2 (.tristate(io_2),.oe(io_2_oe | io_2_force_output),.reg_val(reg_2)); + bidir_reg bidir_reg_3 (.tristate(io_3),.oe(io_3_oe & (~io_3_force_input)),.reg_val(reg_3)); + + // Upper 16 bits are mask for lower 16 + always @(posedge clock) + if(serial_strobe) + case(serial_addr) + `FR_OE_0 : io_0_oe + <= #1 (io_0_oe & ~serial_data[31:16]) | (serial_data[15:0] & serial_data[31:16] ); + `FR_OE_1 : io_1_oe + <= #1 (io_1_oe & ~serial_data[31:16]) | (serial_data[15:0] & serial_data[31:16] ); + `FR_OE_2 : io_2_oe + <= #1 (io_2_oe & ~serial_data[31:16]) | (serial_data[15:0] & serial_data[31:16] ); + `FR_OE_3 : io_3_oe + <= #1 (io_3_oe & ~serial_data[31:16]) | (serial_data[15:0] & serial_data[31:16] ); + endcase // case(serial_addr) + +endmodule // io_pins diff --git a/gr-gpio/src/fpga/lib/rx_chain_dig.v b/gr-gpio/src/fpga/lib/rx_chain_dig.v new file mode 100644 index 00000000..4f760dde --- /dev/null +++ b/gr-gpio/src/fpga/lib/rx_chain_dig.v @@ -0,0 +1,43 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2008 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 +// + +// Following defines conditionally include RX path circuitry + +`include "../top/config.vh" // resolved relative to project root + +module rx_chain_dig + (input clock, + input reset, + input enable, + input wire [15:0] i_in_ana, + input wire [15:0] q_in_ana, + input wire i_in_dig, + input wire q_in_dig, + output wire [15:0] i_out, + output wire [15:0] q_out + ); + + //assign upper 15 bits of output to analog input, + // discards lsb of analog input and replace with digital input bit (which comes from gpio) + assign i_out = (enable)?{i_in_ana[15:1],i_in_dig}:i_in_ana; + assign q_out = (enable)?{q_in_ana[15:1],q_in_dig}:q_in_ana; + +endmodule // rx_chain_dig diff --git a/gr-gpio/src/fpga/lib/tx_chain_dig.v b/gr-gpio/src/fpga/lib/tx_chain_dig.v new file mode 100644 index 00000000..7001947f --- /dev/null +++ b/gr-gpio/src/fpga/lib/tx_chain_dig.v @@ -0,0 +1,42 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2008 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 tx_chain_dig + (input clock, + input reset, + input enable, + input wire [15:0] i_in, + input wire [15:0] q_in, + output wire [15:0] i_out_ana, + output wire [15:0] q_out_ana, + output wire i_out_dig, + output wire q_out_dig + ); + + //assign upper 15 bits to analog processing, discard lowest bit + //output lower two bits of I and Q as digital signal (to be output on gpio pins) + assign i_out_ana = (enable)?{i_in[15:1],1'b0}:i_in; + assign q_out_ana = (enable)?{q_in[15:1],1'b0}:q_in; + //wire out_dig = (enable)?{i_in[0],q_in[0]}:2'b00; + assign i_out_dig = (enable)?i_in[0]:1'b0; + assign q_out_dig = (enable)?q_in[0]:1'b0; + +endmodule // tx_chain_dig diff --git a/gr-gpio/src/fpga/top/Makefile.am b/gr-gpio/src/fpga/top/Makefile.am new file mode 100644 index 00000000..0aba0141 --- /dev/null +++ b/gr-gpio/src/fpga/top/Makefile.am @@ -0,0 +1,64 @@ +# +# Copyright 2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +include $(top_srcdir)/Makefile.common + +datadir = $(prefix)/share/usrp + +RBFS = usrp_gpio.rbf + +EXTRA_DIST = \ + config.vh \ + usrp_gpio.csf \ + usrp_gpio.esf \ + usrp_gpio.psf \ + usrp_gpio.qpf \ + usrp_gpio.qsf \ + usrp_gpio.v \ + $(RBFS) + +install-data-local: + @for file in $(RBFS); do \ + echo "$(INSTALL_DATA) -D $(srcdir)/$$file $(DESTDIR)$(datadir)/rev2/$$file"; \ + $(INSTALL_DATA) -D $(srcdir)/$$file $(DESTDIR)$(datadir)/rev2/$$file; \ + echo "$(INSTALL_DATA) -D $(srcdir)/$$file $(DESTDIR)$(datadir)/rev4/$$file"; \ + $(INSTALL_DATA) -D $(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 \ + *.qws \ + *.smsg \ + *.done \ + *.pin \ + *.sof \ + *~ diff --git a/gr-gpio/src/fpga/top/config.vh b/gr-gpio/src/fpga/top/config.vh new file mode 100644 index 00000000..5fd4fefb --- /dev/null +++ b/gr-gpio/src/fpga/top/config.vh @@ -0,0 +1,57 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2006,2007 Matt Ettus +// Copyright (C) 2008 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 +// + +// ==================================================================== +// User control over what parts get included +// +// >>>> EDIT ONLY THIS SECTION <<<< +// Uncomment only ONE configuration +// ==================================================================== + +// ==================================================================== +// FIXME drive configuration selection from the command line and/or gui +// ==================================================================== + +// Uncomment this for 1 rx channel (w/ halfband) & 1 transmit channel +//`include "../include/common_config_1rxhb_1tx.vh" + +// Uncomment this for 2 rx channels (w/ halfband) & 2 transmit channels +// `include "../include/common_config_2rxhb_2tx.vh" + +// Uncomment this for 2 rx channels (w/ halfband) & 2 transmit channels with digital output (lsb of I and Q) on gpio pins + `include "../include/common_config_2rxhb_2txdig.vh" + +// Uncomment this for 4 rx channels (w/o halfband) & 0 transmit channels +//`include "../include/common_config_4rx_0tx.vh" + +// Uncomment this for multi with 2 rx channels (w/ halfband) & 0 transmit channels +//`include "../include/common_config_2rxhb_0tx.vh" + +// Uncomment this for multi with 2 rx channels (w/o halfband) & 0 transmit channels +//`include "../include/common_config_2rx_0tx.vh" + +// Add other "known to fit" configurations here... + +// ==================================================================== +// Now include the common footer +// ==================================================================== + `include "../include/common_config_bottom.vh" diff --git a/gr-gpio/src/fpga/top/usrp_gpio.csf b/gr-gpio/src/fpga/top/usrp_gpio.csf new file mode 100644 index 00000000..8a6a0b46 --- /dev/null +++ b/gr-gpio/src/fpga/top/usrp_gpio.csf @@ -0,0 +1,444 @@ +COMPILER_SETTINGS +{ + IO_PLACEMENT_OPTIMIZATION = OFF; + ENABLE_DRC_SETTINGS = OFF; + PHYSICAL_SYNTHESIS_REGISTER_RETIMING = OFF; + PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION = OFF; + PHYSICAL_SYNTHESIS_COMBO_LOGIC = OFF; + DRC_FANOUT_EXCEEDING = 30; + DRC_REPORT_FANOUT_EXCEEDING = OFF; + DRC_TOP_FANOUT = 50; + DRC_REPORT_TOP_FANOUT = OFF; + RUN_DRC_DURING_COMPILATION = OFF; + ADV_NETLIST_OPT_RETIME_CORE_AND_IO = ON; + ADV_NETLIST_OPT_SYNTH_USE_FITTER_INFO = OFF; + ADV_NETLIST_OPT_SYNTH_GATE_RETIME = OFF; + ADV_NETLIST_OPT_SYNTH_WYSIWYG_REMAP = OFF; + SMART_COMPILE_IGNORES_TDC_FOR_STRATIX_PLL_CHANGES = OFF; + MERGE_HEX_FILE = OFF; + TRUE_WYSIWYG_FLOW = OFF; + SEED = 1; + FINAL_PLACEMENT_OPTIMIZATION = AUTOMATICALLY; + FAMILY = Cyclone; + DPRAM_DUAL_PORT_MODE_OTHER_SIGNALS_EPXA1 = "DPRAM0 TO 1 DPRAM1 TO 2"; + DPRAM_32BIT_SINGLE_PORT_MODE_OTHER_SIGNALS_EPXA1 = "MEGALAB COLUMN 1"; + DPRAM_8BIT_16BIT_SINGLE_PORT_MODE_OTHER_SIGNALS_EPXA1 = "MEGALAB COLUMN 1"; + DPRAM_DUAL_PORT_MODE_OUTPUT_EPXA1 = "DPRAM0 TO 1 DPRAM1 TO 2"; + DPRAM_32BIT_SINGLE_PORT_MODE_OUTPUT_EPXA1 = "LOWER TO 1ESB UPPER TO 1"; + DPRAM_8BIT_16BIT_SINGLE_PORT_MODE_OUTPUT_EPXA1 = "MEGALAB COLUMN 1"; + DPRAM_DUAL_PORT_MODE_INPUT_EPXA1 = "DPRAM0 TO 1 DPRAM1 TO 2"; + DPRAM_32BIT_SINGLE_PORT_MODE_INPUT_EPXA1 = "MEGALAB COLUMN 1"; + DPRAM_8BIT_16BIT_SINGLE_PORT_MODE_INPUT_EPXA1 = "MEGALAB COLUMN 1"; + DPRAM_DUAL_PORT_MODE_OTHER_SIGNALS_EPXA4_10 = "DPRAM0 TO 3 DPRAM1 TO 4"; + DPRAM_SINGLE_PORT_MODE_OTHER_SIGNALS_EPXA4_10 = "DPRAM0 TO 3 DPRAM1 TO 4"; + DPRAM_WIDE_MODE_OTHER_SIGNALS_EPXA4_10 = "MEGALAB COLUMN 3"; + DPRAM_DEEP_MODE_OTHER_SIGNALS_EPXA4_10 = "MEGALAB COLUMN 3"; + DPRAM_DUAL_PORT_MODE_OUTPUT_EPXA4_10 = "DPRAM0 TO 3 DPRAM1 TO 4ESB"; + DPRAM_SINGLE_PORT_MODE_OUTPUT_EPXA4_10 = "DPRAM0 TO 3 DPRAM1 TO 4ESB"; + DPRAM_WIDE_MODE_OUTPUT_EPXA4_10 = "LOWER TO 3 UPPER TO 4ESB"; + DPRAM_DEEP_MODE_OUTPUT_EPXA4_10 = "MEGALAB COLUMN 3"; + DPRAM_DUAL_PORT_MODE_INPUT_EPXA4_10 = "DPRAM0 TO 3 DPRAM1 TO 4"; + DPRAM_SINGLE_PORT_MODE_INPUT_EPXA4_10 = "DPRAM0 TO 3 DPRAM1 TO 4"; + DPRAM_WIDE_MODE_INPUT_EPXA4_10 = "LOWER TO 3 UPPER TO 4"; + DPRAM_DEEP_MODE_INPUT_EPXA4_10 = "MEGALAB COLUMN 3"; + DPRAM_OTHER_SIGNALS_EPXA4_10 = "DEFAULT OTHER ROUTING OPTIONS"; + DPRAM_OUTPUT_EPXA4_10 = "DEFAULT OUTPUT ROUTING OPTIONS"; + DPRAM_INPUT_EPXA4_10 = "DEFAULT INPUT ROUTING OPTIONS"; + STRIPE_TO_PLD_INTERRUPTS_EPXA4_10 = "MEGALAB COLUMN 2"; + PLD_TO_STRIPE_INTERRUPTS_EPXA4_10 = "MEGALAB COLUMN 2"; + PROCESSOR_DEBUG_EXTENSIONS_EPXA4_10 = "MEGALAB COLUMN 2"; + STRIPE_TO_PLD_BRIDGE_EPXA4_10 = "MEGALAB COLUMN 1"; + FAST_FIT_COMPILATION = OFF; + SIGNALPROBE_DURING_NORMAL_COMPILATION = OFF; + OPTIMIZE_IOC_REGISTER_PLACEMENT_FOR_TIMING = ON; + OPTIMIZE_TIMING = "NORMAL COMPILATION"; + OPTIMIZE_HOLD_TIMING = OFF; + COMPILATION_LEVEL = FULL; + SAVE_DISK_SPACE = OFF; + SPEED_DISK_USAGE_TRADEOFF = NORMAL; + LOGICLOCK_INCREMENTAL_COMPILE_ASSIGNMENT = OFF; + SIGNALPROBE_ALLOW_OVERUSE = OFF; + FOCUS_ENTITY_NAME = |usrp_gpio; + ROUTING_BACK_ANNOTATION_MODE = OFF; + INC_PLC_MODE = OFF; + FIT_ONLY_ONE_ATTEMPT = OFF; +} +DEFAULT_DEVICE_OPTIONS +{ + GENERATE_CONFIG_HEXOUT_FILE = OFF; + GENERATE_CONFIG_JBC_FILE_COMPRESSED = ON; + GENERATE_CONFIG_JBC_FILE = OFF; + GENERATE_CONFIG_JAM_FILE = OFF; + GENERATE_CONFIG_ISC_FILE = OFF; + GENERATE_CONFIG_SVF_FILE = OFF; + GENERATE_JBC_FILE_COMPRESSED = ON; + GENERATE_JBC_FILE = OFF; + GENERATE_JAM_FILE = OFF; + GENERATE_ISC_FILE = OFF; + GENERATE_SVF_FILE = OFF; + RESERVE_PIN = "AS INPUT TRI-STATED"; + RESERVE_ALL_UNUSED_PINS = "AS OUTPUT DRIVING GROUND"; + HEXOUT_FILE_COUNT_DIRECTION = UP; + HEXOUT_FILE_START_ADDRESS = 0; + GENERATE_HEX_FILE = OFF; + GENERATE_RBF_FILE = OFF; + GENERATE_TTF_FILE = OFF; + RESERVE_ASDO_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + RESERVE_DATA0_AFTER_CONFIGURATION = "AS INPUT TRI-STATED"; + RESERVE_DATA7_THROUGH_DATA1_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + RESERVE_RDYNBUSY_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + RESERVE_NWS_NRS_NCS_CS_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + DISABLE_NCS_AND_OE_PULLUPS_ON_CONFIG_DEVICE = OFF; + AUTO_INCREMENT_CONFIG_DEVICE_JTAG_USER_CODE = ON; + EPROM_USE_CHECKSUM_AS_USERCODE = OFF; + FLEX10K_CONFIG_DEVICE_JTAG_USER_CODE = FFFFFFFF; + MERCURY_CONFIG_DEVICE_JTAG_USER_CODE = FFFFFFFF; + STRATIX_CONFIG_DEVICE_JTAG_USER_CODE = FFFFFFFF; + APEX20K_CONFIG_DEVICE_JTAG_USER_CODE = FFFFFFFF; + STRATIX_CONFIGURATION_DEVICE = AUTO; + CYCLONE_CONFIGURATION_DEVICE = AUTO; + FLEX10K_CONFIGURATION_DEVICE = AUTO; + FLEX6K_CONFIGURATION_DEVICE = AUTO; + MERCURY_CONFIGURATION_DEVICE = AUTO; + EXCALIBUR_CONFIGURATION_DEVICE = AUTO; + APEX20K_CONFIGURATION_DEVICE = AUTO; + USE_CONFIGURATION_DEVICE = ON; + ENABLE_INIT_DONE_OUTPUT = OFF; + FLEX10K_ENABLE_LOCK_OUTPUT = OFF; + ENABLE_DEVICE_WIDE_OE = OFF; + ENABLE_DEVICE_WIDE_RESET = OFF; + RELEASE_CLEARS_BEFORE_TRI_STATES = OFF; + AUTO_RESTART_CONFIGURATION = OFF; + ENABLE_VREFB_PIN = OFF; + ENABLE_VREFA_PIN = OFF; + SECURITY_BIT = OFF; + USER_START_UP_CLOCK = OFF; + APEXII_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + FLEX10K_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + FLEX6K_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + MERCURY_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + EXCALIBUR_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + CYCLONE_CONFIGURATION_SCHEME = "ACTIVE SERIAL"; + STRATIX_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + APEX20K_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + STRATIX_UPDATE_MODE = STANDARD; + USE_CHECKSUM_AS_USERCODE = OFF; + MAX7000_USE_CHECKSUM_AS_USERCODE = OFF; + MAX7000_JTAG_USER_CODE = FFFFFFFF; + FLEX10K_JTAG_USER_CODE = 7F; + MERCURY_JTAG_USER_CODE = FFFFFFFF; + APEX20K_JTAG_USER_CODE = FFFFFFFF; + STRATIX_JTAG_USER_CODE = FFFFFFFF; + MAX7000S_JTAG_USER_CODE = FFFF; + RESERVE_NCEO_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + FLEX10K_ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE = ON; + FLEX6K_ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE = OFF; + ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE = ON; + MAX7000_ENABLE_JTAG_BST_SUPPORT = ON; + ENABLE_JTAG_BST_SUPPORT = OFF; + CONFIGURATION_CLOCK_DIVISOR = 1; + CONFIGURATION_CLOCK_FREQUENCY = "10 MHZ"; + CLOCK_SOURCE = INTERNAL; + COMPRESSION_MODE = OFF; + ON_CHIP_BITSTREAM_DECOMPRESSION = OFF; +} +AUTO_SLD_HUB_ENTITY +{ + AUTO_INSERT_SLD_HUB_ENTITY = ENABLE; + HUB_INSTANCE_NAME = SLD_HUB_INST; + HUB_ENTITY_NAME = SLD_HUB; +} +SIGNALTAP_LOGIC_ANALYZER_SETTINGS +{ + ENABLE_SIGNALTAP = Off; + AUTO_ENABLE_SMART_COMPILE = On; +} +CHIP(usrp_gpio) +{ + DEVICE = EP1C12Q240C8; + DEVICE_FILTER_PACKAGE = "ANY QFP"; + DEVICE_FILTER_PIN_COUNT = 240; + DEVICE_FILTER_SPEED_GRADE = ANY; + AUTO_RESTART_CONFIGURATION = OFF; + RELEASE_CLEARS_BEFORE_TRI_STATES = OFF; + USER_START_UP_CLOCK = OFF; + ENABLE_DEVICE_WIDE_RESET = OFF; + ENABLE_DEVICE_WIDE_OE = OFF; + ENABLE_INIT_DONE_OUTPUT = OFF; + FLEX10K_ENABLE_LOCK_OUTPUT = OFF; + ENABLE_JTAG_BST_SUPPORT = OFF; + MAX7000_ENABLE_JTAG_BST_SUPPORT = ON; + APEX20K_JTAG_USER_CODE = FFFFFFFF; + MERCURY_JTAG_USER_CODE = FFFFFFFF; + FLEX10K_JTAG_USER_CODE = 7F; + MAX7000_JTAG_USER_CODE = FFFFFFFF; + MAX7000S_JTAG_USER_CODE = FFFF; + STRATIX_JTAG_USER_CODE = FFFFFFFF; + APEX20K_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + MERCURY_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + FLEX6K_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + FLEX10K_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + EXCALIBUR_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + APEXII_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + STRATIX_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + CYCLONE_CONFIGURATION_SCHEME = "PASSIVE SERIAL"; + USE_CONFIGURATION_DEVICE = OFF; + APEX20K_CONFIGURATION_DEVICE = AUTO; + MERCURY_CONFIGURATION_DEVICE = AUTO; + FLEX6K_CONFIGURATION_DEVICE = AUTO; + FLEX10K_CONFIGURATION_DEVICE = AUTO; + EXCALIBUR_CONFIGURATION_DEVICE = AUTO; + STRATIX_CONFIGURATION_DEVICE = AUTO; + CYCLONE_CONFIGURATION_DEVICE = AUTO; + STRATIX_UPDATE_MODE = STANDARD; + APEX20K_CONFIG_DEVICE_JTAG_USER_CODE = FFFFFFFF; + MERCURY_CONFIG_DEVICE_JTAG_USER_CODE = FFFFFFFF; + FLEX10K_CONFIG_DEVICE_JTAG_USER_CODE = FFFFFFFF; + STRATIX_CONFIG_DEVICE_JTAG_USER_CODE = FFFFFFFF; + AUTO_INCREMENT_CONFIG_DEVICE_JTAG_USER_CODE = ON; + DISABLE_NCS_AND_OE_PULLUPS_ON_CONFIG_DEVICE = OFF; + COMPRESSION_MODE = OFF; + ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE = ON; + FLEX6K_ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE = OFF; + FLEX10K_ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE = ON; + EPROM_USE_CHECKSUM_AS_USERCODE = OFF; + USE_CHECKSUM_AS_USERCODE = OFF; + MAX7000_USE_CHECKSUM_AS_USERCODE = OFF; + GENERATE_TTF_FILE = OFF; + GENERATE_RBF_FILE = ON; + GENERATE_HEX_FILE = OFF; + SECURITY_BIT = OFF; + ENABLE_VREFA_PIN = OFF; + ENABLE_VREFB_PIN = OFF; + GENERATE_SVF_FILE = OFF; + GENERATE_ISC_FILE = OFF; + GENERATE_JAM_FILE = OFF; + GENERATE_JBC_FILE = OFF; + GENERATE_JBC_FILE_COMPRESSED = ON; + GENERATE_CONFIG_SVF_FILE = OFF; + GENERATE_CONFIG_ISC_FILE = OFF; + GENERATE_CONFIG_JAM_FILE = OFF; + GENERATE_CONFIG_JBC_FILE = OFF; + GENERATE_CONFIG_JBC_FILE_COMPRESSED = ON; + GENERATE_CONFIG_HEXOUT_FILE = OFF; + ON_CHIP_BITSTREAM_DECOMPRESSION = OFF; + BASE_PIN_OUT_FILE_ON_SAMEFRAME_DEVICE = OFF; + HEXOUT_FILE_START_ADDRESS = 0; + HEXOUT_FILE_COUNT_DIRECTION = UP; + RESERVE_ALL_UNUSED_PINS = "AS INPUT TRI-STATED"; + STRATIX_DEVICE_IO_STANDARD = LVTTL; + CLOCK_SOURCE = INTERNAL; + CONFIGURATION_CLOCK_FREQUENCY = "10 MHZ"; + CONFIGURATION_CLOCK_DIVISOR = 1; + RESERVE_NWS_NRS_NCS_CS_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + RESERVE_RDYNBUSY_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + RESERVE_DATA7_THROUGH_DATA1_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + RESERVE_DATA0_AFTER_CONFIGURATION = "AS INPUT TRI-STATED"; + RESERVE_NCEO_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + RESERVE_ASDO_AFTER_CONFIGURATION = "USE AS REGULAR IO"; + SCLK : LOCATION = Pin_101; + SDI : LOCATION = Pin_100; + SEN : LOCATION = Pin_98; + SLD : LOCATION = Pin_95; + adc1_data[0] : LOCATION = Pin_5; + adc1_data[10] : LOCATION = Pin_235; + adc1_data[11] : LOCATION = Pin_234; + adc1_data[1] : LOCATION = Pin_4; + adc1_data[2] : LOCATION = Pin_3; + adc1_data[3] : LOCATION = Pin_2; + adc1_data[4] : LOCATION = Pin_1; + adc1_data[4] : IO_STANDARD = LVTTL; + adc1_data[5] : LOCATION = Pin_240; + adc1_data[6] : LOCATION = Pin_239; + adc1_data[7] : LOCATION = Pin_238; + adc1_data[8] : LOCATION = Pin_237; + adc1_data[9] : LOCATION = Pin_236; + adc2_data[0] : LOCATION = Pin_20; + adc2_data[10] : LOCATION = Pin_8; + adc2_data[11] : LOCATION = Pin_7; + adc2_data[1] : LOCATION = Pin_19; + adc2_data[2] : LOCATION = Pin_18; + adc2_data[3] : LOCATION = Pin_17; + adc2_data[4] : LOCATION = Pin_16; + adc2_data[5] : LOCATION = Pin_15; + adc2_data[6] : LOCATION = Pin_14; + adc2_data[7] : LOCATION = Pin_13; + adc2_data[8] : LOCATION = Pin_12; + adc2_data[9] : LOCATION = Pin_11; + adc3_data[0] : LOCATION = Pin_200; + adc3_data[10] : LOCATION = Pin_184; + adc3_data[11] : LOCATION = Pin_183; + adc3_data[1] : LOCATION = Pin_197; + adc3_data[2] : LOCATION = Pin_196; + adc3_data[3] : LOCATION = Pin_195; + adc3_data[4] : LOCATION = Pin_194; + adc3_data[5] : LOCATION = Pin_193; + adc3_data[6] : LOCATION = Pin_188; + adc3_data[7] : LOCATION = Pin_187; + adc3_data[8] : LOCATION = Pin_186; + adc3_data[9] : LOCATION = Pin_185; + adc4_data[0] : LOCATION = Pin_222; + adc4_data[10] : LOCATION = Pin_203; + adc4_data[11] : LOCATION = Pin_202; + adc4_data[1] : LOCATION = Pin_219; + adc4_data[2] : LOCATION = Pin_217; + adc4_data[3] : LOCATION = Pin_216; + adc4_data[4] : LOCATION = Pin_215; + adc4_data[5] : LOCATION = Pin_214; + adc4_data[6] : LOCATION = Pin_213; + adc4_data[7] : LOCATION = Pin_208; + adc4_data[8] : LOCATION = Pin_207; + adc4_data[9] : LOCATION = Pin_206; + adc_oeb[0] : LOCATION = Pin_228; + adc_oeb[1] : LOCATION = Pin_21; + adc_oeb[2] : LOCATION = Pin_181; + adc_oeb[3] : LOCATION = Pin_218; + adc_otr[0] : LOCATION = Pin_233; + adc_otr[1] : LOCATION = Pin_6; + adc_otr[2] : LOCATION = Pin_182; + adc_otr[3] : LOCATION = Pin_201; + adclk0 : LOCATION = Pin_224; + adclk1 : LOCATION = Pin_226; + clk0 : LOCATION = Pin_28; + clk0 : RESERVE_PIN = "AS INPUT TRI-STATED"; + clk0 : IO_STANDARD = LVTTL; + clk1 : LOCATION = Pin_29; + clk1 : RESERVE_PIN = "AS INPUT TRI-STATED"; + clk1 : IO_STANDARD = LVTTL; + clk3 : LOCATION = Pin_152; + clk3 : RESERVE_PIN = "AS INPUT TRI-STATED"; + clk3 : IO_STANDARD = LVTTL; + clk_120mhz : LOCATION = Pin_153; + clk_120mhz : IO_STANDARD = LVTTL; + clk_out : LOCATION = Pin_63; + clk_out : IO_STANDARD = LVTTL; + dac1_data[0] : LOCATION = Pin_165; + dac1_data[10] : LOCATION = Pin_177; + dac1_data[11] : LOCATION = Pin_178; + dac1_data[12] : LOCATION = Pin_179; + dac1_data[13] : LOCATION = Pin_180; + dac1_data[1] : LOCATION = Pin_166; + dac1_data[2] : LOCATION = Pin_167; + dac1_data[3] : LOCATION = Pin_168; + dac1_data[4] : LOCATION = Pin_169; + dac1_data[5] : LOCATION = Pin_170; + dac1_data[6] : LOCATION = Pin_173; + dac1_data[7] : LOCATION = Pin_174; + dac1_data[8] : LOCATION = Pin_175; + dac1_data[9] : LOCATION = Pin_176; + dac2_data[0] : LOCATION = Pin_159; + dac2_data[10] : LOCATION = Pin_163; + dac2_data[11] : LOCATION = Pin_139; + dac2_data[12] : LOCATION = Pin_164; + dac2_data[13] : LOCATION = Pin_138; + dac2_data[1] : LOCATION = Pin_158; + dac2_data[2] : LOCATION = Pin_160; + dac2_data[3] : LOCATION = Pin_156; + dac2_data[4] : LOCATION = Pin_161; + dac2_data[5] : LOCATION = Pin_144; + dac2_data[6] : LOCATION = Pin_162; + dac2_data[7] : LOCATION = Pin_141; + dac2_data[8] : LOCATION = Pin_143; + dac2_data[9] : LOCATION = Pin_140; + dac3_data[0] : LOCATION = Pin_122; + dac3_data[10] : LOCATION = Pin_134; + dac3_data[11] : LOCATION = Pin_135; + dac3_data[12] : LOCATION = Pin_136; + dac3_data[13] : LOCATION = Pin_137; + dac3_data[1] : LOCATION = Pin_123; + dac3_data[2] : LOCATION = Pin_124; + dac3_data[3] : LOCATION = Pin_125; + dac3_data[4] : LOCATION = Pin_126; + dac3_data[5] : LOCATION = Pin_127; + dac3_data[6] : LOCATION = Pin_128; + dac3_data[7] : LOCATION = Pin_131; + dac3_data[8] : LOCATION = Pin_132; + dac3_data[9] : LOCATION = Pin_133; + dac4_data[0] : LOCATION = Pin_104; + dac4_data[10] : LOCATION = Pin_118; + dac4_data[11] : LOCATION = Pin_119; + dac4_data[12] : LOCATION = Pin_120; + dac4_data[13] : LOCATION = Pin_121; + dac4_data[1] : LOCATION = Pin_105; + dac4_data[2] : LOCATION = Pin_106; + dac4_data[3] : LOCATION = Pin_107; + dac4_data[4] : LOCATION = Pin_108; + dac4_data[5] : LOCATION = Pin_113; + dac4_data[6] : LOCATION = Pin_114; + dac4_data[7] : LOCATION = Pin_115; + dac4_data[8] : LOCATION = Pin_116; + dac4_data[9] : LOCATION = Pin_117; + enable_rx : LOCATION = Pin_88; + enable_tx : LOCATION = Pin_93; + gndbus[0] : LOCATION = Pin_223; + gndbus[0] : RESERVE_PIN = "AS INPUT TRI-STATED"; + gndbus[0] : IO_STANDARD = LVTTL; + gndbus[1] : LOCATION = Pin_225; + gndbus[1] : RESERVE_PIN = "AS INPUT TRI-STATED"; + gndbus[1] : IO_STANDARD = LVTTL; + gndbus[2] : LOCATION = Pin_227; + gndbus[2] : RESERVE_PIN = "AS INPUT TRI-STATED"; + gndbus[2] : IO_STANDARD = LVTTL; + gndbus[3] : LOCATION = Pin_62; + gndbus[3] : RESERVE_PIN = "AS INPUT TRI-STATED"; + gndbus[3] : IO_STANDARD = LVTTL; + gndbus[4] : LOCATION = Pin_64; + gndbus[4] : RESERVE_PIN = "AS INPUT TRI-STATED"; + gndbus[4] : IO_STANDARD = LVTTL; + misc_pins[0] : LOCATION = Pin_87; + misc_pins[0] : IO_STANDARD = LVTTL; + misc_pins[10] : LOCATION = Pin_76; + misc_pins[10] : IO_STANDARD = LVTTL; + misc_pins[11] : LOCATION = Pin_74; + misc_pins[11] : IO_STANDARD = LVTTL; + misc_pins[1] : LOCATION = Pin_86; + misc_pins[1] : IO_STANDARD = LVTTL; + misc_pins[2] : LOCATION = Pin_85; + misc_pins[2] : IO_STANDARD = LVTTL; + misc_pins[3] : LOCATION = Pin_84; + misc_pins[3] : IO_STANDARD = LVTTL; + misc_pins[4] : LOCATION = Pin_83; + misc_pins[4] : IO_STANDARD = LVTTL; + misc_pins[5] : LOCATION = Pin_82; + misc_pins[5] : IO_STANDARD = LVTTL; + misc_pins[6] : LOCATION = Pin_79; + misc_pins[6] : IO_STANDARD = LVTTL; + misc_pins[7] : LOCATION = Pin_78; + misc_pins[7] : IO_STANDARD = LVTTL; + misc_pins[8] : LOCATION = Pin_77; + misc_pins[8] : IO_STANDARD = LVTTL; + misc_pins[9] : LOCATION = Pin_75; + misc_pins[9] : IO_STANDARD = LVTTL; + reset : LOCATION = Pin_94; + usbclk : LOCATION = Pin_55; + usbctl[0] : LOCATION = Pin_56; + usbctl[1] : LOCATION = Pin_54; + usbctl[2] : LOCATION = Pin_53; + usbctl[3] : LOCATION = Pin_58; + usbctl[4] : LOCATION = Pin_57; + usbctl[5] : LOCATION = Pin_44; + usbdata[0] : LOCATION = Pin_73; + usbdata[10] : LOCATION = Pin_41; + usbdata[11] : LOCATION = Pin_39; + usbdata[12] : LOCATION = Pin_38; + usbdata[12] : IO_STANDARD = LVTTL; + usbdata[13] : LOCATION = Pin_37; + usbdata[14] : LOCATION = Pin_24; + usbdata[15] : LOCATION = Pin_23; + usbdata[1] : LOCATION = Pin_68; + usbdata[2] : LOCATION = Pin_67; + usbdata[3] : LOCATION = Pin_66; + usbdata[4] : LOCATION = Pin_65; + usbdata[5] : LOCATION = Pin_61; + usbdata[6] : LOCATION = Pin_60; + usbdata[7] : LOCATION = Pin_59; + usbdata[8] : LOCATION = Pin_43; + usbdata[9] : LOCATION = Pin_42; + usbrdy[0] : LOCATION = Pin_45; + usbrdy[1] : LOCATION = Pin_46; + usbrdy[2] : LOCATION = Pin_47; + usbrdy[3] : LOCATION = Pin_48; + usbrdy[4] : LOCATION = Pin_49; + usbrdy[5] : LOCATION = Pin_50; + clear_status : LOCATION = Pin_99; +} diff --git a/gr-gpio/src/fpga/top/usrp_gpio.esf b/gr-gpio/src/fpga/top/usrp_gpio.esf new file mode 100644 index 00000000..5ca38664 --- /dev/null +++ b/gr-gpio/src/fpga/top/usrp_gpio.esf @@ -0,0 +1,14 @@ +SIMULATOR_SETTINGS +{ + ESTIMATE_POWER_CONSUMPTION = OFF; + GLITCH_INTERVAL = 1NS; + GLITCH_DETECTION = OFF; + SIMULATION_COVERAGE = ON; + CHECK_OUTPUTS = OFF; + SETUP_HOLD_DETECTION = OFF; + POWER_ESTIMATION_START_TIME = "0 NS"; + ADD_DEFAULT_PINS_TO_SIMULATION_OUTPUT_WAVEFORMS = ON; + SIMULATION_MODE = TIMING; + START_TIME = 0NS; + USE_COMPILER_SETTINGS = usrp_gpio; +} diff --git a/gr-gpio/src/fpga/top/usrp_gpio.psf b/gr-gpio/src/fpga/top/usrp_gpio.psf new file mode 100644 index 00000000..ff8e6ab0 --- /dev/null +++ b/gr-gpio/src/fpga/top/usrp_gpio.psf @@ -0,0 +1,312 @@ +DEFAULT_DESIGN_ASSISTANT_SETTINGS +{ + HCPY_ALOAD_SIGNALS = OFF; + HCPY_VREF_PINS = OFF; + HCPY_CAT = OFF; + HCPY_ILLEGAL_HC_DEV_PKG = OFF; + ACLK_RULE_IMSZER_ADOMAIN = OFF; + ACLK_RULE_SZER_BTW_ACLK_DOMAIN = OFF; + ACLK_RULE_NO_SZER_ACLK_DOMAIN = OFF; + ACLK_CAT = OFF; + SIGNALRACE_RULE_ASYNCHPIN_SYNCH_CLKPIN = OFF; + SIGNALRACE_CAT = OFF; + NONSYNCHSTRUCT_RULE_LATCH_UNIDENTIFIED = OFF; + NONSYNCHSTRUCT_RULE_SRLATCH = OFF; + NONSYNCHSTRUCT_RULE_DLATCH = OFF; + NONSYNCHSTRUCT_RULE_MULTI_VIBRATOR = OFF; + NONSYNCHSTRUCT_RULE_ILLEGAL_PULSE_GEN = OFF; + NONSYNCHSTRUCT_RULE_RIPPLE_CLK = OFF; + NONSYNCHSTRUCT_RULE_DELAY_CHAIN = OFF; + NONSYNCHSTRUCT_RULE_REG_LOOP = OFF; + NONSYNCHSTRUCT_RULE_COMBLOOP = OFF; + NONSYNCHSTRUCT_CAT = OFF; + NONSYNCHSTRUCT_RULE_COMB_DRIVES_RAM_WE = OFF; + TIMING_RULE_COIN_CLKEDGE = OFF; + TIMING_RULE_SHIFT_REG = OFF; + TIMING_RULE_HIGH_FANOUTS = OFF; + TIMING_CAT = OFF; + RESET_RULE_ALL = OFF; + RESET_RULE_IMSYNCH_ASYNCH_DOMAIN = OFF; + RESET_RULE_UNSYNCH_ASYNCH_DOMAIN = OFF; + RESET_RULE_REG_ASNYCH = OFF; + RESET_RULE_COMB_ASYNCH_RESET = OFF; + RESET_RULE_IMSYNCH_EXRESET = OFF; + RESET_RULE_UNSYNCH_EXRESET = OFF; + RESET_RULE_INPINS_RESETNET = OFF; + RESET_CAT = OFF; + CLK_RULE_ALL = OFF; + CLK_RULE_MIX_EDGES = OFF; + CLK_RULE_CLKNET_CLKSPINES = OFF; + CLK_RULE_INPINS_CLKNET = OFF; + CLK_RULE_GATING_SCHEME = OFF; + CLK_RULE_INV_CLOCK = OFF; + CLK_RULE_COMB_CLOCK = OFF; + CLK_CAT = OFF; + HCPY_EXCEED_USER_IO_USAGE = OFF; + HCPY_EXCEED_RAM_USAGE = OFF; + NONSYNCHSTRUCT_RULE_ASYN_RAM = OFF; + SIGNALRACE_RULE_TRISTATE = OFF; + ASSG_RULE_MISSING_TIMING = OFF; + ASSG_RULE_MISSING_FMAX = OFF; + ASSG_CAT = OFF; +} +SYNTHESIS_FITTING_SETTINGS +{ + AUTO_SHIFT_REGISTER_RECOGNITION = ON; + AUTO_DSP_RECOGNITION = ON; + AUTO_RAM_RECOGNITION = ON; + REMOVE_DUPLICATE_LOGIC = ON; + AUTO_TURBO_BIT = ON; + AUTO_MERGE_PLLS = ON; + AUTO_OPEN_DRAIN_PINS = ON; + AUTO_PARALLEL_EXPANDERS = ON; + AUTO_FAST_OUTPUT_ENABLE_REGISTERS = OFF; + AUTO_FAST_OUTPUT_REGISTERS = OFF; + AUTO_FAST_INPUT_REGISTERS = OFF; + AUTO_CASCADE_CHAINS = ON; + AUTO_CARRY_CHAINS = ON; + AUTO_DELAY_CHAINS = ON; + MAX7000_PARALLEL_EXPANDER_CHAIN_LENGTH = 4; + PARALLEL_EXPANDER_CHAIN_LENGTH = 16; + CASCADE_CHAIN_LENGTH = 2; + STRATIX_CARRY_CHAIN_LENGTH = 70; + MERCURY_CARRY_CHAIN_LENGTH = 48; + FLEX10K_CARRY_CHAIN_LENGTH = 32; + FLEX6K_CARRY_CHAIN_LENGTH = 32; + CARRY_CHAIN_LENGTH = 48; + CARRY_OUT_PINS_LCELL_INSERT = ON; + NORMAL_LCELL_INSERT = ON; + AUTO_LCELL_INSERTION = ON; + ALLOW_XOR_GATE_USAGE = ON; + AUTO_PACKED_REGISTERS_STRATIX = NORMAL; + AUTO_PACKED_REGISTERS = OFF; + AUTO_PACKED_REG_CYCLONE = NORMAL; + FLEX10K_OPTIMIZATION_TECHNIQUE = AREA; + FLEX6K_OPTIMIZATION_TECHNIQUE = AREA; + MERCURY_OPTIMIZATION_TECHNIQUE = AREA; + APEX20K_OPTIMIZATION_TECHNIQUE = SPEED; + MAX7000_OPTIMIZATION_TECHNIQUE = SPEED; + STRATIX_OPTIMIZATION_TECHNIQUE = SPEED; + CYCLONE_OPTIMIZATION_TECHNIQUE = AREA; + FLEX10K_TECHNOLOGY_MAPPER = LUT; + FLEX6K_TECHNOLOGY_MAPPER = LUT; + MERCURY_TECHNOLOGY_MAPPER = LUT; + APEX20K_TECHNOLOGY_MAPPER = LUT; + MAX7000_TECHNOLOGY_MAPPER = "PRODUCT TERM"; + STRATIX_TECHNOLOGY_MAPPER = LUT; + AUTO_IMPLEMENT_IN_ROM = OFF; + AUTO_GLOBAL_MEMORY_CONTROLS = OFF; + AUTO_GLOBAL_REGISTER_CONTROLS = ON; + AUTO_GLOBAL_OE = ON; + AUTO_GLOBAL_CLOCK = ON; + USE_LPM_FOR_AHDL_OPERATORS = ON; + LIMIT_AHDL_INTEGERS_TO_32_BITS = OFF; + ENABLE_BUS_HOLD_CIRCUITRY = OFF; + WEAK_PULL_UP_RESISTOR = OFF; + TURBO_BIT = ON; + MAX7000_IGNORE_SOFT_BUFFERS = OFF; + IGNORE_SOFT_BUFFERS = ON; + MAX7000_IGNORE_LCELL_BUFFERS = AUTO; + IGNORE_LCELL_BUFFERS = OFF; + IGNORE_ROW_GLOBAL_BUFFERS = OFF; + IGNORE_GLOBAL_BUFFERS = OFF; + IGNORE_CASCADE_BUFFERS = OFF; + IGNORE_CARRY_BUFFERS = OFF; + REMOVE_DUPLICATE_REGISTERS = ON; + REMOVE_REDUNDANT_LOGIC_CELLS = OFF; + ALLOW_POWER_UP_DONT_CARE = ON; + PCI_IO = OFF; + NOT_GATE_PUSH_BACK = ON; + SLOW_SLEW_RATE = OFF; + DSP_BLOCK_BALANCING = AUTO; + STATE_MACHINE_PROCESSING = AUTO; +} +DEFAULT_HARDCOPY_SETTINGS +{ + HARDCOPY_EXTERNAL_CLOCK_JITTER = "0.0 NS"; +} +DEFAULT_TIMING_REQUIREMENTS +{ + INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS = OFF; + RUN_ALL_TIMING_ANALYSES = ON; + IGNORE_CLOCK_SETTINGS = OFF; + DEFAULT_HOLD_MULTICYCLE = "SAME AS MULTICYCLE"; + CUT_OFF_IO_PIN_FEEDBACK = ON; + CUT_OFF_CLEAR_AND_PRESET_PATHS = ON; + CUT_OFF_READ_DURING_WRITE_PATHS = ON; + CUT_OFF_PATHS_BETWEEN_CLOCK_DOMAINS = ON; + DO_MIN_ANALYSIS = ON; + DO_MIN_TIMING = OFF; + NUMBER_OF_PATHS_TO_REPORT = 200; + NUMBER_OF_DESTINATION_TO_REPORT = 10; + NUMBER_OF_SOURCES_PER_DESTINATION_TO_REPORT = 10; + MAX_SCC_SIZE = 50; +} +HDL_SETTINGS +{ + VERILOG_INPUT_VERSION = VERILOG_2001; + ENABLE_IP_DEBUG = OFF; + VHDL_INPUT_VERSION = VHDL93; + VHDL_SHOW_LMF_MAPPING_MESSAGES = OFF; +} +PROJECT_INFO(usrp_gpio) +{ + ORIGINAL_QUARTUS_VERSION = 3.0; + PROJECT_CREATION_TIME_DATE = "00:14:04 JULY 13, 2003"; + LAST_QUARTUS_VERSION = 3.0; + SHOW_REGISTRATION_MESSAGE = ON; + USER_LIBRARIES = "e:\usrp\fpga\megacells"; +} +THIRD_PARTY_EDA_TOOLS(usrp_gpio) +{ + EDA_DESIGN_ENTRY_SYNTHESIS_TOOL = ""; + EDA_SIMULATION_TOOL = ""; + EDA_TIMING_ANALYSIS_TOOL = ""; + EDA_BOARD_DESIGN_TOOL = ""; + EDA_FORMAL_VERIFICATION_TOOL = ""; + EDA_RESYNTHESIS_TOOL = ""; +} +EDA_TOOL_SETTINGS(eda_design_synthesis) +{ + EDA_INPUT_GND_NAME = GND; + EDA_INPUT_VCC_NAME = VCC; + EDA_SHOW_LMF_MAPPING_MESSAGES = OFF; + EDA_RUN_TOOL_AUTOMATICALLY = OFF; + EDA_INPUT_DATA_FORMAT = EDIF; + EDA_OUTPUT_DATA_FORMAT = NONE; + USE_GENERATED_PHYSICAL_CONSTRAINTS = ON; + RESYNTHESIS_PHYSICAL_SYNTHESIS = NORMAL; + RESYNTHESIS_OPTIMIZATION_EFFORT = NORMAL; + RESYNTHESIS_RETIMING = FULL; +} +EDA_TOOL_SETTINGS(eda_simulation) +{ + EDA_INCLUDE_VHDL_CONFIGURATION_DECLARATION = OFF; + EDA_TRUNCATE_LONG_HIERARCHY_PATHS = OFF; + EDA_MAINTAIN_DESIGN_HIERARCHY = OFF; + EDA_WRITE_DEVICE_CONTROL_PORTS = OFF; + EDA_GENERATE_FUNCTIONAL_NETLIST = OFF; + EDA_FLATTEN_BUSES = OFF; + EDA_MAP_ILLEGAL_CHARACTERS = OFF; + EDA_EXCALIBUR_ATOMS_AS_SINGLE_STRIPE = OFF; + EDA_RUN_TOOL_AUTOMATICALLY = OFF; + EDA_OUTPUT_DATA_FORMAT = NONE; + USE_GENERATED_PHYSICAL_CONSTRAINTS = ON; + RESYNTHESIS_PHYSICAL_SYNTHESIS = NORMAL; + RESYNTHESIS_OPTIMIZATION_EFFORT = NORMAL; + RESYNTHESIS_RETIMING = FULL; +} +EDA_TOOL_SETTINGS(eda_timing_analysis) +{ + EDA_INCLUDE_VHDL_CONFIGURATION_DECLARATION = OFF; + EDA_TRUNCATE_LONG_HIERARCHY_PATHS = OFF; + EDA_MAINTAIN_DESIGN_HIERARCHY = OFF; + EDA_WRITE_DEVICE_CONTROL_PORTS = OFF; + EDA_GENERATE_FUNCTIONAL_NETLIST = OFF; + EDA_FLATTEN_BUSES = OFF; + EDA_MAP_ILLEGAL_CHARACTERS = OFF; + EDA_EXCALIBUR_ATOMS_AS_SINGLE_STRIPE = OFF; + EDA_RUN_TOOL_AUTOMATICALLY = OFF; + EDA_OUTPUT_DATA_FORMAT = NONE; + EDA_LAUNCH_CMD_LINE_TOOL = OFF; + USE_GENERATED_PHYSICAL_CONSTRAINTS = ON; + RESYNTHESIS_PHYSICAL_SYNTHESIS = NORMAL; + RESYNTHESIS_OPTIMIZATION_EFFORT = NORMAL; + RESYNTHESIS_RETIMING = FULL; +} +EDA_TOOL_SETTINGS(eda_board_design) +{ + EDA_INCLUDE_VHDL_CONFIGURATION_DECLARATION = OFF; + EDA_TRUNCATE_LONG_HIERARCHY_PATHS = OFF; + EDA_MAINTAIN_DESIGN_HIERARCHY = OFF; + EDA_WRITE_DEVICE_CONTROL_PORTS = OFF; + EDA_GENERATE_FUNCTIONAL_NETLIST = OFF; + EDA_FLATTEN_BUSES = OFF; + EDA_MAP_ILLEGAL_CHARACTERS = OFF; + EDA_EXCALIBUR_ATOMS_AS_SINGLE_STRIPE = OFF; + EDA_RUN_TOOL_AUTOMATICALLY = OFF; + EDA_OUTPUT_DATA_FORMAT = NONE; + USE_GENERATED_PHYSICAL_CONSTRAINTS = ON; + RESYNTHESIS_PHYSICAL_SYNTHESIS = NORMAL; + RESYNTHESIS_OPTIMIZATION_EFFORT = NORMAL; + RESYNTHESIS_RETIMING = FULL; +} +EDA_TOOL_SETTINGS(eda_formal_verification) +{ + EDA_INCLUDE_VHDL_CONFIGURATION_DECLARATION = OFF; + EDA_TRUNCATE_LONG_HIERARCHY_PATHS = OFF; + EDA_MAINTAIN_DESIGN_HIERARCHY = OFF; + EDA_WRITE_DEVICE_CONTROL_PORTS = OFF; + EDA_GENERATE_FUNCTIONAL_NETLIST = OFF; + EDA_FLATTEN_BUSES = OFF; + EDA_MAP_ILLEGAL_CHARACTERS = OFF; + EDA_EXCALIBUR_ATOMS_AS_SINGLE_STRIPE = OFF; + EDA_RUN_TOOL_AUTOMATICALLY = OFF; + EDA_OUTPUT_DATA_FORMAT = NONE; + USE_GENERATED_PHYSICAL_CONSTRAINTS = ON; + RESYNTHESIS_PHYSICAL_SYNTHESIS = NORMAL; + RESYNTHESIS_OPTIMIZATION_EFFORT = NORMAL; + RESYNTHESIS_RETIMING = FULL; +} +EDA_TOOL_SETTINGS(eda_palace) +{ + EDA_INCLUDE_VHDL_CONFIGURATION_DECLARATION = OFF; + EDA_TRUNCATE_LONG_HIERARCHY_PATHS = OFF; + EDA_MAINTAIN_DESIGN_HIERARCHY = OFF; + EDA_WRITE_DEVICE_CONTROL_PORTS = OFF; + EDA_GENERATE_FUNCTIONAL_NETLIST = OFF; + EDA_FLATTEN_BUSES = OFF; + EDA_MAP_ILLEGAL_CHARACTERS = OFF; + EDA_EXCALIBUR_ATOMS_AS_SINGLE_STRIPE = OFF; + EDA_RUN_TOOL_AUTOMATICALLY = OFF; + EDA_OUTPUT_DATA_FORMAT = NONE; + RESYNTHESIS_RETIMING = FULL; + RESYNTHESIS_PHYSICAL_SYNTHESIS = NORMAL; + RESYNTHESIS_OPTIMIZATION_EFFORT = NORMAL; + USE_GENERATED_PHYSICAL_CONSTRAINTS = ON; +} +CLOCK(clk_120mhz) +{ + FMAX_REQUIREMENT = "120.0 MHz"; + INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS = OFF; + DUTY_CYCLE = 50; + DIVIDE_BASE_CLOCK_PERIOD_BY = 1; + MULTIPLY_BASE_CLOCK_PERIOD_BY = 1; + INVERT_BASE_CLOCK = OFF; +} +CLOCK(usbclk) +{ + FMAX_REQUIREMENT = "48.0 MHz"; + INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS = OFF; + DUTY_CYCLE = 50; + DIVIDE_BASE_CLOCK_PERIOD_BY = 1; + MULTIPLY_BASE_CLOCK_PERIOD_BY = 1; + INVERT_BASE_CLOCK = OFF; +} +CLOCK(SCLK) +{ + FMAX_REQUIREMENT = "1.0 MHz"; + INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS = OFF; + DUTY_CYCLE = 50; + DIVIDE_BASE_CLOCK_PERIOD_BY = 1; + MULTIPLY_BASE_CLOCK_PERIOD_BY = 1; + INVERT_BASE_CLOCK = OFF; +} +CLOCK(adclk0) +{ + FMAX_REQUIREMENT = "60.0 MHz"; + INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS = OFF; + DUTY_CYCLE = 50; + DIVIDE_BASE_CLOCK_PERIOD_BY = 1; + MULTIPLY_BASE_CLOCK_PERIOD_BY = 1; + INVERT_BASE_CLOCK = OFF; +} +CLOCK(adclk1) +{ + FMAX_REQUIREMENT = "60.0 MHz"; + INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS = OFF; + DUTY_CYCLE = 50; + DIVIDE_BASE_CLOCK_PERIOD_BY = 1; + MULTIPLY_BASE_CLOCK_PERIOD_BY = 1; + INVERT_BASE_CLOCK = OFF; +} diff --git a/gr-gpio/src/fpga/top/usrp_gpio.qpf b/gr-gpio/src/fpga/top/usrp_gpio.qpf new file mode 100644 index 00000000..7eb8da9e --- /dev/null +++ b/gr-gpio/src/fpga/top/usrp_gpio.qpf @@ -0,0 +1,29 @@ +# Copyright (C) 1991-2004 Altera Corporation +# Any megafunction design, and related netlist (encrypted or decrypted), +# support information, device programming or simulation file, and any other +# associated documentation or information provided by Altera or a partner +# under Altera's Megafunction Partnership Program may be used only +# to program PLD devices (but not masked PLD devices) from Altera. Any +# other use of such megafunction design, netlist, support information, +# device programming or simulation file, or any other related documentation +# or information is prohibited for any other purpose, including, but not +# limited to modification, reverse engineering, de-compiling, or use with +# any other silicon devices, unless such use is explicitly licensed under +# a separate agreement with Altera or a megafunction partner. Title to the +# intellectual property, including patents, copyrights, trademarks, trade +# secrets, or maskworks, embodied in any such megafunction design, netlist, +# support information, device programming or simulation file, or any other +# related documentation or information provided by Altera or a megafunction +# partner, remains with Altera, the megafunction partner, or their respective +# licensors. No other licenses, including any licenses needed under any third +# party's intellectual property, are provided herein. + + + +QUARTUS_VERSION = "4.0" +DATE = "17:10:11 December 20, 2004" + + +# Active Revisions + +PROJECT_REVISION = "usrp_gpio" diff --git a/gr-gpio/src/fpga/top/usrp_gpio.qsf b/gr-gpio/src/fpga/top/usrp_gpio.qsf new file mode 100644 index 00000000..4132dcca --- /dev/null +++ b/gr-gpio/src/fpga/top/usrp_gpio.qsf @@ -0,0 +1,410 @@ +# Copyright (C) 1991-2005 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. + + +# The default values for assignments are stored in the file +# usrp_gpio_assignment_defaults.qdf +# If this file doesn't exist, and for assignments not listed, see file +# assignment_defaults.qdf + +# Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. + + +# Project-Wide Assignments +# ======================== +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 3.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "00:14:04 JULY 13, 2003" +set_global_assignment -name LAST_QUARTUS_VERSION "7.1 SP1" + +# Pin & Location Assignments +# ========================== +set_global_assignment -name RESERVE_PIN "AS INPUT TRI-STATED" +set_location_assignment PIN_29 -to SCLK +set_location_assignment PIN_117 -to SDI +set_location_assignment PIN_28 -to usbclk +set_location_assignment PIN_107 -to usbctl[0] +set_location_assignment PIN_106 -to usbctl[1] +set_location_assignment PIN_105 -to usbctl[2] +set_location_assignment PIN_100 -to usbdata[0] +set_location_assignment PIN_84 -to usbdata[10] +set_location_assignment PIN_83 -to usbdata[11] +set_location_assignment PIN_82 -to usbdata[12] +set_location_assignment PIN_79 -to usbdata[13] +set_location_assignment PIN_78 -to usbdata[14] +set_location_assignment PIN_77 -to usbdata[15] +set_location_assignment PIN_99 -to usbdata[1] +set_location_assignment PIN_98 -to usbdata[2] +set_location_assignment PIN_95 -to usbdata[3] +set_location_assignment PIN_94 -to usbdata[4] +set_location_assignment PIN_93 -to usbdata[5] +set_location_assignment PIN_88 -to usbdata[6] +set_location_assignment PIN_87 -to usbdata[7] +set_location_assignment PIN_86 -to usbdata[8] +set_location_assignment PIN_85 -to usbdata[9] +set_location_assignment PIN_104 -to usbrdy[0] +set_location_assignment PIN_101 -to usbrdy[1] +set_location_assignment PIN_76 -to FX2_1 +set_location_assignment PIN_75 -to FX2_2 +set_location_assignment PIN_74 -to FX2_3 +set_location_assignment PIN_116 -to io_rx_a[0] +set_location_assignment PIN_115 -to io_rx_a[1] +set_location_assignment PIN_114 -to io_rx_a[2] +set_location_assignment PIN_113 -to io_rx_a[3] +set_location_assignment PIN_108 -to io_rx_a[4] +set_location_assignment PIN_195 -to io_rx_a[5] +set_location_assignment PIN_196 -to io_rx_a[6] +set_location_assignment PIN_197 -to io_rx_a[7] +set_location_assignment PIN_200 -to io_rx_a[8] +set_location_assignment PIN_201 -to io_rx_a[9] +set_location_assignment PIN_202 -to io_rx_a[10] +set_location_assignment PIN_203 -to io_rx_a[11] +set_location_assignment PIN_206 -to io_rx_a[12] +set_location_assignment PIN_207 -to io_rx_a[13] +set_location_assignment PIN_208 -to io_rx_a[14] +set_location_assignment PIN_214 -to io_rx_b[0] +set_location_assignment PIN_215 -to io_rx_b[1] +set_location_assignment PIN_216 -to io_rx_b[2] +set_location_assignment PIN_217 -to io_rx_b[3] +set_location_assignment PIN_218 -to io_rx_b[4] +set_location_assignment PIN_219 -to io_rx_b[5] +set_location_assignment PIN_222 -to io_rx_b[6] +set_location_assignment PIN_223 -to io_rx_b[7] +set_location_assignment PIN_224 -to io_rx_b[8] +set_location_assignment PIN_225 -to io_rx_b[9] +set_location_assignment PIN_226 -to io_rx_b[10] +set_location_assignment PIN_227 -to io_rx_b[11] +set_location_assignment PIN_228 -to io_rx_b[12] +set_location_assignment PIN_233 -to io_rx_b[13] +set_location_assignment PIN_234 -to io_rx_b[14] +set_location_assignment PIN_175 -to io_tx_a[0] +set_location_assignment PIN_176 -to io_tx_a[1] +set_location_assignment PIN_177 -to io_tx_a[2] +set_location_assignment PIN_178 -to io_tx_a[3] +set_location_assignment PIN_179 -to io_tx_a[4] +set_location_assignment PIN_180 -to io_tx_a[5] +set_location_assignment PIN_181 -to io_tx_a[6] +set_location_assignment PIN_182 -to io_tx_a[7] +set_location_assignment PIN_183 -to io_tx_a[8] +set_location_assignment PIN_184 -to io_tx_a[9] +set_location_assignment PIN_185 -to io_tx_a[10] +set_location_assignment PIN_186 -to io_tx_a[11] +set_location_assignment PIN_187 -to io_tx_a[12] +set_location_assignment PIN_188 -to io_tx_a[13] +set_location_assignment PIN_193 -to io_tx_a[14] +set_location_assignment PIN_73 -to io_tx_b[0] +set_location_assignment PIN_68 -to io_tx_b[1] +set_location_assignment PIN_67 -to io_tx_b[2] +set_location_assignment PIN_66 -to io_tx_b[3] +set_location_assignment PIN_65 -to io_tx_b[4] +set_location_assignment PIN_64 -to io_tx_b[5] +set_location_assignment PIN_63 -to io_tx_b[6] +set_location_assignment PIN_62 -to io_tx_b[7] +set_location_assignment PIN_61 -to io_tx_b[8] +set_location_assignment PIN_60 -to io_tx_b[9] +set_location_assignment PIN_59 -to io_tx_b[10] +set_location_assignment PIN_58 -to io_tx_b[11] +set_location_assignment PIN_57 -to io_tx_b[12] +set_location_assignment PIN_56 -to io_tx_b[13] +set_location_assignment PIN_55 -to io_tx_b[14] +set_location_assignment PIN_152 -to master_clk +set_location_assignment PIN_144 -to rx_a_a[0] +set_location_assignment PIN_143 -to rx_a_a[1] +set_location_assignment PIN_141 -to rx_a_a[2] +set_location_assignment PIN_140 -to rx_a_a[3] +set_location_assignment PIN_139 -to rx_a_a[4] +set_location_assignment PIN_138 -to rx_a_a[5] +set_location_assignment PIN_137 -to rx_a_a[6] +set_location_assignment PIN_136 -to rx_a_a[7] +set_location_assignment PIN_135 -to rx_a_a[8] +set_location_assignment PIN_134 -to rx_a_a[9] +set_location_assignment PIN_133 -to rx_a_a[10] +set_location_assignment PIN_132 -to rx_a_a[11] +set_location_assignment PIN_23 -to rx_a_b[0] +set_location_assignment PIN_21 -to rx_a_b[1] +set_location_assignment PIN_20 -to rx_a_b[2] +set_location_assignment PIN_19 -to rx_a_b[3] +set_location_assignment PIN_18 -to rx_a_b[4] +set_location_assignment PIN_17 -to rx_a_b[5] +set_location_assignment PIN_16 -to rx_a_b[6] +set_location_assignment PIN_15 -to rx_a_b[7] +set_location_assignment PIN_14 -to rx_a_b[8] +set_location_assignment PIN_13 -to rx_a_b[9] +set_location_assignment PIN_12 -to rx_a_b[10] +set_location_assignment PIN_11 -to rx_a_b[11] +set_location_assignment PIN_131 -to rx_b_a[0] +set_location_assignment PIN_128 -to rx_b_a[1] +set_location_assignment PIN_127 -to rx_b_a[2] +set_location_assignment PIN_126 -to rx_b_a[3] +set_location_assignment PIN_125 -to rx_b_a[4] +set_location_assignment PIN_124 -to rx_b_a[5] +set_location_assignment PIN_123 -to rx_b_a[6] +set_location_assignment PIN_122 -to rx_b_a[7] +set_location_assignment PIN_121 -to rx_b_a[8] +set_location_assignment PIN_120 -to rx_b_a[9] +set_location_assignment PIN_119 -to rx_b_a[10] +set_location_assignment PIN_118 -to rx_b_a[11] +set_location_assignment PIN_8 -to rx_b_b[0] +set_location_assignment PIN_7 -to rx_b_b[1] +set_location_assignment PIN_6 -to rx_b_b[2] +set_location_assignment PIN_5 -to rx_b_b[3] +set_location_assignment PIN_4 -to rx_b_b[4] +set_location_assignment PIN_3 -to rx_b_b[5] +set_location_assignment PIN_2 -to rx_b_b[6] +set_location_assignment PIN_240 -to rx_b_b[7] +set_location_assignment PIN_239 -to rx_b_b[8] +set_location_assignment PIN_238 -to rx_b_b[9] +set_location_assignment PIN_237 -to rx_b_b[10] +set_location_assignment PIN_236 -to rx_b_b[11] +set_location_assignment PIN_156 -to SDO +set_location_assignment PIN_153 -to SEN_FPGA +set_location_assignment PIN_159 -to tx_a[0] +set_location_assignment PIN_160 -to tx_a[1] +set_location_assignment PIN_161 -to tx_a[2] +set_location_assignment PIN_162 -to tx_a[3] +set_location_assignment PIN_163 -to tx_a[4] +set_location_assignment PIN_164 -to tx_a[5] +set_location_assignment PIN_165 -to tx_a[6] +set_location_assignment PIN_166 -to tx_a[7] +set_location_assignment PIN_167 -to tx_a[8] +set_location_assignment PIN_168 -to tx_a[9] +set_location_assignment PIN_169 -to tx_a[10] +set_location_assignment PIN_170 -to tx_a[11] +set_location_assignment PIN_173 -to tx_a[12] +set_location_assignment PIN_174 -to tx_a[13] +set_location_assignment PIN_38 -to tx_b[0] +set_location_assignment PIN_39 -to tx_b[1] +set_location_assignment PIN_41 -to tx_b[2] +set_location_assignment PIN_42 -to tx_b[3] +set_location_assignment PIN_43 -to tx_b[4] +set_location_assignment PIN_44 -to tx_b[5] +set_location_assignment PIN_45 -to tx_b[6] +set_location_assignment PIN_46 -to tx_b[7] +set_location_assignment PIN_47 -to tx_b[8] +set_location_assignment PIN_48 -to tx_b[9] +set_location_assignment PIN_49 -to tx_b[10] +set_location_assignment PIN_50 -to tx_b[11] +set_location_assignment PIN_53 -to tx_b[12] +set_location_assignment PIN_54 -to tx_b[13] +set_location_assignment PIN_158 -to TXSYNC_A +set_location_assignment PIN_37 -to TXSYNC_B +set_location_assignment PIN_235 -to io_rx_b[15] +set_location_assignment PIN_24 -to io_tx_b[15] +set_location_assignment PIN_213 -to io_rx_a[15] +set_location_assignment PIN_194 -to io_tx_a[15] +set_location_assignment PIN_1 -to MYSTERY_SIGNAL + +# Timing Assignments +# ================== +set_global_assignment -name INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS OFF + +# Analysis & Synthesis Assignments +# ================================ +set_global_assignment -name SAVE_DISK_SPACE OFF +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 240 +set_global_assignment -name EDA_DESIGN_ENTRY_SYNTHESIS_TOOL "" +set_global_assignment -name FAMILY Cyclone +set_global_assignment -name CYCLONE_OPTIMIZATION_TECHNIQUE BALANCED +set_global_assignment -name STRATIX_OPTIMIZATION_TECHNIQUE SPEED +set_global_assignment -name APEX20K_OPTIMIZATION_TECHNIQUE SPEED +set_global_assignment -name TOP_LEVEL_ENTITY usrp_gpio +set_global_assignment -name VHDL_SHOW_LMF_MAPPING_MESSAGES OFF +set_global_assignment -name USER_LIBRARIES "e:\\usrp\\fpga\\megacells" +set_global_assignment -name AUTO_ENABLE_SMART_COMPILE ON + +# Fitter Assignments +# ================== +set_global_assignment -name DEVICE EP1C12Q240C8 +set_global_assignment -name CYCLONE_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED" +set_global_assignment -name OPTIMIZE_HOLD_TIMING OFF +set_global_assignment -name OPTIMIZE_TIMING "NORMAL COMPILATION" +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC OFF +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION OFF +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING OFF +set_global_assignment -name IO_PLACEMENT_OPTIMIZATION OFF +set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT NORMAL +set_global_assignment -name INC_PLC_MODE OFF +set_global_assignment -name ROUTING_BACK_ANNOTATION_MODE OFF +set_instance_assignment -name IO_STANDARD LVTTL -to usbdata[12] +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD LVTTL +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 + +# Timing Analysis Assignments +# =========================== +set_global_assignment -name MAX_SCC_SIZE 50 + +# EDA Netlist Writer Assignments +# ============================== +set_global_assignment -name EDA_SIMULATION_TOOL "" +set_global_assignment -name EDA_TIMING_ANALYSIS_TOOL "" +set_global_assignment -name EDA_BOARD_DESIGN_TOOL "" +set_global_assignment -name EDA_FORMAL_VERIFICATION_TOOL "" +set_global_assignment -name EDA_RESYNTHESIS_TOOL "" + +# Assembler Assignments +# ===================== +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_NO_OUTPUT_GND "AS INPUT TRI-STATED" +set_global_assignment -name AUTO_RESTART_CONFIGURATION OFF + +# Simulator Assignments +# ===================== +set_global_assignment -name START_TIME "0 ns" +set_global_assignment -name GLITCH_INTERVAL "1 ns" + +# Design Assistant Assignments +# ============================ +set_global_assignment -name DRC_REPORT_TOP_FANOUT OFF +set_global_assignment -name DRC_REPORT_FANOUT_EXCEEDING OFF +set_global_assignment -name ASSG_CAT OFF +set_global_assignment -name ASSG_RULE_MISSING_FMAX OFF +set_global_assignment -name ASSG_RULE_MISSING_TIMING OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_ASYN_RAM OFF +set_global_assignment -name CLK_CAT OFF +set_global_assignment -name CLK_RULE_COMB_CLOCK OFF +set_global_assignment -name CLK_RULE_INV_CLOCK OFF +set_global_assignment -name CLK_RULE_GATING_SCHEME OFF +set_global_assignment -name CLK_RULE_INPINS_CLKNET OFF +set_global_assignment -name CLK_RULE_CLKNET_CLKSPINES OFF +set_global_assignment -name CLK_RULE_MIX_EDGES OFF +set_global_assignment -name RESET_CAT OFF +set_global_assignment -name RESET_RULE_INPINS_RESETNET OFF +set_global_assignment -name RESET_RULE_UNSYNCH_EXRESET OFF +set_global_assignment -name RESET_RULE_IMSYNCH_EXRESET OFF +set_global_assignment -name RESET_RULE_COMB_ASYNCH_RESET OFF +set_global_assignment -name RESET_RULE_UNSYNCH_ASYNCH_DOMAIN OFF +set_global_assignment -name RESET_RULE_IMSYNCH_ASYNCH_DOMAIN OFF +set_global_assignment -name TIMING_CAT OFF +set_global_assignment -name TIMING_RULE_SHIFT_REG OFF +set_global_assignment -name TIMING_RULE_COIN_CLKEDGE OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_COMB_DRIVES_RAM_WE OFF +set_global_assignment -name NONSYNCHSTRUCT_CAT OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_COMBLOOP OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_REG_LOOP OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_DELAY_CHAIN OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_RIPPLE_CLK OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_ILLEGAL_PULSE_GEN OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_MULTI_VIBRATOR OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_SRLATCH OFF +set_global_assignment -name NONSYNCHSTRUCT_RULE_LATCH_UNIDENTIFIED OFF +set_global_assignment -name SIGNALRACE_CAT OFF +set_global_assignment -name ACLK_CAT OFF +set_global_assignment -name ACLK_RULE_NO_SZER_ACLK_DOMAIN OFF +set_global_assignment -name ACLK_RULE_SZER_BTW_ACLK_DOMAIN OFF +set_global_assignment -name ACLK_RULE_IMSZER_ADOMAIN OFF +set_global_assignment -name HCPY_CAT OFF +set_global_assignment -name HCPY_VREF_PINS OFF + +# SignalTap II Assignments +# ======================== +set_global_assignment -name HUB_ENTITY_NAME SLD_HUB +set_global_assignment -name HUB_INSTANCE_NAME SLD_HUB_INST +set_global_assignment -name ENABLE_SIGNALTAP OFF + +# LogicLock Region Assignments +# ============================ +set_global_assignment -name LOGICLOCK_INCREMENTAL_COMPILE_ASSIGNMENT OFF + +# ----------------- +# start CLOCK(SCLK) + + # Timing Assignments + # ================== +set_global_assignment -name DUTY_CYCLE 50 -section_id SCLK +set_global_assignment -name FMAX_REQUIREMENT "1 MHz" -section_id SCLK +set_global_assignment -name INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS OFF -section_id SCLK + +# end CLOCK(SCLK) +# --------------- + +# ----------------------- +# start CLOCK(master_clk) + + # Timing Assignments + # ================== +set_global_assignment -name DUTY_CYCLE 50 -section_id master_clk +set_global_assignment -name FMAX_REQUIREMENT "64 MHz" -section_id master_clk +set_global_assignment -name INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS OFF -section_id master_clk + +# end CLOCK(master_clk) +# --------------------- + +# ------------------- +# start CLOCK(usbclk) + + # Timing Assignments + # ================== +set_global_assignment -name DUTY_CYCLE 50 -section_id usbclk +set_global_assignment -name FMAX_REQUIREMENT "48 MHz" -section_id usbclk +set_global_assignment -name INCLUDE_EXTERNAL_PIN_DELAYS_IN_FMAX_CALCULATIONS OFF -section_id usbclk + +# end CLOCK(usbclk) +# ----------------- + +# ---------------------- +# start ENTITY(usrp_gpio) + + # Timing Assignments + # ================== +set_instance_assignment -name CLOCK_SETTINGS SCLK -to SCLK +set_instance_assignment -name CLOCK_SETTINGS usbclk -to usbclk +set_instance_assignment -name CLOCK_SETTINGS master_clk -to master_clk + +# end ENTITY(usrp_gpio) +# -------------------- + +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_gpio.v +set_global_assignment -name VERILOG_FILE ../lib/gpio_input.v +set_global_assignment -name VERILOG_FILE ../lib/io_pins.v +set_global_assignment -name VERILOG_FILE ../lib/rx_chain_dig.v +set_global_assignment -name VERILOG_FILE ../lib/tx_chain_dig.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/atr_delay.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/cic_dec_shifter.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/rssi.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/ram16.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/megacells/fifo_4k.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/megacells/bustri.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/megacells/fifo_4k_18.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/hb/acc.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/hb/mult.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/hb/ram16_2sum.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/hb/coeff_rom.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/hb/halfband_decim.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/hb/mac.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/tx_chain.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/rx_dcoffset.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/adc_interface.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/setting_reg.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/bidir_reg.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/cic_int_shifter.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/rx_chain.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/gen_sync.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/master_control.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/rx_buffer.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/tx_buffer.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/phase_acc.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/cic_interp.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/cic_decim.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/cordic_stage.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/cordic.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/clk_divider.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/serial_io.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/strobe_gen.v +set_global_assignment -name VERILOG_FILE ../../../../usrp/fpga/sdr_lib/sign_extend.v \ No newline at end of file diff --git a/gr-gpio/src/fpga/top/usrp_gpio.rbf b/gr-gpio/src/fpga/top/usrp_gpio.rbf new file mode 100644 index 0000000000000000000000000000000000000000..5d1c9c7d29355320c1be6d62396b4bc4abf4dce3 GIT binary patch literal 181332 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%0D(J(;X$d}YCS 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 +%} + +// ---------------------------------------------------------------- + +GR_SWIG_BLOCK_MAGIC(gpio,and_const_ss) + +gpio_and_const_ss_sptr gpio_make_and_const_ss (unsigned short k); + +class gpio_and_const_ss : public gr_sync_block +{ + private: + gpio_and_const_ss (unsigned short k); + + public: + unsigned short k () const { return d_k; } + void set_k (unsigned short k) { d_k = k; } +}; diff --git a/gr-gpio/src/lib/gpio_and_const_ss.cc b/gr-gpio/src/lib/gpio_and_const_ss.cc new file mode 100644 index 00000000..e9304619 --- /dev/null +++ b/gr-gpio/src/lib/gpio_and_const_ss.cc @@ -0,0 +1,71 @@ +/* -*- c++ -*- */ +/* + * Copyright 2008 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio 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 3, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +gpio_and_const_ss_sptr +gpio_make_and_const_ss (unsigned short k) +{ + return gpio_and_const_ss_sptr (new gpio_and_const_ss (k)); +} + +gpio_and_const_ss::gpio_and_const_ss (unsigned short k) + : gr_sync_block ("and_const_ss", + gr_make_io_signature (1, 1, sizeof (short)), + gr_make_io_signature (1, 1, sizeof (short))), + d_k (k) +{ +} + +int +gpio_and_const_ss::work (int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + short *iptr = (short *) input_items[0]; + short *optr = (short *) output_items[0]; + + int size = noutput_items; + + while (size >= 8){ + *optr++ = *iptr++ & d_k; + *optr++ = *iptr++ & d_k; + *optr++ = *iptr++ & d_k; + *optr++ = *iptr++ & d_k; + *optr++ = *iptr++ & d_k; + *optr++ = *iptr++ & d_k; + *optr++ = *iptr++ & d_k; + *optr++ = *iptr++ & d_k; + size -= 8; + } + + while (size-- > 0) + *optr++ = *iptr++ & d_k; + + return noutput_items; +} diff --git a/gr-gpio/src/lib/gpio_and_const_ss.h b/gr-gpio/src/lib/gpio_and_const_ss.h new file mode 100644 index 00000000..e27134d6 --- /dev/null +++ b/gr-gpio/src/lib/gpio_and_const_ss.h @@ -0,0 +1,54 @@ +/* -*- c++ -*- */ +/* + * Copyright 2008 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio 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 3, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef INCLUDED_GPIO_AND_CONST_SS_H +#define INCLUDED_GPIO_AND_CONST_SS_H + +#include + +class gpio_and_const_ss; +typedef boost::shared_ptr gpio_and_const_ss_sptr; + +gpio_and_const_ss_sptr gpio_make_and_const_ss (unsigned short k); + +/*! + * \brief output = input & constant + * \ingroup block + */ +class gpio_and_const_ss : public gr_sync_block +{ + friend gpio_and_const_ss_sptr gpio_make_and_const_ss (unsigned short k); + + unsigned short d_k; // the constant + gpio_and_const_ss (unsigned short k); + + public: + unsigned short k () const { return d_k; } + void set_k (unsigned short k) { d_k = k; } + + int work (int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif diff --git a/gr-gpio/src/python/Makefile.am b/gr-gpio/src/python/Makefile.am new file mode 100644 index 00000000..ea1a9866 --- /dev/null +++ b/gr-gpio/src/python/Makefile.am @@ -0,0 +1,50 @@ +# +# Copyright 2007,2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +include $(top_srcdir)/Makefile.common + +# Installation locations +ourpythondir = $(grpythondir)/gpio +ourlibdir = $(grpyexecdir)/gpio + +# List of Python files that will get installed into site-packages +ourpython_PYTHON = \ + __init__.py \ + gpio.py + +# List of python files that will be installed onto $prefix/bin +bin_SCRIPTS = \ + gpio_rx_sfile.py \ + gpio_usrp_siggen.py \ + gpio_usrp_fft.py + +# List of python files that will get distributed in tarball +# but not installed anywhere on system +noinst_PYTHON = \ + qa_gpio.py + +# Programs that get run by 'make check' +TESTS = run_tests + +# Files to go into tarball not otherwise mentioned (except bin_SCRIPTS!) +EXTRA_DIST = run_tests.in $(bin_SCRIPTS) + +MOSTLYCLEANFILES = *.pyo *.pyc *~ diff --git a/gr-gpio/src/python/__init__.py b/gr-gpio/src/python/__init__.py new file mode 100644 index 00000000..b1f69b7e --- /dev/null +++ b/gr-gpio/src/python/__init__.py @@ -0,0 +1,34 @@ +# +# Copyright 2007,2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +import glob +import os.path + +# This automatically imports all top-level objects from .py files +# in our directory into the package name space +for _p in __path__: + _filenames = glob.glob (os.path.join (_p, "*.py")) + for _f in _filenames: + _f = os.path.basename(_f).lower() + _f = _f[:-3] + if _f == '__init__': + continue + exec "from %s import *" % (_f,) diff --git a/gr-gpio/src/python/gpio.py b/gr-gpio/src/python/gpio.py new file mode 100644 index 00000000..cd94a27c --- /dev/null +++ b/gr-gpio/src/python/gpio.py @@ -0,0 +1,3 @@ +from gpio_swig import * + +fpga_filename = 'usrp_gpio.rbf' diff --git a/gr-gpio/src/python/gpio_rx_sfile.py b/gr-gpio/src/python/gpio_rx_sfile.py new file mode 100755 index 00000000..ac4d608b --- /dev/null +++ b/gr-gpio/src/python/gpio_rx_sfile.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +# +# Copyright 2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from gnuradio import gr, eng_notation +from gnuradio import usrp +from gnuradio.eng_option import eng_option +from optparse import OptionParser +import sys + +from gnuradio import gpio + +class my_top_block(gr.top_block): + + def __init__(self, options): + gr.top_block.__init__(self) + + # Create a USRP source with GPIO FPGA build, then configure + u = usrp.source_s(decim_rate=options.decim,fpga_filename=gpio.fpga_filename) + + if options.force_complex_RXA: + # This is a dirty hack to force complex mode (receive both I and Q) on basicRX or LFRX + # This forces the receive board in RXA (side A) to be used + # FIXME: This has as a side effect that the gain for Q is not set. So only use with gain 0 (--gain 0) + options.rx_subdev_spec=(0,0) + u.set_mux(0x10) + if not (0==options.gain): + print "WARNING, you should set the gain to 0 with --gain 0 when using --force-complex-RXA" + print "The gain for Q will now still be zero while the gain for I is not" + #options.gain=0 + else: + if options.rx_subdev_spec is None: + options.rx_subdev_spec = usrp.pick_rx_subdevice(u) + u.set_mux(usrp.determine_rx_mux_value(u, options.rx_subdev_spec)) + + subdev = usrp.selected_subdev(u, options.rx_subdev_spec) + print "Using RX d'board %s" % (subdev.side_and_name(),) + input_rate = u.adc_freq()/u.decim_rate() + print "USB sample rate %s" % (eng_notation.num_to_str(input_rate)) + + if options.gain is None: + # if no gain was specified, use the mid-point in dB + g = subdev.gain_range() + options.gain = float(g[0]+g[1])/2 + + + #TODO setting gain on basicRX only sets the I channel, use a second subdev to set gain of Q channel + #see gnuradio-examples/multi-antenna for possible solutions + subdev.set_gain(options.gain) + + #TODO check if freq has same problem as gain when trying to use complex mode on basicRX + r = u.tune(0, subdev, options.freq) + if not r: + sys.stderr.write('Failed to set frequency\n') + raise SystemExit, 1 + + # Connect pipeline + src = u + if options.nsamples is not None: + head = gr.head(gr.sizeof_short, int(options.nsamples)*2) + self.connect(u, head) + src = head + + ana_strip = gpio.and_const_ss(0xFFFE) + dig_strip = gpio.and_const_ss(0x0001) + ana_sink = gr.file_sink(gr.sizeof_short, options.ana_filename) + dig_sink = gr.file_sink(gr.sizeof_short, options.dig_filename) + + self.connect(src, ana_strip, ana_sink) + self.connect(src, dig_strip, dig_sink) + +if __name__ == '__main__': + usage="%prog: [options] analog_filename digital_filename" + parser = OptionParser(option_class=eng_option, usage=usage) + parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=(0, 0), + help="select USRP Rx side A or B (default=A)") + parser.add_option("-d", "--decim", type="int", default=16, + help="set fgpa decimation rate to DECIM [default=%default]") + parser.add_option("-f", "--freq", type="eng_float", default=None, + help="set frequency to FREQ", metavar="FREQ") + parser.add_option("-g", "--gain", type="eng_float", default=None, + help="set gain in dB (default is midpoint)") + parser.add_option("-N", "--nsamples", type="eng_float", default=None, + help="number of samples to collect [default=+inf]") + parser.add_option("-F", "--force-complex-RXA", action="store_true", default=False, + help="enable basicRX hack to force complex mode on basicRX and LFRX. Only works on side A. Only use with --gain 0") + (options, args) = parser.parse_args () + if len(args) != 2: + parser.print_help() + raise SystemExit, 1 + options.ana_filename = args[0] + options.dig_filename = args[1] + + if options.freq is None: + parser.print_help() + sys.stderr.write('You must specify the frequency with -f FREQ\n'); + raise SystemExit, 1 + + try: + tb = my_top_block(options) + tb.run() + except KeyboardInterrupt: + pass diff --git a/gr-gpio/src/python/gpio_usrp_fft.py b/gr-gpio/src/python/gpio_usrp_fft.py new file mode 100755 index 00000000..cde0de05 --- /dev/null +++ b/gr-gpio/src/python/gpio_usrp_fft.py @@ -0,0 +1,333 @@ +#!/usr/bin/env python +# +# Copyright 2004,2005,2007,2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from gnuradio import gr, gru +from gnuradio import usrp +from gnuradio import eng_notation +from gnuradio.eng_option import eng_option +from gnuradio.wxgui import stdgui2, fftsink2, waterfallsink2, scopesink2, form, slider +from optparse import OptionParser +import wx +import sys +import numpy + +from gnuradio import gpio + +def pick_subdevice(u): + """ + The user didn't specify a subdevice on the command line. + If there's a daughterboard on A, select A. + If there's a daughterboard on B, select B. + Otherwise, select A. + """ + if u.db[0][0].dbid() >= 0: # dbid is < 0 if there's no d'board or a problem + return (0, 0) + #if u.db[1][0].dbid() >= 0: #disable the use of RXB + # return (1, 0) + return (0, 0) + + +class app_top_block(stdgui2.std_top_block): + def __init__(self, frame, panel, vbox, argv): + stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv) + + self.frame = frame + self.panel = panel + + parser = OptionParser(option_class=eng_option) + parser.add_option("-w", "--which", type="int", default=0, + help="select which USRP (0, 1, ...) default is %default", + metavar="NUM") +# parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=None, +# help="select USRP Rx side A or B (default=first one with a daughterboard)") + parser.add_option("-A", "--antenna", default=None, + help="select Rx Antenna (only on RFX-series boards)") + parser.add_option("-d", "--decim", type="int", default=32, + help="set fgpa decimation rate to DECIM [default=%default]") + parser.add_option("-f", "--freq", type="eng_float", default=0.0, + help="set frequency to FREQ", metavar="FREQ") + parser.add_option("-g", "--gain", type="eng_float", default=None, + help="set gain in dB (default is midpoint)") + parser.add_option("-W", "--waterfall", action="store_true", default=False, + help="Enable waterfall display") + parser.add_option("-8", "--width-8", action="store_true", default=False, + help="Enable 8-bit samples across USB") +# parser.add_option( "--no-hb", action="store_true", default=False, +# help="don't use halfband filter in usrp") + parser.add_option("-S", "--oscilloscope", action="store_true", default=False, + help="Enable oscilloscope display (default)") + parser.add_option("-F", "--fft", action="store_true", default=False, + help="Enable FFT display") + parser.add_option("-n", "--frame-decim", type="int", default=1, + help="set oscope frame decimation factor to n [default=1]") + parser.add_option("-v", "--v-scale", type="eng_float", default=1, + help="set oscope initial V/div to SCALE [default=%default]") + parser.add_option("-t", "--t-scale", type="eng_float", default=10e-6, + help="set oscope initial s/div to SCALE [default=10us]") + parser.add_option ("--digital", action="store_true", default=False, + help="show (only) the digital wave on lsb (will be input from gpio pins with special usrp firmware)") + parser.add_option ("--analog", action="store_true", default=False, + help="show (only) the analog wave on msbs (will be input from analog inputs)") + parser.add_option ("--file", default=None, + help="input from file FILE in stead of USRP (will be input from raw file in interleaved short format)") + (options, args) = parser.parse_args() + if len(args) != 0: + parser.print_help() + sys.exit(1) + self.options = options + self.show_debug_info = True + + self.u = usrp.source_s(which=options.which, decim_rate=options.decim, fpga_filename=gpio.fpga_filename) + + print "Warning: This script only supports boards on RXA, change the script if you want otherwise" + #options.rx_subdev_spec=(0, 0)#force the use of RXA + options.rx_subdev_spec=None #force the use of RXA + + if options.rx_subdev_spec is None: + options.rx_subdev_spec = pick_subdevice(self.u) + + #This hardcoded mux setting is why this script only supports RXA + #We want both I and Q active, even when using basicRX + #set to 0x10 for RXA + #set to 0x32 for RXB + self.u.set_mux(0x10) #usrp.determine_rx_mux_value(self.u, options.rx_subdev_spec)) + + if options.width_8: + width = 8 + shift = 8 + format = self.u.make_format(width, shift) + print "format =", hex(format) + r = self.u.set_format(format) + print "set_format =", r + + # determine the daughterboard subdevice we're using + self.subdev = usrp.selected_subdev(self.u, options.rx_subdev_spec) + #if options.rx_subdev_spec==(0,0): + # rx_subdev_spec2=(0,1) + # self.subdev2 = usrp.selected_subdev(self.u, rx_subdev_spec2) + input_rate = self.u.adc_freq() / self.u.decim_rate() + + if options.waterfall: + self.scope = \ + waterfallsink2.waterfall_sink_c (panel, fft_size=1024, sample_rate=input_rate) + elif options.fft: + self.scope = fftsink2.fft_sink_c (panel, fft_size=1024, sample_rate=input_rate) + else: # options.oscilloscope: + #self.scope = scopesink2.scope_sink_c(panel, sample_rate=input_rate) + self.scope = scopesink2.scope_sink_c(panel, sample_rate=input_rate, + frame_decim=options.frame_decim, + v_scale=options.v_scale, + t_scale=options.t_scale) + + self.is2c = gr.interleaved_short_to_complex() + if not (options.file is None): + self.filesrc=gr.file_source(gr.sizeof_short, options.file, True) + thr = gr.throttle(gr.sizeof_short, input_rate) + self.connect(self.filesrc,thr,self.is2c,self.scope) + elif options.digital: + self.select_dig=gpio.and_const_ss(0x0001) + self.connect(self.u, self.select_dig,self.is2c,self.scope) + elif options.analog: + self.select_ana=gpio.and_const_ss(0xFFFE) + self.connect(self.u, self.select_ana,self.is2c,self.scope) + else: + self.connect(self.u,self.is2c,self.scope) + + self._build_gui(vbox) + self._setup_events() + + # set initial values + + if options.gain is None: + # if no gain was specified, use the mid-point in dB + g = self.subdev.gain_range() + options.gain = float(g[0]+g[1])/2 + + if options.freq is None: + # if no freq was specified, use the mid-point + r = self.subdev.freq_range() + options.freq = float(r[0]+r[1])/2 + + self.set_gain(options.gain) + + if options.antenna is not None: + print "Selecting antenna %s" % (options.antenna,) + self.subdev.select_rx_antenna(options.antenna) + + if self.show_debug_info: + self.myform['decim'].set_value(self.u.decim_rate()) + self.myform['fs@usb'].set_value(self.u.adc_freq() / self.u.decim_rate()) + self.myform['dbname'].set_value(self.subdev.name()) + self.myform['baseband'].set_value(0) + self.myform['ddc'].set_value(0) + + if not(self.set_freq(options.freq)): + self._set_status_msg("Failed to set initial frequency") + + def _set_status_msg(self, msg): + self.frame.GetStatusBar().SetStatusText(msg, 0) + + def _build_gui(self, vbox): + + def _form_set_freq(kv): + return self.set_freq(kv['freq']) + + vbox.Add(self.scope.win, 10, wx.EXPAND) + + # add control area at the bottom + self.myform = myform = form.form() + hbox = wx.BoxSizer(wx.HORIZONTAL) + hbox.Add((5,0), 0, 0) + myform['freq'] = form.float_field( + parent=self.panel, sizer=hbox, label="Center freq", weight=1, + callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg)) + + hbox.Add((5,0), 0, 0) + g = self.subdev.gain_range() + myform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, label="Gain", + weight=3, + min=int(g[0]), max=int(g[1]), + callback=self.set_gain) + + hbox.Add((5,0), 0, 0) + vbox.Add(hbox, 0, wx.EXPAND) + + self._build_subpanel(vbox) + + def _build_subpanel(self, vbox_arg): + # build a secondary information panel (sometimes hidden) + + # FIXME figure out how to have this be a subpanel that is always + # created, but has its visibility controlled by foo.Show(True/False) + + def _form_set_decim(kv): + return self.set_decim(kv['decim']) + + if not(self.show_debug_info): + return + + panel = self.panel + vbox = vbox_arg + myform = self.myform + + #panel = wx.Panel(self.panel, -1) + #vbox = wx.BoxSizer(wx.VERTICAL) + + hbox = wx.BoxSizer(wx.HORIZONTAL) + hbox.Add((5,0), 0) + + myform['decim'] = form.int_field( + parent=panel, sizer=hbox, label="Decim", + callback=myform.check_input_and_call(_form_set_decim, self._set_status_msg)) + + hbox.Add((5,0), 1) + myform['fs@usb'] = form.static_float_field( + parent=panel, sizer=hbox, label="Fs@USB") + + hbox.Add((5,0), 1) + myform['dbname'] = form.static_text_field( + parent=panel, sizer=hbox) + + hbox.Add((5,0), 1) + myform['baseband'] = form.static_float_field( + parent=panel, sizer=hbox, label="Analog BB") + + hbox.Add((5,0), 1) + myform['ddc'] = form.static_float_field( + parent=panel, sizer=hbox, label="DDC") + + hbox.Add((5,0), 0) + vbox.Add(hbox, 0, wx.EXPAND) + + + def set_freq(self, target_freq): + """ + Set the center frequency we're interested in. + + @param target_freq: frequency in Hz + @rypte: bool + + Tuning is a two step process. First we ask the front-end to + tune as close to the desired frequency as it can. Then we use + the result of that operation and our target_frequency to + determine the value for the digital down converter. + """ + r = self.u.tune(0, self.subdev, target_freq) + + if r: + self.myform['freq'].set_value(target_freq) # update displayed value + if self.show_debug_info: + self.myform['baseband'].set_value(r.baseband_freq) + self.myform['ddc'].set_value(r.dxc_freq) + if not self.options.waterfall and not self.options.oscilloscope: + self.scope.win.set_baseband_freq(target_freq) + return True + + return False + + def set_gain(self, gain): + self.myform['gain'].set_value(gain) # update displayed value + self.subdev.set_gain(gain) + + def set_decim(self, decim): + ok = self.u.set_decim_rate(decim) + if not ok: + print "set_decim failed" + input_rate = self.u.adc_freq() / self.u.decim_rate() + self.scope.set_sample_rate(input_rate) + if self.show_debug_info: # update displayed values + self.myform['decim'].set_value(self.u.decim_rate()) + self.myform['fs@usb'].set_value(self.u.adc_freq() / self.u.decim_rate()) + return ok + + def _setup_events(self): + if not self.options.waterfall and not self.options.oscilloscope: + self.scope.win.Bind(wx.EVT_LEFT_DCLICK, self.evt_left_dclick) + + def evt_left_dclick(self, event): + (ux, uy) = self.scope.win.GetXY(event) + if event.CmdDown(): + # Re-center on maximum power + points = self.scope.win._points + if self.scope.win.peak_hold: + if self.scope.win.peak_vals is not None: + ind = numpy.argmax(self.scope.win.peak_vals) + else: + ind = int(points.shape()[0]/2) + else: + ind = numpy.argmax(points[:,1]) + (freq, pwr) = points[ind] + target_freq = freq/self.scope.win._scale_factor + print ind, freq, pwr + self.set_freq(target_freq) + else: + # Re-center on clicked frequency + target_freq = ux/self.scope.win._scale_factor + self.set_freq(target_freq) + + +def main (): + app = stdgui2.stdapp(app_top_block, "USRP FFT", nstatus=1) + app.MainLoop() + +if __name__ == '__main__': + main () diff --git a/gr-gpio/src/python/gpio_usrp_siggen.py b/gr-gpio/src/python/gpio_usrp_siggen.py new file mode 100755 index 00000000..0a0ea685 --- /dev/null +++ b/gr-gpio/src/python/gpio_usrp_siggen.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python +# +# Copyright 2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# +from gnuradio import gr, gru +from gnuradio import usrp +from gnuradio.eng_option import eng_option +from gnuradio import eng_notation +from optparse import OptionParser +import sys + +from gnuradio import gpio + +class my_top_block(gr.top_block): + def __init__ (self): + gr.top_block.__init__(self) + + # controllable values + self.interp = 64 + self.waveform_type = gr.GR_CONST_WAVE + self.waveform_ampl = 16000 + self.waveform_freq = 100.12345e3 + self.waveform_offset = 0 + self._instantiate_blocks () + self.set_waveform_type (self.waveform_type) + + def usb_freq (self): + return self.u.dac_freq() / self.interp + + def usb_throughput (self): + return self.usb_freq () * 4 + + def set_waveform_type (self, type): + ''' + valid waveform types are: gr.GR_SIN_WAVE, gr.GR_CONST_WAVE, + gr.GR_UNIFORM and gr.GR_GAUSSIAN + ''' + self._configure_graph (type) + self.waveform_type = type + + def set_waveform_ampl (self, ampl): + self.waveform_ampl = ampl + self.siggen.set_amplitude (ampl) + self.noisegen.set_amplitude (ampl) + + def set_waveform_freq (self, freq): + self.waveform_freq = freq + self.siggen.set_frequency (freq) + + def set_waveform_offset (self, offset): + self.waveform_offset = offset + self.siggen.set_offset (offset) + + def set_interpolator (self, interp): + self.interp = interp + self.siggen.set_sampling_freq (self.usb_freq ()) + self.u.set_interp_rate (interp) + + def _instantiate_blocks (self): + self.src = None + self.u = usrp.sink_c (0, self.interp,fpga_filename=gpio.fpga_filename) + + self.siggen = gr.sig_source_c (self.usb_freq (), + gr.GR_SIN_WAVE, + self.waveform_freq, + self.waveform_ampl, + self.waveform_offset) + + self.noisegen = gr.noise_source_c (gr.GR_UNIFORM, + self.waveform_ampl) + self.vecgen = gr.vector_source_c ([complex(1.0,0.0),complex(0.0,0.0),complex(1.0,1.0),complex(0.0,1.0)],True) + + # self.file_sink = gr.file_sink (gr.sizeof_gr_complex, "siggen.dat") + + def _configure_graph (self, type): + was_running = self.is_running () + if was_running: + self.stop () + self.disconnect_all () + if type == gr.GR_SIN_WAVE: + self.connect (self.siggen, self.u) + # self.connect (self.siggen, self.file_sink) + self.siggen.set_waveform (type) + self.src = self.siggen + elif type == gr.GR_UNIFORM or type == gr.GR_GAUSSIAN: + self.connect (self.noisegen, self.u) + self.noisegen.set_type (type) + self.src = self.noisegen + elif type == gr.GR_CONST_WAVE: + self.connect (self.vecgen, self.u) + self.src = self.vecgen + else: + raise ValueError, type + if was_running: + self.start () + + def set_freq(self, target_freq): + """ + Set the center frequency we're interested in. + + @param target_freq: frequency in Hz + @rypte: bool + + Tuning is a two step process. First we ask the front-end to + tune as close to the desired frequency as it can. Then we use + the result of that operation and our target_frequency to + determine the value for the digital up converter. + """ + r = self.u.tune(self.subdev._which, self.subdev, target_freq) + if r: + #print "r.baseband_freq =", eng_notation.num_to_str(r.baseband_freq) + #print "r.dxc_freq =", eng_notation.num_to_str(r.dxc_freq) + #print "r.residual_freq =", eng_notation.num_to_str(r.residual_freq) + #print "r.inverted =", r.inverted + return True + + return False + + + +def main (): + parser = OptionParser (option_class=eng_option) + parser.add_option ("-T", "--tx-subdev-spec", type="subdev", default=(0, 0), + help="select USRP Tx side A or B") + parser.add_option ("-f", "--rf-freq", type="eng_float", default=None, + help="set RF center frequency to FREQ") + parser.add_option ("-i", "--interp", type="int", default=512, + help="set fgpa interpolation rate to INTERP [default=%default]") + parser.add_option ("--sine", dest="type", action="store_const", const=gr.GR_SIN_WAVE, + help="generate a complex sinusoid [default]", default=gr.GR_SIN_WAVE) + + parser.add_option ("--gaussian", dest="type", action="store_const", const=gr.GR_GAUSSIAN, + help="generate Gaussian random output") + parser.add_option ("--uniform", dest="type", action="store_const", const=gr.GR_UNIFORM, + help="generate Uniform random output") + + parser.add_option ("-w", "--waveform-freq", type="eng_float", default=100e3, + help="set waveform frequency to FREQ [default=%default]") + parser.add_option ("-a", "--amplitude", type="eng_float", default=16e3, + help="set waveform amplitude to AMPLITUDE [default=%default]", metavar="AMPL") + parser.add_option ("-g", "--gain", type="eng_float", default=None, + help="set output gain to GAIN [default=%default]") + parser.add_option ("-o", "--offset", type="eng_float", default=0, + help="set waveform offset to OFFSET [default=%default]") + parser.add_option ("--digital", dest="type", action="store_const", const=gr.GR_CONST_WAVE, + help="generate (only) a digital wave on lsb (will be output on gpio pins with special usrp firmware)") + (options, args) = parser.parse_args () + + if len(args) != 0: + parser.print_help() + raise SystemExit + + if options.rf_freq is None: + sys.stderr.write("usrp_siggen: must specify RF center frequency with -f RF_FREQ\n") + parser.print_help() + raise SystemExit + + tb = my_top_block() + tb.set_interpolator (options.interp) + tb.set_waveform_type (options.type) + tb.set_waveform_freq (options.waveform_freq) + tb.set_waveform_ampl (options.amplitude) + tb.set_waveform_offset (options.offset) + + # determine the daughterboard subdevice we're using + if options.tx_subdev_spec is None: + options.tx_subdev_spec = usrp.pick_tx_subdevice(tb.u) + + m = usrp.determine_tx_mux_value(tb.u, options.tx_subdev_spec) + #print "mux = %#04x" % (m,) + tb.u.set_mux(m) + tb.subdev = usrp.selected_subdev(tb.u, options.tx_subdev_spec) + print "Using TX d'board %s" % (tb.subdev.side_and_name(),) + + if options.gain is None: + tb.subdev.set_gain(tb.subdev.gain_range()[1]) # set max Tx gain + else: + tb.subdev.set_gain(options.gain) # set max Tx gain + + if not tb.set_freq(options.rf_freq): + sys.stderr.write('Failed to set RF frequency\n') + raise SystemExit + + tb.subdev.set_enable(True) # enable transmitter + + try: + tb.run() + except KeyboardInterrupt: + pass + +if __name__ == '__main__': + main () diff --git a/gr-gpio/src/python/qa_gpio.py b/gr-gpio/src/python/qa_gpio.py new file mode 100755 index 00000000..1d140c24 --- /dev/null +++ b/gr-gpio/src/python/qa_gpio.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# +# Copyright 2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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 3, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from gnuradio import gr, gr_unittest +# This is different from the usage after installation +import gpio_swig + +class qa_gpio (gr_unittest.TestCase): + + def setUp (self): + self.tb = gr.top_block() + + def tearDown (self): + self.tb = None + +if __name__ == '__main__': + gr_unittest.main () diff --git a/gr-gpio/src/python/run_tests.in b/gr-gpio/src/python/run_tests.in new file mode 100644 index 00000000..999e4634 --- /dev/null +++ b/gr-gpio/src/python/run_tests.in @@ -0,0 +1,10 @@ +#!/bin/sh + +# 1st parameter is absolute path to component source directory +# 2nd parameter is absolute path to component build directory +# 3rd parameter is path to Python QA directory + +@top_builddir@/run_tests.sh \ + @abs_top_srcdir@/gr-gpio \ + @abs_top_builddir@/gr-gpio \ + @srcdir@ -- 2.39.5