You are on page 1of 7

Uso de Handel-C con DK Design Suite 5.

0
Universidad Distrital Francisco Jos de Caldas

Facultad Tecnolgica
Jorge Armando Millan Gmez
Brayan Manuel Avila Silva
Objetivo
Adquirir y aprender el manejo de los conceptos
fundamentales del programa Handel-C mediante DK
Design suite 5.0 y ver su aplicacin en FPGA basys2.
ABSTRACT
In recent decades, the development of new technologies
for manufacturing integrated circuits, together with the
significant increase in computer equipment has provided
the appearance of new programming language oriented
to the design of electronic systems. Programming
languages have been used for years to solve problems,
which have rules to form correct instructions, organizing
them into modules and subject to an compiler, which
translates the code into a language understandable to a
particular machine in the following document he were an
introduction to programming languages but one specific
deepen called "Handel-C" which is a programming
language of high level that focuses on low-level
hardware.
INTRODUCCIN
Durante las ltimas dcadas, el desarrollo de las nuevas
tecnologas de fabricacin de circuitos integrados, junto
con el significativo avance de los equipos informticos,
ha proporcionado la aparicin de nuevos lenguajes de
programacin orientado al diseo de sistemas
electrnicos. Los lenguajes de programacin durante aos
se han utilizado para resolver problemas, los cuales tienen
reglas
para
formar
instrucciones
correctas,
organizndolas en mdulos y sometiendolas hacia un
compilador , el cual traduce el cdigo en un lenguaje
comprensible para una mquina en particular, en el
siguiente documento se encontrara una introduccin sobre
los lenguajes de programacin pero se profundizara uno
en especfico llamado Handel-C el cual es un lenguaje
de programacin de alto nivel que se enfoca en hardware
de bajo nivel.

Cd. 20122073231
Cd. 20122073120
PROGRAMACIN EN HANDEL-C CON
DK DESIGN SUITE 5.0
DK Design Suite 5.0 y Handel-c

1. Handel- C
Handel-C es un alto nivel de lenguaje de
programacin Diseado por Celoxica, el cual se
enfoca en hardware de bajo nivel, ms comnmente
utilizado en la programacin de FPGAs; este es un
lenguaje para implementar algoritmos en hardware
directamente de una representacin en C. Para disear
sistemas usando la herramienta de desarrollo DK
Design Suite. Handel-C Es un rico subconjunto de C ,
con extensiones que no son estndar para el control de
la creacin de instancias de hardware con un nfasis en
el paralelismo; la asignacin y el comando de retardo
tienen un ciclo. Todas las dems operaciones son
"libres", esto permite a los programadores realizar
manualmente las tareas y crear eficaces componentes
. Mediante la disposicin de los bucles en paralelo con
los retrasos correctos, los componentes pueden
aumentar enormemente el rendimiento de datos, a
expensas de un mayor uso de recursos de hardware. [1]
2. DK Design Suite 5.0
Handel-C en sntesis con DK Design Suite (kit de
diseo) ofrece un flujo de software para el desarrollo
de algoritmos, optimizacin y aceleracin en sistemas
embebidos y Con esto Validar el rendimiento y
mejorar la calidad del producto en menos tiempo y con
menor costo. El DK Design Suite es muy adecuado
para diseadores de algoritmos que utilizan C y C++,
lo que requiere una plataforma de validacin ms
rpido que una plataforma orientada al procesador (es
decir, un ordenador porttil), teniendo como
herramienta la lgica de paralelo en FPGA de
prototipos de hardware. La suite DK Design da la
opcin de la compilacin del algoritmo directamente

a las placas FPGA dedicados para acelerar el


rendimiento del sistema al tiempo que proporciona
herramientas para la depuracin y optimizacin. Para
los equipos de diseo de algoritmos, Handel-C permite
la programacin FPGA utilizando herramientas y
flujos basados en software. Los usuarios pueden
comprobar los sistemas en las simulaciones de ciclo
exacto, y compilar el cdigo directamente en la lgica
FPGA, la creacin de archivos de un bit para
programar juntas FPGA. Bibliotecas API permiten a
los diseadores de software conectar procesadores y
perifricos de mesa a la lgica FPGA, lo que permite
una rpida exploracin de HW y SW de aplicacin
compensaciones. El resultado final es un "banco de
trabajo algortmico " que permite la implementacin
rpida del sistema de software para las plataformas de
hardware FPGA. Los Algoritmos definen el valor de
los sistemas integrados de hoy en da estos modelos
complejos determinan el funcionamiento y
rendimiento de los productos finales. Los Tiempos de
ejecucin resultantes de clsico SW compilacin de
una CPU pueden no ser lo suficientemente
rpido. Verificacin de mundo real la interaccin de E
/ S puede ser necesaria para determinar la exactitud del
algoritmo y funcionalidad. La suite DK Design ofrece
una solucin a este ltimo por la compilacin del
algoritmo directamente a las placas FPGA dedicados
para acelerar el rendimiento del sistema al tiempo que
proporciona herramientas para la depuracin y
optimizacin.[2]
Ejemplos en Handel-C usando
DK Design suite 5.0
1. Contador
El siguiente programa tiene como objetivo contar el
nmero de ceros (0) y unos (1) que tiene una expresin
hexadecimal. El nmero hexadecimal debe entrar por un
canal de entrada por medio de un archivo.dat y el
resultado debe ser enviado a otro canal de salida
tambin por otro archivo.dat en el cual debe salir el
nmero total de unos (1) y ceros (0) en la expresin
enviada. A continuacin se muestra el cdigo el cual se
utiliz para resolver el problema:
De la lnea 1 a la lnea 6 se declararon las variables sin
smbolo definiendo cada una con el ancho de memoria
determinado:
1. set clock = external;
2. unsigned int 8 Ceros, Ones;
3. unsigned int 8
c,z,x,y,e,f,g,d,h,H,i,j,k,l,ord,datos,res,res1,res2,res3
,res4,res5,res6,res7;
4. unsigned int 4 m,n;

5. unsigned int 1 o,p,q,r,s,t,v,w;


6. unsigned 8 a[0x100];
En la lnea 7 se declara el mtodo principal, en las
lneas 10 a la 12 se crean los canales de entrada y de
salida para recibir el nmero hexadecimal, enviar el
contador de unos y ceros y el respectivo nmero
hexadecimal a evaluar .Los canales de entrada y salida
fueron creados en archivos.dat (Figura 1.1.)

(Figura 1.1)Creacin de archivos.dat en su respectivo enlace


de acceso

7. void main(void)
8. {
9. chanin input with {infile="C:/Program Files
(x86)/Agility/trabajos en clase/hex/entra.dat"};
10. chanout oce with {outfile="C:/Program Files
(x86)/Agility/trabajos en
clase/hex/contador0.dat"};
11. chanout oun with {outfile="C:/Program Files
(x86)/Agility/trabajos en
clase/hex/contador1.dat"};
12. chanout hexa with {outfile="C:/Program Files
(x86)/Agility/trabajos en clase/hex/sale1.dat"};
De la lnea 13 a la 17 se declaran las variables del
contador de ceros y unos y los respectivos valores que
sern tomados de tipo binario:
13. x=0;
14. Ceros = 0;
15. Ones = 0;
16. m=0b0000;
17. H=0x00;
De la lnea 18 a la 24 se toman los datos de entrada y se
almacenan un vector en donde la variable x va a ir
aumentando +1 cada vez que haya un dato diferente a 0.
18. do
19. {
20. input?datos;
21. a[x]=datos;
22. x++;
23. }
24. while(datos!=0);

En la lnea 25 se resta -1 al contador de 0 para poder


entrar en la condicin for. De la lnea 26 a la 31 se toma
la nuevo valor de x haciendo una respectiva divisin y
calculando el modulo para obtener los 2 primero dgitos
en la cadena hexadecimal.
25.
26.
27.
28.
29.
30.
31.

l=x-1;
for(x=0;x<l;x++)
{
c=a[x];
d=c/2;
res=c%2;
o=res[0];

De la lnea 32 a la 100 se evalan los dos primero dgitos


obtenidos en el mdulo anterior y se hace una respectiva
comparacin para saber su valor y si es igual al valor de
0 se va sumando +1 al contador de ceros; En caso de que
valor no sea el mismo se suma +1 al contador de unos y
se declara el nuevo valor que va a tomar la variable
evaluada anteriormente haciendo una respectiva divisin
y calculando el modulo para obtener los respectivos
dgitos en la nueva cadena. Es proceso se continua
haciendo hasta terminar de saber el valor de la ltima
posicin del nmero hexadecimal.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.

if (o==0)
{
Ceros=Ceros+1;
}
else
Ones=Ones+1;
e=d/2;
res1=d%2;
p=res1[0];
if (p==0)
{
Ceros=Ceros+1;
}
else
Ones=Ones+1;
f=e/2;
res2=e%2;
q=res2[0];

50.
51.
52.
53.

if (q==0)
{
Ceros=Ceros+1;
}

54.
55.
56.
57.
58.

else
Ones=Ones+1;
g=f/2;
res3=f%2;
r=res3[0];

59.
60.
61.
62.

if (r==0)
{
Ceros=Ceros+1;
}

63.
64.
65.
66.
67.

else
Ones=Ones+1;
h=g/2;
res4=g%2;
s=res4[0];

68.
69.
70.
71.

if (s==0)
{
Ceros=Ceros+1;
}

72.
73.
74.
75.
76.

else
Ones=Ones+1;
i=h/2;
res5=h%2;
t=res5[0];

77.
78.
79.
80.

if (t==0)
{
Ceros=Ceros+1;
}

81.
82.
83.
84.
85.

else
Ones=Ones+1;
j=i/2;
res6=i%2;
v=res6[0];

86.
87.
88.
89.
90.
91.
92.
93.
94.

if (v==0)
{
Ceros=Ceros+1;
}
else
Ones=Ones+1;
k=j/2;
res7=j%2;
w=res7[0];

95. if (w==0)
96. {
97. Ceros=Ceros+1;
98. }
99. else
100. Ones=Ones+1;
De la lnea 101 a la 105 se concatenan los valores
obtenidos para ser enviados al canal de salida en su
respectivo valor binario.
101. m=(r@q@p@o);
102. n=(w@v@t@s);

103. hexa!n;
104. hexa!m;
105. }
De la lnea 106 a la 110 se enva el valor final obtenido
en los contadores de ceros y unos.
106. oun!Ones;
107. oce!Ceros;
108. delay;
109. delay;
110. }
2. Contador de 0-99 con visualizacin dinmica en
FPGA Basys 2
Este programa tiene como objetivo generar un contador
de 0 a 99 en el display 7 segmentos de la FPGA Basys 2
(Figura 2.1). Para lograr el resultado debemos generar
un archivo.edf el cual es generado automticamente
cuando estamos configurando y marcamos la opcin
edif en la parte de set active configuration con HandelC (Figura 2.2). el cual debe ser compilado con el
programa Xilinx y posterior mente quemado en la FPGA
con el programa Adept.[3]

A continuacin se muestra el cdigo el cual se utiliz


para generar el contador de 0 a 99 por medio de la
visualizacin dinmica:
De la lnea 1 a la 20 se declara la referencia de la FPGA,
paquete y velocidad la familia de la FPGA a utilizar, se
define el reloj en pin B8 para FPGA spartan3E en
variables correspondientes a cada uno de los leds de un
display 7 segmentos.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

12.
13.
14.
15.

(Figura 2.1)FPGA Basys 2 Spartan 3E con display 7


segmentos

16.
17.
18.
19.
20.

set part = "xc3s100e-4cp132";//fpga gio


set family = XilinxSpartan3E;
set clock = external "b8";
unsigned int 1 r;
interface bus_in (unsigned int 1)up ()
with {data={"p11"}};
interface bus_in(unsigned 1 in_rst) stop()
with {data ={"L3"}};
unsigned int 7 lu;//Visual Displays
interface bus_out () led_U (unsigned int 7
OutPort=lu)
with
{data={"l14","h12","n14","n11","p12","l13","m12
"}};
unsigned int 4 tr;
interface bus_out () bar_C(unsigned int 4
OutPort=tr)
with {data={"k14","m13","j12" ,"f12"}};
unsigned int 9
mot1=0,mot2=0,moto1=0,moto2=0,motor1=0,mot
or2=0;
unsigned int 8 estados;
unsigned int 12 mmot1=0;
unsigned int 12 mmot2=0;
unsigned int 12 mmot3=0;
unsigned int 12 mmot4=0;

De la lnea 21 a la 45 en el display se declaran las


variables correspondientes a los 8 led en donde se asigna
el switch dedicado a iniciar el funcionamiento al asignar
el pulsador dedicado a la funcin reset.

(Figura 2.2)Configuracin para generar el archivo.edf

21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.

static macro proc clk (t)//espera


{
unsigned 17 j;
for (j=0; j<(t/1)*10000;j++){}
delay;
}
unsigned int 7 led_decoder(unsigned int 9 digito)
{
unsigned int 7 s;
switch(digito)
{
case 0: s=0b0000001; break;
case 1: s=0b1001111; break;
case 2: s=0b0010010; break;

35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.

case 3: s=0b0000110; break;


case 4: s=0b1001100; break;
case 5: s=0b0100100; break;
case 6: s=0b0100000; break;
case 7: s=0b0001111; break;
case 8: s=0b0000000; break;
case 9: s=0b0001100; break;
default: s=0b1111111;break;
}
return s;
}

De la lnea 46 a la 63 se declara los estados del pulsador


en donde si es (1) se va prendiendo cada uno de los 4
display de manera consecutiva lo que da el efecto de
visualizacin dinmica.
46. void main(void)
47. {
48. while(1)
49. {
50. r=up.in;
51. if(r==1)
52. {
53. switch (estados){
54. case 0: tr=0b1111; break;
55. case 1: tr=0b1110; lu=led_decoder(mot1); break;
56. case 2: tr=0b1111; break;
57. case 3: tr=0b1101; lu=led_decoder(mot2); break;
58. case 4: tr=0b1111; break;
59. case 5: tr=0b1011; lu=led_decoder(moto1);break;
60. case 6: tr=0b1111; break;
61. case 7: tr=0b0111; lu=led_decoder(moto2); break;
62. default: tr=0b1111;break;
63. }
De la lnea 64 a la 106 se declaran los estados del
pulsador en donde si es (0) o reset los displays vuelven a
su condicin inicial es decir con valor nulo y empiezan a
hacer nueva mente el conteo de 0 a 99.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.

if(stop.in_rst==1)
{
mot1=0;
mmot2=0;
mmot3=0;
mmot4=0;
}
}
if(r==0)
{
mot1=0;
mot2=0;
moto1=0;
moto2=0;
motor1=0;
motor2=0;

80.
81.
82.
83.

mmot1=0;
mmot2=0;
mmot3=0;
mmot4=0;

84. switch (estados)


85. {
86. case 0: tr=0b0000;
87. break;
88. case 1: tr=0b0000; lu=led_decoder(moto1);
89. break;
90. case 2: tr=0b0000;
91. break;
92. case 3: tr=0b0000; lu=led_decoder(moto2);
93. break;
94. case 4: tr=0b0000;
95. break;
96. case 5: tr=0b0000; lu=led_decoder(motor1);
97. break;
98. case 6: tr=0b0000;
99. break;
100. case 7: tr=0b0000; lu=led_decoder(motor2);
101. break;
102. default: tr=0b0000;
103. break;
104. }
105. }
106. estados++;
De la lnea 107 a la 123 se hace a lgica para hacer el
conteo, en donde cada uno de los displays va a ir
aumentando de manera consecutiva.
107. if (estados==9) estados=0;
108. clk(1);
109. mmot1++;
110. mmot2++;
111. mmot3++;
112. mmot4++;
113. par{
114. if(mmot1==4000)
115. {
116. mmot1=0;
117. mot1++;
118. }
119. if(mmot2==4000)
120. {
121. mmot2=0;
122. mot2++;
123. }
De la lnea 124 a la 162 se hace el proceso para cuando
cada uno de los displays utilizados que en este caso son 2
cuando lleguen a 99 se reinicie el contador nuevamente
en 0 para los cuatros displays.
124. if (mot1==9)
125. {

126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.

mot1=0;
}
if (mot2==9)
{
mot2=0;
}
if (moto1==9)
{
moto1=0;
}
if (moto2==9)
{
moto2=0;
}
if(motor1==9)
{
mot1=0;
mot2=0;
moto1=0;
moto2=0;
motor1=0;

147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.

}
if(motor2==9)
{
mot1=0;
mot2=0;
mmot1=0;
mmot2=0;
mmot3=0;
mmot4=0;
moto1=0;
moto2=0;
motor1=0;
motor2=0;
}
}
}

(Figura 2.4)Archivo.edf creada dentro del proyecto en


Handel-C

Despus de haberse generado el archivo deseado lo


cargamos en Xilinx y lo compilamos normalmente como
cualquier cdigo en VHDL (Figura 2.4).

Despus de realizar el respectivo cdigo en Handel-C sin


que se hallan generado errores, el automticamente
generara una carpeta llamada EDIF (Figura 2.3). Y dentro
de ella el archivo que debemos adjuntar en Xilinx
(Figura 2.4).

(Figura 2.5)Compilacin del archivo.edf en Xilinx preparado


para ser procesado en la FPGA Basys2.

Despus de haber realizado los pasos anteriores


procedemos a procesar el programa por medio de Manage
configuration Project o Adept y de manera inmediata
podremos observar el programa funcionando en la FPGA
Basys 2 Spartan 3E.
(Figura 2.3)Carpeta EDIF creada dentro del proyecto en
Handel-C

CONCLUSIONES
Handel-C es una herramienta la cual nos facilita
por medio de los comandos PAR y SEQ realizar
varios procesos al tiempo y de manera secuencial
sin afectar la velocidad en los intervalos.
DK Design Suite 5.0 es un programa flexible que
permite al usuario por medio de sus herramientas
seguir paso a paso cada uno de los procesos
efectuados median la programacin.
Por medio de Handel-C y DK Design Suite 5.0
podemos generar programas utilizando canales
de datos de manera sencilla y con sintaxis de
programacin conocida como lo es C++.
BIBLIOGRAFA
[1]

A. Sutcliffe, U. Rey, J. Carlos, and M. Espaa,


Uso de Handel-C con DK Objetivos del Curso,
pp. 178, 2004.

[2]

D. K. D. Suite, DK 4 DK Design Suite user


guide.

[3]

U. S. B. Port, D i g i l e n t B a s y s 2 B o a r d
R e f e r e n c e M a n u a l, vol. 99163, no. 509,
pp. 112, 2010.

You might also like