OpenCores
URL https://opencores.org/ocsvn/phr/phr/trunk

Subversion Repositories phr

[/] [phr/] [trunk/] [doc/] [informe-tesis/] [reports/] [schedule_2013-03-20/] [schedule.tex] - Blame information for rev 242

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 229 guanucolui
%$Id: schedule.tex 228 2014-04-14 16:21:29Z guanucoluis $
2 71 guanucolui
\documentclass[11pt,a4paper,oneside]{article}
3
\usepackage[utf8]{inputenc}
4
\usepackage[spanish]{babel}
5
\usepackage{acronym}
6
\usepackage{graphicx}
7
\usepackage{multicol}
8
\usepackage{balance}
9
%\usepackage{subfig}
10
%\usepackage[cm]{fullpage}
11
\usepackage[a4paper]{geometry}
12
%\usepackage{subfigure}
13
\usepackage{float}
14
\usepackage{fancyhdr}
15
\usepackage{caption}
16
\usepackage{subcaption}
17 79 guanucolui
\usepackage{amssymb}
18 160 guanucolui
\usepackage{fancyvrb}
19
\usepackage{listings}
20
\usepackage{xcolor}
21
 
22
\definecolor{light-gray}{gray}{0.9}
23
 
24
\lstset{
25
  basicstyle=\ttfamily\footnotesize,%\scriptsize,
26
  backgroundcolor=\color{light-gray},
27
  language=bash,
28
  keywordstyle=\bfseries,
29
  breaklines=true,
30
  keywords=[2]{INT8U,INT16U,DIO\_DI,DIO\_DO,CPU\_INT16S,CPU\_INT08U}
31
}
32
 
33
\lstset{literate=
34
  {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
35
  {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
36
  {à}{{\`a}}1 {è}{{\'e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
37
  {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
38
  {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
39
  {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
40
  {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
41
  {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
42
  {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
43
  {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
44
  {€}{{\EUR}}1 {£}{{\pounds}}1 {"}{{``}}1 {~}{{$\sim$}}1
45
}
46
 
47
\renewcommand{\lstlistingname}{Código}
48
 
49 125 guanucolui
\title{Plataforma de hardware reconfigurable \\ \small{JTAG -- Configuración OOCD-Links, (\textsl{Hardware \& Software})}}
50 231 guanucolui
\author{Luis A. Guanuco}
51 229 guanucolui
\date{Marzo 2013\\\scriptsize{$Rev: 231 $}}
52 71 guanucolui
\pagestyle{fancy}
53
\addtolength{\textheight}{2cm}
54
%\addtolength{\voffset}{-1cm}
55
%\addtolength{\textwidth}{1cm}
56
 
57
\begin{document}
58
 
59
\maketitle{}
60
 
61 79 guanucolui
%\chead{\includegraphics[width=0.1\textwidth]{images/logov2_ES}}
62
\begin{figure}[h]
63
  \centering
64
  \includegraphics[width=0.3\textwidth]{images/logov2_ES}
65
\end{figure}
66 71 guanucolui
 
67 160 guanucolui
\tableofcontents{}
68
 
69 71 guanucolui
\section{Introducción}
70
\label{sec:intro}
71
 
72 79 guanucolui
El presente reporte desarrolla la continuación del armado, testeo de las distintas placas que conformarán la \emph{\ac{PHR}}. Además, gran parte del informe se basa en el \textsl{software} que permitirá la comunicación entre la PC y el programador \ac{jtag}.
73 71 guanucolui
 
74 160 guanucolui
\section{\textsl{Software} \ac{openocd}}
75
\label{sec:soft-openocd}
76 79 guanucolui
Los \textsl{scripts} utilizados se obtuvieron del manual de usuario del \textsl{software} \ac{openocd} que se encuentra publicado en la web\footnote{http://openocd.sourceforge.net/doc/html/index.html}.
77
Anteriormente al uso de \ac{openocd} se intentó utilizar el \textsl{software} UrJTAG\footnote{http://urjtag.org/} pero debido a la limitaciones que presentaba la versión estable se lo descartó.
78 71 guanucolui
 
79 79 guanucolui
La instalación y puesta en funcionamiento del \textsl{software} \ac{openocd} se realiza en tres etapas:
80 71 guanucolui
\begin{itemize}
81 79 guanucolui
\item Instalación del \textsl{software} \ac{openocd}
82 71 guanucolui
\item \textsl{Interface}
83
\end{itemize}
84
 
85 160 guanucolui
\subsection{Instalación del \textsl{software} \ac{openocd}}
86
\label{sec:instal-openocd}
87 79 guanucolui
Se recomienda descargar la última versión estable de \ac{openocd} y compilarlo manualmente con los correspondientes argumentos necesarios para el \textsl{driver} a utilizar. En nuestro caso utilizaremos el \textsl{driver} libftdi\footnote{http://www.intra2net.com/en/developer/libftdi/}. Además en la documentación oficial de \ac{openocd} se hace referencia a los requerimientos para cada \ac{SO}. Como ya se mencionó en anteriormente reportes, se utilizará herramientas libres, por lo que se realizará la instalación en un \ac{SO} GNU/Linux Debian ``Squeeze'' 6.0. Como así también los drivers para el \textsl{hardware} están licenciados como \ac{GPL}.
88
Un documento de referencia muy útil es la Nota Técnica \emph{Entorno de desarrollo de \textsl{firmware} sobre arquitecturas ARM Cortex-M3, basado en herramientas libres}\cite{2012-SSE-FIUBA-NT01-00}.
89 71 guanucolui
 
90 160 guanucolui
\subsection{\textsl{Interface}}
91 79 guanucolui
\textsl{Interface} hace referencia al \textsl{hardware} que realiza el enlace entre el puerto \ac{jtag} del dispositivo al que se quiere acceder y la PC. En éste caso el \textsl{interface} será nuestra placa OOCD-Links. \ac{openocd} dispone de \textsl{scripts} para varios \textsl{interface} entre los cuales se encuentra nuestra placa programadora. La información que proporciona éste código hace a que tipo de driver se utilizará como así también identificación del dispositivo central. A continuación se puede ver la estructura del archivo \texttt{oocdlink.cfg}.
92
 
93 160 guanucolui
\begin{lstlisting}
94 71 guanucolui
#
95
# Joern Kaipf's OOCDLink
96
#
97
# http://www.joernonline.de/contrexx2/cms/index.php?page=126
98
#
99
 
100
interface ft2232
101
ft2232_device_desc "OOCDLink"
102
ft2232_layout oocdlink
103
ft2232_vid_pid 0x0403 0xbaf8
104
jtag_khz 5
105 160 guanucolui
\end{lstlisting}
106 71 guanucolui
 
107 79 guanucolui
Para obtener el VIP (vendor ID) y el PID (product ID) se lo puede obtener una vez conectada el \textsl{interface} a la PC y listando los dispositivos conectados al puerto USB, por ejemplo,
108 71 guanucolui
 
109 160 guanucolui
\begin{lstlisting}
110 79 guanucolui
luis@luis-laptop:openocd$ lsusb
111
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
112
Bus 006 Device 002: ID 0403:6010 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
113
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
114
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
115
Bus 001 Device 002: ID 0bda:0158 Realtek Semiconductor Corp. USB 2.0 multicard reader
116
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
117 160 guanucolui
\end{lstlisting}
118 79 guanucolui
 
119
En la salida del \texttt{lsusb} se puede ver que tenemos el dispositivo \emph{0403:6001 Future Technology Device International}. Luego utilizamos éste dato para modificar o crear nuestro archivo \texttt{openocd.cfg} que será argumento de \ac{openocd}.
120
 
121 71 guanucolui
\subsection{Documentación de comandos y \textsl{scripts}}
122 79 guanucolui
Una vez que se logra comunicar el \textsl{interface} \ac{jtag} con el  \textsl{software} \ac{openocd}, se crean los archivos necesarios para acceder a los dispositivos que se encuentren conectados en el protocolo \ac{jtag}.
123
Para correr \ac{openocd} correctamente se necesita pasarle algunos simples argumentos,
124 160 guanucolui
\begin{lstlisting}
125 79 guanucolui
luis@luis-laptop:trunk$ openocd -h
126
Open On-Chip Debugger 0.6.1 (2012-12-08-02:21)
127
Licensed under GNU GPL v2
128
For bug reports, read
129
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
130
Open On-Chip Debugger
131
Licensed under GNU GPL v2
132
--help       | -h       display this help
133
--version    | -v       display OpenOCD version
134
--file       | -f       use configuration file <name>
135
--search     | -s       dir to search for config files and scripts
136
--debug      | -d       set debug level <0-3>
137
--log_output | -l       redirect log output to file <name>
138
--command    | -c       run <command>
139 160 guanucolui
\end{lstlisting}
140 79 guanucolui
 
141
Los más importantes de éstos son \texttt{--file}, que permite definir que archivo de configuración \ac{openocd} utilizará. Dentro de éste archivo se podría agregar cualquiera de los otros comandos.
142
Es recomendable que la estructura de archivos sea la siguiente,
143 71 guanucolui
\begin{itemize}
144 79 guanucolui
\item Directorio raíz de trabajo (por ej.: \texttt{openocd\_dir})
145
  \begin{itemize}
146
  \item [$\rightarrow$] \texttt{core.cfg}, contiene los comandos básicos para que \ac{openocd} reconozca el \textsl{interface}
147
  \item [$\rightarrow$] \texttt{openocd.cfg}, contiene los comandos que configura el acceso al protocolo \ac{jtag}
148
  \item [$\rightarrow$] \texttt{device.cfg}, contiene los comandos propios de los dispositivos a conectar en la cadena \ac{jtag}, por ejemplo ID, cantidad de bits de los registros, etc.
149
  \item [$\rightarrow$] \texttt{files/...}, también se debe conciderar tener un subdirectorio en el cual almacenar archivos que se transerirán a los dispositivos mediante \ac{jtag}, por ejemplo: archivos .svf, archivos .elf, etc.
150
  \end{itemize}
151 71 guanucolui
\end{itemize}
152
 
153 79 guanucolui
A continuación se describen comandos útiles que se pueden aplicar en forma general a cualquier dispositivo a conectar.
154
 
155 160 guanucolui
\subsection{Agregar un \ac{TAP}}
156 79 guanucolui
Para acceder a un dispositivo mediante el protocolo \ac{jtag}, se debe proporcionar especificaciones del mismo. Muchas veces ésta información no se encuentra fácil de acceder en la hoja de datos de los dispositivos conectados al \textsl{interface}. Para situaciones como la descrita, \ac{openocd} dispone de un modo llamado \textsl{Autoprobing}\cite{openocd-manual-autoprobing}.
157
 
158
En definitiva, para capturar la información del dispositivo conectado se debe generar una archivo base \texttt{openocd.cfg} como el que se muestra a continuación,
159 160 guanucolui
\begin{lstlisting}
160 71 guanucolui
# OpenOCD configuration script
161
# 2013-03-25 lguanuco
162
# Hardware:
163
# - OOCD-Link-s
164
 
165
# ("3": max. verbosity level)
166
debug_level 3
167
# (set log file)
168
log_output out.log
169
 
170
source [find core.cfg]
171
 
172
# 3. Other configs
173
 
174
reset_config trst_and_srst
175
jtag_rclk 8
176 160 guanucolui
\end{lstlisting}
177 79 guanucolui
Luego de correr \ac{openocd}, se debe acceder al archivo de salida con el nombre que se asignó en el archivo \texttt{openocd.cfg}, \texttt{out.log}. Este archivo registra todos los mensajes de salida que genera \ac{openocd}, a continuación se muestra parte de éste archivo donde se puede observar información útil para generar el \ac{TAP} de dicho dispositivo.
178 160 guanucolui
\begin{lstlisting}
179 71 guanucolui
...
180
Debug: 129 273 core.c:323 jtag_call_event_callbacks(): jtag event: TAP reset
181
Warn : 130 359 core.c:1145 jtag_examine_chain(): AUTO auto0.tap - use "jtag newtap auto0 tap -expected-id 0x4f1f0f0f ..."
182
Debug: 131 359 core.c:1323 jtag_tap_init(): Created Tap: auto0.tap @ abs position 0, irlen 0, capture: 0x1 mask: 0x3
183
Debug: 132 359 core.c:1208 jtag_validate_ircapture(): IR capture validation scan
184
Warn : 133 369 core.c:1244 jtag_validate_ircapture(): AUTO auto0.tap - use "... -irlen 4"
185
Debug: 134 369 core.c:1267 jtag_validate_ircapture(): auto0.tap: IR capture 0x01
186
Debug: 135 369 openocd.c:145 handle_init_command(): Examining targets...
187
...
188 160 guanucolui
\end{lstlisting}
189 71 guanucolui
 
190
Una vez obtenida éstas lineas se puede rescatar los datos más importantes que son,
191
\begin{itemize}
192
\item \emph{id}
193
\item \emph{irlen}
194
\item \emph{capture}
195 79 guanucolui
\item \emph{mask}
196 71 guanucolui
\end{itemize}
197
 
198 79 guanucolui
Por lo tanto, con estos datos se puede generar nuestro propio \textsl{script} en el cual agregar manualmente el \ac{TAP}, por ejemplo \texttt{lpc2124.cfg}
199 160 guanucolui
\begin{lstlisting}
200 79 guanucolui
jtag newtap arm_lpc2124 tap -irlen 4 -ircapture 0x01 -irmask 0x3 -expected-id 0x4f1f0f0f
201 160 guanucolui
\end{lstlisting}
202 71 guanucolui
 
203 160 guanucolui
\subsection{Multiples \ac{TAP}}
204 79 guanucolui
Muchas plataformas o kits de desarrollo tienen multiples TAPs. Por ejemplo, en nuestro caso tenemos conectados dos dispositivos a la cadena \ac{jtag} que son la \ac{FPGA} y la memoria \ac{PROM} de programación del mismo. Si la conexión es tal que,
205
 
206
\begin{itemize}
207
\item OpenOCD TDI(output) $\rightarrow$ XC3S50A pin TDI(BS input).
208
\item XC3S50A pin TDO(BS input) $\rightarrow$ XCF01S pin TDI.
209
\item XCF01S pin TDO(BS output) $\rightarrow$ OpenOCD TDO(input).
210
\end{itemize}
211
 
212
Los comandos para agregar éstos TAPs deberán respetar él orden con el que fueron conectados físicamente,
213 160 guanucolui
\begin{lstlisting}
214 79 guanucolui
...
215
jtag newtap xcf01s tap -irlen ...
216
jtag newtap xc3s50a tap -irlen ...
217
...
218 160 guanucolui
\end{lstlisting}
219 79 guanucolui
 
220
Es decir, se agrega los TAPs recorriendo la cadena JTAG desde el pin TDO al pin TDI desde el interface, aquí sería desde la placa OOCDLink.
221
 
222 161 guanucolui
\subsection{Programación del \ac{CPLD}}
223 79 guanucolui
Para los \ac{CPLD}, primero se debe tener el archivo \ac{SVF}, que es generado por la herramienta con la que se diseña y sintetiza el código VHDL o Verilog. En éste caso se utiliza el \textsl{software} ISE Xilinx. Una vez que se tiene el archivo \ac{SVF}, desde \ac{openocd}, se corre el siguiente comando;
224 160 guanucolui
\begin{lstlisting}
225 79 guanucolui
svf -tap tap_name file.svf quiet
226 160 guanucolui
\end{lstlisting}
227 71 guanucolui
Lo que generaría una salida como la que sigue,
228 160 guanucolui
\begin{lstlisting}
229
svf processing file: ``file.svf''
230 71 guanucolui
500 kHz
231 79 guanucolui
...
232
...
233 71 guanucolui
Time used: 0m7s478ms
234
svf file programmed successfully for 8468 commands
235 160 guanucolui
\end{lstlisting}
236 71 guanucolui
 
237 79 guanucolui
En el caso de que se tenga problemas en la transferencia del archivo, se podría probar bajando la frecuencia de la comunicación \ac{jtag}.
238 71 guanucolui
 
239 79 guanucolui
Algo interesante se puede observar en el archivo \texttt{file.svf}, pues en una de sus lineas tiene el IDCODE del dispositivo al que se va a transferir, que debería coincidir con el que se le pasa cuando se agrega el \ac{TAP} al código de \ac{openocd}. O quizá diferenciarse con el valor hexadecimal más significativo, que indica la versión del dispositivo.
240 160 guanucolui
\begin{lstlisting}
241 71 guanucolui
...
242
//Loading device with 'idcode' instruction.
243
SIR 8 TDI (fe) SMASK (ff) ;
244
SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f9604093) MASK (0fffffff) ;
245
//Check for Read/Write Protect.
246
SIR 8 TDI (ff) TDO (01) MASK (e3) ;
247
//Boundary Scan Chain Contents
248
//Position 1: xc9572xl
249
...
250 160 guanucolui
\end{lstlisting}
251 71 guanucolui
 
252 79 guanucolui
La placa OOCD-Links cuenta con un dispositivo central, FT2232D. Éste dispositivo posee dos alimentaciones, por una parte la alimentación de núcleo del circuito integrado y por otro lado la alimentación de los interfaces de salida. La primera alimentación es tomada desde el puerto USB al que se encuentra conectado, mientas que la alimentación de sus puertos de conexión lo toma del conector \ac{jtag}, del \emph{Pin 1}. De tal manera que la tensión de los puertos de conexión \ac{jtag} del \textsl{interface} siempre tiene la misma tensión que maneja las señales \ac{jtag} de la placa conectada. Es decir, si se hace una conexión entre la placa OOCD-Links y una placa con un CPLD XC9572XL, ambas tendrán la misma tensión en sus puertos \ac{jtag}, en éste caso 3.3V.
253 71 guanucolui
 
254 79 guanucolui
Un inconveniente podría ser el consumo de corriente, pues el regulador de la placa OT-CPLD se tendría que proporcionar energía a la placa OOCD-Links, pero como es en el proceso de programación y como proceso de testeo, no debería haber inconvenientes. Igualmente se debe tener en cuenta.
255 71 guanucolui
 
256
Se encontró en la nota de aplicación de Xilinx [\emph{ug445.pdf}] que para los pines TDI y TMS de los CPLD XC9572XL, se dispone de resistores \textsl{pull-ups} internos. Por lo que no es necesario colocar resistores externos en el diseño del PCB.
257
 
258 79 guanucolui
\subsection{\textsl{Debugging}}
259
Para el \textsl{debugging} se utiliza varias herramientas y todas ellas corren sobre terminales \textsl{bash} de nuestro \ac{SO}. Entre éstos \textsl{software}, tenemos
260
\begin{itemize}
261
\item \emph{terminator}, múltiples terminales en una sola ventana (escritorio GNOME).
262
\item \emph{tailf}, sigue la escritura de un archivo( por ej.: archivos de .log).
263
\item \emph{ccze}, un robusto visor de archivos log con la posibilidad de colorear las líneas.
264
\item \emph{grep}, imprime las líneas similares a un patrón.
265
\end{itemize}
266 71 guanucolui
 
267 79 guanucolui
Todos éstos comandos son utilizados a la vez. La forma de trabajo es correr \emph{terminator} y luego dividir la pantalla en varios terminales al vez, eso será útil para ingresar comandos al puerto telnet 4444 donde se puede acceder al \textsl{interface} \ac{jtag}. Los otros \textsl{software} se utilizar a modo de \textsl{debugger}, pues nos permiten resaltar mensajes que genera \ac{openocd}. Por ejemplo, una forma estándar de ver la salida es,
268
 
269 160 guanucolui
\begin{lstlisting}
270 79 guanucolui
luis@luis-laptop:~$ tailf  codigo/jtag/openocd/find_tap/out.log | ccze -A -o scroll
271 160 guanucolui
\end{lstlisting}
272 79 guanucolui
 
273
También se podría utilizar \emph{grep} para filtrar o diferenciar las líenas en función si son \emph{\textsl{Error, Warning, Debug \& User}}.
274
 
275 160 guanucolui
 
276
\section{\textsl{Software} \emph{xc3sprog}}
277
\label{sec:soft-xc3sprog}
278
 
279
Si bien el \ac{openocd} se consideró como el \textsl{software} a utilizar, se encontraron algunos inconvenientes a la hora de interactuar con la placa \ac{PHR}. El problema, en principio, se debía a que el \ac{openocd} no puede manejar archivos binarios que pesaran más de 2Mb[REF]. Existe la posibilidad de modificar \ac{openocd} de forma tal que se pueda transferir datos binarios con tamaños superiores a 2Mb pero quizá genere otro tipos de errores como consecuencia.
280
 
281
Frente al inconveniente planteado en el párrafo anterior, se busco herramientas alternativas. Mediante el contacto con otros desarrolladores/usuarios de plataformas basadas en PLDs se encontró el \textsl{software} \emph{xc3sprog}. Este programa permite con unos simples comandos programar varias FPGAs, memorias PROM y hasta microcontroladores mediante el interfaz \ac{jtag}.
282
 
283
En una aplicación típica, xc3sprog lee un archivo \texttt{.bit} generado por la herramienta de diseño de la FPGA y programará el chip PROM de la placa que contiene la FPGA. Como su nombre lo indica, xc3sprog fue diseñado originalmente para la familia de FPGA Sparta-3 de Xilinx. Sin embargo se ha extendido el manejo a varios otros tipos de dispositivos que incluyen otras FPGAs, CPLDs, XCF flash PROMs, microprocesadores AVRs de Atmel y memorias flash SPI. El \textsl{software} xc3sprog soporta varios cables JTAG, incluyendo cables de puerto paralelo y programadores USB.
284
 
285
 
286
\subsection{Instalación del \textsl{software} xc3sprog}
287 163 guanucolui
\label{sec:install-xc3sprog}
288 160 guanucolui
 
289
Para obtener el xc3sprog, primero se debe descargar el código fuente desde SourceForge\footnote{http://sourceforge.net/projects/xc3sprog/}. El proceso se realizará sobre un terminal del \ac{SO} GNU/Linux que estemos utilizando.
290
 
291
\begin{lstlisting}
292
luis@luis-laptop:~$ cd ~/
293
luis@luis-laptop:~$ mkdir sourceforge
294
luis@luis-laptop:~$ cd sourceforge
295
luis@luis-laptop:~$ svn co https://xc3sprog.svn.sourceforge.net/svnroot/xc3sprog/trunk xc3sprog
296
\end{lstlisting}
297
 
298
Luego se debe compilare e instalar el programa
299
 
300
\begin{lstlisting}
301
luis@luis-laptop:~$ cd  xc3sprog
302
luis@luis-laptop:~$ cmake .
303
luis@luis-laptop:~$ make
304
luis@luis-laptop:~$ make install
305
\end{lstlisting}
306
 
307
En esta sección no se hace referencia al \textsl{driver} de la placa OOCDLink pues los pasos para la instalación del controlador son los mismos que se describieron en la sección \ref{sec:instal-openocd}.
308
 
309
\subsection{Documentación de comandos y \textsl{scripts}}
310
 
311
Al igual que el \textsl{software} \ac{openocd}, xc3sprog recibe varios argumentos en función de como se quiera interactuar con  los dispositivos a programar. Para listar las opciones que se tienen, se debe correo el programa desde el directorio donde se construyó el proyecto, llamado \texttt{build},
312
 
313
\begin{lstlisting}
314
luis@luis-laptop:~$ cd ~/sourceforge/xc3sprog/build
315
luis@luis-laptop:~$ ./xc3sprog
316 229 guanucolui
XC3SPROG (c) 2004-2011 xc3sprog project $Rev: 231 $ OS: Linux
317 160 guanucolui
Free software: If you contribute nothing, expect nothing!
318
Feedback on success/failure/enhancement requests:
319
        http://sourceforge.net/mail/?group_id=170565
320
Check Sourceforge for updates:
321
        http://sourceforge.net/projects/xc3sprog/develop
322
 
323
usage:  xc3sprog -c cable [options] <file0spec> <file1spec> ...
324
        List of known cables is given with -c follow by no or invalid cablename
325
        filespec is filename:action:offset:style:length
326
        action on of 'w|W|v|r|R'
327
        w: erase whole area, write and verify
328
        W: Write with auto-sector erase and verify
329
        v: Verify device against filename
330
        r: Read from device,write to file, don't overwrite existing file
331
        R: Read from device and write to file, overwrite existing file
332
        Default action is 'w'
333
 
334
        Default offset is 0
335
 
336
        style: One of BIT|BIN|MCS|IHEX|HEX
337
        BIT: Xilinx .bit format
338
        BIN: Binary format
339
        MCS: Intel Hex File, LSB first
340
        IHEX: INTEL Hex format, MSB first (Use for Xilinx .mcs files!)
341
        HEX:  Hex dump format
342
        Default for FPGA|SPI|XCF is BIT
343
        Default for CPLD is JED
344
        Default for XMEGA is IHEX
345
        Default length is whole device
346
\end{lstlisting}
347
 
348
xc3sprog utiliza dos archivos más que ofrecen mayor información y configuración tanto al \textsl{interface} JTAG como también sobre los dispositivos que vayamos a programar. Estos archivos se encuentran en el mismo directorio \texttt{build} donde se compiló el programa, estos son: \texttt{cablelist.txt} y \texttt{devlist.txt}.
349
 
350
\subsubsection{Configuración del \textsl{interface}}
351
\label{sec:xc3sprog-cablelist}
352
 
353
El archivo \texttt{cablelist.txt} contiene, por cada línea, diferentes tipos de configuraciones para \textsl{interface} de programación JTAG. Si bien son varios, a continuación se listan algunos de los más reconocidos en los sistemas embebidos.
354
\begin{lstlisting}
355
luis@luis-laptop:build$ cat cablelist.txt
356
# Alias       Type  OptString Max_Freq
357
# OptString for ftdi:
358
# VID:PID:PRODDESC:INTERFACE:DBUS_DATA:DBUS_EN:CBUS_DAT:ACBUS_EN
359
# OptString for pp:
360
# OptString for xps:  VID:PID
361
# Max_Freq == 0 mean use maximum speed of device
362
# Use 1500000 for all cable connected cables and max for all on board cables
363
 
364
ftdi          ftdi    1500000 0x0403:0x6010:
365
ftdiphr       ftdi    6000000 0x0403:0x6010:
366
papilio       ftdi    6000000 0x0403:0x6010:
367
ft232h        ftdi    1500000 0x0403:0x6014:
368
amontec       ftdi    1500000 0x0403:0xcff8::1:0x00:0x10:0x00:0x00
369
olimex        ftdi    1500000 0x15b1:0x0003::1:0x00:0x10:0x00:0x08
370
knob2usb      ftdi    0       0x0403:0x6010:KNOB2USB:0:0x00:0x10:0x00:0x40
371
xpc           xpc     0       0x03fd:0x0008
372
llbbc08       fx2     0       0xfffe:0x0018
373
pp            pp      0       NULL
374
dlc5          pp      0       NULL
375
jtaghs1       ftdi    1500000 0x0403:0x6010:Digilent Adept USB Device:0:0x80:0x80:0x00:0x0
376
turtelizer    ftdi    1500000 0x0403:0xbdc8:Turtelizer JTAG/RS232 Adapter:0:0x00:0x10:0x00:0x0
377
arm-usb-ocd-h ftdi    1500000 0x15ba:0x002b::1:0x00:0x10:0x00:0x08
378
\end{lstlisting}
379
Se puede ver que el formato de este documento consiste en
380
\begin{itemize}
381
\item El nombre con que se define el \textsl{inteface}
382
\item El \textsl{hardware} que se utiliza, es decir, si se utiliza el puerto paralelo, el usb a través de un dispositivo FTDI, etc.
383
\item La frecuencia en Hertz a la que trabajará el \textsl{interface} JTAG
384
\item El identificador del \textsl{hardware} según el \ac{SO} GNU/Linux.
385
\end{itemize}
386
Se toma como ejemplo algunas de estas configuraciones que utilice como base el dispositivo FTDI y se agrega una nueva línea con la configuración de nuestra placa OOCDLink. Es la segunda configuración  disponible del archivo \texttt{cablelist.txt},
387
\begin{lstlisting}
388
  ftdiphr       ftdi    6000000 0x0403:0x6010:
389
\end{lstlisting}
390
 
391
\subsubsection{Dispositivos soportados}
392
\label{sec:xc3sprog-devlist}
393
 
394
El archivo \texttt{devlist.txt} contiene información de los diferentes dispositivos soportados por xc3sprog. Este documento se presente a modo descriptivo pues no tenemos por que modificar ninguna de las líneas de este archivo. El programa xc3sprog utiliza este documento para obtener fundamentalmente el tamaño de algunos registros mediante la identificación del \emph{IDCODE} que proporciona todo los dispositivos JTAG cuando son escaneados. Como se podrá apreciar, se ha evitado incluir todos los dispositivos ya que son varias líneas, por lo que se utilizó los puntos $\cdots$ para acortar el documento.
395
 
396
\begin{lstlisting}
397
luis@luis-laptop:build$$ cat devlist.txt
398
# IDCODE IR_len ID_Cmd Text
399
...
400
04001093      6    0x9 XC6SLX9
401
04002093      6    0x9 XC6SLX16
402
04004093      6    0x9 XC6SLX25
403
...
404
02210093      6    0x9 XC3S50A
405
02218093      6    0x9 XC3S200A
406
02220093      6    0x9 XC3S400A
407
02228093      6    0x9 XC3S700A
408
02230093      6    0x9 XC3S1400A
409
...
410
05044093      8    0xfe XCF01S
411
05045093      8    0xfe XCF02S
412
05046093      8    0xfe XCF04S
413
...
414
#XC95XL
415
09602093      8  0xfe XC9536XL
416
09604093      8  0xfe XC9572XL
417
09608093      8  0xfe XC95144XL
418
09616093      8  0xfe XC95288XL
419
...
420
#unsupported
421
#Virtex2
422
01020093      6     5 XC2V500
423
#XC95
424
09502093      8  0xfd XC9536
425
09504093      8  0xfd XC9572
426
09506093      8  0xfd XC95108
427
...
428
##Atmel
429
#list should not care for the version part
430
0978203f      4   0x1 AT90USB
431
0958103f      4   0x1 AT90CAN32
432
0968103f      4   0x1 AT90CAN64
433
0978103f      4   0x1 AT90CAN128
434
...
435
#ARM 7 in ICE Mode (e.g. AT91SAM7X)
436
3f0f0f0f      4   0xe  ARM-ICE-MODE
437
4f1f0f0f      4   0xe  ARM-ICE-MODE(ARM7TDMI-S rev4)
438
 
439
#AVR32
440
01e8203f     5   0x1 AT32AP7000
441
 
442
#STM
443
06410041     5   0x1 STM32L1_Med_density
444
...
445
#ARM Debug
446
3BA00477     4   0xe ARM_Cortex-M3_r1p1-01rel0
447
4BA00477     4   0xe ARM-Cortex-M4F_r0p1
448
 
449
#Unsure about IR_Len...
450
0270817f     11  0x1 BCM2835
451
 
452
#Manufacturer list
453
00000093        99  0 Xilinx_Unknown
454
0000003f        99  0 Atmel_Unknown
455
\end{lstlisting}
456
 
457
\subsubsection{Comandos básicos}
458
\label{sec:xc3sprog-com-bas}
459
 
460
En el \textsl{usage} del xc3sprog define una estructura básica para correr comandos. El comando se debe correr desde el directorio \texttt{build} donde se ha compilado el programa.
461
\begin{lstlisting}
462
  xc3sprog -c cable [options] <file0spec> <file1spec> ...
463
\end{lstlisting}
464
En este comando, lo principal es definir que \emph{cable} se utilizará de la lista que tenemos en el archivo \texttt{cablelist.txt}. Para esto, se debe indicar luego del \texttt{-c} el nombre de la lista de \textsl{interfaces}. Una vez definido el cable, se concatenan demás tareas que debe procesar el xc3sprog, pero ya teniendo referencia a que tipo de \textsl{interface} está conectado. Los tareas son,
465
\begin{description}
466 161 guanucolui
\item[\texttt{-j}] Detecta la cadena JTAG e imprime una lista de dispositivos encontrados. La numeración de la posición del dispositivo en la cadena se cuenta desde el dispositivo conectado al pin TDO del \textsl{interface}.
467
\item[\texttt{-p val}] Define a que dispositivo de la cadena JTAG se está por acceder, donde \texttt{val} es el número que ocupa en la cadena y es visualizado por el comando \texttt{-j}. El valor por defecto de \texttt{val} es 0.
468
\item[\texttt{-T n}] Testea la cadena JTAG \texttt{n} veces. Cuando se corre en modo ISF, se testea la conexión SPI.
469 160 guanucolui
  \begin{itemize}
470
  \item Si \texttt{n} no se específica, el valor por defecto es de 10,000 veces.
471
  \item Si \texttt{n = 0} se mantendrá en un testeo para siempre.
472
  \end{itemize}
473 161 guanucolui
\item[\texttt{-J freq}] Ejecuta a una frecuencia específica el clock del JTAG (\texttt{freq} se encuentra en Hz). Si no se proporciona este dato, o \texttt{freq = 0}, el \textsl{interface} trabajará a la máxima frecuencia que soporte y se encuentre definido en el archivo \texttt{cablelist.txt} (véase \ref{sec:xc3sprog-cablelist}).
474
\item[\texttt{-e}] Borra el dispositivo seleccionado por el parámetro \texttt{-p}.
475
\item[\texttt{-I file}] Define si se trabaja en modo ISF para programar una memoria serial \textsl{flash} interna. La memoria \textsl{flash} está junta al dispositivo JTAG primario, pero no es accesible directamente mediante la cadena JTAG. El \textsl{interface} JTAG primario es usado como un \emph{proxy} para enviar datos sobre SPI a la memoria \textsl{flash}. Si se especifica el argumento \texttt{file}, se comenzará por programar el bitfile especificado en el \textsl{interface} JTAG primario (típicamente una FPGA).
476
\item[\texttt{-R}] Envía un comando de reconfiguración al dispositivo de memoria del \textsl{hardware} utilizado (por ejemplo: XVC, XCF, XCFP para las FPGA o directamente a los dispositivos XC3S, XC6S, XC2V).
477
\item[\texttt{-m mapdir}] Búsqueda de archivos de mapeo (XC2C) en el directorio especificado por \texttt{mapdir}. Los archivos de mapeo (\textsl{map files}) son requeridos para manejar archivos JEDEC durante la programación de los CPLDs. Si se especifica el directorio, por defecto el valor que se toma es \texttt{\$XC\_MAPDIR}.
478
\item[\texttt{-d /dev/parportN}] Especifica el puerto paralelo a utilizar. Si no es especificado, por defecto se utiliza el valor \texttt{\$XCPORT} o \texttt{/dev/parport0}.
479
\item[\texttt{-s serialnum}] Utiliza el puerto USB con \textsl{string} de número de serie específico.
480
\item[\texttt{-L}] Usa el controlador \emph{libFTD2XX} en luag de \emph{libftdi} para acceder a un \textsl{interface} basados en los dispositivos FTDI.
481
\item[\texttt{-D}] Genera los archivos \texttt{cablelist.txt} y \texttt{devlist.txt} en el directorio actual. Si ya existiesen, xc3sprog intentará generar los mismos archivos pero agregando al nombre de los archivos un número que incrementará.
482
\item[\texttt{-v}] Habilita la salida formal detallada (\textsl{verbose}).
483
\item[\texttt{-h}] Imprime un texto de ayuda para el programa.
484 160 guanucolui
\end{description}
485
 
486 161 guanucolui
Luego de reconocer los diferentes comandos que permiten ejecutarse con xc3sprog, se presenta a continuación algunas acciones posibles que se pueden correr. Cada una de estas acciones está compuesta de un archivo \texttt{filename} seguido opcionalmente por atributos de la forma:
487
\begin{lstlisting}
488 164 guanucolui
<filename:action:offset:style:length>
489 161 guanucolui
\end{lstlisting}
490
\begin{description}
491
\item[\texttt{filename}] Corresponde al archivo que será escrito por el dispositivo seleccionado, o también puede ser el archivo que almacena el dato para luego ser leído por el dispositivo que se encuentra en la cadena JTAG.
492
\item[\texttt{action}] Es una letra que indica si se escribe, lee, o verifica el dispositivo. Si es especificado, la acción de escritura es indicado por defecto.
493
  \begin{description}
494
  \item[\texttt{w}] Borra, luego escribe los datos desde el archivo al dispositivo y por último verifica.
495
  \item[\texttt{W}] Escribe con un tipo de borrado \textsl{auto-sector}, luego verifica. Este modo permite borrar solo el espacio necesario.\\
496
  \item[\texttt{v}] Verifica el dato del dispositivo comparando el un archivo especificado.
497
  \item[\texttt{r}] Lee los datos desde el dispositivo y los escribe al archivo (sin sobre-escritura).
498
  \item[\texttt{R}] Lee los datos desde el dispositivo y los escribe al archivo, si ya existe el archivo lo sobreescribe.
499
  \end{description}
500
\item[\texttt{offset}] El desplazamiento interno en \textsl{byte} del dispositivo donde la escritura/lectura deberá comenzar. Solo soportado para dispositivos SPI, XCFxxS y XMEGA.
501
\item[\texttt{style}] Define el formato del archivo especificado.
502
  \begin{description}
503
  \item[\texttt{BIT}] Formato de archivo de Xilinx \texttt{.BIT}. Por defecto para los dispositivos FPGA, XCF y memorias SPI.
504
  \item[\texttt{BIN}] Archivo binario.
505
  \item[\texttt{MCS}] Formato de archivo de Xilinx \texttt{.MCS}.
506
  \item[\texttt{IHEX}] Formato de Intel \texttt{HEX}. También usado por los formatos PROMGEN de Xilinx cuando escribe archivos MCS. Por defecto para los archivos XMEGA.
507
  \item[\texttt{HEXRAW}] Secuencia en bruto de dígitos hexadecimales.
508
  \item[\texttt{JEDEC}] Por defecto para los dispositivos CPLDs.
509
  \end{description}
510
\item[\texttt{length}] El número de \textsl{bytes} a programar/leer. Solo soportado para SPI, XCFxxS y XMEGA.
511
\end{description}
512 160 guanucolui
 
513 163 guanucolui
\subsection{Programación de \ac{FPGA} y memoria PROM}
514 160 guanucolui
 
515 163 guanucolui
Para demostrar el uso del xc3sprog se realizan algunas pruebas sobre la placa \ac{PHR}. Esta placa dispone de un puerto JTAG al cual se le conectan dos dispositivos en cadena, la FPGA de Xilinx Spantan-3 XC3S200A y su correspondiente memoria de PROM de programación XCF02S. Aquí no se detallará el manejo de la herramienta de \textsl{software} del fabricante de la FPGA (Xilinx). El \textsl{software} ISE Xilinx permite diseñar sistemas digitales y sintetizar esto a una FPGA o CPLD. Como generar los archivos de salida de un proyecto en el ISE Xilinx se puede encontrar en cualquier texto y seguramente con mayor detalle. Aquí solo se trabajará con los archivos de salida obtenidos desde un diseño sencillo que solo busca testear los diferentes periféricos de la placa \ac{PHR}.
516 160 guanucolui
 
517 163 guanucolui
Primero se debe contar con los drivers de la placa OOCDLink instalados en el \ac{SO}. Luego conectamos la placa OOCDLink al puerto JTAG de la plataforma \ac{PHR} de un extremo, y del otro (puerto USB) nos conectamos a la computadora.
518
 
519
Como se comentó la sección \ref{sec:install-xc3sprog}, para correr el programa xc3sprog, en un terminal del sistema GNU/Linux nos cambiamos de directorio hasta donde hayamos compilado nuestra versión del xc3sprog. Una vez ahí, y ya con el \textsl{hardware} conectado correctamente, lanzamos el primer comando para escanear el \textsl{interface} JTAG.
520
\begin{lstlisting}
521
luis@luis-laptop:build$ ./xc3sprog -c ftdiphr
522 229 guanucolui
XC3SPROG (c) 2004-2011 xc3sprog project $Rev: 231 $ OS: Linux
523 163 guanucolui
Free software: If you contribute nothing, expect nothing!
524
Feedback on success/failure/enhancement requests:
525
        http://sourceforge.net/mail/?group_id=170565
526
Check Sourceforge for updates:
527
        http://sourceforge.net/projects/xc3sprog/develop
528
 
529
Using Libftdi,
530
JTAG loc.:   0  IDCODE: 0x02218093  Desc:                       XC3S200A Rev: A  IR length:  6
531
JTAG loc.:   1  IDCODE: 0xd5045093  Desc:                         XCF02S Rev: M  IR length:  8
532
\end{lstlisting}
533
Utilizando la configuración \texttt{ftdiphr} para el \textsl{interface} OOCDLink. Se puede ver que xc3sprog encontró dos dispositivos conectados a la cadena JTAG. El primero, ubicado en la posición 0, es la FPGA XC3S200A. Mientras que el segundo dispositivo, en la posición 1, es la memoria PROM XCF02S.
534
 
535
\subsubsection{Programación de la FPGA}
536
\label{sec:prog-phr-fpga}
537
Para programar directamente sobre la FPGA se debe correr el comando,
538
\begin{lstlisting}
539
luis@luis-laptop:build$ ./xc3sprog -v -c ftdiphr -p 0 /media/datos3/temp/xilinx_projects/PHRprojects/test1/test1_top.bit:w:0:BIT
540 229 guanucolui
XC3SPROG (c) 2004-2011 xc3sprog project $Rev: 231 $ OS: Linux
541 163 guanucolui
Free software: If you contribute nothing, expect nothing!
542
Feedback on success/failure/enhancement requests:
543
        http://sourceforge.net/mail/?group_id=170565
544
Check Sourceforge for updates:
545
        http://sourceforge.net/projects/xc3sprog/develop
546
 
547
Using devlist.txt
548
Using cablelist.txt
549
Cable ftdiphr type ftdi VID 0x0403 PID 0x6010 dbus data 00 enable 0b cbus data 00 data 00
550
Using Libftdi, Using JTAG frequency   6.000 MHz from undivided clock
551
JTAG chainpos: 0 Device IDCODE = 0x02218093     Desc: XC3S200A
552
Created from NCD file: test1_top.ncd;UserID=0xFFFFFFFF
553
Target device: 3s200avq100
554
Created: 2014/03/19 18:31:15
555
Bitstream length: 1196128 bits
556
DNA is 0x95cde80efb9ba0fe
557
done. Programming time 288.0 ms
558
USB transactions: Write 83 read 9 retries 18
559
\end{lstlisting}
560
En comparación con el comando que escanea el puerto JTAG, solo le agregamos la posición del dispositivo al que nos queremos referir y luego una acción concreta que es el de escribir el dispositivo con el dato del archivo \texttt{test\_1.bit}\footnote{No es necesario que el archivo se encuentre en el directorio \texttt{build} donde se compiló el xc3sprog. Se puede indicar un archivo que se encuentre en otro directorio, éste puede ser invocado en forma absoluta o relativa.}. Los demás atributos son propios de la acción como ser, \texttt{w} que borarrá todo el dispositivo PROM y no se le asignará ningún \textsl{offset}.
561
 
562
\subsubsection{Programación de la memoria PROM}
563
\label{sec:prog-phr-prom}
564
Para el caso de la memoria PROM se debe trabajar un poco más con el \textsl{software} ISE Xilinx para realizar la conversión del archivo de salida \texttt{.bit} a un formato para las memorias XCFxxS/P. Esto se explicará en otra documentación, pero si se deja en claro que debe obtenerse una archivo configurado para este tipo de memorias. Una vez que se tenga este archivo \texttt{.MCS} se debe correr el comando
565
\begin{lstlisting}
566
luis@luis-laptop:build$ ./xc3sprog -v -c  ftdiphr -p 1 /media/datos3/temp/xilinx_projects/PHRprojects/test1/output/Untitled.mcs:w:0:IHEX
567 229 guanucolui
XC3SPROG (c) 2004-2011 xc3sprog project $Rev: 231 $ OS: Linux
568 163 guanucolui
Free software: If you contribute nothing, expect nothing!
569
Feedback on success/failure/enhancement requests:
570
        http://sourceforge.net/mail/?group_id=170565
571
Check Sourceforge for updates:
572
        http://sourceforge.net/projects/xc3sprog/develop
573
 
574
Using devlist.txt
575
Using cablelist.txt
576
Cable ftdiphr type ftdi VID 0x0403 PID 0x6010 dbus data 00 enable 0b cbus data 00 data 00
577
Using Libftdi, Using JTAG frequency   6.000 MHz from undivided clock
578
JTAG chainpos: 1 Device IDCODE = 0xd5045093     Desc: XCF02S
579
Erasing......done
580
Erase time 3158.5 ms
581
Programming does not end at block boundary (nbits = 1196432), padding
582
Programming block    292/   293 at XCF frame 0x2480.done
583
Programming time 3236.6 ms
584
Verify block    292/   293 at XCF frame 0x2480
585
Success! Verify time 938.0 ms
586
USB transactions: Write 903 read 890 retries 2040
587
\end{lstlisting}
588
 
589 161 guanucolui
\subsection{Programación del \ac{CPLD}}
590 160 guanucolui
 
591 163 guanucolui
 
592 71 guanucolui
\section{Documentación}
593
La documentación resulta fundamental en ésta etapa del desarrollo. Si bien se quiere lograr el correcto funcionamiento de las placas, la documentación sirve para realizar correciones a las versiones futuras de cada placa. Otro objetivo es documentar el funcionamiento de cada dispositivo que sirvan al reporte final como así también a los usuarios de la \emph{Plataforma de Hardware Reconfigurable}.
594
 
595 79 guanucolui
\begin{thebibliography}{}
596
  \bibitem{2012-SSE-FIUBA-NT01-00} Sebastián García, ``Entorno de desarrollo de firmware sobre arquitectura ARM Cortex-M3, basado en herramientas libres'', 31 de Julio del 2013, Versión 0
597
  \bibitem{openocd-manual-autoprobing} \ac{openocd}, ``\ac{openocd} User's Guide'', 25 de Noviembre del 2012, 10.7~Autoprobing, 58~p., Versión 0.7.0-dev
598
\end{thebibliography}
599 71 guanucolui
 
600
\newpage{}
601
 
602
\appendix{}
603 79 guanucolui
 
604 71 guanucolui
\section{Acrónimos}
605
\begin{acronym}
606
  \acro{PHR}[PHR]{Plataforma de Hardware Reconfigurable}
607 79 guanucolui
  \acro{openocd}[OpenOCD]{\textsl{Open On-Chip Debugger}}
608
  \acro{jtag}[JTAG]{\textsl{Joint Test Action Group}}
609
  \acro{TAP}[TAP]{\textsl{Test Access Port}}
610
  \acro{SVF}[SVF]{\textsl{Serial Vector Format}}
611
  \acro{CPLD}[CPLD]{\textsl{Complex Programmable Logical Device}}
612
  \acro{FPGA}[FPGA]{\textsl{Field Programmable Gate Array}}
613
  \acro{PROM}[PROM]{\textsl{Programmable Read-Only Memory}}
614 71 guanucolui
  \acro{SO}[SO]{sistema operativo}
615 79 guanucolui
  \acro{GPL}[GPL]{\textsl{General Public License}}
616 71 guanucolui
  \acro{UTN-FRC}{Universidad Tecnológica Nacional -- Facultad Regional Córdoba}
617
\end{acronym}
618
 
619
\section{Repositorio de proyecto}
620
 
621
El proyecto se encuentra alojado en los servidores de \emph{OpenCores}. Por lo que se puede acceder a los repositorios mediante el siguiente link, \texttt{http://opencores.org/project,phr}
622
De todas formas se pueden comunicar por correo, \texttt{guanucoluis@gmail.com}.
623
 
624
\end{document}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.