--- /dev/null
+doc_standalone.aux
+doc_standalone.log
+doc_standalone.out
+doc_standalone.toc
+
--- /dev/null
+\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}
--- /dev/null
+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)
--- /dev/null
+%!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
--- /dev/null
+<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
--- /dev/null
+\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.