]> jspc29.x-matter.uni-frankfurt.de Git - jtag_mvd.git/commitdiff
documentation added. bn.
authorHadaq in Frankfurt <hadaq@frankfurt>
Fri, 22 Mar 2013 13:39:35 +0000 (14:39 +0100)
committerHadaq in Frankfurt <hadaq@frankfurt>
Fri, 22 Mar 2013 13:39:35 +0000 (14:39 +0100)
14 files changed:
doku/.gitignore [new file with mode: 0644]
doku/doc_standalone.pdf [new file with mode: 0644]
doku/doc_standalone.tex [new file with mode: 0644]
doku/jtag_chain_controller.tex [new file with mode: 0644]
doku/jtag_chain_sensornumbers2.pdf [new file with mode: 0644]
doku/jtag_m26cs_flowchart4-eps-converted-to.pdf [new file with mode: 0644]
doku/jtag_m26cs_flowchart4.eps [new file with mode: 0644]
doku/jtag_signals/jtag_signals.htm [new file with mode: 0644]
doku/jtag_signals/jtag_signals.png [new file with mode: 0644]
doku/jtag_signals/jtag_signals2.png [new file with mode: 0644]
doku/jtag_signals/jtag_signals_short.png [new file with mode: 0644]
doku/jtagmon_webpage.png [new file with mode: 0644]
doku/ram3block.pdf [new file with mode: 0644]
doku/scripts.tex [new file with mode: 0644]

diff --git a/doku/.gitignore b/doku/.gitignore
new file mode 100644 (file)
index 0000000..7ba1fd0
--- /dev/null
@@ -0,0 +1,5 @@
+doc_standalone.aux
+doc_standalone.log
+doc_standalone.out
+doc_standalone.toc
+
diff --git a/doku/doc_standalone.pdf b/doku/doc_standalone.pdf
new file mode 100644 (file)
index 0000000..f9208fa
Binary files /dev/null and b/doku/doc_standalone.pdf differ
diff --git a/doku/doc_standalone.tex b/doku/doc_standalone.tex
new file mode 100644 (file)
index 0000000..fb7afe0
--- /dev/null
@@ -0,0 +1,83 @@
+\documentclass[a4paper,10pt]{scrreprt}
+%\documentclass[a4paper,10pt]{scrartcl}
+\usepackage[utf8]{inputenc}
+\usepackage[draft]{fixme}
+\usepackage{setspace}
+\usepackage{threeparttable} % for footnotes in tables
+\usepackage{graphicx} % for graphics?
+\usepackage{subfig}
+\usepackage{float}   % to be able to place figures HERE
+\usepackage{wrapfig} % to be able to have text around floating figures
+\usepackage{tikz}
+%\usepackage[scaled]{uarial}
+%\renewcommand*\familydefault{\sfdefault} %% Only if the base font of the document is to be sans serif
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage{marvosym} % for documentation: user manual
+\usepackage{pifont} % for documentation: user manual: enter key symbol
+\usepackage[margin=2cm,right=2.5cm,left=3cm]{geometry}
+
+%\usepackage{footmisc}
+\usepackage[ngerman]{babel}
+%line spacing
+\usepackage{setspace} 
+\usepackage{fancyvrb} 
+
+%\usepackage{zref-xr}
+\usepackage[bookmarks, pdftitle={Dokumentation: JTAG-Chain-Controller Version "Ionized" und JTAG-Monitor}, pdfauthor={Bertram Neumann}, pdfsubject={}, pdfkeywords={CBM, MVD, MAPS, JTAG}]{hyperref}
+\usepackage{xr}
+\externaldocument[MA-]{/u/bneumann/master/master/main}
+%\externaldocument[MA]{../anforderungen}
+%\externaldocument[MA]{../implementierung}
+\usepackage{rotating}
+\usepackage{framed}
+\title{Dokumentation: JTAG-Chain-Controller (für TRB V3) und JTAG-Monitor}
+\author{Bertram Neumann}
+
+\makeatletter
+\let\thetitle\@title
+\let\theauthor\@author
+\makeatother
+
+\usepackage{manfnt}
+\makeatletter
+\def\hang{\hangindent2\parindent}
+\def\d@nger{\medbreak\begingroup\clubpenalty=10000
+  \def\par{\endgraf\endgroup\medbreak} \noindent\hang\hangafter=-3
+  \hbox to0pt{\hskip-\hangindent\dbend\hfill}}
+\outer\def\danger{\d@nger}
+\makeatother
+
+
+
+\begin{document}
+
+% \begin{figure}[p]
+%  \centering
+%  \includegraphics[width=1.0\textwidth]{../setup_slowcontrol_trbv2_3.pdf}
+%  % schrader_overview.pdf: 720x540 pixel, 72dpi, 25.40x19.05 cm, bb=0 0 720 540
+% \setcapwidth{0.9\textwidth}
+%  \caption{Aufbau der Auslesekette für Version 1 des Prototypen. Der JTAG-Chain-Controller soll die JTAG-Signale für die JTAG-Chain erzeugen. }
+%  \label{fig:prototype_version1_readout_chain}
+% \end{figure}
+
+% \label{kapitel_implementierung}
+% \input{implementierung.tex}
+\maketitle
+\tableofcontents
+
+\chapter{Dokumentation}
+\label{kapitel_dokumentation}
+\input{jtag_chain_controller.tex}
+\input{scripts.tex}
+\begin{thebibliography}{100}
+\addcontentsline{toc}{chapter}{Literaturverzeichniss}
+
+%\bibitem{ieee1149.1} IEEE Computer Society, "`IEEE Standard Test Access Port and Boundary-Scan Architecture - IEEE Std 1149.1TM-2001 (R2008) (Revision of IEEE Std 1149.1-1990)"', IEEE, 2008.
+%\bibitem{LeoGreinerLU} Leo Greiner, 
+\bibitem{Mi26UM} A. Himmi, "`Mimosa26 User Manual V.1.0 (Preliminary Version)"', Strasbourg, 2008.
+\bibitem{TrbPaper} Fröhlich, I. et. al., "`A General Purpose Trigger and Readout Board (TRB) for HADES and FAIR-Experiments"', IEEE Transactions on Nuclear Science, Volume 55, Issue 1, pp. 59-66, 2008.
+\bibitem{JMichelDiplarb} Michel, J., "`Development of a Realtime Network Protocol for HADES and FAIR Experiments"'.
+\bibitem{timingtool_url} Olive, M., TimingTool Webseite, MOHC Ltd., Wimborne. \url{http://www.timingtool.com/}, abgerufen am 31.8.2012.
+\end{thebibliography}
+\end{document}
diff --git a/doku/jtag_chain_controller.tex b/doku/jtag_chain_controller.tex
new file mode 100644 (file)
index 0000000..f043955
--- /dev/null
@@ -0,0 +1,581 @@
+Diese Dokumentation der JTAG-Ansteuerung für JTAG-Chains (z.B. aus MIMOSA-26 Sensoren)
+durch einen FPGA (z.B. auf dem TRB V3)
+bezieht sich auf meine Master-Arbeit. Als Einstieg sollte man sich Kapitel MA:\ref{MA-kapitel_anforderungen} (Anforderungen) und MA:\ref{MA-kapitel_implementierung} (Implementierung)
+ansehen.
+\section{JTAG-Chain-Controller Interface}
+\subsection{VHDL entity}
+Diese Dokumentation beschreibt die Version im Git-Repository \texttt{jtag\_mvd} unter Benutzer \texttt{git} auf \texttt{jspc29.x-matter.uni-frankfurt.de}, vom März 2013.
+Der JTAG-Chain-Controller wird durch die Entity \texttt{jtag\_cmd\_m26c} in der Datei \texttt{vhdl/\-code/\-jtag\_cmd\_m26c.vhd} implementiert.
+
+\begin{turn}{3}
+\parbox{\textwidth}{
+Für das TRB V3 gibt es eine neue Entity \texttt{jtag\_mvd}, 
+die zusätzlich zu den JTAG-Signalen die Signale MAPS\_START, MAPS\_RESET und MAPS\_CLK (80 MHz) für eine Sensor-Kette generiert.
+Siehe Abschnitt \ref{jtagmvdentity}.
+}
+\end{turn}
+
+\texttt{CLK\_IN} wird an den Systemtakt von 100 MHz angeschlossen. \texttt{RESET\_IN} führt einen synchronen Reset durch.
+\texttt{JTAG\_*} sind die Signale, die eine JTAG-Chain versorgen. Auf \texttt{JTAG\_TDO\_IN} werden die Daten von TDO des letzten
+nicht herausgeschalteten Sensors gelegt.
+Die \texttt{BUS\_*}-Signale definieren das Interface zu TrbNet.
+\begin{figure}[p]
+ \centering
+ \includegraphics[width=0.4\textwidth]{./jtag_m26cs_flowchart4.eps}
+ % schrader_overview.pdf: 720x540 pixel, 72dpi, 25.40x19.05 cm, bb=0 0 720 540
+\setcapwidth{0.9\textwidth}
+ \caption{Flussdiagramm des "`Simple Controller"' auf dem FPGA: Mit check1 wird der rote Weg ausgewählt, auf dem, um schneller zu einem Ergebnis zu kommen,
+ keine WRITE-Operationen stattfinden.  }
+ \label{fig:m26controller_simple}
+\end{figure}
+\begin{figure}[tb]
+ \centering
+ \includegraphics[width=0.8\textwidth]{./jtag_chain_sensornumbers2.pdf}
+ % schrader_overview.pdf: 720x540 pixel, 72dpi, 25.40x19.05 cm, bb=0 0 720 540
+\setcapwidth{0.9\textwidth}
+ \caption{Nummerierung der Sensoren in der JTAG-Chain. Links ist der FPGA, der die JTAG-Chain aus n Sensoren ansteuert.}
+ \label{fig:jtag_chain_sensornumbers}
+\end{figure}
+Der Off-Spill-Trigger-Eingang wurde in dieser Version in \texttt{RUN\_\-REQUEST\_\-IN} umbenannt.
+Wird \texttt{RUN\_\-REQUEST\_\-IN} für mindestens einen Takt gesetzt, 
+werden die JTAG-Register nach dem Ablauf aus Abb. \ref{fig:m26controller_simple} drei mal programmiert sowie die Device ID 
+gelesen. Die Operation BYPASSREG\_TESTCHAIN wird jedoch hart-codiert übersprungen, da sie nicht gut getestet ist.
+An der Stelle, an der der Reset der Sensoren stattfinden soll, wird \texttt{RESET\_WAIT\_DURATION} Takte gewartet
+und das Signal \texttt{REQUEST\_RESET\_OUT} für 2 Takte auf 1 gesetzt.
+Der Reset-Puls währenddessen ist extern zu generieren. 
+Dies passiert in der top-level entity \texttt{main\_board} in \texttt{vhdl/main\_board.vhd} für das TRB V2 oder in \texttt{vhdl/code/jtag\_mvd} für das TRB V3.
+
+
+Wird \texttt{WRITE\_ONCE\_REQUEST\_IN} für mindestens einen Takt gesetzt, werden alle JTAG-Register einmal programmiert.
+
+
+\texttt{MY\_STATUS\_OUT} dient Debugzwecken und wird nicht verwendet.
+\texttt{IDLE\_OUT} ist 1, wenn auf einen Trigger auf \texttt{RUN\_\-REQUEST\_\-IN} oder \texttt{WRITE\_ONCE\_REQUEST\_IN} gewartet wird.
+\texttt{PROG\_JTAG\_FINISHED\_OUT} wird auf 1 gesetzt wenn der letzte Schreibvorgang der JTAG-Register eines Durchlaufs abgeschlossen ist,
+und wird auf 0 gesetzt, wenn ein Durchlauf gestartet wird.
+
+Die Zählerstände
+\texttt{READ\_ID\_ERRORS\_COUNT\_OUT}, \texttt{WRITE\_ERRORS\_COUNT\_OUT}, \texttt{DATA\_CHANGED\_COUNT\_OUT}, \texttt{SAMPLING\_ERRORS\_COUNT\_OUT},
+    \texttt{RUN\_COUNTER\_OUT} geben die Zahl der Durchläufe mit READ\_ERRORS, WRITE\_ERRORS, DATA\_CHANGED (siehe Abschnitt MA:\ref{MA-abschnitt_zaehlerstaende}), SAMPLING\_ERROR (siehe Abschnitt \ref{section_timing}) irgendwo 
+in der Chain sowie die aktuelle Durchlaufnummer an
+und dienen dem Monitoring. Diese Werte sind nicht gut getestet. 
+Statt dessen sollten die zuverlässig funktionierenden per TrbNet Register auslesbaren Zähler,
+wie in Abschnitt \ref{section_status2_adresses} beschrieben ausgelesen werden.
+
+\texttt{STARTED\_OUT} gibt den Wert von \texttt{jtag\_refresh\_active} aus (siehe \ref{table:trbnet_commands}).
+Die booleschen Werte \texttt{LAST\_\-RUN\_\-SUCCESSFUL\_\-OUT}, \texttt{LAST\_DATA\_CHANGED\_OUT}, \texttt{LAST\_WRITE\_ERRORS\_OUT}, 
+\texttt{LAST\_READ\_ERRORS\_OUT},
+\texttt{CRC\_\-ERROR\_\-OUT}
+geben an, ob im letzten Durchlauf keine Fehler registriert wurden, die Register-Werte sich im Sensor geändert haben, es 
+WRITE\_ERRORS, bzw. READ\_ERRORS
+oder Fehler bei der CRC-Prüfung (siehe Abschnitt \ref{section_addresses_status}) gab. Auch diese Werte sind nicht gut getestet.
+
+
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=jtag\_cmd\_m26c Port,labelposition=all,commandchars=\\\{\}]
+    CLK_IN : in std_logic;
+    RESET_IN : in std_logic;
+
+    JTAG_TMS_OUT : out std_logic;
+    JTAG_TCK_OUT : out std_logic;
+    JTAG_TDI_OUT : out std_logic;
+    JTAG_TDO_IN  : in  std_logic;
+
+    BUS_DATA_IN  : in std_logic_vector(31 downto 0);
+    BUS_DATA_OUT  : out std_logic_vector(31 downto 0);
+    BUS_ADDR_IN   : in  std_logic_vector(8 downto 0);
+    BUS_READ_IN   : in std_logic;
+    BUS_WRITE_IN  : in std_logic;
+
+    BUS_DATAREADY_OUT    : out  std_logic;
+    BUS_NO_MORE_DATA_OUT : out  std_logic;
+    BUS_WRITE_ACK_OUT    : out  std_logic;
+    BUS_UNKNOWN_ADDR_OUT : out  std_logic;
+
+    RUN_REQUEST_IN : in   std_logic;
+    WRITE_ONCE_REQUEST_IN : in   std_logic;
+    MY_STATUS_OUT        : out std_logic_vector(8 downto 0);
+    REQUEST_RESET_OUT    : out std_logic;
+    IDLE_OUT             : out std_logic;
+    PROG_JTAG_FINISHED_OUT: out std_logic;
+    READ_ID_ERRORS_COUNT_OUT : out std_logic_vector(COUNTER_WIDTHS-1 downto 0);
+    WRITE_ERRORS_COUNT_OUT : out std_logic_vector(COUNTER_WIDTHS-1 downto 0);
+    DATA_CHANGED_COUNT_OUT : out std_logic_vector(COUNTER_WIDTHS-1 downto 0);
+    SAMPLING_ERRORS_COUNT_OUT : out std_logic_vector(COUNTER_WIDTHS-1 downto 0);
+    RUN_COUNTER_OUT : out std_logic_vector(31 downto 0);
+    
+    STARTED_OUT : out std_logic;
+    LAST_RUN_SUCCESSFUL_OUT : out std_logic;
+    LAST_DATA_CHANGED_OUT : out std_logic;
+    LAST_WRITE_ERRORS_OUT : out std_logic;
+    LAST_READ_ERRORS_OUT : out std_logic;
+    CRC_ERROR_OUT : out std_logic
+
+\end{Verbatim}
+
+\begin{table}[H]
+\begin{threeparttable}
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{p{4.5cm}llp{6.6cm}}
+ Name & Typ\tnote{1} & Standardwert & Beschreibung\\
+ MAX\_NUMCHIPS  &i &  7&  Maximale Anzahl an Sensoren in der JTAG-Chain dieses Controllers\tnote{2}\\
+% MAX\_NUMCHIPS\_\-PLUS\_ONE\_LD & i & 3 & $ \lceil \text{ld} (\text{MAX\_NUMCHIPS}+1)\rceil$\\
+% MAX\_NUMCHIPS\_\-LD          & i & 3 & $ \lceil \text{ld} (\text{MAX\_NUMCHIPS})\rceil$ \\
+ MAX\_REGISTERS            & i & 14 & Maximale Anzahl von Registern pro Sensor\tnote{3}\\
+% MAX\_REGISTERS\_\-LD         & i & 4 &  $ \lceil \text{ld} (\text{MAX\_REGISTERS})\rceil$\\
+% MAX\_REGISTERS\_\-PLUS\_ONE\_LD& i & 4 &  $\lceil \text{ld}(\text{MAX\_REGISTERS}+1)\rceil$\\
+% MAX\_REGISTERS\_\-PLUS\_TWO\_LD& i & 4 &  $\lceil \text{ld}(\text{MAX\_REGISTERS}+2)\rceil$\\
+ MAX\_REGLEN                  & i & 4095& Maximale Registerlänge in bit\tnote{2}\\
+% MAX\_REGLEN\_LD                  & i & 12& $ \lceil \text{ld} (\text{MAX\_REGLEN})\rceil$, wobei MAX\_REGLEN die maximale Registerlänge in bit ist\\
+% MAX\_REGLEN\_\-PLUS\_ONE\_LD         & i & 12& $ \lceil \text{ld} (\text{MAX\_REGLEN}+1)\rceil$\\
+ WRITE\_ERROR\_\-THRESHOLD          & i &  3& Mindestanzahl von abweichenden Bits, ab der WRITE\_ERROR\_/DATA\_CHANGED\_-OVER\_THRESHOLD gezählt werden.\\
+ READ\_ERROR\_\-THRESHOLD           & i &  4& Mindestanzahl von abweichenden Bits in der 32 bit ID, ab der READ\_ERROR\_OVER\_THRESHOLD gezählt werden.\\
+ JTAG\_M26\_IRLEN                 & i & 5 & Länge des Instruktionsregisters der Sensoren\\ 
+% JTAG\_M26\_\-IRLEN\_LD              & i & 3 &  $ \lceil \text{ld} (\text{JTAG\_M26C\_IRLEN})\rceil$\\
+ JTAG\_M26\_IR\-\_ID\_CODE            & v & "01110" &  Code für 32 bit DEV\_ID Register\\
+ JTAG\_M26\_\-DEV\_ID                & v & x"4D323601"& 32 bit DEV\_ID\\ 
+ RAM\_JTAG\_REGISTERS\-\_DEPTH       & i & 11& Adressbreite von \textbf{ram1} in bit.\tnote{4}\\
+ JTAG\_CHAIN\_BROKEN\_\-COUNTER\_BITS & i & 10& Breite des Zählers für die Anzahl der Durchläufe mit Unterbrechungen in der JTAG-Chain (getestet durch Entity \texttt{jtag\_bypassreg\_testchain\_m10})\\
+ JTAG\_TDO\_EXPECTED\_\-MAXDELAY       & i & 3 & Maximale Speicherzeit der internen Signale zum Vergleich mit TDO in JTAG-Takten.\\
+ JTAG\_TDO\_EXPECTED\_\-MAXDELAY\_PLUS\_ONE\_LD & i & 2& $ \lceil \text{ld} (\text{JTAG\_TDO\_EXPECTED\_MAXDELAY}+1)\rceil$\\
+ RESET\_WAIT\_\-DURATION                    & u & "10000000"& Wartezeit nach RESET-Anforderung nach erstem \textbf{WRITE}, Standardwert entspricht 128 Taktzyklen bei 100 MHz.\\
+\end{tabular}
+\begin{tablenotes}\footnotesize 
+\item[1]i: integer, v: std\_logic\_vector, u: unsigned
+\item[2]Um Logik zu sparen, werden hier Werte der Form $2^n-1$ ($n \in \mathbb{N}$) verwendet.
+    Um stattdessen den Speicher \textbf{ram1} vollständig zu nutzen, kann $2^n$ gewählt werden.
+\item[3]Um \textbf{ram3} optimal zu nutzen, sollte dieser Wert $2^n-2$ für ganzzahliges n entsprechen.
+\item[4] MAX\_NUMCHIPS\_LD bit davon werden für die Adressierung des Sensor-Blocks verwendet, der Rest bleibt für die 32-bit Worte innerhalb eines Sensor-Blocks.
+\end{tablenotes}
+\end{threeparttable}
+\caption{jtag\_cmd\_m26c Generics}
+\end{table}
+
+\clearpage
+\subsection{TrbNet Interface}
+Der Bus Handler akzeptiert 9-bit-Adressen. Die Adressen liegen damit zwischen 0x000 und 0x1FF.
+\begin{table}[H]
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{ll}
+Name & Bereich\\
+RAM  & 0x000 - 0x0FF\\
+STATUS & 0x100 - 0x11F\\
+CONTROL & 0x120 - 0x13F\\
+DEBUG & 0x140 - 0x15F\\
+STATUS2 & 0x160 - 0x17F\\
+\end{tabular} 
+\caption{Die 5 Adressbereiche des JTAG-Chain-Controllers.}
+\label{table:trbnet_address_ranges}
+\end{table}
+\subsubsection{RAM-Adressen}
+Das RAM \textbf{ram1a}, das die JTAG-Register für alle Sensoren speichert, kann über diesen Adressbereich mit 256 32-bit Wörtern 
+beschrieben und ausgelesen werden (Tabelle \ref{table:ram_addrs}). 
+Die 8 bit dieses Adressraums entsprechen den 8 niederwertigsten Bits der \textbf{ram1a}-Adresse.
+Die höheren Adressbits werden über das im folgenden Abschitt 
+"`CONTROL-Adressen"' beschriebene Register mit der Adresse 0x121 eingestellt.
+In der Standardeinstellung ist der Block für einen Sensor auch 256 32-bit Wörter (entspricht 8 kbit Speicherbereichen) groß.
+Die höherwertigen Adressbits geben in diesem Fall an, welcher Sensor ausgewählt ist.\footnote{Wenn die Speichergröße für einen Sensor 
+von 8 kbit abweichend gewählt wird, enthalten die 256 Wörter dieses Adressbereichs
+entweder mehr als einen Sensor-Block oder nur einen Teil eines Sensor-Blocks.}
+
+
+Geschrieben werden kann nur, wenn der JTAG-Chain-Controller gestoppt ist (\texttt{m26cs\_stopped} = 1).
+\begin{table}
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{p{3.5cm}lp{8cm}}
+Name & Adresse & Beschreibung\\
+RAM1AWORD(0-255) & 0x000-0x0FF & Wenn \texttt{m26cs\_stopped} = 1, kann ram1a über diese Register beschrieben, sonst nur ausgelesen werden. Der Bereich von \textbf{ram1a}, das auf diese Register abgebildet wird, wird durch das Register RAM\_BASEADDR (siehe Tabelle \ref{table:control_addrs}) eingestellt.\\
+\end{tabular}
+\caption{Register im RAM-Adressbereich.}
+\label{table:ram_addrs}
+\end{table}
+\subsubsection{STATUS-Adressen}
+\label{section_addresses_status}
+Unter der Adresse 0x100 kann für die ersten 32 Sensoren der Status des CRC-Checks des \textbf{ram1a}-Speicherbereichs abgefragt werden (Tabelle \ref{table:status_addrs}). Bei erfolgreichem
+CRC-Check ist das Bit auf 1 gesetzt. Dabei gehört das niederwertigste Bit zum ersten Sensor.
+\begin{table}
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{p{3.5cm}lp{8cm}}
+Name & Adresse & Beschreibung\\
+CRC\_STATUS & 0x100 & 32 bit Status-Register des letzten CRC-Checks für die ersten 32 Sensoren. "`Bit i"' = 1 $\to$ CRC-Check ok für Sensor i.\\
+\end{tabular}
+\caption{Register im STATUS-Adressbereich.}
+\label{table:status_addrs}
+\end{table}
+\subsubsection{CONTROL-Adressen}
+\label{abschnitt_control}
+Die Register sind in Tabelle \ref{table:control_addrs} zusammengefasst.
+Es gibt ein Befehls- und ein Datenregister, die bei
+(hexadezimal) 0x120 und 0x122  liegen.
+
+Das Register 0x121 wählt den Speicherbereich aus \textbf{ram1a} aus, der durch die im Abschnitt "`RAM-Adressen"' beschriebenen Adressen
+zugänglich ist. 
+\begin{table}
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{p{3.5cm}lp{8cm}}
+Name & Adresse & Beschreibung\\
+CMD & 0x120 & Befehlsregister, siehe Abschnitt \ref{abschnitt_control}.\\
+RAM\_BASEADDR & 0x121 & Wählt einen Speicherbereich mit 256 32-bit Worten aus \textbf{ram1a} aus. Diese Adresse entspricht der RAM-Adresse ohne die 8 niederwertigsten Bits. \\
+DATA\_REGISTER & 0x122 & Datenregister, siehe Abschnitt \ref{abschnitt_control}.\\
+\end{tabular}
+\caption{Register im CONTROL-Adressbereich.}
+\label{table:control_addrs}
+\end{table}
+
+Ein Befehl wird ausgeführt, indem per TrbNet ein 8 bit-Code an die untersten 8 bit des 32-bit-Befehlsregisters geschrieben wird.
+Das Datenregister kann per TrbNet beschrieben werden, aber auch von ausgeführten Befehlen verändert werden.
+Auf das Datenregister kann man auch lesend zugreifen, um das Ergebnis eines Befehls auszulesen.
+
+
+Eine Liste der Befehle, deren Code in \texttt{jtag\_constants.vhd} festgelegt ist, findet sich in den Tabellen 
+\ref{table:trbnet_commands} und \ref{table:trbnet_commands2}.
+\begin{table}
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{p{5cm}lp{10cm}}
+Name & Code & Beschreibung\\
+NONE &     00 & Leerer Befehl.\\
+START &    09 & Aktiviert das Warten auf den \texttt{OFF\_SPILL\_IN}-Trigger (\texttt{jtag\_refresh\_active} = 1).\\
+STOP &     0A & Beendet sowohl Warten auf \texttt{OFF\_SPILL\_IN}-Trigger (\texttt{jtag\_refresh\_active} = 0) als auch check1 (\texttt{jtag\_check1\_active} = 0). Nach Beendigung eventuell noch laufender Programmiervorgänge wird der STOP-Zustand erreicht (\texttt{m26cs\_stopped} = 1).\\
+REMOVE\_SENSOR & 10 & Wenn gestoppt (\texttt{m26cs\_stopped} = 1), wird der im Datenregister eingestellte Sensor als nicht in der Kette befindlich markiert und dadurch bei kommenden Programmiervorgängen übersprungen, so dass eine Kette mit weniger Sensoren programmiert wird.\\
+INSERT\_SENSOR & 11 & Wenn gestoppt (\texttt{m26cs\_stopped} = 1), wird der im Datenregister eingestellte Sensor als nicht in der Kette befindlich markiert und dadurch bei kommenden Programmiervorgängen übersprungen, so dass eine Kette mit weniger Sensoren programmiert wird.\\
+GET\_NUMCHIPS\_CONFIGURED & 12& Die eingestellte Anzahl der im RAM zu liegenden Sensor-Blöcke wird ins Datenregister geschrieben.\\
+SET\_NUMCHIPS\_CONFIGURED & 33 & Aus dem Datenregister wird die Anzahl der im RAM zu liegenden Sensor-Blöcke übernommen.\\
+GET\_NUMCHIPS\_ACTIVE & 13& Die Anzahl nicht entfernter Sensoren wird ins Datenregister geschrieben.\\
+GET\_TRIGGER\_COUNT &14 & Die Zahl der \texttt{OFF\_SPILL\_IN}-Trigger wird ins Datenregister kopiert.\\
+GET\_REMOVED     &1d& Schreibt 1 ins Datenregister, wenn der vorher im Datenregister eingestellte Sensor als entfernt markiert ist.\\
+GET\_REMOVED32   &1e& Schreibt für die ersten maximal 32 Sensoren die Entfernt-Markierung in das 32-bit Datenregister. (1 = entfernt, 0 = nicht entfernt).\\
+SET\_BREAKPOINTS & 53 & Setzt \texttt{breakpoint\_active}, siehe VHDL-Code \texttt{jtag\_cmd\_m26c.vhd} für Stellen, an denen die State-Machine angehalten wird.\\
+GET\_BREAKPOINTS & 52 & Schreibt \texttt{breakpoint\_active} ins Datenregister.\\
+SET\_JTAG\_CLOCK\_CYCLE\-\_LENGTH &  40 & setzt die Dauer des JTAG-Takzyklus (\texttt{jtag\_clock\_cycle\_length}, angegeben in Systemtakten).\\
+GET\_JTAG\_CLOCK\_CYCLE\-\_LENGTH &41 & schreibt die Dauer des JTAG-Takzyklus (\texttt{jtag\_clock\_cycle\_length}, in Systemtakten)  in das Datenregister.\\
+SET\_JTAG\_CLOCK\_TIME1 &42 & Setzt den Zeitpunkt der steigenden TCK-Taktflanke (\texttt{jtag\_clock\_time1}) innerhalb des durch jtag\_clock\_cycle\_length gegebenen Bereichs.\\
+GET\_JTAG\_CLOCK\_TIME1 & 43& schreibt den Wert von \texttt{jtag\_clock\_time1} in das Datenregister.\\
+SET\_JTAG\_CLOCK\_TIME2 &44& Setzt den Zeitpunkt der fallenden TCK-Taktflanke (\texttt{jtag\_clock\_time2}) innerhalb des durch jtag\_clock\_cycle\_length gegebenen Bereichs.\\
+GET\_JTAG\_CLOCK\_TIME2 &45& schreibt den Wert von \texttt{jtag\_clock\_time2} in das Datenregister.\\
+\end{tabular} 
+\caption{Befehle für den JTAG-Chain-Controller, die per TrbNet geschickt werden können.}
+\label{table:trbnet_commands}
+\end{table}
+
+\begin{table}
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{p{5cm}lp{10cm}}
+SET\_JTAG\_SAMPLE\_TIME1 &46 & Setzt den Zeitpunkt der ersten Abtastung des TDO\_IN-Signals (\texttt{jtag\_sample\_time1}).\\
+GET\_JTAG\_SAMPLE\_TIME1 &47 & Schreibt den Wert von \texttt{jtag\_sample\_time1} ins Datenregister.\\
+SET\_JTAG\_SAMPLE\_TIME2 &48 & Setzt den Zeitpunkt der zweiten Abtastung des TDO\_IN-Signals (\texttt{jtag\_sample\_time2}).\\
+GET\_JTAG\_SAMPLE\_TIME2 &49 & Schreibt den Wert von \texttt{jtag\_sample\_time2} ins Datenregister.\\
+SET\_JTAG\_SAMPLE\_TIME3 &4a & Setzt den Zeitpunkt der dritten Abtastung des TDO\_IN-Signals (\texttt{jtag\_sample\_time3}).\\
+GET\_JTAG\_SAMPLE\_TIME3 &4b & Schreibt den Wert von \texttt{jtag\_sample\_time3} ins Datenregister.\\
+SET\_JTAG\_SET\_DATA\_TIME&4c & Setzt den Zeitpunkt für das Ändern der TMS und TDI-Ausgänge des FPGA (\texttt{set\_data\_time}).\\
+GET\_JTAG\_SET\_DATA\_TIME&4d& Schreibt den Wert von set\_data\_time ins Datenregister.\\
+GET\_RUN\_COUNT &50& Schreibt den Wert des Durchlauf-Zählers, \texttt{run\_counter}, in das Datenregister.\\
+START\_CHECK1 &60& Setzt \texttt{jtag\_check1\_active} auf 1. Damit wird das Schreiben der Register der Sensoren übersprungen.\\
+COPY\_TO\_STATUS2 &63& Das Kopieren von \textbf{ram3a} in \textbf{ram3b} wird nach Beenden des Durchlaufs aus Abb. \ref{fig:m26controller_simple} durchgeführt.\\
+COPY\_RAM1B1C\_SINGLE\-\_TRIGGER &64& Setze den Trigger für das Kopieren von \textbf{ram1b} nach \textbf{ram1c} (siehe Abschnitt MA:\ref{MA-rams_description}) auf bit 0  $\to$ read error, 1  $\to$ write error, 2  $\to$ data changed, 3  $\to$ next run.\\
+SET\_CSOPTIONS &65& Setze Optionen (\texttt{m26csoptions}): bit 0  $\to$ Überspringe \textbf{BYPASSREG\_TESTCHAIN}.\\
+GET\_CSOPTIONS &66& Schreibe \texttt{m26csoptions} in das Datenregister.\\
+SET\_DELAY\_EXPECTED\-\_VALUES &67& Setze die Zahl der TCK-Takte, um die das TDO-Signal des letzten Sensors verzögert eintrifft (\texttt{jtag\_delay\_expvalues}, Wertebereich 0 - 3).\\
+GET\_DELAY\_EXPECTED\-\_VALUES &68& Schreibe \texttt{jtag\_delay\_expvalues} in das Datenregister.\\
+GET\_ACTIVITY &69& Schreibt die Werte der folgenden internen Variablen ins Datenregister: bit 0 $\to$ jtag\_refresh\_active, bit 1  $\to$ jtag\_check1\_active.\\
+\end{tabular} 
+\caption{Fortsetzung von Tabelle \ref{table:trbnet_commands}.}
+\label{table:trbnet_commands2}
+\end{table}
+
+\subsubsection{DEBUG-Adressen}
+Im DEBUG-Adressraum 0x140-0x15F liegen die in Tabelle \ref{table:debug_addrs} angegebenen Register.
+
+\begin{table}
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{p{3.5cm}lp{8cm}}
+Name & Adresse & Beschreibung\\
+TEST & 0x140 & Lesen/Schreiben des Test-Registers \texttt{debug\_test}.\\
+M26CS\_STATE & 0x141 & Lese den binär kodierten Zustand des Durchlaufs aus Abb. \ref{fig:m26controller_simple}, der im Register \texttt{debug\_m26cs\_state} gespeichert ist. Siehe \texttt{jtag\_cmd\_m26c.vhd}.\\
+TRIGGER\_COUNT & 0x145 & Lese das Register \texttt{debug\_trigger\_counter} aus, das so lange jeden Systemtakt inkrementiert wird, wie \texttt{OFF\_SPILL\_IN} gesetzt ist.\\
+VERSION & 0x146 & Lese beim Kompilieren festgelegte Versionsnummer aus.\\
+RAM1BADDR & 0x147 & Setze die Addresse für den Zugriff auf \textbf{ram1b}.\\
+RAM1B\_DATA & 0x148 & Lese 32-bit Wort aus \textbf{ram1b} bei Adresse aus dem \texttt{RAM1BADDR}-Register.\\
+RAM1CADDR & 0x149 & Setze die Addresse für den Zugriff auf \textbf{ram1c}.\\
+RAM1C\_DATA & 0x14A &  Lese 32-bit Wort aus \textbf{ram1c} bei Adresse aus dem \texttt{RAM1CADDR}-Register.\\
+RAM1C\_RUN\-\_COUNTER & 0x14B & Lese das Register \texttt{ram1c\_run\_counter}. Dies ist eine Kopie des Registers \texttt{run\_counter}, zu dem Zeitpunkt, zu dem die Kopie \textbf{ram1c} von \textbf{ram1b} gemacht wurde.\\
+RAM1C\_CHAIN\-\_STATUS & 0x14C & Lese das Register \texttt{ram1c\_chain\_status}. Dies ist eine Kopie des Registers \texttt{chain\_status}, zu dem Zeitpunkt, zu dem die Kopie \textbf{ram1c} von \textbf{ram1b} gemacht wurde.\\
+DEBUGTDO\-\_SAMPLES & 0x14D & Datenausgang des \texttt{fifo32bit\_debugtdo}-FIFOs. In dieser Version ist dieses FIFO deaktivert. \\
+DEBUGTDO\-\_GETFIFOSTATUS & 0x14E & Status des \texttt{fifo32bit\_debugtdo}-FIFO: bit 0 $\to$ voll, bit 1 $\to$ leer, bit 2 $\to$ Überlauf, bit 3 $\to$ Unterlauf.\\
+DEBUGTDO\-\_TIMEOUT & 0x14F & Setze Register \texttt{debugtdo\_timeout}: Die Zeit in Systemtakten, die nach dem Start des Durchlaufs aus Abb. \ref{fig:m26controller_simple}  gewartet wird, bis der \texttt{fifo32bit\_debugtdo}-FIFO befüllt wird.\\
+DEBUGTDO\-\_ACTIVATE & 0x150 & Wenn in dieses Register als unterstes Bit eine 1 geschrieben wird, wird der \texttt{fifo32bit\_debugtdo}-FIFO jeden Takt beffüllt, wenn seit dem Start des Durchlaufs die im \texttt{debugtdo\_timeout}-Register angegebene Zeit vergangen ist.\\
+DEBUGTDO\-\_CONTROLFIFO & 0x151 & Kontrolle des \texttt{fifo32bit\_debugtdo}-FIFOs: bit 0 $\to$ ein 32 bit Wort auslesen, bit 4 $\to$ FIFO Reset \\
+\end{tabular}
+\caption{Register im DEBUG-Adressbereich.}
+\label{table:debug_addrs}
+\end{table}
+\subsubsection{STATUS2-Adressen}
+\label{section_status2_adresses}
+Im STATUS2-Adressraum 0x160-0x17F liegen die in Tabelle \ref{table:status2_addrs} angegebenen Register. Sie dienen der
+konsistenten Abfrage der Fehlerzähler. Dazu wird mit dem Befehl COPY\_TO\_STATUS2 eine Kopie von \textbf{ram3a} 
+in \textbf{ram3b} angefordert. Wenn die Kopie fertig ist, was über das UPDATING-Register abfragbar ist, kann über 
+setzen des RAM3B\_BASEADDR-Registers die Kopie \textbf{ram3b} über die Register im Bereich von RAM3B\_BEGIN bis RAM3B\_END  ausgelesen werden.
+Wenn das Auslesen abgeschlossen ist, kann eine neue Kopie angefordert werden. 
+
+\begin{table}
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{p{3.5cm}lp{8cm}}
+Name & Adresse & Beschreibung\\
+TRIGGERCOUNTER\-\_COPY & 0x160 & Nummer des letzten Durchlaufs (\texttt{run\_counter}) zum Zeitpunkt der Kopie.\\
+CHAIN\_STATUS\-\_COPY  & 0x161 & Kopie des \texttt{chain\_status}: bit 0 $\to$ Kette unterbrochen (per \textbf{bypassreg\_testchain} getestet), 
+bits 1,2 $\to$ reserved, bits 3+MAX\_NUMCHIPS\_PLUS\_ONE\_LD-1 downto 3: Länge der Kette, ermittelt per \textbf{bypassreg\_testchain}.\\
+UPDATING & 0x162 & bit 0 $\to$ Kopieren von \textbf{ram3a} nach \textbf{ram3b} noch nicht fertig.\\
+RAM3B\_BASEADDR & 0x163 & Setzt die höheren Adressbits von ram3b.\\
+STARTED    & 0x164 & bit 0 $\to$ aktueller Wert von \texttt{jtag\_refresh\_active}.\\
+RAM3B\_BEGIN- RAM3B\_END & 0x170 - 0x17F & 16 32-bit Wörter mit den unteren Adressbits 0-F und höheren Adressbits wie durch das Register RAM3B\_BASEADDR gesetzt. \textbf{ram3b} (Kopie von \textbf{ram3a}) kann über diese Register ausgelesen werden. Für den Inhalt siehe Abschnitt \ref{abschnitt_ram3}.
+\end{tabular}
+\caption{Register im STATUS2-Adressbereich.}
+\label{table:status2_addrs}
+\end{table}
+
+\clearpage
+\subsection{RAM-Layout von ram3a/b (Zählerstände)}
+\label{abschnitt_ram3}
+\begin{wrapfigure}{l}{0.45\textwidth}
+ \centering
+ \includegraphics[width=0.4\textwidth]{./ram3block.pdf}
+ % schrader_overview.pdf: 720x540 pixel, 72dpi, 25.40x19.05 cm, bb=0 0 720 540
+%\setcapwidth[c]{0.9\textwidth}
+ \caption{32 bit Zählerstände in \textbf{ram3a}/\textbf{ram3b}. Gezeigt ist der Block für einen Sensor.}
+ \label{fig:ram3block}
+\end{wrapfigure}
+Abbildung \ref{fig:ram3block} zeigt das RAM-Layout für das Speichern der Fehlerzählerstände 
+RD\_ERR (READ\_\-ERROR, siehe MA:\ref{MA-abschnitt_zaehlerstaende}),
+WR\_ERR (WRITE\_\-ERROR: Fehler beim Schreiben mindestens eines Registers) und 
+D\_CH (DATA\_\-CHANGED: Änderung der Daten in den Sensor-Registern seit dem letzten Initialisier-Durchlauf).
+
+Die letzten beiden Fehlerzähler sind zudem für alle Register vorhanden und heißen DRi\_ERR und DRi\_D\_CH für das i-te Register.
+
+Außerdem wird der \texttt{run\_counter} des Durchlaufs, bei dem das letzte mal dieser Sensor nicht entfernt markiert war, gespeichert.
+
+Die Namen, die in \_OV\_TH enden sind entsprechende Fehlerzähler, die nur Zählen, wenn mindestend READ\_ERROR\_THRESHOLD Bits
+der Device ID falsch sind (RD\_ERR\_OV\_TH) bzw. mindestens WRITE\_ERROR\_THRESHOLD Bits des entsprechenden Sensor-Registers von
+dem geschriebenen Wert abwichen (WR\_ERR\_OV\_TH und DRi\_ERR\_OV\_TH, und auch DATA\_CH\_OV\_TH sowie DRi\_D\_CH\_OV\_TH).
+\subsection{Konfiguration des Timings}
+\label{section_timing}
+\begin{figure}[p]
+ \centering
+ \includegraphics[width=\textwidth]{./jtag_signals/jtag_signals2.png}
+ % schrader_overview.pdf: 720x540 pixel, 72dpi, 25.40x19.05 cm, bb=0 0 720 540
+\setcapwidth[c]{0.9\textwidth}
+ \caption{Timing-Diagramm, das JTAG-Signale und FPGA-interne Signale zeigt. Erstellt mit der Software TimingTool\cite{timingtool_url}}
+ \label{fig:timingtool_internal_signals}
+\end{figure}
+Die Signale \textit{set\_data}, \textit{sample\_pulse\{1,2,3\}} sowie \textit{jtag\_clock\_pulse1} und 
+\textit{jtag\_clock\_pulse2} bestehen aus einen Systemtakt langen Pulsen, die regelmäßig zu den Zeiten \texttt{set\_data\_time}, \texttt{jtag\_sample\_time1}, 
+\texttt{jtag\_sample\_time2}, \texttt{jtag\_sample\_time3} sowie \texttt{jtag\_clock\_time1} und \texttt{jtag\_clock\_time2}
+nach dem Puls auf dem \textit{begin\_jtag\_bitcalc}-Signal generiert werden. 
+Der \textit{begin\_jtag\_bitcalc}-Puls wird regelmäßig in Abständen von \texttt{jtag\_clock\_cycle\_length} Taktzyklen generiert.
+Die Zeiten sind in Systemtakten angegeben und beginnen bei Null einen Takt nach dem Puls auf dem \textit{begin\_jtag\_bitcalc}-Signal.
+
+Das TDO\_IN-Signal vom letzten nicht aus der Kette herausgeschalteten Sensor wird jeweils abgetastet an der Taktflanke nach dem Takt, in dem
+das Signal \textit{sample\_pulse\{1,2,3\}} aktiv ist.
+Falls sich die bei den verschiedenen eingestellten Zeiten abgetasteten Werte unterscheiden, wird dies als SAMPLING\_ERROR gewertet.
+
+Beginnend beim Puls auf \textit{begin\_jtag\_bitcalc} berechnen die auf das JTAG-Interface zugreifenden Entities \textit{jtag\_write\_m10},
+\textit{jtag\_read\_m26devid\_m10} und \textit{jtag\_bypassreg\_testchain\_m10} innerhalb von 10 Taktzyklen den Wert für die JTAG-Signale TMS und TDI für 
+den nächsten JTAG-Takt.
+Nachdem ein solcher Wert berechnet wurde, wird beim \textit{set\_data}-Puls, der mindestens 10 Taktzyklen nach dem 
+\textit{begin\_jtag\_bitcalc}-Puls jedoch und spätestens mit dem nächsten \textit{begin\_jtag\_bitcalc}-Puls kommen muss,
+das \textit{ENABLE\_JTAG\_CLOCK}-Signal high und beim nächsten \textit{jtag\_clock\_pulse1} wird eine steigende Flanke auf 
+\texttt{TCK\_OUT} generiert.
+Es ist hier erlaubt, dass der \textit{set\_data}-Puls gleichzeitig mit dem \textit{begin\_jtag\_bitcalc}-Puls kommt, da die 
+berechneten Werte an den Ausgängen innerhalb dieses Taktes von den Entities noch nicht verändert werden. Eine Einstellung 
+z.B. zwei Takte nach dem \textit{begin\_jtag\_bitcalc}-Puls könnte zu Fehlern führen, da eine Entity unterschiedlich lange
+brauchen kann (bis zu 10 Taktzyklen), um die neuen JTAG-Werte zu bestimmen.
+
+Ein Beispiel, bei dem der \textit{set\_data}-Puls gleichzeitig mit dem \textit{begin\_jtag\_bitcalc}-Puls kommt ist im Diagramm in 
+Abbildung \ref{fig:timingtool_internal_signals} gezeigt.
+Ebenfalls mit dem \textit{set\_data}-Puls werden die Ausgänge \texttt{TMS\_OUT} und \texttt{TDI\_OUT} gesetzt.
+
+
+Um die Fehler in den Registern der einzelnen Sensoren zu zählen, wird falls die drei gesampelten Werte \textit{sampled(2 downto 0)} gleich sind, deren Wert verglichen 
+mit dem Wert, der auf TDI gelegt wurde. Dieser Wert kann auch noch durch die Einstellung von \texttt{jtag\_delay\_expvalues} mehrere JTAG-Takte verzögert werden.
+
+
+\clearpage
+\subsection{Erweiterte VHDL entity}
+Die Entity \texttt{jtag\_mvd} enthält einen JTAG-Chain-Controller, sowie einen weiteren TrbNet Bus Handler,
+der Adressen für die Steuerung der \texttt{MAPS\_*}-Ausgänge bereitstellt. Außerdem können die JTAG-Ein- und -Ausgänge
+invertiert werden.
+
+
+\label{jtagmvdentity}
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=jtag\_mvd Entity,labelposition=all,commandchars=\\\{\}]
+entity jtag_mvd is
+  generic(
+    NUM_CHAINS : integer := 1
+    );
+  port(
+    CLK_IN            : in  std_logic;
+    CLK_MAPS_IN       : in  std_logic;  --200 MHz for PLL!
+    RESET             : in  std_logic;
+    
+    MAPS_CLK_OUT      : out std_logic_vector(NUM_CHAINS-1 downto 0);
+    MAPS_START_OUT    : out std_logic_vector(NUM_CHAINS-1 downto 0);
+    MAPS_RESET_OUT    : out std_logic_vector(NUM_CHAINS-1 downto 0);
+    
+    JTAG_TDI_OUT      : out std_logic_vector(NUM_CHAINS-1 downto 0);
+    JTAG_TMS_OUT      : out std_logic_vector(NUM_CHAINS-1 downto 0);
+    JTAG_TCK_OUT      : out std_logic_vector(NUM_CHAINS-1 downto 0);
+    JTAG_TDO_IN       : in  std_logic_vector(NUM_CHAINS-1 downto 0);
+    
+    BUS_DATA_IN          : in  std_logic_vector(31 downto 0);
+    BUS_DATA_OUT         : out std_logic_vector(31 downto 0);
+    BUS_ADDR_IN          : in  std_logic_vector(12 downto 0);
+    BUS_WRITE_IN         : in  std_logic;
+    BUS_READ_IN          : in  std_logic;
+    BUS_DATAREADY_OUT    : out std_logic;
+    BUS_WRITE_ACK_OUT    : out std_logic;
+    BUS_NO_MORE_DATA_OUT : out std_logic;
+    BUS_UNKNOWN_OUT      : out std_logic;
+    
+    STATUS_OUT        : out std_logic_vector(NUM_CHAINS*256-1 downto 0); 
+      --common status register, a.t.m.
+    DEBUG_OUT         : out std_logic_vector(31 downto 0)
+    );
+end entity;
+\end{Verbatim}
+
+Die Signale \texttt{MAPS\_CLK\_OUT}, \texttt{MAPS\_START\_OUT}, \texttt{MAPS\_RESET\_OUT} sind speziell für den MIMOSA-26 Sensor. 
+Die Front-End-Elektronik führt allen Sensoren einer Kette das gleiche CLK-, START- und RESET-Signal zu, weshalb genau wie
+die JTAG-Signale diese Signale einmal pro Kette benötigt werden.
+
+Das Signal \texttt{STATUS\_OUT} fasst verschiedene Status-Ausgänge des JTAG-Chain-Controllers zusammen.
+
+\subsubsection{COM\_SETTINGS-Adressen}
+\label{section_status2_adresses}
+Im COM\_SETTINGS-Adressraum \texttt{0x1000-0x10FF} liegen die in Tabelle \ref{table:com_settings_addrs} angegebenen Register. 
+
+Für die Initialisations-Sequenz kann über WAITBEFORESTART eine Wartezeit nach erfolgtem Schreiben aller JTAG-Register
+bis zum Senden des START-Signals auf \texttt{MAPS\_START\_OUT} eingestellt werden.
+Desweiteren kann vor und nach dem ersten WRITE (siehe Abb. \ref{fig:m26controller_simple}) ein Reset-Puls
+auf \texttt{MAPS\_RESET\_OUT} gesendet werden.
+
+\begin{table}
+\renewcommand{\arraystretch}{1.4} 
+\begin{tabular}{p{4.2cm}lp{6.8cm}}
+Name & Adresse & Beschreibung\\
+TRBNET\_TRIGGER\_\-ALLCHAINS\_INIT\_SEQ & 0x1003 & Initialisations-Sequenz für alle angeschlossenen Sensor-Ketten starten.\\
+WAITBEFORESTART  & 0x1007 & Wartezeit nach letztem WRITE-Vorgang (Abb. \ref{fig:m26controller_simple}) bis zum Puls auf \texttt{MAPS\_START\_OUT} in Taktzyklen des \texttt{MAPS\_CLK\_OUT}-Taktes.\\
+TRBNET\_TRIGGER\_ALL\-CHAINS\_RESET\_PULSE & 0x100a & Reset-Puls auf allen Chains generieren.\\
+TRBNET\_TRIGGER\_ALL\-CHAINS\_START\_PULSE & 0x100b & Start-Puls auf allen Chains generieren.\\
+TRBNET\_TRIGGER\_\-INIT\_SEQ & 0x100c & bit i $\to$ Initialisierungs-Sequenz für Chain i starten.\\
+TRBNET\_TRIGGER\_\-RESET\_PULSE & 0x100d & bit i $\to$ Reset-Puls auf Chain i generieren.\\
+TRBNET\_TRIGGER\_\-START\_PULSE & 0x100e & bit i $\to$ Start-Puls auf Chain i generieren.\\
+TRBNET\_TRIGGER\_\-JTAG\_RUN\_NORESET & 0x100f & bit i $\to$ JTAG-Register 3x Schreiben (Ablauf siehe Abb. \ref{fig:m26controller_simple}).\\
+RESETBEFOREINIT & 0x1010 & Bei Initialisations-Sequenz vor Ablauf aus Abb. \ref{fig:m26controller_simple} einen Reset-Puls generieren.\\
+RESETAFTERFIRST\-WRITE & 0x1011 & Bei Initialisations-Sequenz vor Ablauf aus Abb. \ref{fig:m26controller_simple} einen Reset-Puls generieren.\\
+TRBNET\_TRIGGER\_\-JTAG\_WRITE\_ONCE & 0x1014 & Nur einen WRITE-Vorgang (Alle Regiser schreiben, Teil des normalen Ablaufs aus Abb. \ref{fig:m26controller_simple}) ausführen, zu Debugzwecken.\\
+\end{tabular}
+\caption{Register im COM\_SETTINGS-Adressbereich.}
+\label{table:com_settings_addrs} 
+\end{table}
+
+% -- 0xb100 - 0xb2ff
+% -- RAM:               0xb000 - 0xb0ff
+% -- Status registers:  0xb100 - 0xb11f
+% -- Control registers: 0xb120 - 0xb13f
+% -- Debug   registers: 0xb140 - 0xb15f
+% constant ADDR_RAM       : std_logic_vector (15 downto 0) := x"b000";
+% constant ADDR_STATUS       : std_logic_vector (15 downto 0) := x"b100";
+% constant ADDR_CONTROL      : std_logic_vector (15 downto 0) := x"b120";
+% constant ADDR_DEBUG        : std_logic_vector (15 downto 0) := x"b140";
+% constant ADDR_STATUS2       : std_logic_vector (15 downto 0) := x"b160";
+% 
+% constant ADDR_CONTROL_CMD  : std_logic_vector (4 downto 0) := "00000";
+% constant ADDR_CONTROL_RAM_BASEADDR  : std_logic_vector (4 downto 0) := "00001";
+% constant ADDR_CONTROL_DATA_REGISTER : std_logic_vector (4 downto 0) := "00010";
+% 
+% constant ADDR_DEBUG_TEST   : std_logic_vector(4 downto 0) := "00000";
+% constant ADDR_DEBUG_M26CS_STATE   : std_logic_vector(4 downto 0) := "00001";
+% constant ADDR_DEBUG_M26C_READ_STATE   : std_logic_vector(4 downto 0) := "00010";
+% constant ADDR_DEBUG_M26C_WRITE_STATE   : std_logic_vector(4 downto 0) := "00011";
+% constant ADDR_DEBUG_JTAG_DRIVER_STATE   : std_logic_vector(4 downto 0) := "00100";
+% constant ADDR_DEBUG_TRIGGER_COUNT   : std_logic_vector(4 downto 0) := "00101";
+% constant ADDR_DEBUG_VERSION   : std_logic_vector(4 downto 0) := "00110";
+% constant ADDR_DEBUG_RAM1BADDR : std_logic_vector(4 downto 0) := "00111";
+% constant ADDR_DEBUG_RAM1B_DATA : std_logic_vector(4 downto 0) := "01000";
+% constant ADDR_DEBUG_RAM1CADDR : std_logic_vector(4 downto 0) := "01001";
+% constant ADDR_DEBUG_RAM1C_DATA : std_logic_vector(4 downto 0) := "01010";
+% constant ADDR_DEBUG_RAM1C_RUN_COUNTER : std_logic_vector(4 downto 0) := "01011";
+% constant ADDR_DEBUG_RAM1C_CHAIN_STATUS : std_logic_vector(4 downto 0) := "01100";
+% constant ADDR_DEBUG_DEBUGTDO_SAMPLES : std_logic_vector(4 downto 0) := "01101";
+% constant ADDR_DEBUG_DEBUGTDO_GETFIFOSTATUS : std_logic_vector(4 downto 0) := "01110";
+% constant ADDR_DEBUG_DEBUGTDO_TIMEOUT : std_logic_vector(4 downto 0) := "01111";
+% constant ADDR_DEBUG_DEBUGTDO_ACTIVATE : std_logic_vector(4 downto 0) := "10000";
+% constant ADDR_DEBUG_DEBUGTDO_CONTROLFIFO : std_logic_vector(4 downto 0) := "10001";
+% 
+% 
+% constant ADDR_STATUS_VERSION   : std_logic_vector(4 downto 0) := "00110";
+% 
+% constant ADDR_STATUS2_TRIGGERCOUNTER_COPY   : std_logic_vector(4 downto 0) := "00000";
+% constant ADDR_STATUS2_CHAIN_STATUS_COPY   : std_logic_vector(4 downto 0) := "00001";
+% constant ADDR_STATUS2_UPDATING   : std_logic_vector(4 downto 0) := "00010";
+% constant ADDR_STATUS2_RAM3B_BASEADDR   : std_logic_vector(4 downto 0) := "00011";
+% constant ADDR_STATUS2_STARTED   : std_logic_vector(4 downto 0) := "00100";
+% constant ADDR_STATUS2_RAM3B_BEGIN   : std_logic_vector(4 downto 0) := "10000"; -- lower 4 bits used as address into ram3b from baseaddr
+% 
+% 
+% 
+% --constant ADDR_DATA      : std_logic_vector (8 downto 0) := "000000001";
+% --constant ADDR_LENGTH    : std_logic_vector (8 downto 0) := "000000010";
+% 
+% 
+% constant STATUS_OK      : std_logic_vector (15 downto 0) := x"0000";
+% constant STATUS_INVALID_COMMAND      : std_logic_vector (15 downto 0) := x"FFFF";
+% 
+% -- constraint: MAX_NUMCHIPS can be at most 2**MAX_NUMCHIPS_LD
+% --             MAX_NUMCHIPS should be a multiple of 8, because then the status register fits evenly into n 32 bit words
+% constant MAX_NUMCHIPS          : integer := 7;
+% constant MAX_NUMCHIPS_PLUS_ONE_LD       : integer := 3;    -- LD of plus one, rounded up, or ld rounded down + 1, because the next binary digit needs one bit more (i.e, 2 needs second bit)
+% constant MAX_NUMCHIPS_LD       : integer := 3;
+% constant MAX_REGISTERS         : integer := 14;
+% constant MAX_REGISTERS_LD      : integer := 4;
+% constant MAX_REGISTERS_PLUS_ONE_LD      : integer := 4;
+% constant MAX_REGISTERS_PLUS_TWO_LD      : integer := 4;
+% constant MAX_REGLEN_LD                  : integer := 12;
+% constant MAX_REGLEN_PLUS_ONE_LD                  : integer := 12;
+% -- uses an extra register
+% --constant STATUS_CRC_ERROR      : integer := 0; -- length 1
+%  
+% constant STATUS_JTAG_ERROR     : integer := 0; -- length MAX_NUMCHIPS
+% constant STATUS_WRITE_ERROR    : integer := MAX_NUMCHIPS;
+% constant STATUS_WRITE_ERROR2   : integer := 2*MAX_NUMCHIPS;
+% constant STATUS_READ_ERROR     : integer := 3*MAX_NUMCHIPS;
+% constant STATUS_READ_ERROR2    : integer := 4*MAX_NUMCHIPS;
+% constant STATUS_DATA_CHANGED   : integer := 5*MAX_NUMCHIPS;
+% 
+% constant WRITE_STATUS_JTAG_ERROR     : integer := 0; -- length MAX_NUMCHIPS
+% constant WRITE_STATUS_DATA_CHANGED     : integer := MAX_NUMCHIPS; -- length MAX_NUMCHIPS
+% constant WRITE_STATUS_DATA_CHANGED_OVER_THRESHOLD     : integer := 2*MAX_NUMCHIPS; -- length MAX_NUMCHIPS
+% constant WRITE_ERROR_THRESHOLD                     : integer := 3; -- if at least READ_ERROR_THRESHOLD bits are different from 
+% 
+% constant READ_STATUS_JTAG_ERROR                   : integer := 0; -- length MAX_NUMCHIPS
+% constant READ_STATUS_BIT_ERROR                    : integer := MAX_NUMCHIPS; -- length MAX_NUMCHIPS
+% constant READ_STATUS_BIT_ERROR_OVER_THRESHOLD     : integer := 2*MAX_NUMCHIPS; -- length MAX_NUMCHIPS
+% constant READ_ERROR_THRESHOLD                     : integer := 4; -- if at least READ_ERROR_THRESHOLD bits are different from 32 bit ID, set 
+%                                                                   -- READ_STATUS_BIT_ERROR_OVER_THRESHOLD bit for chip
+% 
+% constant MY_STATUS_WRITE_ERROR                    : integer := 0;
+% constant MY_STATUS_READ_ERROR                    : integer := 1;
+% 
+% constant JTAG_M26_IRLEN        : integer := 5;
+% constant JTAG_M26_IRLEN_LD        : integer := 3;
+% constant JTAG_M26_IR_ID_CODE   : std_logic_vector(4 downto 0) := "01110";
+% constant JTAG_M26_DEV_ID       : std_logic_vector(31 downto 0) := x"4D323601";
+% 
+% constant RAM_JTAG_REGISTERS_DEPTH   : integer := 11;
+% constant RAM_MATCH_DIFF_COUNT_DEPTH   : integer := MAX_NUMCHIPS_LD + MAX_REGISTERS_PLUS_ONE_LD + 1;--9; -- maximum 32 counts / chip (one for read DEV_ID register, rest for read/write data registers), maximum 16 chips, each count 32 bits
+% constant RAM_ERROR_COUNTS_DEPTH : integer := MAX_REGISTERS_PLUS_TWO_LD+2+MAX_NUMCHIPS_LD; --10; -- ld(8+4*MAX_REGISTERS)+MAX_NUMCHIPS_LD= MAX_REGISTERS_PLUS_TWO_LD+2+MAX_NUMCHIPS_LD
+% constant GLOBAL_JTAG_COUNTER_BITS : integer := 10;
+% constant JTAG_CHAIN_BROKEN_COUNTER_BITS : integer := 10;
+% constant JTAG_TDO_EXPECTED_MAXDELAY : integer := 3;
+% constant JTAG_TDO_EXPECTED_MAXDELAY_PLUS_ONE_LD : integer := 2; -- ceil of ld( value plus one)
diff --git a/doku/jtag_chain_sensornumbers2.pdf b/doku/jtag_chain_sensornumbers2.pdf
new file mode 100644 (file)
index 0000000..7aea4a5
Binary files /dev/null and b/doku/jtag_chain_sensornumbers2.pdf differ
diff --git a/doku/jtag_m26cs_flowchart4-eps-converted-to.pdf b/doku/jtag_m26cs_flowchart4-eps-converted-to.pdf
new file mode 100644 (file)
index 0000000..ff43b1e
Binary files /dev/null and b/doku/jtag_m26cs_flowchart4-eps-converted-to.pdf differ
diff --git a/doku/jtag_m26cs_flowchart4.eps b/doku/jtag_m26cs_flowchart4.eps
new file mode 100644 (file)
index 0000000..15b71e9
--- /dev/null
@@ -0,0 +1,679 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /u/bneumann/master/work/jtag_m26cs_flowchart4.dia
+%%Creator: Dia v0.97.1
+%%CreationDate: Tue Jul  3 18:25:27 2012
+%%For: bneumann
+%%Orientation: Portrait
+%%Magnification: 1.0000
+%%BoundingBox: 0 0 451 1515
+%%BeginSetup
+%%EndSetup
+%%EndComments
+%%BeginProlog
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+   /endangle exch def
+   /startangle exch def
+   /yrad exch def
+   /xrad exch def
+   /y exch def
+   /x exch def   /savematrix mtrx currentmatrix def
+   x y tr xrad yrad sc
+   0 0 1 startangle endangle arc
+   savematrix setmatrix
+   end
+} def
+
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/Times-Roman-latin1
+    /Times-Roman findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Times-Italic-latin1
+    /Times-Italic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Times-Bold-latin1
+    /Times-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Times-BoldItalic-latin1
+    /Times-BoldItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/AvantGarde-Gothic-latin1
+    /AvantGarde-Gothic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/AvantGarde-BookOblique-latin1
+    /AvantGarde-BookOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/AvantGarde-Demi-latin1
+    /AvantGarde-Demi findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/AvantGarde-DemiOblique-latin1
+    /AvantGarde-DemiOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Bookman-Light-latin1
+    /Bookman-Light findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Bookman-LightItalic-latin1
+    /Bookman-LightItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Bookman-Demi-latin1
+    /Bookman-Demi findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Bookman-DemiItalic-latin1
+    /Bookman-DemiItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Courier-latin1
+    /Courier findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Courier-Oblique-latin1
+    /Courier-Oblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Courier-Bold-latin1
+    /Courier-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Courier-BoldOblique-latin1
+    /Courier-BoldOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-latin1
+    /Helvetica findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Oblique-latin1
+    /Helvetica-Oblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Bold-latin1
+    /Helvetica-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-BoldOblique-latin1
+    /Helvetica-BoldOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Narrow-latin1
+    /Helvetica-Narrow findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Narrow-Oblique-latin1
+    /Helvetica-Narrow-Oblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Narrow-Bold-latin1
+    /Helvetica-Narrow-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Narrow-BoldOblique-latin1
+    /Helvetica-Narrow-BoldOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/NewCenturySchlbk-Roman-latin1
+    /NewCenturySchlbk-Roman findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/NewCenturySchlbk-Italic-latin1
+    /NewCenturySchlbk-Italic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/NewCenturySchlbk-Bold-latin1
+    /NewCenturySchlbk-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/NewCenturySchlbk-BoldItalic-latin1
+    /NewCenturySchlbk-BoldItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Palatino-Roman-latin1
+    /Palatino-Roman findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Palatino-Italic-latin1
+    /Palatino-Italic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Palatino-Bold-latin1
+    /Palatino-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Palatino-BoldItalic-latin1
+    /Palatino-BoldItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Symbol-latin1
+    /Symbol findfont
+definefont pop
+/ZapfChancery-MediumItalic-latin1
+    /ZapfChancery-MediumItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/ZapfDingbats-latin1
+    /ZapfDingbats findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+28.346000 -28.346000 scale
+-14.393750 -44.346488 translate
+%%EndProlog
+
+
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 16.743750 -0.426247 m 14.443750 -0.426247 l 14.443750 -9.022403 l 21.373016 -9.022403 l 21.373016 -8.127876 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.373016 -7.752876 m 21.123016 -8.252876 l 21.373016 -8.127876 l 21.623016 -8.252876 l ef
+n 21.373016 -7.752876 m 21.123016 -8.252876 l 21.373016 -8.127876 l 21.623016 -8.252876 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 21.216400 31.630205 m 21.234626 32.281154 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.245122 32.656007 m 20.981225 32.163200 l 21.234626 32.281154 l 21.481030 32.149206 l ef
+n 21.245122 32.656007 m 20.981225 32.163200 l 21.234626 32.281154 l 21.481030 32.149206 l cp s
+1.000000 1.000000 1.000000 srgb
+n 16.376092 7.154700 m 16.376092 10.654700 l 26.136092 10.654700 l 26.136092 7.154700 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 16.376092 7.154700 m 16.376092 10.654700 l 26.136092 10.654700 l 26.136092 7.154700 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(increment ) dup sw 2 div 21.256092 ex sub 8.139700 m
+ gs 1 -1 sc sh gr
+(DATA_CHANGED) dup sw 2 div 21.256092 ex sub 8.939700 m
+ gs 1 -1 sc sh gr
+(counters) dup sw 2 div 21.256092 ex sub 9.739700 m
+ gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+1.000000 1.000000 1.000000 srgb
+n 21.355632 -2.603522 m 25.967514 -0.426247 l 21.355632 1.751028 l 16.743750 -0.426247 l ef
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 21.355632 -2.603522 m 25.967514 -0.426247 l 21.355632 1.751028 l 16.743750 -0.426247 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(off spill trigger?) dup sw 2 div 21.355632 ex sub -0.391247 m
+ gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(YES) 21.900000 2.398770 m
+ gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n 21.373016 -7.641073 m 26.689382 -5.909992 l 21.373016 -4.178910 l 16.056650 -5.909992 l ef
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 21.373016 -7.641073 m 26.689382 -5.909992 l 21.373016 -4.178910 l 16.056650 -5.909992 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(check1 active?) dup sw 2 div 21.373016 ex sub -5.874992 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+1 slj
+1.000000 1.000000 1.000000 srgb
+n 17.903900 12.327020 m 17.903900 14.627020 l 24.603900 14.627020 l 24.603900 12.327020 l f
+0.000000 0.000000 0.000000 srgb
+n 17.903900 12.327020 m 17.903900 14.627020 l 24.603900 14.627020 l 24.603900 12.327020 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(BYPASSREG_ ) dup sw 2 div 21.253900 ex sub 13.130208 m
+ gs 1 -1 sc sh gr
+(TESTCHAIN) dup sw 2 div 21.253900 ex sub 13.930208 m
+ gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(reset sensors) dup sw 2 div 21.216400 ex sub 30.740702 m
+ gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(YES) 27.226400 -6.330450 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 17.191400 15.925650 m 17.191400 17.884500 l 25.302001 17.884500 l 25.302001 15.925650 l f
+0.000000 0.000000 0.000000 srgb
+n 17.191400 15.925650 m 17.191400 17.884500 l 25.302001 17.884500 l 25.302001 15.925650 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(READ device ID ) dup sw 2 div 21.246700 ex sub 16.558262 m
+ gs 1 -1 sc sh gr
+(registers) dup sw 2 div 21.246700 ex sub 17.358262 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+1.000000 0.000000 0.000000 srgb
+n 21.253900 14.627020 m 21.249399 15.438854 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.247320 15.813848 m 21.000096 15.312470 l 21.249399 15.438854 l 21.500088 15.315242 l ef
+n 21.247320 15.813848 m 21.000096 15.312470 l 21.249399 15.438854 l 21.500088 15.315242 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 17.873700 3.538800 m 17.873700 5.688800 l 24.723700 5.688800 l 24.723700 3.538800 l f
+0.000000 0.000000 0.000000 srgb
+n 17.873700 3.538800 m 17.873700 5.688800 l 24.723700 5.688800 l 24.723700 3.538800 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(WRITE registers ) dup sw 2 div 21.298700 ex sub 4.266988 m
+ gs 1 -1 sc sh gr
+(of active sensors) dup sw 2 div 21.298700 ex sub 5.066988 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 21.298700 5.688800 m 21.270236 6.668102 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.259341 7.042944 m 21.023973 6.535891 l 21.270236 6.668102 l 21.523762 6.550418 l ef
+n 21.259341 7.042944 m 21.023973 6.535891 l 21.270236 6.668102 l 21.523762 6.550418 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 17.263580 39.503200 m 17.263580 42.647192 l 25.263480 42.647192 l 25.263480 39.503200 l f
+0.000000 0.000000 0.000000 srgb
+n 17.263580 39.503200 m 17.263580 42.647192 l 25.263480 42.647192 l 25.263480 39.503200 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(increment) dup sw 2 div 21.263530 ex sub 40.337696 m
+ gs 1 -1 sc sh gr
+(WRITE_ERROR) dup sw 2 div 21.263530 ex sub 41.137696 m
+ gs 1 -1 sc sh gr
+(counters) dup sw 2 div 21.263530 ex sub 41.937696 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 21.373016 -4.178910 m 21.361003 -3.090296 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.356865 -2.715319 m 21.112398 -3.218047 l 21.361003 -3.090296 l 21.612367 -3.212530 l ef
+n 21.356865 -2.715319 m 21.112398 -3.218047 l 21.361003 -3.090296 l 21.612367 -3.212530 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(NO) 21.819700 -3.559990 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+1 slj
+n 17.966400 29.726200 m 17.966400 31.630205 l 24.466400 31.630205 l 24.466400 29.726200 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 17.823251 32.767766 m 17.823251 34.917766 l 24.673251 34.917766 l 24.673251 32.767766 l f
+0.000000 0.000000 0.000000 srgb
+n 17.823251 32.767766 m 17.823251 34.917766 l 24.673251 34.917766 l 24.673251 32.767766 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(WRITE registers ) dup sw 2 div 21.248251 ex sub 33.495954 m
+ gs 1 -1 sc sh gr
+(of active sensors) dup sw 2 div 21.248251 ex sub 34.295954 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 21.260751 38.367766 m 21.262338 39.016398 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.263256 39.391397 m 21.012033 38.892010 l 21.262338 39.016398 l 21.512032 38.890787 l ef
+n 21.263256 39.391397 m 21.012033 38.892010 l 21.262338 39.016398 l 21.512032 38.890787 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 17.835751 36.217766 m 17.835751 38.367766 l 24.685751 38.367766 l 24.685751 36.217766 l f
+0.000000 0.000000 0.000000 srgb
+n 17.835751 36.217766 m 17.835751 38.367766 l 24.685751 38.367766 l 24.685751 36.217766 l cp s
+(WRITE registers ) dup sw 2 div 21.260751 ex sub 36.945954 m
+ gs 1 -1 sc sh gr
+(of active sensors) dup sw 2 div 21.260751 ex sub 37.745954 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 21.248251 34.917766 m 21.256070 35.730986 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.259676 36.105968 m 21.004880 35.608395 l 21.256070 35.730986 l 21.504857 35.603588 l ef
+n 21.259676 36.105968 m 21.004880 35.608395 l 21.256070 35.730986 l 21.504857 35.603588 l cp s
+1.000000 1.000000 1.000000 srgb
+n 21.265282 24.616214 m 26.169814 26.533089 l 21.265282 28.449964 l 16.360751 26.533089 l ef
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 21.265282 24.616214 m 26.169814 26.533089 l 21.265282 28.449964 l 16.360751 26.533089 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(check1 active?) dup sw 2 div 21.265282 ex sub 26.568089 m
+ gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n 16.354179 19.286799 m 16.354179 22.786799 l 26.114179 22.786799 l 26.114179 19.286799 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 16.354179 19.286799 m 16.354179 22.786799 l 26.114179 22.786799 l 26.114179 19.286799 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(increment ) dup sw 2 div 21.234179 ex sub 20.271799 m
+ gs 1 -1 sc sh gr
+(READ_ERROR) dup sw 2 div 21.234179 ex sub 21.071799 m
+ gs 1 -1 sc sh gr
+(counters) dup sw 2 div 21.234179 ex sub 21.871799 m
+ gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(YES) 25.804179 26.021799 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+n 21.263530 42.647192 m 21.263530 44.296488 l 30.225142 44.296488 l 30.225142 -8.765326 l 21.373016 -8.765326 l 21.373016 -8.127876 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.373016 -7.752876 m 21.123016 -8.252876 l 21.373016 -8.127876 l 21.623016 -8.252876 l ef
+n 21.373016 -7.752876 m 21.123016 -8.252876 l 21.373016 -8.127876 l 21.623016 -8.252876 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(NO) 21.760429 29.101478 m
+ gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 21.355632 1.751028 m 21.314194 3.052243 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.302259 3.427053 m 21.068300 2.919349 l 21.314194 3.052243 l 21.568046 2.935264 l ef
+n 21.302259 3.427053 m 21.068300 2.919349 l 21.314194 3.052243 l 21.568046 2.935264 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+1.000000 0.000000 0.000000 srgb
+n 21.246700 17.884500 m 21.238525 18.800015 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.235177 19.175000 m 20.989651 18.672788 l 21.238525 18.800015 l 21.489632 18.677253 l ef
+n 21.235177 19.175000 m 20.989651 18.672788 l 21.238525 18.800015 l 21.489632 18.677253 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 21.256092 10.654700 m 21.254538 11.840217 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.254047 12.215217 m 21.004702 11.714889 l 21.254538 11.840217 l 21.504702 11.715545 l ef
+n 21.254047 12.215217 m 21.004702 11.714889 l 21.254538 11.840217 l 21.504702 11.715545 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+1.000000 0.000000 0.000000 srgb
+n 21.234179 22.786799 m 21.257007 24.129481 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.263382 24.504427 m 21.004918 24.008749 l 21.257007 24.129481 l 21.504846 24.000249 l ef
+n 21.263382 24.504427 m 21.004918 24.008749 l 21.257007 24.129481 l 21.504846 24.000249 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 21.265282 28.449964 m 21.235032 29.239753 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.220679 29.614479 m 20.989999 29.105276 l 21.235032 29.239753 l 21.489633 29.124413 l ef
+n 21.220679 29.614479 m 20.989999 29.105276 l 21.235032 29.239753 l 21.489633 29.124413 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+1.000000 0.000000 0.000000 srgb
+n 26.169814 26.533089 m 26.169814 26.526181 l 30.225142 26.526181 l 30.225142 -8.765326 l 21.373016 -8.765326 l 21.373016 -8.127876 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.373016 -7.752876 m 21.123016 -8.252876 l 21.373016 -8.127876 l 21.623016 -8.252876 l ef
+n 21.373016 -7.752876 m 21.123016 -8.252876 l 21.373016 -8.127876 l 21.623016 -8.252876 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+n 26.689382 -5.909992 m 29.049942 -5.909992 l 29.049942 11.376181 l 21.253900 11.376181 l 21.253900 11.840217 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.253900 12.215217 m 21.003900 11.715217 l 21.253900 11.840217 l 21.503900 11.715217 l ef
+n 21.253900 12.215217 m 21.003900 11.715217 l 21.253900 11.840217 l 21.503900 11.715217 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+0.000000 0.000000 0.000000 srgb
+(NO) 14.965142 -1.054878 m
+ gs 1 -1 sc sh gr
+showpage
diff --git a/doku/jtag_signals/jtag_signals.htm b/doku/jtag_signals/jtag_signals.htm
new file mode 100644 (file)
index 0000000..095aad5
--- /dev/null
@@ -0,0 +1,20 @@
+<html>\r
+  <head>\r
+    <meta content="Datasheet generated by TimingTool" name="description">\r
+    <title>Datasheet - jtag_signals</title>\r
+    \r
+  </head>\r
+  <body>\r
+    <h1>\r
+      jtag_signals\r
+    </h1>\r
+    <p>\r
+      <img src="./jtag_signals.png" border="0" alt="Timing Diagram: jtag_signals">\r
+      \r
+    </p>\r
+    <p>\r
+      <i>C:\bertram\uni\master\implementierung\jtag_signals.tdml</i>\r
+    </p>\r
+    <br>\r
+  </body>\r
+</html>\r
diff --git a/doku/jtag_signals/jtag_signals.png b/doku/jtag_signals/jtag_signals.png
new file mode 100644 (file)
index 0000000..fb11085
Binary files /dev/null and b/doku/jtag_signals/jtag_signals.png differ
diff --git a/doku/jtag_signals/jtag_signals2.png b/doku/jtag_signals/jtag_signals2.png
new file mode 100644 (file)
index 0000000..3e3c1b1
Binary files /dev/null and b/doku/jtag_signals/jtag_signals2.png differ
diff --git a/doku/jtag_signals/jtag_signals_short.png b/doku/jtag_signals/jtag_signals_short.png
new file mode 100644 (file)
index 0000000..20869ad
Binary files /dev/null and b/doku/jtag_signals/jtag_signals_short.png differ
diff --git a/doku/jtagmon_webpage.png b/doku/jtagmon_webpage.png
new file mode 100644 (file)
index 0000000..fe4f265
Binary files /dev/null and b/doku/jtagmon_webpage.png differ
diff --git a/doku/ram3block.pdf b/doku/ram3block.pdf
new file mode 100644 (file)
index 0000000..e1221f2
Binary files /dev/null and b/doku/ram3block.pdf differ
diff --git a/doku/scripts.tex b/doku/scripts.tex
new file mode 100644 (file)
index 0000000..e685f20
--- /dev/null
@@ -0,0 +1,258 @@
+\clearpage
+\section{TRBV3 als JTAG-Chain-Controller konfigurieren}
+%Um den FPGA auf dem TRB zu konfigurieren, wird per \texttt{trbtelnet} auf dem TRBV2 für das Main-Board (Boris Arbiter und drei JTAG-Chain-Controller)
+%das Programm \texttt{jam\_trbv2\_ao} ausgeführt.
+%Hierbei ist anstelle von \texttt{trb126} der Hostname des JTAG-Chain-Controller-Boards einzugeben.
+%%\newcommand\typeHighlight[1]{$\llcorner$\textcolor[rgb]{1.0,0.3,0.3}{#1}$\lrcorner$}
+%%\newcommand\typeHighlight[1]{\textcolor[rgb]{1.0,0.3,0.3}{$\llcorner$}#1\textcolor[rgb]{1.0,0.3,0.3}{$\lrcorner$}}
+\newcommand\typeHighlight[1]{\textcolor[rgb]{1.0,0.3,0.3}{\Rightscissors}#1\textcolor[rgb]{1.0,0.3,0.3}{\Leftscissors}}
+\newcommand\begnTypeVB[1]{\textcolor[rgb]{1.0,0.3,0.3}{\Rightscissors}}
+\newcommand\enTypeVB[1]{\textcolor[rgb]{1.0,0.3,0.3}{\Leftscissors}}
+\newcommand\enterSymb{\Pisymbol{psy}{191}}
+\newcommand\linewrapVB{$\curvearrowright$}
+
+Das Design (\texttt{trb3\_periph\_mvdjtag.bit}) ist in einen der 4 äußeren FPGAs des TRB V3 zu laden.
+Dann kann über ein Addon-Board die Front-End-Elektronik (FEE) einer JTAG-Chain angeschlossen werden (Adapter auf RJ-45 Patch Panel für eine Chain verkabelt).
+
+Um per Remote Procedure Call (RPC) TrbNet Slow-Control Read/Write Operationen ausführen zu können, wird auf dem lokalen Rechner das Programm \texttt{trbnetd} gestartet. Anstelle von \texttt{192.168.10.243} kommt die IP-Adresse des TRB V3.
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=maps@jspc55,labelposition=all,commandchars=\\\{\}]
+maps@jspc55:/> \typeHighlight{TRB3_SERVER=192.168.10.243 trbnetd -i 7\enterSymb}
+\end{Verbatim} 
+
+
+\subsection{Konfiguration}
+Zur Inbetriebnahme der an das TRB V3  angeschlossenen JTAG-Chain werden die Befehle
+aus den folgenden Abschnitten in der abgedruckten Reihenfolge verwendet.
+
+\subsubsection*{Umgebungsvariablen}
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=maps@jspc55(Umgebungsvariablen setzen),labelposition=all,commandchars=\\\{\}]
+ $ \begnTypeVB{}export DAQOPSERVER=localhost:7\enterSymb\enTypeVB{}
+\end{Verbatim} 
+
+\subsubsection*{Pfadangaben}
+Relative Pfadangaben beiehen sich auf \texttt{soft/toolbox}. In diesem Verzeichnis befindet sich die Datei \texttt{prototype\_setup.db} und die Verzeichnise \texttt{sensors} und \texttt{jtag\_atomic}.
+
+\subsubsection{Konfiguration laden}
+\label{script_}
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=maps@jspc55(Konfiguration laden),labelposition=all,commandchars=\\\{\}]
+jtag_atomic $ \begnTypeVB{}./generate_chainorder.pl\enterSymb\enTypeVB{}
+\end{Verbatim} 
+Die TrbNet-Registeradressen aus den Dateien \texttt{jtag\_\-atomic/\-chains.ini.chain\{0-2\}} werden in die Konfigurationsdatei \texttt{jtag\_atomic/chains.ini} geschrieben.
+Das Script \texttt{jtag\_\-atomic/\-generate\_\-chain\-order\-.pl} schreibt diese Konfigurationsdatei 
+basierend auf der Konfiguration in der Datenbank in \texttt{prototype\_\-setup.db}.
+\subsubsection{prototype\_setup.db}
+Dort steht unter \texttt{key jtag}, der Name der einzelnen Sensoren.
+Die Namen sind im Prinzip beliebig, folgen aber hier dem Schema \texttt{sensor\#} wobei \texttt{\#} 
+die Sensor-Nummer ist, die bei 1 anfängt.
+Die Chain-Namen, z.B. \texttt{newchain1}, \texttt{chain1}, \texttt{chain2} oder \texttt{chain3} können frei gewählt werden. 
+Jeder Sensor ist einer Chain zugeordnet.
+Die Spalte JNR bestimmt die Reihenfolge innerhalb dieser Chain. Dieser Wert ist eine Zahl,
+mit der kleinsten Zahl beginnend sind die Sensoren vom Ende der JTAG-Chain aus durchnummeriert.
+Um einen Sensor aus der Konfiguration zu entfernen kann ein nicht-numerisches Symbol wie "`F"'
+verwendet werden.
+Die verwendeten Chain-Namen werden alphabetisch sortiert den in den Dateien \texttt{jtag\_atomic/chains.ini.chain\{0-2\}} angegebenen JTAG-Chain-Controllern in gleicher Reihenfolge zugeordnet (Beispiel: Wenn nur \texttt{newchain1} verwendet wird, entspricht \texttt{newchain1} $\longrightarrow$ \texttt{jtag\_atomic/chains.ini.chain0}).
+
+\subsubsection{sensor.ini-Dateien}
+
+Jeder Sensor hat eine individuelle Konfigurationsdatei, in der die JTAG-Register gespeichert sind.
+Der Name dieser Dateien ergibt sich aus dem Namen des Sensors, an den die Endung \texttt{.ini} angehängt wird.
+Diese Dateien befinden sich im Verzeichnis \texttt{sensors}.
+Sie beginnen mit einem \texttt{Generl}-Abschnitt, in dem die Länge des Instruktionsregisters 
+sowie die Adresse des Bypass-Registers festgelegt werden.
+Danach folgt der Data-Abschnitt, in dem jede Zeile (die nicht per Semikolon (\texttt{;}) auskommentiert ist)
+ein zu schreibendes Register hinzufügt.
+Die Register werden nach ihrem Schlüssel (String vor \texttt{=}) alphabetisch sortiert, 
+weshalb die Nummerierung hier mit 00 beginnend gewählt wurde. Dies ist dann das Register,
+das als erstes per JTAG geschrieben wird.
+Der Wert (String nach \texttt{=}) besteht aus der Länge des Datenregisters in bit angegeben, gefolgt von einem Komma (\texttt{,}) 
+und den eigentlichen Daten für das Register kodiert als ASCII-String von hexadezimalen Ziffern. Dabei steht das niederwertigste Nibble ganz rechts
+(analog zur üblichen Darstellung von Zahlen im Dezimalsystem). Die Länge dieses Strings muss ein vielfaches von 8 Nibblen (32 bit) haben, was das Einlesen als 32-bit Wörter erlaubt.
+Dazu ist der String falls nötig von links mit Nullen aufzufüllen.
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=sensor1.ini(Sensor-Konfigurationsdatei)]
+[General]
+IRLEN=5
+BYPASSREG=1F
+[Data]
+00=0F,152,006432202064C1B08BAB32648020280A0A0A0A64
+01=1E,8,00000002 ; RO_MODE0 en ext start
+...
+\end{Verbatim} 
+
+\subsubsection{Konfiguration an FPGA übertragen}
+\label{script_}
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=maps@jspc55(Konfiguration laden),labelposition=all,commandchars=\\\{\}]
+jtag_atomic $ \begnTypeVB{}./ui_set_standard_settings.sh\enterSymb\enTypeVB{}
+\end{Verbatim} 
+
+Das Skript \texttt{jtag\_atomic/ui\_set\_standard\_settings.sh} überträgt diese Register an die JTAG-Chain-Controller auf dem FPGA.
+\danger Die Daten werden in dieser Version nach /tmp/jtag\_initmem/jtag\_atomic geschrieben, und alte Werte gehen beim neuen Aufruf verloren.
+Um dies zu ändern muss die auskommentierte Zeile 206 statt Zeile 207 in Datei \texttt{jtag\_atomic/ui\_writeram.pl} verwendet werden.
+
+
+Die durch dieses Shell-Skript aufgerufenen Skripte kodieren die Chain-Namen hart. Daher sind bei einer Änderung der Chain-Namen die aufgerufenen Skripte anzupassen und gegebenenfalls nach dem Muster der vorhandenen Skripte neue anzulegen.
+\subsubsection{Sensoren initialisieren}
+\label{script_}
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=maps@jspc55(Konfiguration laden),labelposition=all,commandchars=\\\{\}]
+jtag_atomic $ \begnTypeVB{}./ui_trigger_all_chains.sh\enterSymb\enTypeVB{}
+\end{Verbatim} 
+
+
+Das Skript \texttt{jtag\_atomic/ui\_trigger\_all\_chains.sh} leitet die Initialisierungs-Sequenz für alle an Board board01 angeschlossenen JTAG-Chains ein.
+Dabei wird ein Reset-Puls auf der RESET-Leitung der Sensoren geschickt, alle JTAG-Register geschrieben und danach ein Puls auf den START-Leitungen für alle Sensoren generiert.
+
+\subsection{Überwachung}
+\label{script_}
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=maps@jspc55(Konfiguration laden),labelposition=all,commandchars=\\\{\}]
+jtag_atomic $ \begnTypeVB{}jtagmonitor_usechainsini4.pl\enterSymb\enTypeVB{}
+\end{Verbatim} 
+Um zu überwachen, wieviele Fehler in den JTAG-Registern bzw. beim JTAG-Programmieren aufgetreten sind,
+wird der Perl-Skript \texttt{jtag\_atomic/jtagmonitor\_usechainsini4.pl} verwendet.
+Es benötigt die Perl-Bibliothek HADES::TrbNet, um Register per TrbNet zu lesen (siehe Repository trbnettools).
+Die Bibliothek HMon wird verwendet, um eine HTML-Ausgabe zu generieren.
+Es erstellt etwa jede 2 Sekunden eine HTML-Datei \texttt{jtagmonitor\_usechainsini.htt} 
+im Verzeichnis \texttt{jtag\_atomic/files}
+(per \texttt{HMONDIR} einstellbar).
+Diese Datei kann per Webserver freigegeben werden, siehe Datei \texttt{../mvdmon/\-files/\-cgi-bin/\-jtagmon.cgi}.
+Dort kann dann bei jedem Ausführen des
+Skripts \texttt{jtag\_\-atomic/ui\_\-trigger\_\-all\_\-chains.sh} eine Inkrementierung der "`Run Counter"' für
+alle konfigurierten Sensoren beobachtet werden. Und falls beim letzten Durchlauf keine Fehler aufgetreten sind,
+werden unterhalb der Sensoren grüne Balken angezeigt.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[width=0.6\textwidth,keepaspectratio=true]{./jtagmon_webpage.png}
+% \setcapwidth{0.9\textwidth}
+%  \caption{Aufbau der Simulation: Die JTAG-Chain läuft über ein Flexprint-Kabel mit Masseschicht, an das die Sensor-Flexprint-Kabel regelmäßig 
+% in 10 und 50 cm Abständen angeschlossen sind. Insgesamt sind 24 Sensor-Flexprint-Kabel angeschlossen.}
+\caption{Screenshot der JTAG Monitor-Webseite.}
+ \label{fig:decline_w_d}
+\end{figure}
+
+\begin{description}
+ \item[not programmed] Dieser Sensor wurde im letzten "`Initialization Sequence"' nicht programmiert, entweder weil er als entfernt markiert wurde, oder weil die gesamte Chain nicht programmiert wurde, weil sie z.B. nicht gestartet war (\texttt{jtag\_refresh\_active} = 0) oder ein CRC-Error aufgetreten ist (siehe \ref{section_addresses_status}). \\
+\item[read ID errors only] Die 32-bit Device ID, die vom Sensor kommt, weicht von der eingestellten ab (in ui\_writeram.pl ist die MIMOSA-26 ID 0x4D323601 hart kodiert)
+                           Jedoch konnte wurde beim wiederholten Schreiben der Register der geschriebene Wert
+                           korrekt wieder ausgegeben, was jedoch theoretisch auch auftreten könnte, 
+                           wenn gar kein Sensor angeschlossen ist, und der Daten-Ausgang am FPGA direkt
+                           wieder an den Eingang angeschlossen wird, oder wenn eine JTAG-Chain mit der
+                           falschen Länge angeschlossen wird, sich die Register-Inhalte aber nicht
+                           von Sensor zu Sensor unterscheiden.
+\item[write errors only] 
+Die 32-bit Device ID ist angekommen. Da diese nicht vom FPGA ausgegeben wird,
+heißt dies, dass sie extern generiert wurde, also dass ein Sensor antwortet.
+Jedoch werden die Register nicht
+korrekt ausgegeben. Das kann mehrere Ursachen haben.
+Die wahrscheinlichsten sind:
+\begin{enumerate}
+\item  Die Anzahl der eingestellten Sensoren stimmt nicht mit der tatsächlichen
+Zahl in der Chain überein. Dazu spielt auch eine Rolle, ob Sensoren durch
+die Bypass-Schalter überbrückt sind.
+\item  Ein defekter Sensor oder ein anderer Fehler könnte die TDI/TDO-Leitung
+unterbrochen haben. Dann sollten so viele Sensoren mit write errors only angezeigt werden, 
+wie nach dem Defekt folgen.                           
+\end{enumerate}
+
+\item[write $+$ read ID errors] Weder die korrekte Device ID noch die geschriebenen Register wurden ausgegeben.
+                              Dies ist z.B. der Fall, wenn die Stromversorgung abgeschaltet ist.
+\item[no errors] Die 32-bit Device ID ist angekommen, und die geschriebenen Register sind beim wiederholten Schreiben korrekt wieder ausgegeben worden.
+                 Auch wenn alle in der JTAG-Chain angezeigten Sensoren diesen Status haben, könnten sich immernoch mehr Sensoren in der physikalischen JTAG-Chain befinden, wenn die Register-Werte für mehrere Sensoren gleich sind. Dann werden evtl. keine Fehler gefunden.
+                 In der Praxis wird aufgrund unterschiedlicher Diskriminator-Schwellen dieses Problem jedoch kaum auftreten.
+
+\end{description}
+
+\subsection{Änderung der Einstellungen}
+\subsubsection{Konfiguration des Zeitverhaltens}
+\label{skripte_zeitverhalten}
+Das Script \texttt{ui\_set\_standard\_settings.sh} setzt für alle drei JTAG-Chain-Controller auch die Register, die 
+die JTAG-Taktfrequenz, den Abstand zwischen den Taktflanken, den Abstand zwischen der Taktflanke und dem Ändern der 
+Datenleitung, sowie den Sampling-Zeitpunkt festlegen.
+Die Frequenz kann mit dem verwendeten 100 MHz FPGA in dem Bereich 10MHz-100kHz eingestellt werden, da ein 10 bit Zähler verwendet wurde.
+Das Skript \texttt{ui.pl} erlaubt die Einstellung der JTAG-Taktfrequenz auf 
+100 kHz, 1 MHz sowie 10 MHz.
+
+\paragraph{Beispiel:}
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=maps@jspc55(mit Umgebungsvariablen),labelposition=all,commandchars=\\\{\}]
+ jtag_atomic $ \begnTypeVB{}./ui.pl -b board01 -c chain1 -o set_timing_1mhz\enterSymb\enTypeVB{}
+\end{Verbatim} 
+Dadurch wird für die erste JTAG-Chain \texttt{chain1} am Board \texttt{board01} eine JTAG-Taktfrequenz von 1 MHz eingestellt. Dann muss vermutlich auch das Delay auf von 1 auf 0 herabgesetzt werden (siehe Operation \texttt{delay0} im folgenden Abschnitt).
+\subsubsection{Weitere Einstellungsmöglichkeiten}
+
+Die Liste der zur Verfügung stehenden Operationen wird bei Ausführung ohne Argumente angezeigt:
+\begin{Verbatim}[frame=single,
+framesep=2mm,
+label=maps@jspc55(mit Umgebungsvariablen),labelposition=all,commandchars=\\\{\}]
+ jtag_atomic $ \begnTypeVB{}./ui.pl\enterSymb\enTypeVB{}
+atomic,ui.pl: showing usage information.
+Usage: ui.pl [-c <chain name> ] [-o <Operation>] [-a <address>]
+   
+required:
+   [-c|--chain  <JTAG chain name>]             : Select the JTAG chain (controller) 
+                                                 whose RAM should be written.
+   [-b|--board  <JTAG board name>]             : Select the JTAG/MAIN board for 
+                                                 setting signals. (use board01)
+   [-o|--operation  <handle name from gui.pl without h_>]     : Select operation 
+                                                 (on the selected JTAG chain).
+   [-a|--addr  <address for operation>]        : read_ram1b_word needs address
+   [-q|--quiet  ]             : suppress informative output
+    
+board operations (no chain parameter given):
+    prog_fpga :             program FPGA on trb
+    start_trbnetd:          start trbnet daemon on trb
+    waitbeforestart_6us:    set wait before start time to 6 us
+    waitbeforestart_1ms:    set wait before start time to 1 ms
+    waitbeforestart_1s:     set wait before start time to 1 s
+    trigger_init_sequence:  trigger initialization sequence for all chains, 
+                            3xWRITE+1xREAD DEV ID, reset as configured
+    maps_reset:             generate RESET pulse, all chains
+    run_jtag:               Run 3xWRITE Registers+ 1xRead DEV ID, no reset, 
+                            all chains
+    write_once:             Once write all registers all chains
+    maps_start:             generate START pulse, all chains
+
+chain operations (with -c parameter)
+    man_maps_reset:         software generated reset pulse
+    delay0:                 set delay 0 JTAG Clock cycles
+    delay1:                 set delay 1 JTAG Clock cycles
+    delay2:                 set delay 2 JTAG Clock cycles
+    delay3:                 set delay 3 JTAG Clock cycles
+    prog_ram:               Write from sensor*.ini to RAM with JTAG registers on 
+                            FPGA
+    set_timing_10mhz:       Set 10 MHz TCK
+    set_timing_1mhz:        Set 1 MHz TCK
+    set_timing_100khz:      Set 100 kHz TCK
+    set_inout:              Initialize I/O pin settings (signals_invert)
+    maps_reset_before_on:   set reset before first WRITE on trig_init_seq/
+                            trigger_init_sequence
+    maps_reset_before_off:  set reset before ... off
+    maps_reset_after_on:    set reset after  ... on
+    maps_reset_after_off:   set reset after  ... off
+    maps_clk_on:            activate MAPS CLK (80MHz) immediately 
+    maps_clk_off:           deactivate MAPS CLK (80MHz) immediately 
+    trig_init_seq:          trigger initialization sequence
+    maps_reset:             generate RESET pulse 
+    run_jtag:               run JTAG (see board operation) this chain
+    write_once:             write once all registers
+    maps_start:             generate START pulse
+    read_ram1b_word:        read 32 bit word at address given with -a option
+                            from ram1b CONNECTION REMOVED
+    read_ram1c_word:        read 32 bit word at address given with -a option 
+                            from ram1c
+    copy_ram1b1c:           trigger copy of ram1b to ram1c
+\end{Verbatim} 
+Am Ende der Operation "`trigger initialization sequence"' wird ein START-Puls generiert.