-
Notifications
You must be signed in to change notification settings - Fork 1
/
Base_designs.tex
2224 lines (1775 loc) · 111 KB
/
Base_designs.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\documentclass[12pt,oneside]{article}
\usepackage{makeidx,anysize,mflogo,xspace,float,epsfig,url}
\usepackage{amsmath,amsfonts,amssymb,a4wide,pifont}
\usepackage[utf8]{inputenc}
%\usepackage[francais]{babel}
%\usepackage[french]{babel}
\urlstyle{sf}
%\usepackage{subcaption}
\usepackage[colorlinks = true,
linkcolor = blue,
urlcolor = blue,
citecolor = blue,
anchorcolor = blue]{hyperref}
\usepackage{graphicx}
\usepackage{graphics}
\usepackage{float}
\usepackage[toc,page]{appendix}
\usepackage{caption}
\usepackage{colordvi} %??
\usepackage{listings}
\usepackage{subfigure}
\usepackage{subfloat}
\usepackage[dvipsnames]{xcolor}
\usepackage{multicol}
\usepackage{tikz}
\usetikzlibrary{calc,trees,patterns,positioning,decorations.pathreplacing,shapes}
\usepackage{array}
\usepackage{comment}
\graphicspath{{./figures/}}
%\usepackage[labelsep=quad,indention=10pt]{subfig}
\definecolor{grey}{rgb}{0.95,0.95,0.95} % on définit la couleur grise
% (c'est un gris très clair)
\definecolor{red}{rgb}{1.0,0.0,0.0}
\definecolor{green}{rgb}{0.0,1.0,0.0}
\definecolor{blue}{rgb}{0.0,0.0,1.0}
\lstloadlanguages{Python,bash,Java,C,C++,csh,make,sh}%%[Visual]Basic,xml}
\lstset{frame=none,basicstyle=\footnotesize,breaklines,tabsize=2,captionpos=b,
prebreak={\hbox{$\rightarrow$}},postbreak={\hbox{$\hookrightarrow$}},
showstringspaces=false,backgroundcolor=\color{grey}\bfseries,
keywordstyle=\color{blue},commentstyle=\color{PineGreen}\textit,
stringstyle=\color{red}\ttfamily,abovecaptionskip=2pt,aboveskip=0pt,
belowskip=0pt,belowcaptionskip=0pt,numbers=none,columns=fullflexible, backgroundcolor=\color{grey}}
\usepackage{arydshln}
%left,numberstyle=\footnotesize,
% stepnumber=2,numbersep=1pt}
\begin{document}
\begin{center}
{\bf \Large Base designs} \\ \ \\
S. Denis, B. Maréchal G. Goavec-M\'erou, J.-M Friedt \\ \ \\ \today
\end{center}
This document aims at making a brief description of basic RF functions that can be set-up, using Vivado and the fpga\_ip repository. It assumes acquired the a priori knowledge on the OscillatorIMP ecosystem, otherwise refer to : \href{[https://github.com/oscimp/oscimpDigital]}{https://github.com/oscimp/oscimpDigital}.
The points discussed, listed below, are wrapped up in the example of a control loop design, with modulation and demodulation. A summary table of the IP blocks that can be used to build a numerical RF setup is given in the next pages.
\begin{multicols}{2}
\begin{enumerate}
\setlength\itemsep{-0.1cm}
\item Reminder on signal dynamics
\item Webserver
\item Double voltage source
\item Double DDS
\item Amplitude modulation
\item Sine perturbation of a signal
\item Frequency and phase modulation of a NCO
\item Filtering
\item Demodulation
\item Monitoring
\item Example to a control loop
\item FAQ
\end{enumerate}
\end{multicols}
\section{Reminder on signal dynamics}\label{sect:reminder}
Regardless of the presented functions, it's obviously better to optimize the dynamic of a signal to the range of data available. This first minimizes the part of noise of the electronics with respect to the signal. Secondly if the signal dynamic exceeds the range available, there is an overflow. For instance $14~bits$ signed data represent a range of $\pm 13~bits$ ie. from $-8192$ to $8191~arb.~unit$. Above $8191~arb.~unit$, there is an overflow and the signal returns to the beginning of the range, ie. $-8192$. Representation in Fig.\ref{fig:overflow}.
\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.5\linewidth]{figures/overflow.jpg}
\caption{Overflow on the top and bottom of a sine.}
\label{fig:overflow}
\end{center}
\end{figure}
\newpage
\vspace*{-1.7cm}
\hspace*{-1cm}
\begin{tabular}{|>{\centering\arraybackslash}m{.3\linewidth} | >{\centering\arraybackslash}m{.3\linewidth} |>{\centering\arraybackslash}m{.3\linewidth}|}
\hline
& & \\
\textbf{IP} & \textbf{Equivalent RF function {\color{BlueViolet}or numeric function}} &\textbf{ Equivalent scheme with {\color{OliveGreen} tunable entries}} \\
& & \\
\hline
\includegraphics[width=5cm,trim={1cm 9cm 1cm 8cm},clip]{figures/Offset.pdf} &Tunable amplitude offset, bias.\newline {\color{BlueViolet}The added offset value is internal to the block.}&
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (plus) {{\color{OliveGreen}$+$}};
\node[xshift=-1.1cm] (i) {in};
\node[yshift=+0.65cm] (c) {\textbf{{\color{OliveGreen}Offset}}};
\node[xshift=+1.2cm] (o) {out};
\draw [->,>=stealth,line width=2pt,blue] (i) -- (plus);
\draw [->,>=stealth,line width=2pt,blue] (plus) -- (o);
\end{tikzpicture} \\
\hline
\includegraphics[width=4.8cm,trim={1cm 9.5cm 1cm 9cm},clip]{figures/splitter.pdf} &Splitter&
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.8cm] (spl) {};
\node[xshift=-1.1cm] (i) {in};
\node[xshift=+1.4cm,yshift=+0.36cm] (o1) {out1};
\node[xshift=+1.4cm,yshift=-0.36cm] (o2) {out2};
\draw [-,line width=2pt,blue] (spl.west) -- (spl.center);
\draw [-,line width=2pt,blue] (spl.center) -- ([yshift=-0.03cm] spl.north east);
\draw [-,line width=2pt,blue] (spl.center) -- ([yshift=+0.03cm] spl.south east);
\draw [->,>=stealth,line width=2pt,blue] ([yshift=-0.04cm] spl.north east) -- (o1);
\draw [->,>=stealth,line width=2pt,blue] ([yshift=+0.04cm] spl.south east) -- (o2);
\draw [-,>=stealth,line width=2pt,blue] (i) -- (spl);
\end{tikzpicture} \\
\hline
\includegraphics[width=6cm,trim={6.2cm 11.5cm 4cm 11.5cm},clip]{figures/addsub.pdf} &\hspace*{0.8cm}Combiner.\newline {\color{BlueViolet} Add or subtract signals. The added/subtracted signal is external to the block unlike the add\_const block.}&
\begin{tikzpicture}
\node[draw, circle, minimum size=.6cm] (plus) {\tiny $\pm$};
\node[xshift=-1.3cm] (i) {in1};
\node[yshift=+1.1cm] (c) {in2};
\node[xshift=+1.2cm] (o) {out};
\draw [->,>=stealth,line width=2pt,blue] (i) -- (plus);
\draw [->,>=stealth,line width=2pt,blue] (plus) -- (o);
\draw [->,>=stealth,line width=2pt,blue] (c) -- (plus);
\end{tikzpicture} \\
\hline
\includegraphics[width=4.6cm,trim={1cm 9.5cm 1cm 8.5cm},clip]{figures/mixer.pdf} &Mixer, multiplier.&
\begin{tikzpicture}
\node [circle, draw ,minimum size=.6cm] (mix) {};
\draw [-] (mix.south west) -- (mix.north east);
\draw [-] (mix.south east) -- (mix.north west);
\node [xshift=-1.2cm] (l) {if};
\node [yshift=+1cm] (u) {lo};
\node [xshift=+1.2cm] (r) {rf};
\draw [->,>=stealth,line width=2pt,blue] (l) -- (mix);
\draw [->,>=stealth,line width=2pt,blue] (u) -- (mix);
\draw [->,>=stealth,line width=2pt,blue] (mix) -- (r);
\end{tikzpicture} \\
\hline
\includegraphics[width=4.8cm,trim={1cm 9cm 1cm 8cm},clip]{figures/fir.pdf} &\hspace*{0.6cm}Tunable filter.\newline {\color{BlueViolet}FIR with decimation option.}&
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (fir) {};
\node[xshift=-1.1cm] (i) {in};
\node[xshift=+1.2cm] (o) {out};
\draw [-, line width=1pt, color=black!60!green, rounded corners] ([xshift=.05cm,yshift=-.2cm] fir.north west) -| ([xshift=-.2cm,yshift=+.2cm] fir.south east);
\draw [->,>=stealth, line width=1pt, color=black!60!green] ([xshift=-.1cm,yshift=-.15cm] fir.north east) -- ([xshift=-.1cm,yshift=+.15cm] fir.south east);
\draw [line width=2pt,blue] (i) -- (fir);
\draw [->,>=stealth,line width=2pt,blue] (fir) -- (o);
\end{tikzpicture} \\
\hline
\includegraphics[width=4.5cm,trim={1cm 10cm 1cm 9.5cm},clip]{figures/exp.pdf}\newline
\includegraphics[width=5cm,trim={2cm 11cm 2cm 10.5cm},clip]{figures/shift1.pdf} & {\footnotesize Can be assimilated to $2^m$ amplifiers or attenuators.\newline
{\color{BlueViolet}Are used to adapt the data size between blocks, or to select the range of the numeric signal.\newline
Expander: crop end of word, expand beginning of word. Shift: crop beginning of word, expand end of word.}}&
\hspace*{0.45cm}\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (exp) {exp};
\node[xshift=-1.1cm] (i) {in};
\node[xshift=+1.3cm] (o) {out};
\draw [line width=2pt,blue] (i) -- (exp);
\draw [->,>=stealth,line width=2pt,blue] (exp) -- (o);
\end{tikzpicture} \newline
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (exp) {sh};
\node[xshift=-1.1cm] (i) {in};
\node[xshift=+1.2cm] (o) {out};
\draw [line width=2pt,blue] (i) -- (exp);
\draw [->,>=stealth,line width=2pt,blue] (exp) -- (o);
\end{tikzpicture}
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (exp) {\textbf{{\color{OliveGreen}dyn-sh}}};
\node[xshift=-1.5cm] (i) {in};
\node[xshift=+1.65cm] (o) {out};
\draw [line width=2pt,blue] (i) -- (exp);
\draw [->,>=stealth,line width=2pt,blue] (exp) -- (o);
\end{tikzpicture} \\
\hline
\includegraphics[width=4cm,trim={7.5cm 13.4cm 12.3cm 13.2cm},clip]{figures/switch.pdf} &Switch&
\begin{tikzpicture}
\usetikzlibrary{arrows}
\node[draw, rectangle, minimum size=.8cm] (spl) {};
\node[xshift=+1.1cm] (i) {out};
\node[yshift=+0.9cm,xshift=-0.1cm] (s) {};
\node[xshift=-1.4cm,yshift=+0.36cm] (o1) {in1};
\node[xshift=-1.4cm,yshift=-0.36cm] (o2) {in2};
\node[OliveGreen, yshift=+0.37cm, xshift=-0.4cm]{$\bullet$};
\node[OliveGreen, yshift=-0.37cm, xshift=-0.4cm]{$\bullet$};
\draw [-,line width=2pt,blue] (spl.east) -- (spl.center);
\draw [-, line width=2pt,OliveGreen] (spl.center) -- ([yshift=-0.03cm] spl.north west);
\draw [<-,>=stealth,line width=2pt,blue] ([yshift=-0.04cm] spl.north west) -- (o1);
\draw [<-,>=stealth,line width=2pt,blue] ([yshift=+0.04cm] spl.south west) -- (o2);
\draw [<-,>=stealth,line width=2pt,OliveGreen,dash dot] ([yshift=+0.2cm,xshift=-0.1cm] spl.center) -- (s);
\draw [-,line width=2pt,blue] (i) -- (spl);
\node[OliveGreen]{$\bullet$};
\end{tikzpicture} \\
\hline
\end{tabular}
\newpage
\vspace*{-1.5cm}
\hspace*{-1cm}
\begin{tabular}{|>{\centering\arraybackslash}m{.3\linewidth} | >{\centering\arraybackslash}m{.3\linewidth} |>{\centering\arraybackslash}m{.3\linewidth}|}
\hline
& & \\
\textbf{IP} & \textbf{Equivalent RF function {\color{BlueViolet}or numeric function}}&\textbf{ Equivalent scheme with {\color{OliveGreen}tunable entries}} \\
& & \\
\hline
\includegraphics[width=3.8cm,trim={2cm 10.5cm 2cm 10cm},clip]{figures/mean.pdf} &\hspace*{0.45cm}Moving average.\newline
{\color{BlueViolet}Decimation of $2^n$ with averaging: slows the data flow.}
&
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (exp) {$\sum~2^n$};
\draw [->,>=stealth, line width=1pt] ([xshift=-.3cm,yshift=-.15cm] fir.north east) -- ([xshift=-.3cm,yshift=+.15cm] fir.south east);
\node[xshift=-1.25cm] (i) {in};
\node[xshift=+1.45cm] (o) {out};
\draw [line width=2pt,blue] (i) -- (exp);
\draw [->,>=stealth,line width=2pt,blue] (exp) -- (o);
\end{tikzpicture} \\
\hline
\includegraphics[width=4.3cm,trim={2cm 9cm 2cm 8.4cm},clip]{figures/delay.pdf} &Tunable delay line ie. cables. &
\begin{tikzpicture}
bg
\node[minimum size=.6cm] (i) {in};
\node[xshift=+3.5cm,minimum size=.6cm] (o) {out};
\draw [-,line width=2pt, blue] ([xshift=4em] i.center)+(-0.5cm,0) arc (270:360+270:0.3) -- ([xshift=4em] i.center)+(-0.25cm,0) arc (270:360+270:0.3) -- ([xshift=4em] i.center) arc (270:360+270:0.3) -- ([xshift=4em] i.center)+(.25cm,0) arc (270:360+270:0.3) -- ([xshift=4em] i.center)+(.5cm,0) arc (270:360+270:0.3);
\draw [-,line width=2pt, blue] (i) -- (o);
\node[minimum size=.6cm, yshift=-0.3cm, xshift=+1.75cm] {\textbf{{\color{OliveGreen}delay}}};
\end{tikzpicture} \\
\hline
\hline
\includegraphics[width=4cm,trim={2cm 8.1cm 2cm 7.8cm},clip]{figures/axi2dac.pdf} &Tunable voltage source. \newline{\color{BlueViolet} Controllable states/constants.}&
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (plus) {\textbf{{\color{OliveGreen}$\lambda$}}};
\node[xshift=+1.3cm, yshift=+0.2cm] (o) {out1};
\node[xshift=+1.3cm, yshift=-0.2cm] (o2) {out2};
\draw [->,>=stealth,line width=2pt,blue] ([yshift=-0.1cm] plus.north east) -- (o);
\draw [->,>=stealth,line width=2pt,blue] ([yshift=+0.1cm] plus.south east) -- (o2);
\end{tikzpicture} \\
\hline
\includegraphics[width=4.5cm,trim={1cm 6.5cm 1cm 6.4cm},clip]{figures/nco.pdf}
&\hspace*{0.8cm} DDS \newline {\color{BlueViolet}NCO}&
\begin{tikzpicture}
\node [circle, draw ,minimum size=.6cm] (osc2){};
\node [minimum size=.6cm, yshift=+0.6cm] {\textbf{{\color{OliveGreen}$f_0$}}};
\draw ([xshift=-0.2cm] osc2.center) sin ([xshift=-0.10cm, yshift=-0.10cm] osc2.center) cos (osc2.center) sin ([xshift=0.10cm, yshift=0.10cm] osc2.center) cos ([xshift=0.2cm] osc2.center);
\node [xshift=-1.8cm] (l) {\textbf{{\color{OliveGreen}$\phi_{off}$, $\phi_{inc}$}}};
\node [xshift=+1.2cm] (r) {out};
\draw [->,>=stealth,line width=2pt,blue] (l) -- (osc2);
\draw [->,>=stealth,line width=2pt,blue] (osc2) -- (r);
\end{tikzpicture} \\
\hline
\includegraphics[width=4cm,trim={7cm 11.6cm 7cm 9.75cm},clip]{figures/pidv3.pdf} &PID&
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (pid) {\textbf{{\color{OliveGreen}PID}}};
\node[xshift=-1.2cm] (i) {$\varepsilon$};
\node[xshift=+1.4cm] (o) {out};
\draw [->,>=stealth,line width=2pt,blue] (i) -- (pid);
\draw [->,>=stealth,line width=2pt,blue] (pid) -- (o);
\end{tikzpicture} \\
\hline
\includegraphics[width=3.8cm,trim={1cm 7.45cm 1cm 6.5cm}, clip]{figures/dat2ram.pdf} &Monitoring: oscilloscope, spectrum analyzer...\newline {\color{BlueViolet}Can also be used to process the signal in the CPU. Up to 12 channels.} &
\begin{tikzpicture}
\node[draw, rectangle, minimum size=1cm] (dat) {Data2Ram};
\node[xshift=-2.2cm, yshift=+.4cm] (i1) {in 1};
\node[xshift=-2.2cm, yshift=-.4cm] (i2) {in 12};
\node[xshift=-2.2cm, yshift=0cm] (i) {in ...};
\draw [->,>=stealth,line width=2pt,blue] (i1) -- ([yshift=-.1cm] dat.north west);
\draw [->,>=stealth,line width=2pt,blue] (i2) -- ([yshift=+.1cm]dat.south west);
\draw [->,>=stealth,line width=2pt,blue] (i) -- (dat.west);
\end{tikzpicture} \\
\hline
\includegraphics[width=4.6cm,trim={7cm 10.55cm 7cm 11.7cm}, clip]{figures/convert} & Split or combine In-phase and Quadrature components.\newline {\color{BlueViolet}Convert $\mathbb{R}$ to $\mathbb{C}$ or $\mathbb{C}$ to $\mathbb{R}$.} &
\begin{tikzpicture}
\node[draw, rectangle, minimum size=0.8cm] (dat) {$\mathbb{R}$2$\mathbb{C}$};
\node[xshift=-1.6cm, yshift=+.2cm] (i1) {Re};
\node[xshift=-1.6cm, yshift=-.2cm] (i2) {Im};
\node[xshift=+1.6cm, yshift=0cm] (i) {$\mathbb{C}$};
\draw [->,>=stealth,line width=2pt,blue] (i1) -- ([yshift=-.2cm] dat.north west);
\draw [->,>=stealth,line width=2pt,blue] (i2) -- ([yshift=+.2cm]dat.south west);
\draw [->,>=stealth,line width=2pt,blue] (dat.east) -- (i);
\end{tikzpicture}
\begin{tikzpicture}
\node[draw, rectangle, minimum size=0.8cm] (dat) {$\mathbb{C}$2$\mathbb{R}$};
\node[xshift=+1.6cm, yshift=+.2cm] (i1) {Re};
\node[xshift=+1.6cm, yshift=-.2cm] (i2) {Im};
\node[xshift=-1.6cm, yshift=0cm] (i) {$\mathbb{C}$};
\draw [<-,>=stealth,line width=2pt,blue] (i1) -- ([yshift=-.2cm] dat.north east);
\draw [<-,>=stealth,line width=2pt,blue] (i2) -- ([yshift=+.2cm]dat.south east);
\draw [<-,>=stealth,line width=2pt,blue] (dat.west) -- (i);
\end{tikzpicture} \\
\hline
\end{tabular}
\section{Webserver}\label{sect:webserver}
The tunable parameters of the IPs are controlled through C coded functions, visible in the {\tt /oscimpDigital/lib/my\_lib.h} library files. Example of functions with a generic driver ``fpgagen'':
\begin{lstlisting}[language=C]
fpgagen_send_conf(char *filename, int reg, int value);
fpgagen_recv_conf(char *filename, int reg, int *value);
\end{lstlisting}
\hspace{1cm}
Those functions can be implemented in a graphic interface to constitute a user friendly control of the IPs. Here we show an example of webserver using RemI\footnote{Download and Faq : https://www.remigui.com/}, a cross platform remote gui for python. The wrapper liboscimp\_fpga.py makes the intermediary between the webserver and the libraries. It takes the following form:
\vspace{-0.2cm}
\begin{lstlisting}[language=Python]
import ctypes
from ctypes import *
lib = ctypes.CDLL('/usr/lib/liboscimp_fpga.so')
def fpgagen_send_conf(filename, reg, value):
file = ctypes.create_string_buffer(str.encode(filename))
my_val = int(value)
lib.fpgagen_send_conf(file, reg, my_val)
def fpgagen_recv_conf(filename, reg):
file = ctypes.create_string_buffer(str.encode(filename))
my_val = c_int()
ret_val = lib.fpgagen_recv_conf(file, reg, byref(my_val))
return (ret_val, my_val.value)
\end{lstlisting}
\hspace{1cm}
Then the example of functions implemented in the webserver to configure the IPs is:
\vspace{-0.2cm}
\begin{lstlisting}[language=Python]
import liboscimp_fpga
liboscimp_fpga.fpgagen_send_conf("/dev/my_file", my_reg, my_value)
\end{lstlisting}
\hspace{1cm}
In the webserver, values sent to the IPs can either take the form of slider, a spinbox, a checkbox, a button... In our case, a simple actuator will be represented by a checkbox, and any other controllable value by both a slider and a spinbox. The structure of the webserver is as follows:
\vspace{-0.2cm}
\begin{lstlisting}[language=Python]
#!/usr/bin/env python
import liboscimp_fpga
import ctypes
import remi.gui as gui
from remi import start, App
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
def main(self):
self.w = gui.VBox()
#Create the slider and the spinbox, whose value is restricted to -8192 to 8191 (no overflow)
self.hbox_MY_VALUE = gui.HBox(margin="10px")
self.lb_MY_VALUE = gui.Label("/dev/MY_VALUE_FILE", width="20%", margin="50px")
self.sd_MY_VALUE = gui.Slider(0, -8192, 8191, 1, width="60%", margin="10px")
self.sd_MY_VALUE.onchange.do(self.sd_MY_VALUE_changed)
self.sb_MY_VALUE = gui.SpinBox(0, -8192, 8191, 1, width="20%", margin="10px")
self.sb_MY_VALUE.onchange.do(self.sb_MY_VALUE_changed)
self.sd_MY_VALUE_changed(self.sd_MY_VALUE, self.sd_MY_VALUE.get_value())
self.hbox_MY_VALUE.append(self.lb_MY_VALUE)
self.hbox_MY_VALUE.append(self.sd_MY_VALUE)
self.hbox_MY_VALUE.append(self.sb_MY_VALUE)
self.w.append(self.hbox_MY_VALUE)
#Create the checkbox
self.hbox_MY_ACTUATOR = gui.HBox(margin="10px")
self.lb_MY_ACTUATOR = gui.Label("/dev/MY_ACTUATOR_FILE", width="20%", margin="50px")
self.cb_MY_ACTUATOR = gui.CheckBox(True, width="5%", margin="10px")
self.cb_MY_ACTUATOR.onchange.do(self.cb_MY_ACTUATOR_changed)
self.hbox_MY_ACTUATOR.append(self.lb_MY_ACTUATOR)
self.hbox_MY_ACTUATOR.append(self.cb_MY_ACTUATOR)
self.w.append(self.hbox_MY_ACTUATOR)
return self.w
#Function called by the slider
def sd_MY_VALUE_changed(self, widget, value):
print("/dev/MY_VALUE_FILE", MY_REG, int(value))
liboscimp_fpga.fpgagen_send_conf("/dev/MY_VALUE_FILE", MY_REG, int(value))
self.sb_MY_VALUE.set_value(int(value))
#Function called by the spinbox
def sb_MY_VALUE_changed(self, widget, value):
print("/dev/MY_VALUE_FILE", MY_REG, int(value))
liboscimp_fpga.fpgagen_send_conf("/dev/MY_VALUE_FILE", MY_REG, int(value))
self.sd_MY_VALUE.set_value(int(float(value)))
#Function called by the checkbox
def sb_MY_ACTUATOR_changed(self, widget, value):
print("/dev/MY_ACTUATOR_FILE", MY_REG, int(value))
liboscimp_fpga.fpgagen_send_conf("/dev/MY_ACTUATOR_FILE", MY_REG2, int(value))
self.sd_adc1_offset.set_value(int(float(value)))
#Launch oh the webserver on the local machine
start(MyApp, address="0.0.0.0", port=80, title="My_super_webserver")
\end{lstlisting}
Preview of the webserver created:
\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=15cm]{webserver/Super_webserver.png}
\caption{Example of webserver with MY\_VALUE\_FILE represented by a slider and a spinbox, and MY\_ACTUATOR\_FILE represented by a checkbox.}
\label{fig:superwebserver}
\end{center}
\end{figure}
Here the generic driver fpgagen is used as an example, however the use of a different driver can lead to various requirements: arguments, data type, or several functions. Some specific cases will be treated in the next sections. In the other cases, refer to the /oscimpDigital/lib/my\_lib.h library files, or the oscimpDigital documentation: \href{[https://github.com/oscimp/oscimpDigital/tree/master/doc]}{https://github.com/oscimp/oscimpDigital/tree/master/doc}
\newline \newline
A webserver generator is available in the /oscimpDigital/app/tools/webserver\_generator repository, and build a standard webserver using the same My\_super\_design.xml file than the one used by the module generator :
\begin{lstlisting}[language=bash]
./webserver_generator.py My_super_design.xml
\end{lstlisting}
\section{Double voltage source}
A double tunable voltage source can be set up si using the axi\_to\_dac IP. However it's only one of the many functions that can be imagined with this IP.
\newline See \href{[https://github.com/oscimp/oscimpDigital/blob/master/doc/IP/axi_to_dac.md]}{https://github.com/oscimp/oscimpDigital/blob/master/doc/IP/axi\_to\_dac.md}.
The block diagram is as follows :
\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=12cm,trim={4.5cm 16cm 3.5cm 7cm}, clip]{figures/GeneTension.pdf}
\caption{Part of the block diagram for the tunable voltage source.}
\label{fig:geneTension}
\end{center}
\end{figure}
\vspace{3cm}
In this configuration and with data on $14~bits$, all the parameters of the axi\_to\_dac block keep their default value. The tuning of the output is performed with the webserver (see section \ref{sect:webserver}). With the Redpitaya board, the maximum voltage is $\pm 1~V$ per output.
\vspace{1cm}
\section{Double DDS}
The schematic configuration of the double DDS we propose here is shown below:
\vspace{0.5cm}
\begin{center}
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (plus) {$\lambda$};
\node[left of=plus, xshift=+0.05cm, yshift=+0.2cm] {{\color{OliveGreen}Ampl1}};
\node[left of=plus, xshift=+0.05cm, yshift=-0.2cm] {{\color{OliveGreen}Ampl2}};
\node [circle, draw ,minimum size=.6cm, xshift=-0.4cm, yshift=+0.2cm, above of=plus] (osc2){};
\node[above of=osc2, yshift=-0.4cm] {{\color{OliveGreen}$f_1$}};
\node [circle, draw ,minimum size=.6cm, xshift=-0.4cm, yshift=-0.2cm, below of=plus] (osc1){};
\node[below of=osc1, yshift=+0.4cm] {{\color{OliveGreen}$f_2$}};
\draw ([xshift=-0.2cm] osc2.center) sin ([xshift=-0.10cm, yshift=-0.10cm] osc2.center) cos (osc2.center) sin ([xshift=0.10cm, yshift=0.10cm] osc2.center) cos ([xshift=0.2cm] osc2.center);
\draw ([xshift=-0.2cm] osc1.center) sin ([xshift=-0.10cm, yshift=-0.10cm] osc1.center) cos (osc1.center) sin ([xshift=0.10cm, yshift=0.10cm] osc1.center) cos ([xshift=0.2cm] osc1.center);
\node [xshift=-1cm, left of=osc2] (l1) {{\color{OliveGreen}$\phi_{off1}$, $\phi_{inc1}$}};
\draw [->,>=stealth,line width=2pt,blue] (l1) -- (osc2);
\node [xshift=-1cm, left of=osc1] (l2) {{\color{OliveGreen}$\phi_{off2}$, $\phi_{inc2}$}};
\draw [->,>=stealth,line width=2pt,blue] (l2) -- (osc1);
\node [circle, draw ,minimum size=.6cm, xshift=0.4cm, right of= osc1] (mix1) {};
\draw [-] (mix1.south west) -- (mix1.north east);
\draw [-] (mix1.south east) -- (mix1.north west);
\node [circle, draw ,minimum size=.6cm, xshift=0.4cm, right of= osc2] (mix2) {};
\draw [-] (mix2.south west) -- (mix2.north east);
\draw [-] (mix2.south east) -- (mix2.north west);
\draw [->,>=stealth,line width=2pt,blue] ([yshift=-0.1cm] plus.north east) -| (mix2);
\draw [->,>=stealth,line width=2pt,blue] ([yshift=+0.1cm] plus.south east) -| (mix1);
\draw [->,>=stealth,line width=2pt,blue] (osc1) -- (mix1);
\draw [->,>=stealth,line width=2pt,blue] (osc2) -- (mix2);
\node[draw, rectangle, minimum size=0.8cm, right of=mix1, xshift=0.3cm] (dat1) {$\mathbb{C}$2$\mathbb{R}$};
\node[draw, rectangle, minimum size=0.8cm, right of=mix2, xshift=0.3cm] (dat2) {$\mathbb{C}$2$\mathbb{R}$};
\draw [->,>=stealth,line width=2pt,blue] (mix1) -- (dat1);
\draw [->,>=stealth,line width=2pt,blue] (mix2) -- (dat2);
\node[draw, rectangle, minimum size=.6cm, xshift=0.3cm, right of=dat1] (plu) {$+$};
\node[yshift=0.25cm, below of=plu] (c1) {{\color{OliveGreen}Offset2}};
\node[xshift=0.8cm, right of=plu] (o1) {DDS2\_out};
\draw [->,>=stealth,line width=2pt,blue] (plu) -- (o1);
\node[draw, rectangle, minimum size=.6cm, xshift=0.3cm, right of=dat2] (plu2) {$+$};
\node[yshift=-0.25cm, above of=plu2] (c2) {{\color{OliveGreen}Offset1}};
\node[xshift=0.8cm, right of=plu2] (o2) {DDS1\_out};
\draw [->,>=stealth,line width=2pt,blue] (plu2) -- (o2);
\draw [->,>=stealth,line width=2pt,blue] (dat1) -- (plu);
\draw [->,>=stealth,line width=2pt,blue] (dat2) -- (plu2);
\end{tikzpicture}
\end{center}
\vspace{0.5cm}
It corresponds to two DDS with adjustable frequency, amplitude, output offset, and referenced on the same clock. Frequency/phase and amplitude modulation are not represented here, but can be added using sections \ref{sect:AM1} and \ref{sect:FMPM}. The block diagram associated with this scheme is as follows:
\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=16cm,trim={1cm 5.5cm 1cm 11cm}, clip]{figures/doubleDDS.pdf}
\caption{Part of the block diagram for the double DDS.}
\label{fig:doubleDDS}
\end{center}
\end{figure}
\newpage
\subsection{IP configuration}
\vspace{0.5cm}
The IPs configuration may change depending on the board/application, however in this example we used the following configurations:
\begin{center}
\begin{tabular}{|>{\centering\arraybackslash}m{.3\linewidth} | >{\centering\arraybackslash}m{.3\linewidth} |}
\hline
IP & Configuration \\
\hline
& Counter size: $40~bits$\\ nco\_counter\_1/2 &Data size: $16~bits$\\ &Lut size: $12~bits$ \\
\hline
dds\_ampl&Data size: $14~bits$ \\
\hline
mixer\_sin\_1/2&Data in/out size: $14~bits$ \newline Nco\_size: $16~bits$ \\
\hline
dds1/2\_offset&Data in size: $14~bits$\newline Data out size: $14~bits$\newline Signed \\
\hline
convert$\mathbb{C}$to$\mathbb{R}$\_1/2&Data size: $14~bits$\\
\hline
\end{tabular}
\end{center}
\vspace{0.1cm}
\subsection{Webserver configuration}\label{subsec:doubleDDSws}
For the DDS offset and amplitude blocks we only use one value to be controlled, ie. one slider/spinbox. However the NCO block offers several options as the phase offset and increment can be internal or external to the block. Therefore we keep a default construction for the NCO in the webserver, including all these possibilities:
\begin{itemize}
\setlength\itemsep{-0.1cm}
\item 1$^{st}$ slider+spinbox: the frequency control, up to the half clock frequency (Hz)
\item 2$^{nd}$ slider+spinbox: the phase offset control
\item pinc checkbox: internal or external phase increment
\item poff checkbox: internal or external phase increment
\end{itemize}
In the present case there is no external connections for the frequency and phase increments, thus the pinc and poff checkbox will remain checked. A preview of the webserver for the double DDS design is given in fig.\ref{fig:webdoubleDDS}.
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{webserver/2019-10-14-143651_927x541_scrot.png}
\caption{Screenshot of the double DDS webserver.}
\label{fig:webdoubleDDS}
\end{center}
\end{figure}
\vspace{0cm}
\subsection{Expected output}
We show in fig.\ref{fig:doubleDDSok} an example of twe signals generated. \newline
Ch1: $f_0=30~MHz$, $dds1\_ampl=8191~arb.~unit$, $dds1\_offset=0~arb.~unit$, \newline $\phi_{off1}=0~arb.~unit$.\newline
Ch2: $f_0=45~MHz$, $dds2\_ampl=3000~arb.~unit$, $dds2\_offset=5000~arb.~unit$, \newline $\phi_{off2}=0~arb.~unit$.
\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=14cm]{scope/doubleDDSok.pdf}
\caption{Expected output.}
\label{fig:doubleDDSok}
\end{center}
\end{figure}
With an internal phase increment, the output signals are generated with an arbitrary phase. This phase can be adjusted according to the intended application, using the phase offset slider, as represented in fig.\ref{fig:doubleDDSphase}:
\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=14cm]{scope/doubleDDSokPhi.pdf}
\caption{Phase offset.}
\label{fig:doubleDDSphase}
\end{center}
\end{figure}
\vspace{-1cm}
\subsection{Unexpected output}\label{subsect:doubleDDSpasOk}
In fig.\ref{fig:doubleDDSpasOk} the Ch1 signal is the same, but there is an overflow in Ch2 due to the sum of $dds1\_ampl$ and $dds1\_offset$. \newline
Ch2: $f_0=45~MHz$, $dds2\_ampl=8191~arb.~unit$, $dds2\_offset=8191~arb.~unit$, \newline $\phi_{off2}=0~arb.~unit$.
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{scope/doubleDDSpasOk.pdf}
\caption{Unexpected output due to overflow in ch2.}
\label{fig:doubleDDSpasOk}
\end{center}
\end{figure}
Solution: decrease either $dds1\_ampl$ or $dds1\_offset$, such as ${dds1\_ampl + dds1\_offset < 8191}$.
\section{Amplitude modulation}\label{sect:AM1}
An amplitude modulation can be performed easily, in the same way as with RF components:
\begin{center}
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (plus) {$\lambda$};
\node[above of=plus, yshift=-0.4cm, xshift=-0.5cm] {{\color{OliveGreen}AM\_ampl}};
\node [circle, draw ,minimum size=.6cm, xshift=+0.6cm, below of=plus] (mix1) {};
\draw [-] (mix1.south west) -- (mix1.north east);
\draw [-] (mix1.south east) -- (mix1.north west);
\node[draw, rectangle, minimum size=0.8cm, below of=mix1, yshift=-0.2cm] (dat) {$\mathbb{C}$2$\mathbb{R}$};
\node[draw, rectangle, minimum size=.6cm, below of=dat, yshift=-0.2cm] (plu) {+};
\node[right of=plu, xshift=+0.3cm] {{\color{OliveGreen}AM\_depth}};
\node [circle, draw ,minimum size=.6cm, below of=plu] (mix2) {};
\draw [-] (mix2.south west) -- (mix2.north east);
\draw [-] (mix2.south east) -- (mix2.north west);
\node [circle, draw ,minimum size=.6cm, above of=mix1, xshift=0.6cm] (osc1){};
\node[above of=osc1, yshift=-0.4cm, xshift=+0.5cm] {{\color{OliveGreen}AM\_nco}};
\draw ([xshift=-0.2cm] osc1.center) sin ([xshift=-0.10cm, yshift=-0.10cm] osc1.center) cos (osc1.center) sin ([xshift=0.10cm, yshift=0.10cm] osc1.center) cos ([xshift=0.2cm] osc1.center);
\node[xshift=0.8cm, left of=mix2, xshift=-1cm] (i1) {in};
\node[xshift=0.8cm, right of=mix2, xshift=-0.5cm] (o1) {out};
\draw [->,>=stealth,line width=2pt,blue] (mix2) -- (o1);
\draw [->,>=stealth,line width=2pt,blue] (i1) -- (mix2);
\draw [->,>=stealth,line width=2pt,blue] (plu) -- (mix2);
\draw [->,>=stealth,line width=2pt,blue] (mix1) -- (dat);
\draw [->,>=stealth,line width=2pt,blue] (dat) -- (plu);
\draw [->, >=stealth, line width=2pt, blue] (plus.south) .. controls ([xshift=0cm, yshift=-0.1cm] plus.south) and ([xshift=0em, yshift=-0.2cm] plus.south) ..(mix1.north west);
\draw [->, >=stealth, line width=2pt, blue] (osc1.south) .. controls ([xshift=0cm, yshift=-0.1cm] osc1.south) and ([xshift=0em, yshift=-0.2cm] osc1.south) ..(mix1.north east);
\end{tikzpicture}
\end{center}
\vspace{-0.3cm}
This scheme is equivalent to the expression of the amplitude modulation:
\begin{center}
${y(t)=[1 + h~cos(\omega_m t)]z(t)}$\newline
$\Rightarrow{out=[1 + \frac{AM\_ampl}{AM\_depth} AM\_nco]~AM\_depth\times in}$
\end{center}
Then the modulation depth is $h=\frac{AM\_ampl}{AM\_depth}$. Thereafter:
\vspace{-0.1cm}
\begin{itemize}
\setlength\itemsep{-0.2cm}
\item $h=0$ with $AM\_ampl=0$
\item $h=0.5$ with $AM\_ampl=4096~arb.~unit$ and $AM\_depth=8191~arb.~unit$
\item $h=1$ with $AM\_ampl=8191~arb.~unit$ and $AM\_depth=8191~arb.~unit$
\item $h=2$ with $AM\_ampl=8191~arb.~unit$ and $AM\_depth=4096~arb.~unit$
\end{itemize}The block diagram corresponding to this scheme is as follows:\newpage
\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=14cm,trim={1.8cm 6cm 1cm 13cm}, clip]{design/mod_ampl1.pdf}
\caption{Part of the block diagram for this amplitude modulation.}
\label{fig:mod_ampl1}
\end{center}
\end{figure}
In this block diagram the input and output are connected to the converter blocks to make an example with external signal. However this principle can be included to other applications, such as the double dds design to add an amplitude modulation option to the generated signals.
\vspace{-0.3cm}
\subsection{IP configuration}
\vspace{-0cm}
IPs configuration in this example:
\begin{center}
\begin{tabular}{|>{\centering\arraybackslash}m{.3\linewidth} | >{\centering\arraybackslash}m{.3\linewidth} |}
\hline
IP & Configuration \\
\hline
& Counter size: $40~bits$\\ AM\_nco &Data size: $16~bits$\\ &Lut size: $12~bits$ \\
\hline
AM\_ampl&Data size: $16~bits$ \\
\hline
AM\_mixer&Data in/out size: $16~bits$ \newline Nco\_size: $16~bits$ \\
\hdashline
multiplierReal&Input data1 size: $14~bits$ \newline Input data2 size: $16~bits$\newline Output data size: $14~bits$ \\
\hline
& Data in size: $16~bits$\\AM\_depth & Data out size: $16~bits$\\ &Format: Signed \\
\hline
convert$\mathbb{C}$to$\mathbb{R}$\_1&Data size: $16~bits$\\
\hline
\end{tabular}
\end{center}
\vspace{-0.2cm}
\subsection{Webserver configuration}
Here the webserver configuration is similar to the double dds one. In case refer to subsection \ref{subsec:doubleDDSws}. preview of the amplitude modulation part of the webserver, with the mod\_nco controlling the modulation frequency, and mod\_ampl controlling its amplitude:
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{webserver/AM_V1.png}
\caption{Screenshot of the amplitude modulation part of the webserver.}
\label{fig:amplModWsv1}
\end{center}
\end{figure}
\subsection{Expected output}
To make a small preview of the expected behavior of the amplitude modulation, we will present the cases $h=0.5$, $h=1$, and the surmodulation $h=2$. We use at the input a sine signal of $50~MHz$ and $0~dBm$. The modulating signal is set to $500~kHz$.\newline
\underline{Input and output with $h=0.5$}
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{scope/Mod_amplOkV1h05.pdf}
\caption{Expected behavior for $h=0.5$.}
\label{fig:ampleModV11}
\end{center}
\end{figure}
\underline{Output with $h=1$}
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{scope/Mod_amplOkV1h10.pdf}
\caption{Expected behavior for $h=1$.}
\label{fig:ampleModV12}
\end{center}
\end{figure}
\newpage
\underline{Output with $h=2$ (overmodulation)}
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{scope/Mod_amplOkV1h20.pdf}
\caption{Expected behavior for $h=2$: overmodulation.}
\label{fig:ampleModV13}
\end{center}
\end{figure}
\subsection{Unexpected output}
Although the following case is not due to the numerical aspect of the amplitude modulation presented here, it can be seen as an unexpected output:
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{scope/Mod_amplPasOkV1.pdf}
\caption{Case of a carrier frequency below the input signal frequency.}
\label{fig:ampleModV14}
\end{center}
\end{figure}
This kind of shape is due to a carrier frequency below the input signal frequency.
\section{Sine perturbation of a signal}\label{sect:AM2}
\vspace{0.5cm}
A way to study the response of a system is to apply a perturbation to this system. Most of the time, the perturbations take the form of steps applied to the input signal of the system by adding to it a square signal. In the case of optical oscillators, the working point of the system, i.e. the resonant frequency, can be determined by making a frequency scan of the system. This scan takes the form of a sine perturbation of the system. In this section, we show the example of a sine perturbation to a signal. The scheme used is quite similar to the amplitude modulation:
\vspace{0.5cm}
\begin{center}
\begin{tikzpicture}
\node[draw, rectangle, minimum size=.6cm] (plus) {$\lambda$};
\node[above of=plus, yshift=-0.4cm, xshift=-1cm] {{\color{OliveGreen}perturb\_ampl}};
\node [circle, draw ,minimum size=.6cm, xshift=+0.6cm, below of=plus] (mix1) {};
\draw [-] (mix1.south west) -- (mix1.north east);
\draw [-] (mix1.south east) -- (mix1.north west);
\node[draw, rectangle, minimum size=0.8cm, yshift=-0.2cm, below of=mix1] (c2r) {$\mathbb{C}$2$\mathbb{R}$};
\node [circle, draw ,minimum size=.6cm, yshift=-0.3cm, below of=c2r] (mix2) {+};
\node [circle, draw ,minimum size=.6cm, above of=mix1, xshift=0.6cm] (osc1){};
\node[above of=osc1, yshift=-0.4cm, xshift=+1cm] {{\color{OliveGreen}perturb\_nco}};
\draw ([xshift=-0.2cm] osc1.center) sin ([xshift=-0.10cm, yshift=-0.10cm] osc1.center) cos (osc1.center) sin ([xshift=0.10cm, yshift=0.10cm] osc1.center) cos ([xshift=0.2cm] osc1.center);
\node[xshift=0.8cm, left of=mix2, xshift=-1cm] (i1) {in};
\node[xshift=0.8cm, right of=mix2, xshift=-0.5cm] (o1) {out};
\draw [->,>=stealth,line width=2pt,blue] (mix2) -- (o1);
\draw [->,>=stealth,line width=2pt,blue] (i1) -- (mix2);
\draw [->,>=stealth,line width=2pt,blue] (mix1) -- (c2r);
\draw [->,>=stealth,line width=2pt,blue] (c2r) -- (mix2);
\draw [->, >=stealth, line width=2pt, blue] (plus.south) .. controls ([xshift=0cm, yshift=-0.1cm] plus.south) and ([xshift=0em, yshift=-0.2cm] plus.south) ..(mix1.north west);
\draw [->, >=stealth, line width=2pt, blue] (osc1.south) .. controls ([xshift=0cm, yshift=-0.1cm] osc1.south) and ([xshift=0em, yshift=-0.2cm] osc1.south) ..(mix1.north east);
\end{tikzpicture}
\end{center}
The block diagram corresponding to this scheme is as follows:
\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=16cm,trim={2.5cm 5cm 2.5cm 14cm}, clip]{design/mod_ampl.pdf}
\caption{Part of the block diagram for the amplitude modulation.}
\label{fig:mod_ampl}
\end{center}
\end{figure}
\newpage
\subsection{IP configuration}
\vspace{0cm}
IPs configuration in this example:
\begin{center}
\begin{tabular}{|>{\centering\arraybackslash}m{.3\linewidth} | >{\centering\arraybackslash}m{.3\linewidth} |}
\hline
IP & Configuration \\
\hline
& Counter size: $40~bits$\\ perturb\_nco &Data size: $16~bits$\\ &Lut size: $12~bits$ \\
\hline
perturb\_ampl&Data size: $14~bits$ \\
\hline
perturb\_mixer&Data in/out size: $14~bits$ \newline Nco\_size: $16~bits$ \\
\hline
& Data size: $14~bits$\\adder\_substracter\_re & Operation: add\\ &Format: Signed \\
\hline
convert$\mathbb{C}$to$\mathbb{R}$\_1&Data size: $14~bits$\\
\hline
\end{tabular}
\end{center}
\vspace{0cm}
\newpage
\subsection{Webserver configuration}
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{webserver/2020-01-13-104008_907x265_scrot.png}
\caption{Screenshot of the sine perturbation part of the webserver.}
\label{fig:amplModWs}
\end{center}
\end{figure}
\vspace{-0.5cm}
\subsection{Expected output}
We use at the input a sine signal of $5~MHz$ and $0~dBm$.
With a sine perturbation of $50~MHz$ and $1000~arb.~unit$, we expect:
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{scope/Mod_amplOk.pdf}
\caption{Expected behavior with input sine at $5~MHz$ and sine perturbation of $50~MHz$.}
\label{fig:ampleModOK}
\end{center}
\end{figure}
\vspace{-0.5cm}
\subsection{Unexpected output}
An unexpected situation can be the output signal visible in fig.\ref{fig:ampleModPasOK}:
\begin{figure}[!h!tb]
\begin{center}
\includegraphics[width=14cm]{scope/Mod_amplPasOk.pdf}
\caption{Unexpected behavior with input sine at $5~MHz$ and sine perturbation of $50~MHz$.}
\label{fig:ampleModPasOK}
\end{center}
\end{figure}
This situation is very similar to the fig.\ref{fig:doubleDDSpasOk} in subsection \ref{subsect:doubleDDSpasOk}: this output is a result of an overflow happening during the signal processing. This situation is due to an input signal too powerful with respect to the perturbation amplitude.
Solution: decrease the perturbation amplitude or the power of the input signal.
\section{Frequency and phase modulation of a NCO}\label{sect:FMPM}
A frequency and a phase modulation can also be performed using the phase increment and the phase offset input of the NCO. The scheme presented below corresponds to the block diagram presented in fig.\ref{fig:mod_phase}.
\begin{figure}[h!tbp]
\begin{center}
\vspace{-3.5cm}
\includegraphics[width=8.4cm,trim={9.8cm 1cm 2.5cm 0cm}, clip]{design/FMPM4.pdf}
\caption{Part of the block diagram for frequency (orange) and phase (purple) modulation of a NCO.}
\label{fig:mod_phase}
\end{center}
\end{figure}
\begin{center}
\begin{tikzpicture}
\node [circle, draw ,minimum size=.6cm] (osc1){};
\draw ([xshift=-0.2cm] osc1.center) sin ([xshift=-0.10cm, yshift=-0.10cm] osc1.center) cos (osc1.center) sin ([xshift=0.10cm, yshift=0.10cm] osc1.center) cos ([xshift=0.2cm] osc1.center);
\node[draw, rectangle, minimum size=0.8cm, xshift=0.4cm, right of=osc1] (datout) {$\mathbb{C}$2$\mathbb{R}$};
\node[right of=datout, xshift=0.5cm] (o1) {out};
\draw [->,>=stealth,line width=2pt,blue] (osc1) -- (datout);
\draw [->,>=stealth,line width=2pt,blue] (datout) -- (o1);
\node[draw, rectangle, minimum size=.6cm, left of=osc1, xshift=0.2cm, above of=osc1] (plus1) {$+$};
\draw [->,>=stealth,line width=2pt,blue] (plus1.east) -| (osc1.north);
\node[draw, rectangle, minimum size=0.8cm, xshift=-0.5cm, left of=plus1, left of=plus1] (dat) {$\mathbb{C}$2$\mathbb{R}$};
\node[draw, rectangle, minimum size=0.8cm, xshift=-3.3cm, below of=osc1] (dat1) {$\mathbb{C}$2$\mathbb{R}$};
\node[draw, rectangle, minimum size=.6cm, right of=dat, xshift=0.4cm] (sh1) {sh};
\node[draw, rectangle, minimum size=.6cm, right of=dat1, xshift=0.5cm] (exp2) {exp};
\node [circle, draw ,minimum size=.6cm, xshift=-0.5cm, left of=dat] (mix1) {};
\draw [-] (mix1.south west) -- (mix1.north east);
\draw [-] (mix1.south east) -- (mix1.north west);
\node [circle, draw ,minimum size=.6cm, xshift=-0.5cm, left of=dat1] (mix2) {};
\draw [-] (mix2.south west) -- (mix2.north east);
\draw [-] (mix2.south east) -- (mix2.north west);
\node[above of=plus1, yshift=-0.4cm] (f0) {{\color{OliveGreen}$f_0$}};
\draw [->,>=stealth,line width=2pt,blue] (mix1) -- (dat);
\draw [->,>=stealth,line width=2pt,blue] (dat) -- (sh1);
\draw [->,>=stealth,line width=2pt,blue] (sh1) -- (plus1);
\draw [->,>=stealth,line width=2pt,blue] (mix2) -- (dat1);
\draw [->,>=stealth,line width=2pt,blue] (dat1) -- (exp2);
\draw [->,>=stealth,line width=2pt,blue] (exp2) -| (osc1.south);
\node [circle, draw ,minimum size=.6cm, above of=mix1, left of=mix1, yshift=-0.2cm] (osc2){};
\draw ([xshift=-0.2cm] osc2.center) sin ([xshift=-0.10cm, yshift=-0.10cm] osc2.center) cos (osc2.center) sin ([xshift=0.10cm, yshift=0.10cm] osc2.center) cos ([xshift=0.2cm] osc2.center);
\node [circle, draw ,minimum size=.6cm, below of=mix2, left of=mix2, yshift=0.2cm] (osc3){};
\draw ([xshift=-0.2cm] osc3.center) sin ([xshift=-0.10cm, yshift=-0.10cm] osc3.center) cos (osc3.center) sin ([xshift=0.10cm, yshift=0.10cm] osc3.center) cos ([xshift=0.2cm] osc3.center);
\node[draw, rectangle, minimum size=0.8cm, left of=osc1, xshift=-6.1cm] (mampl) {$\lambda$};
\node[draw, rectangle, minimum size=.6cm, right of=mampl, yshift=-0.25cm] (exp1) {exp};
\node[right of=mampl, xshift=0.6cm, yshift=0.25cm] (exp3) {};
\draw [-,line width=2pt,blue] ([yshift=0.15cm] mampl.south east) -- (exp1);
\draw [-,line width=2pt,blue] ([yshift=-0.15cm] mampl.north east) -- (exp3);
\draw [->, >=stealth, line width=2pt, blue] (osc2.east) .. controls ([xshift=0.1cm, yshift=0cm] osc2.east) and ([xshift=0.3cm, yshift=0cm] osc2.east) ..(mix1.north west);
\draw [->, >=stealth, line width=2pt, blue] (osc3.east) .. controls ([xshift=0.1cm, yshift=0cm] osc3.east) and ([xshift=0.3cm, yshift=0cm] osc3.east) ..(mix2.south west);
\draw [->, >=stealth, line width=2pt, blue] (exp1.east) .. controls ([xshift=0.1cm, yshift=0cm] exp1.east) and ([xshift=0.3cm, yshift=0cm] exp1.east) ..(mix2.north west);
\draw [->, >=stealth, line width=2pt, blue] (exp3.west) .. controls ([xshift=0.1cm, yshift=0cm] exp3.west) and ([xshift=0.3cm, yshift=0cm] exp3.west) ..(mix1.south west);
\node[left of=osc2, xshift=-0.2cm] () {{\color{OliveGreen}FM\_NCO}};
\node[left of=osc3, xshift=-0.2cm] () {{\color{OliveGreen}PM\_NCO}};
\node[left of=mampl, xshift=-0.75cm] () {{\color{OliveGreen}FM/PM\_ampl}};
\node[xshift=+0.5cm, yshift=+0.7cm] () {{\color{OliveGreen}$\phi_{inc}$}};
\node[xshift=+0.5cm, yshift=-0.7cm] () {{\color{OliveGreen}$\phi_{off}$}};
\end{tikzpicture} \\
\end{center}
\vspace{-0.2cm}
\subsection{IP configuration}
%\vspace{0.5cm}
IPs configuration in this example:
\begin{center}
\begin{tabular}{|>{\centering\arraybackslash}m{.3\linewidth} | >{\centering\arraybackslash}m{.3\linewidth} |}
\hline
IP & Configuration \\
\hline
& Counter size: $40~bits$\\ FP\_nco/PM\_nco/nco &Data size: $16~bits$\\ &Lut size: $12~bits$ \\
\hline
mod\_ampl&Data size: $27~bits$ \\
\hline
& Data in size: $27~bits$\\expanderReal\_1 & Data in size: $16~bits$\\ &Format: Signed \\
\hdashline
& Data in size: $16~bits$\\expanderReal\_2 & Data in size: $12~bits$\\ &Format: Signed \\
\hline
shiftReal\_1&Data in size: $27~bits$ \newline data out size: $40~bits$ \\
\hline
mixer\_sin\_1&Data in/out size: $27~bits$ \newline Nco\_size: $16~bits$ \\
\hdashline
mixer\_sin\_2&Data in/out size: $16~bits$ \newline Nco\_size: $16~bits$ \\
\hline
$f_0$&Data in/out size: $40~bits$ \newline Format: Signed \\
\hline
convert$\mathbb{C}$to$\mathbb{R}$\_1&Data size: $27~bits$\\
\hdashline
convert$\mathbb{C}$to$\mathbb{R}$\_2&Data size: $16~bits$\\
\hdashline
convert$\mathbb{C}$to$\mathbb{R}$\_3&Data size: $14~bits$\\
\hline
\end{tabular}
\end{center}
\vspace{0.0cm}
\subsection{Webserver configuration}
\vspace{+0.0cm}
Here, only the PM\_deviation is reconfigured between $-8192$ and $8191~arb.~unit$. Both FM\_nco, PM\_nco, f0, FM\_deviation and nco are configured between $0$ and $62000000~Hz$.
Also f0 must be scaled to correspond to a phase increment. This takes into account the sampling rate, here $125~MHz$, and the size (i.e. frequency resolution) of f0. Then the control of f0 in the webserver takes the following form:
\vspace{-0.1cm}
\begin{lstlisting}[language=Python]
liboscimp_fpga.add_const_set_offset("/dev/f0", int(round(float(value)/(125e6/2**40))))
\end{lstlisting}
\vspace{+0.5cm}
The webserver is represented in fig.\ref{fig:FMPMwebserver}
\begin{figure}[h!tb]
\begin{center}
\vspace{0.5cm}
\includegraphics[width=14cm,trim={0cm 0cm 0cm 0cm}, clip]{webserver/2020-01-07-090526_907x561_scrot.png}
\caption{Screenshot of the phase and frequency modulation webserver. "pinc" checkbox is unchecked: frequency modulation.}
\label{fig:FMPMwebserver}
\end{center}
\end{figure}
\vspace{+0cm}