Subversion Repositories svnkaklik

Compare Revisions

No changes between revisions

Ignore whitespace Rev 1104 → Rev 1105

/dokumenty/skolni/diplomka/GRC/Grabber.grc
1,7 → 1,66
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
<timestamp>Wed Apr 23 15:51:46 2014</timestamp>
<timestamp>Fri May 2 16:25:22 2014</timestamp>
<block>
<key>options</key>
<param>
<key>id</key>
<value>MLAB_ADC_Grabber</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>title</key>
<value>MLAB ADC Grabber</value>
</param>
<param>
<key>author</key>
<value>Jakub Kakona</value>
</param>
<param>
<key>description</key>
<value>Basic software for reading ADC data from ADCdual01A modules trought ML602 development board.</value>
</param>
<param>
<key>window_size</key>
<value>1280, 1024</value>
</param>
<param>
<key>generate_options</key>
<value>wx_gui</value>
</param>
<param>
<key>category</key>
<value>Custom</value>
</param>
<param>
<key>run_options</key>
<value>prompt</value>
</param>
<param>
<key>run</key>
<value>True</value>
</param>
<param>
<key>max_nouts</key>
<value>0</value>
</param>
<param>
<key>realtime_scheduling</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
<value>(10, 10)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>id</key>
743,49 → 802,6
</param>
</block>
<block>
<key>blocks_file_sink</key>
<param>
<key>id</key>
<value>blocks_file_sink_0</value>
</param>
<param>
<key>_enabled</key>
<value>False</value>
</param>
<param>
<key>file</key>
<value>recfile</value>
</param>
<param>
<key>type</key>
<value>short</value>
</param>
<param>
<key>vlen</key>
<value>10</value>
</param>
<param>
<key>unbuffered</key>
<value>False</value>
</param>
<param>
<key>append</key>
<value>False</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
<value>(127, 594)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<block>
<key>notebook</key>
<param>
<key>id</key>
1247,65 → 1263,6
</param>
</block>
<block>
<key>options</key>
<param>
<key>id</key>
<value>MLAB_ADC_Grabber</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>title</key>
<value>MLAB ADC Grabber</value>
</param>
<param>
<key>author</key>
<value>Jakub Kakona</value>
</param>
<param>
<key>description</key>
<value>Basic software for reading ADC data from ADCdual01A modules trought ML602 development board.</value>
</param>
<param>
<key>window_size</key>
<value>1280, 1024</value>
</param>
<param>
<key>generate_options</key>
<value>wx_gui</value>
</param>
<param>
<key>category</key>
<value>Custom</value>
</param>
<param>
<key>run_options</key>
<value>prompt</value>
</param>
<param>
<key>run</key>
<value>True</value>
</param>
<param>
<key>max_nouts</key>
<value>0</value>
</param>
<param>
<key>realtime_scheduling</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
<value>(10, 10)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<block>
<key>blocks_file_source</key>
<param>
<key>id</key>
1629,6 → 1586,49
<value>0</value>
</param>
</block>
<block>
<key>blocks_file_sink</key>
<param>
<key>id</key>
<value>blocks_file_sink_0</value>
</param>
<param>
<key>_enabled</key>
<value>False</value>
</param>
<param>
<key>file</key>
<value>recfile</value>
</param>
<param>
<key>type</key>
<value>short</value>
</param>
<param>
<key>vlen</key>
<value>10</value>
</param>
<param>
<key>unbuffered</key>
<value>False</value>
</param>
<param>
<key>append</key>
<value>False</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
<value>(127, 594)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<connection>
<source_block_id>blocks_vector_to_streams_0</source_block_id>
<sink_block_id>blocks_interleave_0_2</sink_block_id>
/dokumenty/skolni/diplomka/GRC/MLAB_ADC_Grabber.py
0,0 → 1,273
#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: MLAB ADC Grabber
# Author: Jakub Kakona
# Description: Basic software for reading ADC data from ADCdual01A modules trought ML602 development board.
# Generated: Fri May 2 16:35:23 2014
##################################################
 
from datetime import datetime
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import filter
from gnuradio import gr
from gnuradio import wxgui
from gnuradio.eng_option import eng_option
from gnuradio.fft import window
from gnuradio.filter import firdes
from gnuradio.wxgui import fftsink2
from gnuradio.wxgui import numbersink2
from gnuradio.wxgui import scopesink2
from gnuradio.wxgui import waterfallsink2
from grc_gnuradio import wxgui as grc_wxgui
from optparse import OptionParser
import wx
 
class MLAB_ADC_Grabber(grc_wxgui.top_block_gui):
 
def __init__(self):
grc_wxgui.top_block_gui.__init__(self, title="MLAB ADC Grabber")
_icon_path = "/usr/local/share/icons/hicolor/32x32/apps/gnuradio-grc.png"
self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY))
 
##################################################
# Variables
##################################################
self.prefix = prefix = "/home/localuser/gnuradio/"
self.samp_rate = samp_rate = 5e6
self.recfile = recfile = prefix + datetime.now().strftime("%Y.%m.%d.%H.%M.%S") + ".dat"
 
##################################################
# Blocks
##################################################
self.notebook_0 = self.notebook_0 = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "Time wiev")
self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "Frequency wiev")
self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "numbers")
self.Add(self.notebook_0)
self.wxgui_waterfallsink2_0_0 = waterfallsink2.waterfall_sink_c(
self.notebook_0.GetPage(0).GetWin(),
baseband_freq=0,
dynamic_range=100,
ref_level=0,
ref_scale=2.0,
sample_rate=samp_rate,
fft_size=512,
fft_rate=15,
average=False,
avg_alpha=None,
title="ADC1 Waterfall Plot",
)
self.notebook_0.GetPage(0).GridAdd(self.wxgui_waterfallsink2_0_0.win, 1, 1, 1, 1)
self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_c(
self.notebook_0.GetPage(0).GetWin(),
baseband_freq=0,
dynamic_range=100,
ref_level=0,
ref_scale=2.0,
sample_rate=samp_rate,
fft_size=512,
fft_rate=15,
average=False,
avg_alpha=None,
title="ADC2 Waterfall Plot",
win=window.hanning,
)
self.notebook_0.GetPage(0).GridAdd(self.wxgui_waterfallsink2_0.win, 2, 1, 1, 1)
self.wxgui_scopesink2_1 = scopesink2.scope_sink_f(
self.notebook_0.GetPage(0).GetWin(),
title="Scope Plot",
sample_rate=samp_rate/2,
v_scale=0,
v_offset=0,
t_scale=1e-2,
ac_couple=False,
xy_mode=False,
num_inputs=2,
trig_mode=wxgui.TRIG_MODE_AUTO,
y_axis_label="Counts",
)
self.notebook_0.GetPage(0).GridAdd(self.wxgui_scopesink2_1.win, 2, 2, 1, 1)
self.wxgui_scopesink2_0 = scopesink2.scope_sink_f(
self.notebook_0.GetPage(0).GetWin(),
title="Scope Plot",
sample_rate=samp_rate,
v_scale=0,
v_offset=0,
t_scale=0,
ac_couple=False,
xy_mode=False,
num_inputs=4,
trig_mode=wxgui.TRIG_MODE_AUTO,
y_axis_label="Counts",
)
self.notebook_0.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 2, 1, 1)
self.wxgui_numbersink2_1 = numbersink2.number_sink_f(
self.notebook_0.GetPage(2).GetWin(),
unit="Units",
minval=-100,
maxval=100,
factor=1.0,
decimal_places=10,
ref_level=0,
sample_rate=samp_rate,
number_rate=15,
average=False,
avg_alpha=None,
label="Number Plot",
peak_hold=False,
show_gauge=True,
)
self.notebook_0.GetPage(2).Add(self.wxgui_numbersink2_1.win)
self.wxgui_numbersink2_0 = numbersink2.number_sink_f(
self.notebook_0.GetPage(2).GetWin(),
unit="Units",
minval=-100,
maxval=100,
factor=1.0,
decimal_places=10,
ref_level=0,
sample_rate=samp_rate,
number_rate=15,
average=False,
avg_alpha=None,
label="Number Plot",
peak_hold=False,
show_gauge=True,
)
self.notebook_0.GetPage(2).Add(self.wxgui_numbersink2_0.win)
self.wxgui_fftsink2_1 = fftsink2.fft_sink_c(
self.notebook_0.GetPage(1).GetWin(),
baseband_freq=0,
y_per_div=10,
y_divs=10,
ref_level=0,
ref_scale=2.0,
sample_rate=samp_rate,
fft_size=2048,
fft_rate=15,
average=False,
avg_alpha=None,
title="ADC 1 FFT Plot",
peak_hold=False,
win=window.hanning,
)
self.notebook_0.GetPage(1).Add(self.wxgui_fftsink2_1.win)
self.wxgui_fftsink2_0 = fftsink2.fft_sink_c(
self.notebook_0.GetPage(1).GetWin(),
baseband_freq=0,
y_per_div=10,
y_divs=10,
ref_level=0,
ref_scale=2.0,
sample_rate=samp_rate,
fft_size=2048,
fft_rate=15,
average=False,
avg_alpha=None,
title="ADC 2 FFT Plot",
peak_hold=False,
win=window.hanning,
)
self.notebook_0.GetPage(1).Add(self.wxgui_fftsink2_0.win)
self.dc_blocker_xx_1 = filter.dc_blocker_cc(32, True)
self.dc_blocker_xx_0 = filter.dc_blocker_cc(32, True)
self.blocks_vector_to_streams_0 = blocks.vector_to_streams(gr.sizeof_short*1, 10)
self.blocks_throttle_2 = blocks.throttle(gr.sizeof_short*10, samp_rate/2)
self.blocks_short_to_float_2_0 = blocks.short_to_float(1, 1)
self.blocks_short_to_float_2 = blocks.short_to_float(1, 1)
self.blocks_short_to_float_1_0 = blocks.short_to_float(1, 1)
self.blocks_short_to_float_1 = blocks.short_to_float(1, 1)
self.blocks_short_to_float_0_0 = blocks.short_to_float(1, 1)
self.blocks_short_to_float_0 = blocks.short_to_float(1, 1)
self.blocks_interleave_0_2 = blocks.interleave(gr.sizeof_short*1)
self.blocks_interleave_0_1 = blocks.interleave(gr.sizeof_short*1)
self.blocks_interleave_0_0 = blocks.interleave(gr.sizeof_short*1)
self.blocks_interleave_0 = blocks.interleave(gr.sizeof_short*1)
self.blocks_float_to_complex_0_0 = blocks.float_to_complex(1)
self.blocks_float_to_complex_0 = blocks.float_to_complex(1)
self.blocks_file_source_0 = blocks.file_source(gr.sizeof_short*10, "/dev/xillybus_data2_r", False)
 
##################################################
# Connections
##################################################
self.connect((self.blocks_vector_to_streams_0, 2), (self.blocks_interleave_0_2, 0))
self.connect((self.blocks_vector_to_streams_0, 3), (self.blocks_interleave_0_2, 1))
self.connect((self.blocks_vector_to_streams_0, 4), (self.blocks_interleave_0_1, 0))
self.connect((self.blocks_vector_to_streams_0, 5), (self.blocks_interleave_0_1, 1))
self.connect((self.blocks_vector_to_streams_0, 6), (self.blocks_interleave_0_0, 0))
self.connect((self.blocks_vector_to_streams_0, 7), (self.blocks_interleave_0_0, 1))
self.connect((self.blocks_vector_to_streams_0, 8), (self.blocks_interleave_0, 0))
self.connect((self.blocks_vector_to_streams_0, 9), (self.blocks_interleave_0, 1))
self.connect((self.blocks_short_to_float_1, 0), (self.blocks_float_to_complex_0, 1))
self.connect((self.blocks_short_to_float_0, 0), (self.blocks_float_to_complex_0, 0))
self.connect((self.blocks_short_to_float_0_0, 0), (self.blocks_float_to_complex_0_0, 0))
self.connect((self.blocks_short_to_float_1_0, 0), (self.blocks_float_to_complex_0_0, 1))
self.connect((self.blocks_vector_to_streams_0, 0), (self.blocks_short_to_float_2, 0))
self.connect((self.blocks_vector_to_streams_0, 1), (self.blocks_short_to_float_2_0, 0))
self.connect((self.blocks_short_to_float_2, 0), (self.wxgui_scopesink2_1, 0))
self.connect((self.blocks_short_to_float_2_0, 0), (self.wxgui_scopesink2_1, 1))
self.connect((self.blocks_short_to_float_0_0, 0), (self.wxgui_scopesink2_0, 0))
self.connect((self.blocks_short_to_float_1_0, 0), (self.wxgui_scopesink2_0, 1))
self.connect((self.blocks_short_to_float_0, 0), (self.wxgui_scopesink2_0, 2))
self.connect((self.blocks_short_to_float_1, 0), (self.wxgui_scopesink2_0, 3))
self.connect((self.blocks_interleave_0_2, 0), (self.blocks_short_to_float_0_0, 0))
self.connect((self.blocks_interleave_0_1, 0), (self.blocks_short_to_float_1_0, 0))
self.connect((self.blocks_interleave_0_0, 0), (self.blocks_short_to_float_0, 0))
self.connect((self.blocks_interleave_0, 0), (self.blocks_short_to_float_1, 0))
self.connect((self.blocks_throttle_2, 0), (self.blocks_vector_to_streams_0, 0))
self.connect((self.blocks_file_source_0, 0), (self.blocks_throttle_2, 0))
self.connect((self.blocks_float_to_complex_0_0, 0), (self.dc_blocker_xx_0, 0))
self.connect((self.dc_blocker_xx_0, 0), (self.wxgui_waterfallsink2_0_0, 0))
self.connect((self.blocks_float_to_complex_0, 0), (self.dc_blocker_xx_1, 0))
self.connect((self.blocks_float_to_complex_0_0, 0), (self.wxgui_fftsink2_1, 0))
self.connect((self.blocks_float_to_complex_0, 0), (self.wxgui_fftsink2_0, 0))
self.connect((self.blocks_short_to_float_0, 0), (self.wxgui_numbersink2_1, 0))
self.connect((self.blocks_short_to_float_1, 0), (self.wxgui_numbersink2_0, 0))
self.connect((self.dc_blocker_xx_1, 0), (self.wxgui_waterfallsink2_0, 0))
 
 
# QT sink close method reimplementation
 
def get_prefix(self):
return self.prefix
 
def set_prefix(self, prefix):
self.prefix = prefix
self.set_recfile(self.prefix + datetime.now().strftime("%Y.%m.%d.%H.%M.%S") + ".dat")
 
def get_samp_rate(self):
return self.samp_rate
 
def set_samp_rate(self, samp_rate):
self.samp_rate = samp_rate
self.blocks_throttle_2.set_sample_rate(self.samp_rate/2)
self.wxgui_scopesink2_1.set_sample_rate(self.samp_rate/2)
self.wxgui_waterfallsink2_0_0.set_sample_rate(self.samp_rate)
self.wxgui_scopesink2_0.set_sample_rate(self.samp_rate)
self.wxgui_waterfallsink2_0.set_sample_rate(self.samp_rate)
self.wxgui_fftsink2_0.set_sample_rate(self.samp_rate)
self.wxgui_fftsink2_1.set_sample_rate(self.samp_rate)
 
def get_recfile(self):
return self.recfile
 
def set_recfile(self, recfile):
self.recfile = recfile
 
if __name__ == '__main__':
import ctypes
import sys
if sys.platform.startswith('linux'):
try:
x11 = ctypes.cdll.LoadLibrary('libX11.so')
x11.XInitThreads()
except:
print "Warning: failed to XInitThreads()"
parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
(options, args) = parser.parse_args()
tb = MLAB_ADC_Grabber()
tb.Start(True)
tb.Wait()
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/dokumenty/skolni/diplomka/appendix.tex
27,3 → 27,16
 
\adddocument{/home/kaklik/svn/svnMLAB/Modules/Universal/FMC2DIFF01A/SCH_PCB/FMC2DIFF}
 
 
\app Content of enclosed CD
 
% zdrojove soubory prace
% referencni datovy soubor s navzorkovanymi daty
% instalacni soubor pro pouzitou verzi gnuradia
% pouzite GRG flow grafy
% datasheety
% fotografie z vyvoje a mereni ADC.
 
 
 
 
/dokumenty/skolni/diplomka/description.tex
1,6 → 1,6
\chap Trial design
 
The whole design of radioastronomy receiver digitalization unit is constructed to be used in a wide range of applications and tasks related to digitalisation of signal from radioastronomy receivers. A good illustrating problem for its use is a signal digitalisation from multiple antenna arrays. This design will eventually become a part of MLAB Advanced Radio Astronomy System.
The whole design of radioastronomy receiver digitalization unit is constructed to be used in a wide range of applications and tasks related to digitalization of signal from radioastronomy receivers. A good illustrating problem for its use is a signal digitalisation from multiple antenna arrays. This design will eventually become a part of MLAB Advanced Radio Astronomy System.
 
\sec Required parameters
 
31,7 → 31,7
 
This system concept allows for scalability, that is technically limited by a number of differential signals on host side and its computational power. There is another advantage of scalable data acquisition system -- an economic one. Observatories or end users can make a choice of how much money are they willing to spent on radioastronomy receiver system. This freedom of choice is especially useful for science sites without previous experience in radioastronomy observations.
 
\secc Differential signalling
\secc Differential signaling
 
The concept of scalable design requires relatively long circuit traces between ADC and digital unit which captures the data and performs the computations. The long distance between the digital processing unit and the analog-to-digital conversion unit has an advantage in noise retention typically produced by digital circuits. Those digital circuits, such as FPGA or other flip-flops block and circuit traces, usually work at high frequencies and emit wide-band noise with relatively low power. In such cases any increase in a distance between the noise source and analog signal source increase S/N significantly. However, at the same time a long distance brings problems with the digital signal transmission between ADC and computational unit. This obstacle should be resolved more easily in free-space than on board routing. The high-quality differential signalling shielded cables should be used. This technology has two advantages over PCB signal routing. First, it can use twisted pair of wires for leak inductance suppression in signal path and second, the twisted pair may additionally be shielded by uninterrupted metal foil.
 
39,7 → 39,7
 
For multiple antenna radioastronomy projects, system phase stability is a mandatory condition. It allows precise high resolution imaging of objects.
 
High phase stability in our scalable design is achieved through centralised frequency generation and distribution with multi-output LVPECL hubs, that have equiphased outputs for multiple devices.
High phase stability in our scalable design is achieved through centralized frequency generation and distribution with multi-output LVPECL hubs, that have equiphased outputs for multiple devices.
 
This design ensures that all devices have access to the defined phase and known frequency.
 
50,10 → 50,10
 
\secc Frequency synthesis
 
We have used a centralised topology as a basis for frequency synthesis. One precise high-frequency and low-jitter digital oscillator has been used, while other working frequencies have been derived from it by the division of its signal. This central oscillator has a software defined GPS disciplined control loop for frequency stabilisation.\fnote{\url{http://wiki.mlab.cz/doku.php?id=en:gpsdo} SDGPSDO design has been developed in parallel to this diploma thesis as a related project, but it is not explicitly required by the diploma thesis.}
We have used a centralized topology as a basis for frequency synthesis. One precise high-frequency and low-jitter digital oscillator has been used, while other working frequencies have been derived from it by the division of its signal. This central oscillator has a software defined GPS disciplined control loop for frequency stabilization.\fnote{\url{http://wiki.mlab.cz/doku.php?id=en:gpsdo} SDGPSDO design has been developed in parallel to this diploma thesis as a related project, but it is not explicitly required by the diploma thesis.}
We have used methods of frequency monitoring compensation in order to meet modern requirements on radioastronomy equipment which needs precise frequency and phase stability over a wide scale for effective radioastronomy imaging.
Every ADC module will be directly connected to CLKHUB02A module which takes sampling clock signal delivered by FPGA from main local oscillator. This signal should use high quality differential signalling cable -- we should use SATA cable for this purpose.
Every ADC module will be directly connected to CLKHUB02A module which takes sampling clock signal delivered by FPGA from main local oscillator. This signal should use high quality differential signaling cable -- we should use SATA cable for this purpose.
 
GPSDO design included in data acquisition system has special feature -- generates time marks for precise time-stamping of received signal. Timestamps are created by disabling of local oscillator for 100 us as result rectangle click in input signal is created which appears as horizontal line in spectrogram.
Timestamps should be seen in image \ref[meteor-reflection] (above and below meteor reflection).
82,26 → 82,17
\endinsert
 
\secc Signal integrity requirements
\label[diff-signaling]
 
We use ADC modules that have DATA clock frequency eight times higher than sampling frequency in single line output mode, implying a 40 MHz output bit rate.
We use ADC modules that have DATA clock frequency eight times higher than sampling frequency in single line output mode, implying a 40 MHz output bit rate. This imply $ 1/4*10^7 = 25$ ns time length of data bit, which is equivalent to 7.5m light path in free space. If we use copper PCB with FR4 substrate layer or coaxial/twinax cable, we could obtain velocity factor of 0.66 at worst condition. Then the light path for the same bit rate will be 4.95 m. Although we do not have any cables in system with comparable lengths, worst data bit skew described by data sheets of used components is $0.3*sample time$ time which is 1.485 m. Therefore length matching is not critical in our design.
 
 
\secc ADC modules design
 
The ADC modules have a standard MLAB construction scheme with four mounting holes in corners aligned in defined raster.
 
Data serial data outputs of ADC modules should be connected directly to FPGAs for the basic primary signal processing. The ADC chip used in the modules has a selectable bit width of data output bus and thus the output SATA connectors have signals arranged to contain a single bit from every ADC channel. This creates a signal concept enabling a selection of a proper bus bit-width according to the sampling rate (higher bus bit-width downgrades signalling speed and vice versa.)
 
In order to connect the above mentioned signalling layout, miniSAS to multiple SATA cable should be used.
 
A KiCAD design suite had been chosen for PCB layout. However, the version is, despite having integrated CERN Push \& Shove routing capability, slightly unstable as it sometimes crushes due to an exception during routing. On the basis of these stability issues, the design had to be saved quite often. On the other hand, compared to commercially available solutions, such as MentorGraphics PADS or Cadence Orcad, the Open-source KiCAD provides an acceptable option and it easily surpasses a widely used Eagle software.
 
As a part of work on the thesis, new PCB footprints for FMC, SATA a and miniSAS connectors have been designed and were committed to KiCAD github library repository. They are now publicly available on the official KiCAD repository at GitHub.
 
 
\secc ADC selection
 
There exist several ADC signalling formats currently used in communication with FPGA.
There exist several ADC signaling formats currently used in communication with FPGA.
 
\begitems
* DDR LVDS
116,7 → 107,7
 
An ultrasound AFE chip seems to be ideal for this purpose -- the chip has integrated both front-end amplifiers and filters. It has a drawback though - it is incapable of handling differential input signal and has a relatively low dynamic range (as it consists only of 12bit ADC). Because this IO has many ADC channels the scaling is possible only by a factor of 4 receivers (making 8 analogue channels).
 
If we require a separate output for every analogue channel and a 16bit depth we find that there are only a few 2-Channel simultaneous sampling ADCs currently existing which meet these requirements. We have summarised the ADCs in the following table \ref[ADC-type]
If we require a separate output for every analogue channel and a 16bit depth we find that there are only a few 2-Channel simultaneous sampling ADCs currently existing which meet these requirements. We have summarized the ADCs in the following table \ref[ADC-type]
 
\midinsert \clabel[ADC-types]{Available ADC types}
\ctable{lrrrrrcc}{
133,10 → 124,43
 
All parts in this category are compatible with one board layout. Main differences lay in the sampling frequency and signal to noise ratio, with the slowest having a maximum sampling frequency of 20 MHz. However all of them have a minimal sampling frequency of 5 MSPS and all are configurable over a serial interface (SPI). SPI seems to be a standard interface used in high-end ADC chips made by the largest manufacturers (Analog Devices, Linear technology, Texas instruments, Maxim integrated..).
 
 
 
The ADC modules have a standard MLAB construction scheme with four mounting holes in corners aligned in defined raster.
 
Data serial data outputs of ADC modules should be connected directly to FPGAs for the basic primary signal processing. The ADC chip used in the modules has a selectable bit width of data output bus and thus the output SATA connectors have signals arranged to contain a single bit from every ADC channel. This creates a signal concept enabling a selection of a proper bus bit-width according to the sampling rate (higher bus bit-width downgrades signalling speed and vice versa.)
 
In order to connect the above mentioned signalling layout, miniSAS to multiple SATA cable should be used.
 
A KiCAD design suite had been chosen for PCB layout. However, the version is, despite having integrated CERN Push \& Shove routing capability, slightly unstable as it sometimes crushes due to an exception during routing. On the basis of these stability issues, the design had to be saved quite often. On the other hand, compared to commercially available solutions, such as MentorGraphics PADS or Cadence Orcad, the Open-source KiCAD provides an acceptable option and it easily surpasses a widely used Eagle software.
 
As a part of work on the thesis, new PCB footprints for FMC, SATA a and miniSAS connectors have been designed and were committed to KiCAD github library repository. They are now publicly available on the official KiCAD repository at GitHub.
 
 
 
ADCdual01A module has several digital data output formats
 
\begitems
* 1-lane mode
\enditems
 
All of these modes are supported by module design. For discused data acquisition system the 1-lane mode was selected. 1-lane mode allows minimal number of differential pairs between ADCdual01A and FPGA. Digital signaling scheme used in 1-lane mode is shown in image \ref[1-line-out].
 
\midinsert
\clabel[1-line-out]{Single line ADC output signals}
\picw=15cm \cinspic ./img/ADC_single_line_output.png
\caption/f Digital signaling shema for 1-line ADC digital output mode.
\endinsert
 
ADCdual01A parameters can be set either by jumper setup (refered as parallel programming in device's data sheet) or by SPI interface. SPI interface has been selected for our system, because parallel programming lacks of options (test pattern output setup for example).
 
Complete schematic diagram of ADCdual01A module board is included in the appendix.
 
 
\secc ADC modules interface
 
Both of the ADCdual01A modules were connected to FPGA ML605 board trough FMC2DIFF01A adapter board. The design of this adapter module expects the presence of FMC LPC connector and the board is, at the same time, not compatible with MLAB. It is, on the other hand, designed to meet the VITA 57 standard specifications for boards which support region 1 and region 3. VITA 57 regions are explained in the picture \ref[VITA57-regions].
This industry standard guarantees the compatibility with other FPGA boards that have FMC LPC connectors for Mezzanine Card. Schematic diagram of this adapter board is included in the appendix.
This industry standard guarantees the compatibility with other FPGA boards that have FMC LPC connectors for Mezzanine Card. Schematic diagram of designed adapter board is included in the appendix.
 
The primary purpose of the PCB is to enable the connection of ADC modules located outside the PC case. (In PC box analog circuits cannot be realised without the use of massive RFI mitigation techniques).
Differential signalling connectors should be used for conducting digital signal over relatively long cables. The signal integrity sensitive links (clocks) are equipped with output driver and translator to LVPECL logic for better signal transmission quality.
154,10 → 178,9
 
Several SATA connectors and two miniSAS connectors are populated on this board. This set of connectors allows a connection of any number of ADC modules within the range of 1 to 8. ADC data outputs should be connected to the miniSAS connectors, while other supporting signals should be routed directly to SATA connectors on adapter.
 
Differential pairs routed on PCB are not matched for lenghts. Althought inter differential pairs
Lengths of differential pairs routed on PCB of module are not matched between pairs. Length variation of differential pairs is not critical in our design according to facts discussed in paragraph \ref[diff-signaling]. Nevertheless signals within differential pairs itself are matched for length. Internal signal traces length mating of differential pairs is mandatory in order to avoid dynamic logic hazard conditions on digital signals. Thus clocks signals are routed most precisely on all designed boards.
 
 
 
Signal configuration used in our trial design is described in the following tables.
 
\secc Output data format
193,75 → 216,71
 
\secc ADC module parameters
 
Two pieces of ADC modules were completed and tested. The first piece, labeled ADC1, has LTC21190
ADC chip populated with LT6600-5 front-end operational amplifier. It also has a 1kOhm resistors populated on inputs which gives it an ability of an internal attenuation of input signal. The value of this attenuation $A$ is described by the following formula
Two pieces of ADC modules were completed and tested. The first piece, labeled ADC1, has LTC2190
ADC chip populated with LT6600-5 front-end operational amplifier. It also has a 1kOhm resistors populated on inputs which gives it an ability of an internal attenuation of input signal. The value of this attenuation $A$ is described by the following formula \ref[ADC1-gain]
 
 
\midinsert
\picw=15cm \cinspic ./img/screenshots/ADC1_CH2_FFT.png
\caption/f Sine signal sampled by ADC1 module with LTC21190 and LT6600-5 devices.
\endinsert
 
 
ADC1 CH1 maximal input 705.7 mV
 
 
 
\label[ADC1-gain]
$$
A = {1580 \times R_1 \over R_1 + R_2}
A = {806 \times R_1 \over R_1 + R_2}
$$
 
Where is
\begitems
* $A$ - Gain of input aplifier.
* $A$ - Gain of input amplifier.
* $R_1$ - Output impedance of signal source (usually 50 Ohm).
* $R_2$ - Value of serial resitors at operational apmlifier inputs.
* $R_2$ - Value of serial resistors at operational amplifier inputs.
\enditems
 
We have $R_2 = 1000 \Omega$ and $R_1 = 50 \Omega$ which imply $A = 0.815$. That value of A is confirmed by measurement.
In our measurement setup we have H1012 Ethernet transformer connected at inputs of ADC. Transformer has 10\% tolerance in impedance and amplification. We measured ADC saturation voltage 705.7 mV (generator output) in this setup due to impedance mismatch and uncalibrated transformer gain.
 
 
\midinsert
\picw=15cm \cinspic ./img/screenshots/ADC2_CH1_FFT.png
\caption/f Sine signal sampled by ADC2 module with LTC2271 and LT6600-2.5 devices.
\clabel[ADC1-FFT]{ADC1 sine test FFT}
\picw=15cm \cinspic ./img/screenshots/ADC1_CH2_FFT.png
\caption/f Sine signal sampled by ADC1 module with LTC2190 and LT6600-5 devices.
\endinsert
 
1k
 
ADC2 CH1 maximal input 380 mV
For ADC2 we must use formula with different constant \ref[ADC1-gain]. ADC2 module has LT6600-2.5 populated and gain is $A = 2.457$ with same $R_2$ resistors. We measured saturation voltage of 380 mV (generator output) at channel 1 on this ADC. It is well in parameter tolerances of used setup.
 
 
\label[ADC2-gain]
$$
A = {806 \times R_1 \over R_1 + R_2}
A = {1580 \times R_1 \over R_1 + R_2}
$$
 
Where is
\begitems
* $A$ - Gain of input aplifier.
* $A$ - Gain of input amplifier.
* $R_1$ - Output impedance of signal source (usually 50 Ohm).
* $R_2$ - Value of serial resitors at operational apmlifier inputs.
* $R_2$ - Value of serial resistors at operational amplifier inputs.
\enditems
 
Both images confirms that ADC modules have input dynamical range 80 dB at least.
\midinsert
\clabel[ADC2-FFT]{ADC2 sine test FFT}
\picw=15cm \cinspic ./img/screenshots/ADC2_CH1_FFT.png
\caption/f Sine signal sampled by ADC2 module with LTC2271 and LT6600-2.5 devices.
\endinsert
 
Computed FFT spectra for measured signal are shown in images \ref[ADC2-FFT] and \ref[ADC1-FFT]. Both images confirms that ADCdual01A modules have input dynamical range 80 dB at least.
 
 
ADCdual01A module has several digital data output formats
\begitems
* 1-lane mode
\enditems
 
All of these modes are supported by module design. For discused data aquisition system the 1-lane mode was selected. 1-lane mode allows minimal number of diff pais between ADCdual01A and FPGA.
 
ADCdual01A parameters can be set either by jupmper setup (refered as parallel pragramming in device's datasheet) or by SPI interface. SPI interface has been selected for our system, because papralel programming lacks of option of test pattern output setup.
 
\chap Example of usage
 
%\sec Simple polarimeter station
For additional validation of system design a receiver setup was constructed.
\sec Basic interferometer station
 
For system evaluation basic interferometry station was constructed.
Interferometry station was selected as most basic setup. We connected the new data acquisition system to two SDRX01B receivers. Block schematic of used setup is shown in image \ref[block-schematic]. Two ground-plane antennas were used and mounted outside of balcony at CTU building at location 50°4'36.102"N, 14°25'4.170"E. Antennas were equipped by LNA01A amplifiers. Coaxial cable length are matched for 5 meters. And antennas were isolated by common mode ferrite bead mounted on cable for minimize signal coupling between antennas. Evaluation system consists SDGPSDO local oscillator subsystem used for tunning local oscillator frequency.
 
\midinsert
\clabel[block-schematic]{Receiver block schematic}
\picw=10cm \cinspic ./img/Coherent_UHF_SDR_receiver.png
\caption/f Complete receiver block schematic of dual antenna interferometric station.
\endinsert
 
 
 
\midinsert
\clabel[meteor-reflection]{Meteor reflection}
\picw=10cm \cinspic ./img/screenshots/observed_meteor.png
\caption/f Meteor reflection received by evaluation setup.
274,18 → 293,14
\endinsert
 
 
\midinsert
\clabel[block-schematic]{Receiver block schematic}
\picw=10cm \cinspic ./img/Coherent_UHF_SDR_receiver.png
\caption/f Complete receiver block schematic of dual antenna interferometric station.
\endinsert
 
 
%\sec Simple passive Doppler radar
 
%\sec Simple polarimeter station
 
\chap Proposed final system
 
Construction of a final system which is supposed to be employed for real radioastronomy observations will be described. This chapter is mainly a theoretical analysis of data handling systems. Realisation of these ideas might be possible as a part of our future development after we fully evaluate and test the current trial design.
Construction of a final system which is supposed to be employed for real radioastronomy observations will be described. This chapter is mainly a theoretical analysis of data handling systems. Realization of these ideas might be possible as a part of our future development after we fully evaluate and test the current trial design.
 
\sec Custom design of FPGA board
 
/dokumenty/skolni/diplomka/img/screenshots/ADC1_cross_talk.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/dokumenty/skolni/diplomka/img/screenshots/ADC2_CH2_FFT.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/dokumenty/skolni/diplomka/img/screenshots/ADC2_cross_talk.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property