1 |
3 |
rozpruwacz |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2 |
|
|
%%%% %%%%
|
3 |
|
|
%%%% WISHBONE SD Card Controller IP Core %%%%
|
4 |
|
|
%%%% %%%%
|
5 |
|
|
%%%% hdl_if.tex %%%%
|
6 |
|
|
%%%% %%%%
|
7 |
|
|
%%%% This file is part of the WISHBONE SD Card %%%%
|
8 |
|
|
%%%% Controller IP Core project %%%%
|
9 |
8 |
rozpruwacz |
%%%% http://opencores.org/project,sd_card_controller %%%%
|
10 |
3 |
rozpruwacz |
%%%% %%%%
|
11 |
|
|
%%%% Description %%%%
|
12 |
|
|
%%%% documentation 'HDL interface' chapter %%%%
|
13 |
|
|
%%%% %%%%
|
14 |
|
|
%%%% Author(s): %%%%
|
15 |
|
|
%%%% - Marek Czerski, ma.czerski@gmail.com %%%%
|
16 |
|
|
%%%% %%%%
|
17 |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
18 |
|
|
%%%% %%%%
|
19 |
|
|
%%%% Copyright (C) 2013 Authors %%%%
|
20 |
|
|
%%%% %%%%
|
21 |
|
|
%%%% This source file may be used and distributed without %%%%
|
22 |
|
|
%%%% restriction provided that this copyright statement is not %%%%
|
23 |
|
|
%%%% removed from the file and that any derivative work contains %%%%
|
24 |
|
|
%%%% the original copyright notice and the associated disclaimer. %%%%
|
25 |
|
|
%%%% %%%%
|
26 |
|
|
%%%% This source file is free software; you can redistribute it %%%%
|
27 |
|
|
%%%% and/or modify it under the terms of the GNU Lesser General %%%%
|
28 |
|
|
%%%% Public License as published by the Free Software Foundation; %%%%
|
29 |
|
|
%%%% either version 2.1 of the License, or (at your option) any %%%%
|
30 |
|
|
%%%% later version. %%%%
|
31 |
|
|
%%%% %%%%
|
32 |
|
|
%%%% This source is distributed in the hope that it will be %%%%
|
33 |
|
|
%%%% useful, but WITHOUT ANY WARRANTY; without even the implied %%%%
|
34 |
|
|
%%%% warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR %%%%
|
35 |
|
|
%%%% PURPOSE. See the GNU Lesser General Public License for more %%%%
|
36 |
|
|
%%%% details. %%%%
|
37 |
|
|
%%%% %%%%
|
38 |
|
|
%%%% You should have received a copy of the GNU Lesser General %%%%
|
39 |
|
|
%%%% Public License along with this source; if not, download it %%%%
|
40 |
|
|
%%%% from http://www.opencores.org/lgpl.shtml %%%%
|
41 |
|
|
%%%% %%%%
|
42 |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
43 |
|
|
\section{HDL interface}
|
44 |
|
|
\label{sec:hdl_if}
|
45 |
|
|
|
46 |
13 |
jclaytons |
This IP core has a very simple interface:
|
47 |
3 |
rozpruwacz |
\begin{figure}[H]
|
48 |
|
|
\centering
|
49 |
|
|
\includegraphics[width=11cm]{../bin/ip_core_if.png}
|
50 |
|
|
% ip_core.png: 384x469 pixel, 96dpi, 10.16x12.41 cm, bb=
|
51 |
|
|
\caption{Wishbone SD Card Controller IP Core interface}
|
52 |
|
|
\label{img:ip_core_if}
|
53 |
|
|
\end{figure}
|
54 |
13 |
jclaytons |
The Wishbone slave interface provides access from CPU to all IP core registers (see \ref{sec:regs}). It must
|
55 |
|
|
be connected to a data master. The Wishbone master interface provides access from the DMA engine to RAM (see \ref{sec:dma}).
|
56 |
|
|
It must be connected to a RAM memory slave. Interrupt signals provide a mechanism to notify the CPU about finished transactions (data and command tranfers).
|
57 |
|
|
They are not necessary for proper operation, if you don't want to use interrupts. The MMC/SD card interface communicates with external MMC/SD cards.
|
58 |
|
|
It must be mapped to external pins of the FPGA which are connected to a MMC/SD card connector. Because those external pins are bidirectional, this IP core
|
59 |
3 |
rozpruwacz |
provides inputs, outputs and output enables for these signals.
|
60 |
13 |
jclaytons |
Table \ref{tab:signals} presents all the IP core signals with descriptions.
|
61 |
3 |
rozpruwacz |
|
62 |
|
|
\begin{table}
|
63 |
13 |
jclaytons |
\caption{Description of signals}
|
64 |
3 |
rozpruwacz |
\begin{center}
|
65 |
|
|
\begin{tabular}{l|l|l|l}
|
66 |
|
|
\rowcolor[gray]{0.7} name & direction & width & description \\ \hline \hline
|
67 |
|
|
\multicolumn{4}{c}{Wishbone common signals} \\ \hline
|
68 |
|
|
\texttt{wb\_clk\_i} & input & 1 & clock for both master and slave wishbone transactions \\ \hline
|
69 |
|
|
\texttt{wb\_rst\_i} & input & 1 & reset for whole IP core \\ \hline
|
70 |
|
|
\multicolumn{4}{c}{Wishbone slave signals} \\ \hline
|
71 |
|
|
\texttt{wb\_dat\_i} & input & 32 & data input \\ \hline
|
72 |
|
|
\texttt{wb\_dat\_o} & output & 32 & data output \\ \hline
|
73 |
|
|
\texttt{wb\_adr\_i} & input & 32 & address \\ \hline
|
74 |
|
|
\texttt{wb\_sel\_i} & input & 4 & byte select \\ \hline
|
75 |
|
|
\texttt{wb\_we\_i} & input & 1 & write enable \\ \hline
|
76 |
|
|
\texttt{wb\_cyc\_i} & input & 1 & cycle flag \\ \hline
|
77 |
|
|
\texttt{wb\_stb\_i} & input & 1 & strobe \\ \hline
|
78 |
|
|
\texttt{wb\_ack\_o} & output & 1 & acknowledge flag \\ \hline
|
79 |
|
|
\multicolumn{4}{c}{Wishbone master signals} \\ \hline
|
80 |
|
|
\texttt{m\_wb\_dat\_o} & output & 32 & data output \\ \hline
|
81 |
|
|
\texttt{m\_wb\_dat\_i} & input & 32 & data input \\ \hline
|
82 |
|
|
\texttt{m\_wb\_adr\_o} & output & 32 & address \\ \hline
|
83 |
|
|
\texttt{m\_wb\_sel\_o} & output & 4 & byte select \\ \hline
|
84 |
|
|
\texttt{m\_wb\_we\_o} & output & 1 & write enable \\ \hline
|
85 |
|
|
\texttt{m\_wb\_cyc\_o} & output & 1 & cycle flag \\ \hline
|
86 |
|
|
\texttt{m\_wb\_stb\_o} & output & 1 & strobe \\ \hline
|
87 |
|
|
\texttt{m\_wb\_ack\_i} & input & 1 & acknowledge flag \\ \hline
|
88 |
|
|
\texttt{m\_wb\_cti\_o} & output & 3 & cycle type identifier (always 000) \\ \hline
|
89 |
|
|
\texttt{m\_wb\_bte\_o} & output & 2 & burst type (always 00) \\ \hline
|
90 |
|
|
\multicolumn{4}{c}{MMC/SD signals} \\ \hline
|
91 |
|
|
\texttt{sd\_cmd\_dat\_i} & input & 1 & command line input \\ \hline
|
92 |
|
|
\texttt{sd\_cmd\_out\_o} & output & 1 & command line output \\ \hline
|
93 |
|
|
\texttt{sd\_cmd\_oe\_o} & output & 1 & command line output enable \\ \hline
|
94 |
|
|
\texttt{sd\_dat\_dat\_i} & input & 4 & data line inputs \\ \hline
|
95 |
|
|
\texttt{sd\_dat\_out\_o} & output & 4 & data line outputs \\ \hline
|
96 |
|
|
\texttt{sd\_dat\_oe\_o} & output & 1 & data line outputs enable \\ \hline
|
97 |
|
|
\texttt{sd\_clk\_o\_pad} & output & 1 & clock for external MMC/SD card \\ \hline
|
98 |
|
|
\texttt{sd\_clk\_i\_pad} & input & 1 & clock for MMC/SD interface \\ \hline
|
99 |
|
|
\multicolumn{4}{c}{Interrupts} \\ \hline
|
100 |
|
|
\texttt{int\_cmd} & output & 1 & command transaction finished interrupt \\ \hline
|
101 |
|
|
\texttt{int\_data} & output & 1 & data transaction finished interrupt \\ \hline
|
102 |
|
|
\hline
|
103 |
|
|
\end{tabular}
|
104 |
13 |
jclaytons |
\label{tab:signals}
|
105 |
3 |
rozpruwacz |
\end{center}
|
106 |
|
|
\end{table}
|
107 |
|
|
|
108 |
|
|
\subsection{Clock consideration}
|
109 |
|
|
\label{sec:clock}
|
110 |
|
|
|
111 |
13 |
jclaytons |
The IP core needs two clock sources. The first is for Wishbone bus operation (\texttt{wb\_clk\_i}). There are no constraints for this clock.
|
112 |
|
|
The second is for MMC/SD interface operation (\texttt{sd\_clk\_i\_pad}).
|
113 |
|
|
\texttt{sd\_clk\_i\_pad} is used to drive the \texttt{sd\_clk\_o\_pad} output, which is the external MMC/SD card clock source, through an internal
|
114 |
|
|
clock divider. This clock divider is able to divide the \texttt{sd\_clk\_i\_pad} clock by 2, 4, 6, 8, ... etc. (2*n where n = [1..256]).
|
115 |
|
|
The \texttt{sd\_clk\_o\_pad} clock frequency depends on the MMC/SD specification. To fully utilize the transmission bandwidth \texttt{sd\_clk\_o\_pad}
|
116 |
|
|
should be able to perform at 25MHz frequency which imposes a minimum constraint of 50MHz on \texttt{sd\_clk\_i\_pad} clock.
|
117 |
3 |
rozpruwacz |
Clock inputs \texttt{wb\_clk\_i} and \texttt{sd\_clk\_i\_pad} can be sourced by the same signal.
|
118 |
|
|
|
119 |
|
|
\subsection{DMA engine}
|
120 |
|
|
\label{sec:dma}
|
121 |
|
|
|
122 |
13 |
jclaytons |
The DMA engine is used to lower the CPU usage during data transactions\footnote{"Data transaction" refers to any traffic on the data lines of MMC/SD card interface.}.
|
123 |
|
|
The DMA engine starts its operation immediately after the successful end of any read or write command transactions\footnote{"Command transaction" refers to any traffic on the command line.}
|
124 |
|
|
\footnote{"Read" or "write" commands refer to commands with data payload such as \textit{block read}(CMD17) or \textit{block write}(CMD24).}.
|
125 |
|
|
During write transactions, data is fetched from RAM automatically, starting from a known address. This address has to be configured by the CPU before sending any write commands.
|
126 |
|
|
Similarly, during read transactions, data is written to RAM automatically, starting from a known address.
|
127 |
|
|
This address also has to be configured by the CPU before sending any read commands. Because data transmission is half-duplex,
|
128 |
|
|
read and write addresses are placed in the same configuration register. The function of this register thus depends on the command to be sent.
|
129 |
3 |
rozpruwacz |
|
130 |
|
|
\subsection{Interrupt generation}
|
131 |
|
|
\label{sec:interrupt}
|
132 |
|
|
|
133 |
13 |
jclaytons |
Interrupts are useful when polling is not an option. There are two interrupt sources: One to signify the end of the command transaction (\texttt{int\_cmd} signal) and
|
134 |
|
|
one to signify the end of the data transaction (\texttt{int\_data} signal). Both interrupts use active high logic. All events that trigger an interrupt can be masked. (see \ref{sec:regs})
|
135 |
|
|
Events which are masked do not participate in interrupt generation(see Fig. \ref{img:events}).
|
136 |
3 |
rozpruwacz |
\begin{figure}[H]
|
137 |
|
|
\centering
|
138 |
|
|
\includegraphics[width=11cm]{../bin/events.png}
|
139 |
|
|
% ip_core.png: 384x469 pixel, 96dpi, 10.16x12.41 cm, bb=
|
140 |
|
|
\caption{Interrupt generation scheme}
|
141 |
|
|
\label{img:events}
|
142 |
|
|
\end{figure}
|
143 |
|
|
|
144 |
|
|
\subsubsection{Command transaction events}
|
145 |
|
|
\label{sec:cmd_events}
|
146 |
|
|
|
147 |
13 |
jclaytons |
The command transaction end interrupt is driven in response to command transaction events. The events are:
|
148 |
3 |
rozpruwacz |
\begin{description}
|
149 |
13 |
jclaytons |
\item[completion] - transaction completed successfully,
|
150 |
|
|
\item[error] - transaction completed with error (one or more of the following events occurred),
|
151 |
3 |
rozpruwacz |
\item[timeout] - timeout error (the card did not respond in a timely fashion),
|
152 |
13 |
jclaytons |
\item[wrong CRC] - CRC check error (CRC calculated from received response data did not match to the CRC field of the response),
|
153 |
3 |
rozpruwacz |
\item[wrong index] - index check error (response consists of wrong index field value).
|
154 |
|
|
\end{description}
|
155 |
|
|
|
156 |
|
|
\subsubsection{Data transaction events}
|
157 |
|
|
\label{sec:data_events}
|
158 |
|
|
|
159 |
13 |
jclaytons |
The data transaction end interrupt is driven in response to data transaction events. The events are:
|
160 |
3 |
rozpruwacz |
\begin{description}
|
161 |
13 |
jclaytons |
\item[completion] - transaction completed successfully,
|
162 |
|
|
\item[wrong CRC] - CRC check error (in case of write transaction, CRC received in response to write transaction was different than the one calculated by the core;
|
163 |
|
|
in case of read transaction, the CRC calculated from received data did not match to the CRC field of the received data),
|
164 |
|
|
\item[FIFO error] - internal FIFO error (in case of write transaction, tx FIFO became empty before all data was sent; in case of read transaction, rx FIFO became
|
165 |
|
|
full; both cases are caused by too slow of a wishbone bus or the wishbone bus being busy for too long)).
|
166 |
3 |
rozpruwacz |
\end{description}
|
167 |
|
|
|
168 |
|
|
|
169 |
|
|
|