diff options
author | jcorgan | 2007-05-21 05:58:05 +0000 |
---|---|---|
committer | jcorgan | 2007-05-21 05:58:05 +0000 |
commit | 2711e51f33e4c83b07d8293ceca5d6db7830656e (patch) | |
tree | 21be31385aa79dc8d6f3075acd093f8ca9775f3d /gr-sounder/src/fpga/tb | |
parent | 9b7e0f924e4294bff46fa55b9a993b4d529f499a (diff) | |
download | gnuradio-2711e51f33e4c83b07d8293ceca5d6db7830656e.tar.gz gnuradio-2711e51f33e4c83b07d8293ceca5d6db7830656e.tar.bz2 gnuradio-2711e51f33e4c83b07d8293ceca5d6db7830656e.zip |
Merged r5463:5504 from jcorgan/snd into trunk. Work in progress, adds digital loopback and receive to FPGA code. Host receive code is still debugging only.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@5505 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gr-sounder/src/fpga/tb')
-rw-r--r-- | gr-sounder/src/fpga/tb/Makefile.am | 30 | ||||
-rw-r--r-- | gr-sounder/src/fpga/tb/sounder_tb.sav | 34 | ||||
-rwxr-xr-x | gr-sounder/src/fpga/tb/sounder_tb.sh | 7 | ||||
-rw-r--r-- | gr-sounder/src/fpga/tb/sounder_tb.v | 212 | ||||
-rwxr-xr-x | gr-sounder/src/fpga/tb/sounder_tb_wave.sh | 2 |
5 files changed, 285 insertions, 0 deletions
diff --git a/gr-sounder/src/fpga/tb/Makefile.am b/gr-sounder/src/fpga/tb/Makefile.am new file mode 100644 index 000000000..e668d4568 --- /dev/null +++ b/gr-sounder/src/fpga/tb/Makefile.am @@ -0,0 +1,30 @@ +# +# 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 2, 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 + +EXTRA_DIST = \ + sounder_tb.v \ + sounder_tb.sav \ + sounder_tb.sh \ + sounder_tb_wave.sh + +MOSTLYCLEANFILES = *~ *.vcd *.out* sounder_tb
\ No newline at end of file diff --git a/gr-sounder/src/fpga/tb/sounder_tb.sav b/gr-sounder/src/fpga/tb/sounder_tb.sav new file mode 100644 index 000000000..74019f5ee --- /dev/null +++ b/gr-sounder/src/fpga/tb/sounder_tb.sav @@ -0,0 +1,34 @@ +*-26.117517 250000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +@28 +sounder_tb.uut.clk_i +sounder_tb.rst +sounder_tb.s_strobe +@22 +sounder_tb.sdata[31:0] +@28 +sounder_tb.uut.reset +sounder_tb.uut.transmit +sounder_tb.uut.receive +sounder_tb.uut.loopback +@200 +- +@22 +sounder_tb.uut.degree[4:0] +sounder_tb.uut.len[15:0] +@200 +- +@28 +sounder_tb.tx_dac_i[13:0] +@200 +- +@22 +sounder_tb.fifo_strobe +sounder_tb.fifo_i[15:0] +sounder_tb.fifo_q[15:0] +@200 +- +@22 +sounder_tb.uut.transmitter.pn_code.pn_o +sounder_tb.uut.receiver.pn_ref +@200 +- diff --git a/gr-sounder/src/fpga/tb/sounder_tb.sh b/gr-sounder/src/fpga/tb/sounder_tb.sh new file mode 100755 index 000000000..9bc714387 --- /dev/null +++ b/gr-sounder/src/fpga/tb/sounder_tb.sh @@ -0,0 +1,7 @@ +#!/bin/sh +iverilog -y ../lib/ -y ../../../../usrp/fpga/sdr_lib \ + sounder_tb.v -o sounder_tb && \ +./sounder_tb > sounder_tb.out && \ +grep 'rst=0' sounder_tb.out | grep 'clk=1' > sounder_tb.out2 && \ +grep 'tx_strobe=1' sounder_tb.out2 > sounder_tb.out3 + diff --git a/gr-sounder/src/fpga/tb/sounder_tb.v b/gr-sounder/src/fpga/tb/sounder_tb.v new file mode 100644 index 000000000..045791e43 --- /dev/null +++ b/gr-sounder/src/fpga/tb/sounder_tb.v @@ -0,0 +1,212 @@ +// -*- verilog -*- +// +// USRP - Universal Software Radio Peripheral +// +// Copyright (C) 2007 Corgan Enterprises LLC +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Boston, MA 02110-1301 USA +// + +`timescale 1ns/1ps + +`include "../lib/sounder.v" + +`define FR_MODE 7'd64 +`define bmFR_MODE_RESET 32'h0001 +`define bmFR_MODE_TX 32'h0002 +`define bmFR_MODE_RX 32'h0004 +`define bmFR_MODE_LP 32'h0008 + +`define FR_DEGREE 7'd65 + +module sounder_tb; + + // System bus + reg clk; + reg rst; + reg ena; + + // Configuration bus + reg [6:0] saddr; + reg [31:0] sdata; + reg s_strobe; + + // DAC bus + reg tx_strobe; + wire [13:0] tx_dac_i; + wire [13:0] tx_dac_q; + + // ADC bus + reg rx_strobe; + reg [15:0] rx_adc_i; + reg [15:0] rx_adc_q; + + // FIFO bus + wire fifo_strobe; + wire [15:0] fifo_i; + wire [15:0] fifo_q; + + // Configuration shadow registers + reg [31:0] mode; + reg [31:0] degree; + + sounder uut + (.clk_i(clk),.saddr_i(saddr),.sdata_i(sdata),.s_strobe_i(s_strobe), + .tx_strobe_i(tx_strobe),.tx_dac_i_o(tx_dac_i),.tx_dac_q_o(tx_dac_q), + .rx_strobe_i(rx_strobe),.rx_adc_i_i(rx_adc_i),.rx_adc_q_i(rx_adc_q), + .rx_strobe_o(fifo_strobe),.rx_imp_i_o(fifo_i),.rx_imp_q_o(fifo_q)); + + // Drive tx_strobe @ half clock rate + always @(posedge clk) + tx_strobe <= ~tx_strobe; + + // Start up initialization + initial + begin + clk = 0; + rst = 0; + ena = 0; + saddr = 0; + sdata = 0; + s_strobe = 0; + tx_strobe = 0; + rx_strobe = 1; + rx_adc_i = 0; + rx_adc_q = 0; + mode = 0; + degree = 0; + + @(posedge clk); + rst = 1; + @(posedge clk); + rst = 0; + @(posedge clk); + ena = 1; + end + + always + #5 clk <= ~clk; + + initial + begin + $monitor($time, " clk=%b rst=%b tx_strobe=%b fifo_strobe=%b phs=%x pn_o=%b pn_ref=%b fifo_i=%x fifo_q=", + clk, uut.reset, tx_strobe, fifo_strobe, uut.receiver.phase_strobe.count_o, + uut.transmitter.pn, uut.receiver.pn_ref, fifo_i, fifo_q); + $dumpfile("sounder_tb.vcd"); + $dumpvars(0, sounder_tb); + end + + // Test tasks + task write_cfg_register; + input [6:0] regno; + input [31:0] value; + + begin + @(posedge clk); + saddr <= regno; + sdata <= value; + s_strobe <= 1'b1; + @(posedge clk); + s_strobe <= 0; + end + endtask // write_cfg_register + + // Application reset line + task set_reset; + input reset; + + begin + mode = reset ? (mode | `bmFR_MODE_RESET) : (mode & ~`bmFR_MODE_RESET); + write_cfg_register(`FR_MODE, mode); + end + endtask // reset + + // Set the PN code degree + task set_degree; + input [5:0] degree; + begin + write_cfg_register(`FR_DEGREE, degree); + end + endtask // set_degree + + // Turn on or off the transmitter + task enable_tx; + input tx; + + begin + mode = tx ? (mode | `bmFR_MODE_TX) : (mode & ~`bmFR_MODE_TX); + write_cfg_register(`FR_MODE, mode); + end + endtask // enable_tx + + // Turn on or off the receiver + task enable_rx; + input rx; + + begin + mode = rx ? (mode | `bmFR_MODE_RX) : (mode & ~`bmFR_MODE_RX); + write_cfg_register(`FR_MODE, mode); + end + endtask // enable_rx + + + // Turn on or off digital loopback + task enable_lp; + input lp; + + begin + mode = lp ? (mode | `bmFR_MODE_LP) : (mode & ~`bmFR_MODE_LP); + write_cfg_register(`FR_MODE, mode); + end + endtask // enable_lp + + // Test transmitter functionality + task test_tx; + input [5:0] degree; + + begin + #20 set_reset(1); + #20 set_degree(degree); + #20 enable_tx(1); + #20 set_reset(0); + #(uut.len*20); // One PN code period + + end + endtask // test_tx + + // Test loopback functionality + task test_lp; + input [5:0] degree; + + begin + #20 set_reset(1); + #20 set_degree(degree); + #20 enable_tx(1); + #20 enable_rx(1); + #20 enable_lp(1); + #20 set_reset(0); + #((uut.len+1)*uut.len*20); + end + endtask // test_lp + + // Execute tests + initial + begin + #20 test_tx(12); + #20 test_lp(12); + #100 $finish; + end +endmodule + diff --git a/gr-sounder/src/fpga/tb/sounder_tb_wave.sh b/gr-sounder/src/fpga/tb/sounder_tb_wave.sh new file mode 100755 index 000000000..4551d5c59 --- /dev/null +++ b/gr-sounder/src/fpga/tb/sounder_tb_wave.sh @@ -0,0 +1,2 @@ +#!/bin/sh +gtkwave sounder_tb.vcd sounder_tb.sav |