1 |
5 |
N.Boukadid |
\section{Core1990}
|
2 |
|
|
Core1990 is a point-to-point communication protocol using the royalty-free Interlaken protocol as it's foundation. It is designed by engineers and students of the Electronics Department of Nikhef (Amsterdam, The Netherlands) with large experiments at CERN (e.g. ATLAS) in mind. \\
|
3 |
|
|
The development of Core1990 was intended to publish an open source protocol providing high throughput with a small percentage of overhead. Certain features like flow control and error detection are included.
|
4 |
|
|
\begin{figure}[H]
|
5 |
|
|
\centering
|
6 |
|
|
\includegraphics[width=.6\textwidth]{Core1990_logo.jpg}
|
7 |
|
|
\caption{Core1990 logo}
|
8 |
|
|
\label{fig:Core1990_logo}
|
9 |
|
|
\end{figure}
|
10 |
|
|
|
11 |
|
|
\subsection{Features}
|
12 |
|
|
Core1990 is packet with a lot of features providing data integrity and detection of errors while transmitting. These features are designed to be compliant with those featured in the interlaken protocol definition.
|
13 |
|
|
|
14 |
|
|
\begin{itemize}
|
15 |
|
|
\item Lane rate transceiver dependent
|
16 |
|
|
\item Support framing consistent with the Interlaken Protocol Definition
|
17 |
|
|
\item Generates CRC-24 and CRC-32 for error checking
|
18 |
|
|
\item 58-bit independent synchronous scrambler
|
19 |
|
|
\item 64b/67b encoding
|
20 |
|
|
\item About 90\% bandwidth efficiency possible (depends on user configuration)
|
21 |
|
|
\item Self-synchronizing links
|
22 |
|
|
\item Flow control
|
23 |
|
|
\end{itemize}
|
24 |
|
|
|
25 |
|
|
\subsection{Obtaining and building Core 1990}
|
26 |
|
|
Implementing the core in a design can be done easily by using the files provided with core1990.
|
27 |
|
|
The complete process of obtaining and building Core1990 will be described including which files are required and should be included. The project has been designed in Xilinx Vivado 16.4 but should be compatible with other versions. The correct configuration of the ip cores will also be mentioned to ensure behavior as expected.
|
28 |
|
|
|
29 |
|
|
The complete project can be downloaded through the download link on the OpenCores site itself or through SVN. For OpenCores the link is \href{https://opencores.org/project/core1990_interlaken}{https://opencores.org/project/core1990\\\_interlaken} and the SVN links is \href{https://opencores.org/ocsvn/core1990_interlaken/core1990_interlaken/trunk}{https://opencores.org/ocsvn/core1990\_interlaken/core1990\\\_interlaken/trunk} in case this is preferred.\\
|
30 |
|
|
|
31 |
|
|
\begin{forest}
|
32 |
|
|
pic dir tree,
|
33 |
|
|
where level=0{}{% folder icons by default; override using file for file icons
|
34 |
|
|
directory,
|
35 |
|
|
},
|
36 |
|
|
[Core1990
|
37 |
|
|
[constraints]
|
38 |
|
|
[scripts]
|
39 |
|
|
[simulation]
|
40 |
|
|
[sources
|
41 |
|
|
[Interlaken\_Interface.vhd, file, label=right: \small{The main file}]
|
42 |
|
|
[ip\_cores
|
43 |
|
|
[clk\_40MHz.xci, file]
|
44 |
|
|
[RX\_FIFO.xci, file]
|
45 |
|
|
[Transceiver\_10g\_64b67b.xci, file]
|
46 |
|
|
[TX\_FIFO.xci, file] ]
|
47 |
|
|
[CRC
|
48 |
|
|
[crc-24.vhd,file]
|
49 |
|
|
[crc-32.vhd, file] ]
|
50 |
|
|
[Receiver
|
51 |
|
|
[interlaken\_receiver.vhd,file]
|
52 |
|
|
[decoder.vhd, file]
|
53 |
|
|
[deframing\_burst.vhd, file]
|
54 |
|
|
[deframing\_meta.vhd, file]
|
55 |
|
|
[descrambler.vhd, file] ]
|
56 |
|
|
[Transmitter
|
57 |
|
|
[interlaken\_transmitter.vhd,file]
|
58 |
|
|
[encoder.vhd, file]
|
59 |
|
|
[framing\_burst.vhd, file]
|
60 |
|
|
[framing\_meta.vhd, file]
|
61 |
|
|
[scrambler.vhd, file] ]
|
62 |
|
|
]
|
63 |
|
|
]
|
64 |
|
|
\end{forest}
|
65 |
|
|
|
66 |
|
|
The directory tree depicts the file structure in the sources folder. This should contain several files to configure the ip cores, a folder containing two crc error detection modules, a receiver and transmitter folder containing the module files. A main file is included in the folder that is meant for the top level connecting all modules correctly to each other.
|
67 |
|
|
|
68 |
|
|
Besides these files there are also three different folders. One contains the constraints which are responsible for connecting the physical pins to the signals in the package and providing clock information to the fitter of the design. Another folder contains several scripts to build the project by just running a single script. Another script will be able to generate testbenches on request of the user and a script generates the implementation of the design. The simulation folder contains a lot of testbenches used to simulate all the components included in the design.
|
69 |
|
|
|
70 |
|
|
\begin{forest}
|
71 |
|
|
pic dir tree,
|
72 |
|
|
where level=0{}{% folder icons by default; override using file for file icons
|
73 |
|
|
directory,
|
74 |
|
|
},
|
75 |
|
|
[Core1990
|
76 |
|
|
[constraints
|
77 |
|
|
[Core1990\_Constraints.xdc, file] ]
|
78 |
|
|
[scripts
|
79 |
|
|
[implementation.tcl, file]
|
80 |
|
|
[simulation.tcl, file]
|
81 |
|
|
[vivado\_import\_virtex7.tcl, file] ]
|
82 |
|
|
[simulation]
|
83 |
|
|
[sources]
|
84 |
|
|
]
|
85 |
|
|
\end{forest}
|
86 |
|
|
|
87 |
|
|
For building the project Vivado has to be opened and the vivado\_import\_virtex7.tcl has to be executed. This can be done by changing the directory in the tcl console to the scripts folder and then giving the command 'source vivado\_import\_virtex7.tcl'. This will add the project folder to the directory tree and contains the just generated project.
|
88 |
|
|
|
89 |
|
|
Simulation can be done with a separate script which can be run by the command 'source simulation.tcl'. After this a short explanation of the command this script accepts should appear. For example if the user would like to simulate the decoder, this can be done by giving the command 'simulate decoder' in the tcl console.
|
90 |
|
|
|
91 |
|
|
\subsection{Transceiver IP Core}
|
92 |
|
|
Configuring the transceiver right is essential for the functional behavior of the protocol. In case wrong configuration is used, no data or corrupted data will arrive at the receiving side. This section will guide the user to setting up the transceiver in an easy way without adjusting too many clocks, targeting the VC707 board.\\
|
93 |
|
|
|
94 |
|
|
When configuring the core a separate window will pop up. The fist tab named GT Selection should already have the GTX as GT Type selected and the shared logic should be included in the core, not the example design.
|
95 |
|
|
|
96 |
|
|
After this the second tab will provide more important options. The line rate should be set to 10 Gbps while the reference clock can be set at 125 MHz. This clock is available on the board at IO pins AH7 and AH8, REFCLK0\_Q0. Using the QPLL GTX X1Y2 can be used. Figure \ref{fig:IP_TransceiverConf1} shows the correct configuration.
|
97 |
|
|
|
98 |
|
|
\begin{figure}[H]
|
99 |
|
|
\centering
|
100 |
|
|
\includegraphics[width=.8\textwidth]{IP_TransceiverConf1.png}
|
101 |
|
|
\caption{Transceiver lane rate and reference clock selection}
|
102 |
|
|
\label{fig:IP_TransceiverConf1}
|
103 |
|
|
\end{figure}
|
104 |
|
|
|
105 |
|
|
The encoding and clocking tab shows other important settings. For both the TX and RX, the external data width should be set at 64-bits while the internal data width is 32 bits. Encoding has to be set at 64B/67B with Internal Sequence Counter and decoding has to be set at 64B/67B. The DRP/System Clock Frequency has to be set at 40 MHz. Figure \ref{fig:IP_TransceiverConf2} shows the right settings.
|
106 |
|
|
|
107 |
|
|
\begin{figure}[H]
|
108 |
|
|
\centering
|
109 |
|
|
\includegraphics[width=.8\textwidth]{IP_TransceiverConf2.png}
|
110 |
|
|
\caption{Transceiver encoding and system clock selection}
|
111 |
|
|
\label{fig:IP_TransceiverConf2}
|
112 |
|
|
\end{figure}
|
113 |
|
|
|
114 |
|
|
The other tabs are not important and no settings should be changed in these tabs. Figure \ref{fig:IP_TransceiverConf3} shows a complete summary of the features included with the transceiver when this core will be generate. The user should have the same settings on screen.
|
115 |
|
|
|
116 |
|
|
\begin{figure}[H]
|
117 |
|
|
\centering
|
118 |
|
|
\includegraphics[width=.8\textwidth]{IP_TransceiverConf3.png}
|
119 |
|
|
\caption{Transceiver summary of configuration}
|
120 |
|
|
\label{fig:IP_TransceiverConf3}
|
121 |
|
|
\end{figure}
|
122 |
|
|
|
123 |
|
|
\newpage
|
124 |
|
|
|
125 |
|
|
\subsection{System Clock IP Core}
|
126 |
|
|
The system clock will be generated using a 200 MHz input at IO pins E18 and E19. The frequency will be scaled down using the Xilinx Clocking Wizard which generates an IP core.
|
127 |
|
|
|
128 |
|
|
\begin{figure}[H]
|
129 |
|
|
\centering
|
130 |
|
|
\includegraphics[width=\textwidth]{IP_CLK40Conf1.png}
|
131 |
|
|
\caption{System clock setting the board interface}
|
132 |
|
|
\label{fig:IP_CLK40Conf1}
|
133 |
|
|
\end{figure}
|
134 |
|
|
|
135 |
|
|
\begin{figure}[H]
|
136 |
|
|
\centering
|
137 |
|
|
\includegraphics[width=\textwidth]{IP_CLK40Conf2.png}
|
138 |
|
|
\caption{System clock setting the options}
|
139 |
|
|
\label{fig:IP_CLK40Conf2}
|
140 |
|
|
\end{figure}
|
141 |
|
|
|
142 |
|
|
\begin{figure}[H]
|
143 |
|
|
\centering
|
144 |
|
|
\includegraphics[width=\textwidth]{IP_CLK40Conf3.png}
|
145 |
|
|
\caption{System clock configuring the output clock}
|
146 |
|
|
\label{fig:IP_CLK40Conf3}
|
147 |
|
|
\end{figure}
|
148 |
|
|
|
149 |
|
|
\begin{figure}[H]
|
150 |
|
|
\centering
|
151 |
|
|
\includegraphics[width=\textwidth]{IP_CLK40Conf4.png}
|
152 |
|
|
\caption{System clock summary of configuration}
|
153 |
|
|
\label{fig:IP_CLK40Conf4}
|
154 |
|
|
\end{figure}
|
155 |
|
|
|
156 |
|
|
\newpage
|
157 |
|
|
|
158 |
|
|
\subsection{FIFO IP Cores}
|
159 |
|
|
|
160 |
|
|
\subsection{Simulating the core}
|
161 |
|
|
Simulation of the core1990 protocol can easily be configure by running the simulation script.
|
162 |
|
|
|
163 |
|
|
\newpage
|
164 |
|
|
Core 1990 explores state of the art point-to-point communication protocols.
|
165 |
|
|
It proposes a simple and standard solution, which is as much as possible vendor independent, and based on the Open Source Interlaken protocol.
|
166 |
|
|
\url{https://null.53bits.co.uk/index.php?page=encoding-schemes}
|