\begin{table}[H]
\renewcommand{\arraystretch}{1.4}
\begin{tabular}{ll}
-Name & Bereich\\
-RAM & 0x000 - 0x0FF\\
-DEBUG & 0x140 - 0x15F\\
-STATUS2 & 0x160 - 0x17F\\
+\textbf{Name} & \textbf{Bereich}\\
+RAM & 0x000 - 0x0FF\\
+RAM read-back & 0x100 - 0x1FF \\
+Registers & 0x200 - 0x2FF \\
+RAM errors & 0x300 - 0x3FF\\
\end{tabular}
\caption{Die Adressbereiche des JTAG-Chain-Controllers.}
\label{table:trbnet_address_ranges}
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.}
+entweder mehr als einen Sensor-Block oder nur einen Teil eines Sensor-Blocks.} Gleiches gilt für
+das read-back RAM.
Geschrieben werden kann nur, wenn der JTAG-Chain-Controller gestoppt ist (\texttt{m26cs\_stopped} = 1).
Tabelle \ref{table:trbnet_commands}.
\begin{table}
+\footnotesize
\renewcommand{\arraystretch}{1.4}
-\begin{tabular}{p{5cm}llp{9cm}}
-Name & Alt & Neu & Beschreibung\\
-SET\_NUMCHIPS\_CONFIGURED & 33 & 00 & Zahl der im RAM vorhandenen Sensor-Blöcke.\\
-SET\_JTAG\_CLOCK\_CYCLE\-\_LENGTH & 40 & 01 & setzt die Dauer des JTAG-Taktzyklus
+\begin{tabular}{p{4.5cm}lp{10cm}}
+\textbf{Name} & \textbf{Addr} & \textbf{Beschreibung}\\
+SET\_NUMCHIPS\_CONFIGURED & 00 & Zahl der im RAM vorhandenen Sensor-Blöcke.\\
+SET\_JTAG\_CLOCK\_CYCLE\-\_LENGTH & 01 & setzt die Dauer des JTAG-Taktzyklus
(\texttt{jtag\_clock\_cycle\_length} in Systemtakten).\\
-SET\_JTAG\_CLOCK\_TIME1 &42 & 02 & Setzt den Zeitpunkt der steigenden TCK-Taktflanke
+SET\_JTAG\_CLOCK\_TIME1 & 02 & Setzt den Zeitpunkt der steigenden TCK-Taktflanke
(\texttt{jtag\_clock\_time1}) innerhalb des durch jtag\_clock\_cycle\_length gegebenen Bereichs.\\
-SET\_JTAG\_CLOCK\_TIME2 &44 & 03 & Setzt den Zeitpunkt der fallenden TCK-Taktflanke
+SET\_JTAG\_CLOCK\_TIME2 & 03 & Setzt den Zeitpunkt der fallenden TCK-Taktflanke
(\texttt{jtag\_clock\_time2}) innerhalb des durch jtag\_clock\_cycle\_length gegebenen Bereichs.\\
-SET\_JTAG\_SAMPLE\_TIME1 &46 & 04 & Setzt den Zeitpunkt der ersten Abtastung des TDO\_IN-Signals
+SET\_JTAG\_SAMPLE\_TIME1 & 04 & Setzt den Zeitpunkt der ersten Abtastung des TDO\_IN-Signals
(\texttt{jtag\_sample\_time1}).\\
-SET\_JTAG\_SAMPLE\_TIME2 &48 & 05 & Setzt den Zeitpunkt der zweiten Abtastung des TDO\_IN-Signals
+SET\_JTAG\_SAMPLE\_TIME2 & 05 & Setzt den Zeitpunkt der zweiten Abtastung des TDO\_IN-Signals
(\texttt{jtag\_sample\_time2}).\\
-SET\_JTAG\_SAMPLE\_TIME3 &4a & 06 & Setzt den Zeitpunkt der dritten Abtastung des TDO\_IN-Signals
+SET\_JTAG\_SAMPLE\_TIME3 & 06 & Setzt den Zeitpunkt der dritten Abtastung des TDO\_IN-Signals
(\texttt{jtag\_sample\_time3}).\\
-SET\_JTAG\_SET\_DATA\_TIME&4c & 07 & Setzt den Zeitpunkt für das Ändern der TMS und TDI-Ausgänge des
+SET\_JTAG\_SET\_DATA\_TIME & 07 & Setzt den Zeitpunkt für das Ändern der TMS und TDI-Ausgänge des
FPGA
(\texttt{set\_data\_time}).\\
-SET\_DELAY\_EXPECTED\-\_VALUES &67& 08 & Setze die Zahl der TCK-Takte, um die das TDO-Signal des
+SET\_DELAY\_EXPECT\-\_VALUES & 08 & Setze die Zahl der TCK-Takte, um die das TDO-Signal des
letzten
Sensors verzögert eintrifft (\texttt{jtag\_delay\_expvalues}, Wertebereich 0 - 3).\\
\hline
-GET\_RUN\_COUNT &50& 10 & Liest den Wert des Durchlauf-Zählers, \texttt{run\_counter}.\\
-GET\_NUMCHIPS\_ACTIVE & 13& 11 & Liest die Anzahl nicht entfernter Sensoren.\\
-GET\_TRIGGER\_COUNT &14 & 12 & Liest die Zahl der \texttt{OFF\_SPILL\_IN}-Trigger.\\
-GET\_LAST\_NOT\_REMOVED & 1c & 13 & Nummer des letzten, nicht entfernten Sensors.\\
-GET\_CRC\_STATUS & 100 & 14 & Status flags of CRC check for 32 sensors.\\
+GET\_RUN\_COUNT & 10 & Liest den Wert des Durchlauf-Zählers, \texttt{run\_counter}.\\
+GET\_NUMCHIPS\_ACTIVE & 11 & Liest die Anzahl nicht entfernter Sensoren.\\
+GET\_TRIGGER\_COUNT & 12 & Liest die Zahl der \texttt{OFF\_SPILL\_IN}-Trigger.\\
+GET\_LAST\_NOT\_REMOVED & 13 & Nummer des letzten, nicht entfernten Sensors.\\
+GET\_CRC\_STATUS & 14 & Status flags of CRC check for 32 sensors.\\
\hline
-START & 09 & 40 & Aktiviert das Warten auf den \texttt{OFF\_SPILL\_IN}-Trigger
+START & 40 & Aktiviert das Warten auf den \texttt{OFF\_SPILL\_IN}-Trigger
\texttt{jtag\_refresh\_active} = Bit 0, \texttt{jtag\_check1\_active} = Bit 1 (überspringen des
Schreibens der Register)\\
-REMOVE\_SENSOR & 10 & 41 & Wenn gestoppt (\texttt{m26cs\_stopped} = 1), wird der im Datenregister
+REMOVE\_SENSOR & 41 & Wenn gestoppt (\texttt{m26cs\_stopped} = 1), wird der im Datenregister
eingestellte Sensor als nicht in der Kette befindlich markiert. Bit 31 = 1: Sensor wird entfernt,
Bit 31 = 0: Sensor wird hinzugefügt.\\
-SET\_CSOPTIONS &65& 42 & Setze Optionen (\texttt{m26csoptions}): bit 0 $\to$ Überspringe
+SET\_CSOPTIONS & 42 & Setze Optionen (\texttt{m26csoptions}): bit 0 $\to$ Überspringe
\textbf{BYPASSREG\_TESTCHAIN}.\\
-RAM\_BASEADDR & 121 & 43 & Wählt einen Speicherbereich mit 256 32-bit Worten aus \textbf{ram1a}
+RAM\_BASEADDR & 43 & Wählt einen Speicherbereich mit 256 32-bit Worten aus \textbf{ram1a}
aus. Diese Adresse entspricht der RAM-Adresse ohne die 8 niederwertigsten Bits. \\
\hline
-SET\_BREAKPOINTS & 53 & 50 & Setzt \texttt{breakpoint\_active}, siehe VHDL-Code
+SET\_BREAKPOINTS & 50 & Setzt \texttt{breakpoint\_active}, siehe VHDL-Code
\texttt{jtag\_cmd\_m26c.vhd} für Stellen, an denen die State-Machine angehalten wird.\\
-COPY\_TO\_STATUS2 &63& 51 & Das Kopieren von \textbf{ram3a} in \textbf{ram3b} wird nach Beenden des
+COPY\_TO\_STATUS2 & 51 & 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& 52 & Setze den Trigger für das Kopieren von \textbf{ram1b}
+COPY\_RAM1B1C\_SINGLE\-\_TRIGGER & 52 & 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.\\
+GET\_M26CS\_STATE & 53 & Current status of the main state machine.\\
+GET\_RAM1C\_RUN\_COUNTER & 54 & Lese das Register \texttt{ram1c\_run\_counter}. Kopie
+des Registers \texttt{run\_counter}, zu dem Zeitpunkt, zu dem die Kopie \textbf{ram1c} von
+\textbf{ram1b} gemacht wurde.\\
+GET\_RAM1C\_CHAIN\_STATUS & 55 & Lese das Register \texttt{ram1c\_chain\_status}.
+Kopie des Registers \texttt{chain\_status}, zu dem Zeitpunkt, zu dem die Kopie \textbf{ram1c} von
+\textbf{ram1b} gemacht wurde.\\
+GET\_RAM3B\_RUN\_COUNTER & 54 & Lese das Register \texttt{ram3b\_run\_counter}. Kopie
+des Registers \texttt{run\_counter}, zu dem Zeitpunkt, zu dem die Kopie \textbf{ram3b} von
+\textbf{ram3a} gemacht wurde.\\
+GET\_RAM3B\_CHAIN\_STATUS & 55 & Lese das Register \texttt{ram3b\_chain\_status}.
+Kopie des Registers \texttt{chain\_status}, zu dem Zeitpunkt, zu dem die Kopie \textbf{ram3b} von
+\textbf{ram3a} gemacht wurde.\\
\end{tabular}
\caption{Befehle für den JTAG-Chain-Controller, die per TrbNet geschickt werden können.}
\label{table:trbnet_commands}
\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}
signal bus2_ram_nack_in : std_logic;
signal ram1a_read_delay, ram1a_read_delay2 : std_logic;
-signal bus2_status2_addr_out : std_logic_vector(15 downto 0);
-signal bus2_status2_data_out : std_logic_vector(31 downto 0);
-signal bus2_status2_read_enable_out : std_logic;
-signal bus2_status2_write_enable_out : std_logic;
-signal bus2_status2_data_in : std_logic_vector(31 downto 0);
-signal bus2_status2_ack_in : std_logic;
-signal bus2_status2_nack_in : std_logic;
-
-signal bus2_status2_read_ram3b : std_logic;
-signal buf_bus2_status2_read_ram3b : std_logic;
-
signal status2_run_counter, status2_run_counter_next : unsigned(31 downto 0);
signal status2_chain_status, status2_chain_status_next : std_logic_vector(3+MAX_NUMCHIPS_PLUS_ONE_LD-1 downto 0);
signal status2_copy_finished: std_logic;
---signal bus2_debug_addr_out : std_logic_vector(4 downto 0);
-signal bus2_debug_addr_out : std_logic_vector(15 downto 0);
-signal bus2_debug_data_out : std_logic_vector(31 downto 0);
-signal bus2_debug_read_enable_out : std_logic;
-signal bus2_debug_write_enable_out : std_logic;
-signal bus2_debug_data_in : std_logic_vector(31 downto 0);
-signal bus2_debug_ack_in : std_logic;
-signal bus2_debug_nack_in : std_logic;
-signal bus2_debug_no_more_data_in : std_logic;
-signal bus2_debug_unknown_addr_in : std_logic;
-- monitoring
--signal read_mon_write_out : std_logic;
signal cpr1bc_state, cpr1bc_state_next : CPR1BC_STATE_TYPE;
-- DEBUGTDO fifo and control signals
-signal tdodebugsamples : std_logic_vector(31 downto 0);
-signal debugtdo_rd_en : std_logic;
-signal debugtdo_wr_en : std_logic;
-signal debugtdo_dout : std_logic_vector(31 downto 0);
-signal debugtdo_empty : std_logic;
-signal debugtdo_full : std_logic;
-signal debugtdo_overflow : std_logic;
-signal debugtdo_underflow : std_logic;
-signal resetdebugtdo_toffifo : std_logic;
-signal resetdebugtdo_strobe : std_logic;
-signal debugtdo_activate_strobe : std_logic;
-signal debugtdo_active : std_logic;
-signal debugtdo_timeout : std_logic_vector(31 downto 0);
-signal debugtdo_counter : std_logic_vector(31 downto 0);
-signal debugtdo_ran : std_logic;
+-- signal tdodebugsamples : std_logic_vector(31 downto 0);
+-- signal debugtdo_rd_en : std_logic;
+-- signal debugtdo_wr_en : std_logic;
+-- signal debugtdo_dout : std_logic_vector(31 downto 0);
+-- signal debugtdo_empty : std_logic;
+-- signal debugtdo_full : std_logic;
+-- signal debugtdo_overflow : std_logic;
+-- signal debugtdo_underflow : std_logic;
+-- signal resetdebugtdo_toffifo : std_logic;
+-- signal resetdebugtdo_strobe : std_logic;
+-- signal debugtdo_activate_strobe : std_logic;
+-- signal debugtdo_active : std_logic;
+-- signal debugtdo_timeout : std_logic_vector(31 downto 0);
+-- signal debugtdo_counter : std_logic_vector(31 downto 0);
+-- signal debugtdo_ran : std_logic;
signal crc_error_on_last_check, crc_error_on_last_check_next : std_logic;
signal last_run_successful, last_run_successful_next : std_logic;
signal bus_command_read : std_logic;
signal bus_command_retry : std_logic;
+signal bus_ram3b_ack : std_logic;
+signal bus_ram3b_ack_next : std_logic;
+signal bus_ram3b_ack_next2 : std_logic;
+signal bus_ram3b_addr : std_logic_vector(15 downto 0);
+signal bus_ram3b_data_in : std_logic_vector(31 downto 0);
+signal bus_ram3b_nack : std_logic;
+signal bus_ram3b_read : std_logic;
+signal bus_ram3b_unkwn : std_logic;
+signal bus_ram3b_write : std_logic;
+
+signal bus_ram1c_ack : std_logic;
+signal bus_ram1c_ack_next : std_logic;
+signal bus_ram1c_ack_next2 : std_logic;
+signal bus_ram1c_addr : std_logic_vector(15 downto 0);
+signal bus_ram1c_data_in : std_logic_vector(31 downto 0);
+signal bus_ram1c_nack : std_logic;
+signal bus_ram1c_read : std_logic;
+signal bus_ram1c_unkwn : std_logic;
+signal bus_ram1c_write : std_logic;
+
+
begin
jtag_bypassreg_enable_jtag_clock <= '0';
-resetdebugtdo_toffifo <= resetdebugtdo_strobe OR RESET_IN;
-debugtdo_wr_en <= '1' when debugtdo_active = '1' and debugtdo_timeout <= debugtdo_counter else '0';
+-- resetdebugtdo_toffifo <= resetdebugtdo_strobe OR RESET_IN;
+-- debugtdo_wr_en <= '1' when debugtdo_active = '1' and debugtdo_timeout <= debugtdo_counter else '0';
-tdodebugsamples(31) <= begin_jtag_bitcalc;
-tdodebugsamples(30) <= jtag_clock_pulse1;
-tdodebugsamples(29) <= jtag_clock_pulse2;
-tdodebugsamples(28) <= jtag_sample_pulse1;
-tdodebugsamples(27) <= jtag_sample_pulse2;
-tdodebugsamples(26) <= jtag_sample_pulse3;
-tdodebugsamples(25) <= jtag_set_data_pulse;
-tdodebugsamples(1) <= JTAG_TDO_IN;
+-- tdodebugsamples(31) <= begin_jtag_bitcalc;
+-- tdodebugsamples(30) <= jtag_clock_pulse1;
+-- tdodebugsamples(29) <= jtag_clock_pulse2;
+-- tdodebugsamples(28) <= jtag_sample_pulse1;
+-- tdodebugsamples(27) <= jtag_sample_pulse2;
+-- tdodebugsamples(26) <= jtag_sample_pulse3;
+-- tdodebugsamples(25) <= jtag_set_data_pulse;
+-- tdodebugsamples(1) <= JTAG_TDO_IN;
RUN_COUNTER_OUT <= std_logic_vector(run_counter);
STARTED_OUT <= jtag_refresh_active;
the_bus_handler : trb_net16_regio_bus_handler
generic map(
PORT_NUMBER => 4,
- PORT_ADDRESSES => (0 => x"0000", 1 => x"0140", 2 => x"0160", 3 => x"0200", others => (others => '0')),
- PORT_ADDR_MASK => (0 => 8, 1 => 5, 2 => 5, 3 => 8, others => 0)
+ PORT_ADDRESSES => (0 => x"0000", 1 => x"0100", 2 => x"0200", 3 => x"0300", others => (others => '0')),
+ PORT_ADDR_MASK => (0 => 8, 1 => 8, 2 => 8, 3 => 8, others => 0)
)
port map(
CLK => CLK_IN,
DAT_UNKNOWN_ADDR_OUT => BUS_UNKNOWN_ADDR_OUT, -- noone here to answer your request
BUS_ADDR_OUT(0*16+15 downto 0*16) => bus2_ram_addr_out,
- BUS_ADDR_OUT(1*16+15 downto 1*16) => bus2_debug_addr_out,
- BUS_ADDR_OUT(2*16+15 downto 2*16) => bus2_status2_addr_out,
- BUS_ADDR_OUT(3*16+15 downto 3*16) => bus_command_addr,
+ BUS_ADDR_OUT(1*16+15 downto 1*16) => bus_ram1c_addr,
+ BUS_ADDR_OUT(2*16+15 downto 2*16) => bus_command_addr,
+ BUS_ADDR_OUT(3*16+15 downto 3*16) => bus_ram3b_addr,
BUS_DATA_OUT(0*32+31 downto 0*32) => bus2_ram_data_out,
- BUS_DATA_OUT(1*32+31 downto 1*32) => bus2_debug_data_out,
- BUS_DATA_OUT(2*32+31 downto 2*32) => bus2_status2_data_out,
- BUS_DATA_OUT(3*32+31 downto 3*32) => bus_command_data_out,
+ BUS_DATA_OUT(1*32+31 downto 1*32) => open,
+ BUS_DATA_OUT(2*32+31 downto 2*32) => bus_command_data_out,
+ BUS_DATA_OUT(3*32+31 downto 3*32) => open,
BUS_READ_ENABLE_OUT(0) => bus2_ram_read_enable_out,
- BUS_READ_ENABLE_OUT(1) => bus2_debug_read_enable_out,
- BUS_READ_ENABLE_OUT(2) => bus2_status2_read_enable_out,
- BUS_READ_ENABLE_OUT(3) => bus_command_read,
- BUS_WRITE_ENABLE_OUT(0) => bus2_ram_write_enable_out,
- BUS_WRITE_ENABLE_OUT(1) => bus2_debug_write_enable_out,
- BUS_WRITE_ENABLE_OUT(2) => bus2_status2_write_enable_out,
- BUS_WRITE_ENABLE_OUT(3) => bus_command_write,
- BUS_TIMEOUT_OUT => open,
+ BUS_READ_ENABLE_OUT(1) => bus_ram1c_read,
+ BUS_READ_ENABLE_OUT(2) => bus_command_read,
+ BUS_READ_ENABLE_OUT(3) => bus_ram3b_read,
+ BUS_WRITE_ENABLE_OUT(0) => bus2_ram_write_enable_out,
+ BUS_WRITE_ENABLE_OUT(1) => bus_ram1c_write,
+ BUS_WRITE_ENABLE_OUT(2) => bus_command_write,
+ BUS_WRITE_ENABLE_OUT(3) => bus_ram3b_write,
+ BUS_TIMEOUT_OUT => open,
BUS_DATA_IN(0*32+31 downto 0*32) => bus2_ram_data_in,
- BUS_DATA_IN(1*32+31 downto 1*32) => bus2_debug_data_in,
- BUS_DATA_IN(2*32+31 downto 2*32) => bus2_status2_data_in,
- BUS_DATA_IN(3*32+31 downto 3*32) => bus_command_data_in,
+ BUS_DATA_IN(1*32+31 downto 1*32) => bus_ram1c_data_in,
+ BUS_DATA_IN(2*32+31 downto 2*32) => bus_command_data_in,
+ BUS_DATA_IN(3*32+31 downto 3*32) => bus_ram3b_data_in,
BUS_DATAREADY_IN(0) => bus2_ram_ack_in,
- BUS_DATAREADY_IN(1) => bus2_debug_ack_in,
- BUS_DATAREADY_IN(2) => bus2_status2_ack_in,
- BUS_DATAREADY_IN(3) => bus_command_ack,
+ BUS_DATAREADY_IN(1) => bus_ram1c_ack,
+ BUS_DATAREADY_IN(2) => bus_command_ack,
+ BUS_DATAREADY_IN(3) => bus_ram3b_ack,
BUS_WRITE_ACK_IN(0) => bus2_ram_ack_in,
- BUS_WRITE_ACK_IN(1) => bus2_debug_ack_in,
- BUS_WRITE_ACK_IN(2) => bus2_status2_ack_in,
- BUS_WRITE_ACK_IN(3) => bus_command_ack,
+ BUS_WRITE_ACK_IN(1) => '0',
+ BUS_WRITE_ACK_IN(2) => bus_command_ack,
+ BUS_WRITE_ACK_IN(3) => '0',
BUS_NO_MORE_DATA_IN(0) => bus2_ram_nack_in,
- BUS_NO_MORE_DATA_IN(1) => '0',
+ BUS_NO_MORE_DATA_IN(1) => bus_ram1c_nack,
BUS_NO_MORE_DATA_IN(2) => '0',
- BUS_NO_MORE_DATA_IN(3) => '0',
- BUS_UNKNOWN_ADDR_IN(0) => '0',
- BUS_UNKNOWN_ADDR_IN(1) => bus2_debug_nack_in,
- BUS_UNKNOWN_ADDR_IN(2) => bus2_status2_nack_in,
- BUS_UNKNOWN_ADDR_IN(3) => bus_command_retry
+ BUS_NO_MORE_DATA_IN(3) => bus_ram3b_nack,
+ BUS_UNKNOWN_ADDR_IN(0) => '0',
+ BUS_UNKNOWN_ADDR_IN(1) => bus_ram1c_unkwn,
+ BUS_UNKNOWN_ADDR_IN(2) => bus_command_retry,
+ BUS_UNKNOWN_ADDR_IN(3) => bus_ram3b_unkwn
);
jtag_sample_pulse3_d1_next <= jtag_sample_pulse3;
-ram3b_a2 <= ram3b_a2_base_addr & ram3b_a2_rel_addr; -- hope this is the right order (base_addr should be the MSBs)
SEQUENTIAL : process (CLK_IN)
begin
when M26C_CMD_GET_CRC_STATUS =>
bus_command_data_in(MAX_NUMCHIPS - 1 downto 0) <= crc_status_register(MAX_NUMCHIPS - 1 downto 0);
when M26C_CMD_SET_RAMBASE =>
- bus_command_data_in(MAX_NUMCHIPS_LD-1 downto 0) <= ram1a_a1_base_addr;
+ bus_command_data_in(MAX_NUMCHIPS_LD-1 downto 0) <= ram1a_a1_base_addr;
+ when M26C_CMD_GET_M26CS_STATE =>
+ bus_command_data_in(7 downto 0) <= debug_m26cs_state;
+ when M26C_CMD_GET_RAM1C_RUN_COUNTER =>
+ bus_command_data_in <= std_logic_vector(ram1c_run_counter);
+ when M26C_CMD_GET_RAM1C_CHAIN_STATUS =>
+ bus_command_data_in(3+MAX_NUMCHIPS_PLUS_ONE_LD-1 downto 0) <= ram1c_chain_status;
+ when M26C_CMD_GET_RAM3B_RUN_COUNTER =>
+ bus_command_data_in <= std_logic_vector(status2_run_counter);
+ when M26C_CMD_GET_RAM3B_CHAIN_STATUS =>
+ bus_command_data_in(3+MAX_NUMCHIPS_PLUS_ONE_LD-1 downto 0) <= status2_chain_status;
when M26C_CMD_SET_CSOPTIONS =>
bus_command_data_in(0 downto 0) <= m26csoptions(0 downto 0); -- bit 0 => skip bypassreg chaintest
when M26C_CMD_SET_DELAY_EXPECTED_VALUES =>
-BUS2_DEBUG_R : process begin
+PROC_READ_1C : process begin
wait until rising_edge(CLK_IN);
- bus2_debug_ack_in <= '0';
- bus2_debug_nack_in <= '0';
- bus2_debug_data_in <= (others => '0');
+ bus_ram1c_ack <= '0';
+ bus_ram1c_nack <= '0';
+ bus_ram1c_unkwn <= '0';
+ bus_ram1c_ack_next <= '0';
+ bus_ram1c_ack_next2 <= '0';
- debugtdo_activate_strobe <= '0';
- debugtdo_rd_en <= '0';
- resetdebugtdo_strobe <= '0';
-
- if bus2_debug_write_enable_out = '1' then
- bus2_debug_ack_in <= '1';
- bus2_debug_nack_in <= '0';
- case bus2_debug_addr_out(4 downto 0) is
- when ADDR_DEBUG_TEST =>
- debug_test <= bus2_debug_data_out;
- when ADDR_DEBUG_RAM1BADDR =>
- ram1b_a2 <= bus2_debug_data_out(RAM_JTAG_REGISTERS_DEPTH-1 downto 0);
- when ADDR_DEBUG_RAM1CADDR =>
- ram1c_a2 <= bus2_debug_data_out(RAM_JTAG_REGISTERS_DEPTH-1 downto 0);
- when ADDR_DEBUG_DEBUGTDO_TIMEOUT =>
- debugtdo_timeout <= bus2_debug_data_out(31 downto 0);
- when ADDR_DEBUG_DEBUGTDO_ACTIVATE =>
- debugtdo_activate_strobe <= bus2_debug_data_out(0);
- when ADDR_DEBUG_DEBUGTDO_CONTROLFIFO =>
- debugtdo_rd_en <= bus2_debug_data_out(0);
- resetdebugtdo_strobe <= bus2_debug_data_out(4);
- when others =>
- bus2_debug_ack_in <= '0';
- bus2_debug_nack_in <= '1';
- end case;
-
- elsif bus2_debug_read_enable_out = '1' then
- bus2_debug_ack_in <= '1';
- bus2_debug_nack_in <= '0';
- case bus2_debug_addr_out(4 downto 0) is
- when ADDR_DEBUG_TEST =>
- bus2_debug_data_in <= debug_test;
- when ADDR_DEBUG_M26CS_STATE =>
- bus2_debug_data_in(7 downto 0) <= debug_m26cs_state;
- when ADDR_DEBUG_TRIGGER_COUNT =>
- bus2_debug_data_in <= std_logic_vector(debug_trigger_counter);
- when ADDR_DEBUG_VERSION =>
- bus2_debug_data_in <= std_logic_vector(to_unsigned(VERSION_NUMBER_TIME,32));
- when ADDR_DEBUG_RAM1B_DATA =>
- bus2_debug_data_in <= ram1b_dout2;
- when ADDR_DEBUG_RAM1C_DATA =>
- bus2_debug_data_in <= ram1c_dout2;
- when ADDR_DEBUG_RAM1C_RUN_COUNTER =>
- bus2_debug_data_in <= std_logic_vector(ram1c_run_counter);
- when ADDR_DEBUG_RAM1C_CHAIN_STATUS =>
- bus2_debug_data_in(3+MAX_NUMCHIPS_PLUS_ONE_LD-1 downto 0) <= ram1c_chain_status;
- when ADDR_DEBUG_DEBUGTDO_SAMPLES =>
- bus2_debug_data_in(31 downto 0) <= debugtdo_dout;
- when ADDR_DEBUG_DEBUGTDO_GETFIFOSTATUS =>
- bus2_debug_data_in(0) <= debugtdo_full;
- bus2_debug_data_in(1) <= debugtdo_empty;
- bus2_debug_data_in(2) <= debugtdo_overflow;
- bus2_debug_data_in(3) <= debugtdo_underflow;
- when ADDR_DEBUG_DEBUGTDO_TIMEOUT =>
- bus2_debug_data_in(31 downto 0) <= debugtdo_timeout;
- when ADDR_DEBUG_WRONCE_COUNT =>
- bus2_debug_data_in(COUNTER_WIDTHS-1 downto 0) <= std_logic_vector(write_once_count);
- when others =>
- bus2_debug_ack_in <= '0';
- bus2_debug_nack_in <= '1';
- end case;
+ if bus_ram1c_read = '1' then
+ if status2_copy_finished = '1' then
+ bus_ram1c_ack_next<= '1';
+ ram1c_a2 <= ram1a_a1_base_addr & bus_ram1c_addr(7 downto 0);
+ else
+ bus_ram1c_nack <= '1';
+ end if;
+ elsif bus_ram1c_write = '1' then
+ bus_ram1c_unkwn <= '1';
+ elsif bus_ram1c_ack_next = '1' then
+ bus_ram1c_ack_next2 <= '1';
+ elsif bus_ram1c_ack_next2 = '1' then
+ bus_ram1c_data_in <= ram1c_dout2;
+ bus_ram1c_ack <= '1';
end if;
end process;
-BUS2_STATUS2_R : process begin
+
+PROC_READ_3B : process begin
wait until rising_edge(CLK_IN);
- bus2_status2_data_in <= (others => '0');
- bus2_status2_ack_in <= '0';
- bus2_status2_nack_in <= '0';
- bus2_status2_read_ram3b <= '0';
- buf_bus2_status2_read_ram3b <= bus2_status2_read_ram3b;
+ bus_ram3b_ack <= '0';
+ bus_ram3b_nack <= '0';
+ bus_ram3b_unkwn <= '0';
+ bus_ram3b_ack_next <= '0';
+ bus_ram3b_ack_next2 <= '0';
- if(buf_bus2_status2_read_ram3b = '1') then
- bus2_status2_data_in <= ram3b_dout2;
- bus2_status2_ack_in <= '1';
- end if;
- if(bus2_status2_read_enable_out='1') then
- -- STATUS register layout: 8 bits/chip
- -- first 32 bits : CRC status
- -- bits i*32+31 downto i*32: bits 0: JTAG_ERROR, 1: WRITE_ERROR, 2: WRITE_ERROR2, 3: READ_ERROR, 4: READ_ERROR2,
- -- 5: DATA_CHANGED, 6: reserved, 7: reserved
- if(bus2_status2_addr_out(4) = '1') then -- ram3b
- ram3b_a2_rel_addr <= bus2_status2_addr_out(3 downto 0);
- bus2_status2_read_ram3b <= '1';
- else
- bus2_status2_ack_in <= '1';
- case bus2_status2_addr_out(4 downto 0) is
- when ADDR_STATUS2_TRIGGERCOUNTER_COPY =>
- bus2_status2_data_in <= std_logic_vector(status2_run_counter);
- when ADDR_STATUS2_CHAIN_STATUS_COPY =>
- bus2_status2_data_in(3+MAX_NUMCHIPS_PLUS_ONE_LD-1 downto 0) <= status2_chain_status;
- when ADDR_STATUS2_UPDATING =>
- bus2_status2_data_in(0) <= not status2_copy_finished;
- when ADDR_STATUS2_RAM3B_BASEADDR =>
- bus2_status2_data_in(RAM_ERROR_COUNTS_DEPTH-4 -1 downto 0) <= ram3b_a2_base_addr;
- when ADDR_STATUS2_STARTED =>
- bus2_status2_data_in(0) <= jtag_refresh_active;
- when others =>
- bus2_status2_ack_in <= '0';
- bus2_status2_nack_in <= '1';
- end case;
- end if;
- end if;
- if(bus2_status2_write_enable_out='1') then
- if(bus2_status2_addr_out(4 downto 0) = ADDR_STATUS2_RAM3B_BASEADDR) then
- ram3b_a2_base_addr <= bus2_status2_data_out(RAM_ERROR_COUNTS_DEPTH-4 -1 downto 0);
- bus2_status2_ack_in <= '1';
+ if bus_ram3b_read = '1' then
+ if status2_copy_finished = '1' then
+ bus_ram3b_ack_next<= '1';
+ ram3b_a2 <= '0' & bus_ram3b_addr(7 downto 0);
else
- bus2_status2_nack_in <= '1';
+ bus_ram3b_nack <= '1';
end if;
+ elsif bus_ram3b_write = '1' then
+ bus_ram3b_unkwn <= '1';
+ elsif bus_ram3b_ack_next = '1' then
+ bus_ram3b_ack_next2 <= '1';
+ elsif bus_ram3b_ack_next2 = '1' then
+ bus_ram3b_data_in <= ram3b_dout2;
+ bus_ram3b_ack <= '1';
end if;
end process;
+
+
debug_m26cs_state_process : process begin
wait until rising_edge(CLK_IN);
case m26cs_state is
IDLE_OUT <= idle_out_signal;
-ALL_debugtdo : process( CLK_IN)
-begin
- if(rising_edge(CLK_IN)) then
- if(RESET_IN= '1') then
- debugtdo_counter <= (others => '0');
- debugtdo_active <= '0';
- debugtdo_ran <= '0';
- else
- -- COUNTER
- debugtdo_counter <= std_logic_vector(unsigned(debugtdo_counter) + 1);
- -- reset counter in idle/stopped states => counter times the elapsed time since start of m26cs state machine
- -- also clear debugtdo_active
- if(m26cs_state = M26CSS_WAIT_FOR_TRIGGER or m26cs_state = M26CSS_STOPPED) then
- debugtdo_counter <= (others => '0');
- if(debugtdo_ran = '1') then
- debugtdo_active <= '0';
- end if;
- debugtdo_ran <= '0';
- else
- debugtdo_ran <= '1';
- end if;
- if(debugtdo_activate_strobe = '1') then
- debugtdo_active <= '1';
- end if;
- end if;
- end if;
-end process;
+-- ALL_debugtdo : process( CLK_IN)
+-- begin
+-- if(rising_edge(CLK_IN)) then
+-- if(RESET_IN= '1') then
+-- debugtdo_counter <= (others => '0');
+-- debugtdo_active <= '0';
+-- debugtdo_ran <= '0';
+-- else
+-- -- COUNTER
+-- debugtdo_counter <= std_logic_vector(unsigned(debugtdo_counter) + 1);
+-- -- reset counter in idle/stopped states => counter times the elapsed time since start of m26cs state machine
+-- -- also clear debugtdo_active
+-- if(m26cs_state = M26CSS_WAIT_FOR_TRIGGER or m26cs_state = M26CSS_STOPPED) then
+-- debugtdo_counter <= (others => '0');
+-- if(debugtdo_ran = '1') then
+-- debugtdo_active <= '0';
+-- end if;
+-- debugtdo_ran <= '0';
+-- else
+-- debugtdo_ran <= '1';
+-- end if;
+-- if(debugtdo_activate_strobe = '1') then
+-- debugtdo_active <= '1';
+-- end if;
+-- end if;
+-- end if;
+-- end process;
end architecture;