Tutorial ASIC Alliance VLSI parte 3

Tutorial ASIC Alliance VLSI parte 3

DISEÑO DE SUMADOR CON ACUMULADOR

1- Para empezar se hará la carga de los parámetros de ~/Alliance/install/etc/profile.d/alc_env.sh, con lo cual se establecen los parámetros de entorno. De esta manera:
> source alc_env.sh
En el directorio donde se encuentra ese archivo. Su ubicación puede variar dependiendo del lugar de instalación.

2- Con los parámetros cargados se puede realizar la siguiente prueba a ver si están cargadas las variables correctamente.
>graal
Si cargo el programa si problemas, las variables de entorno ya fueron cargadas, en caso contrario notifique a su instructor.

3- En el programa anterior presionando crtl+q se sale del programa.

4- Crear una carpeta donde guardará sus programas para el tutorial.

5- Crear en esa carpeta el archivo sumador.vhdl:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

-- Ejemplo de un sumador completo de 1 bit
ENTITY sumador IS
PORT(
in_a: IN BIT;
in_b: IN BIT;
in_c: IN BIT;

salida: OUT BIT;
out_c: OUT BIT);
--Esta sería la definición de las entrada y salidas de la compuerta
END sumador;

--Ahora se realiza el comportamiento del sistema
ARCHITECTURE comportamiento of sumador is
BEGIN
salida<=(in_a XOR in_b XOR in_c);
out_c<=((in_a and in_b) or (in_a and in_c) or (in_b and in_c));
END comportamiento;

6- Crear también el archivo sumador.pat:
-- terminales del inversor
in vdd B;;
in vss B;;
in in_a B;;
in in_b B;;
in in_c B;;

out salida B;;
out out_c B;;
begin
-- colocación de los patrones a evaluar, se coloca ?
-- para que el simulador coloque la salida
-- los intervalos de tiempo están en picosegundos en este caso.
--                      v g i i i s  O
--                      d n n n n a
--                      d d a b c l  c
<0 ps> comentario: 1 0 0 0 0 ?* ?*;
<+1 ns> : 1 0 0 0 0 ?* ?*;
<+1 ns> : 1 0 0 1 0 ?* ?*;
<+1 ns> : 1 0 0 1 0 ?* ?*;
<+1 ns> : 1 0 1 0 0 ?* ?*;
<+1 ns> : 1 0 1 0 0 ?* ?*;
<+1 ns> : 1 0 1 1 1 ?* ?*;
<+1 ns> : 1 0 1 1 1 ?* ?*;
<+1 ns> : 1 0 0 1 1 ?* ?*;
<+1 ns> : 1 0 0 1 1 ?* ?*;
<+1 ns> : 1 0 0 0 1 ?* ?*;
<+1 ns> : 1 0 0 0 1 ?* ?*;
<+1 ns> : 1 0 1 0 0 ?* ?*;
<+1 ns> : 1 0 1 0 0 ?* ?*;
<+1 ns> : 1 0 1 1 1 ?* ?*;
<+1 ns> : 1 0 1 1 1 ?* ?*;
end;

7- También el archivo sumador.ioc:
#      
###################################################################
# In each of TOP()/BOTTOM()/LEFT()/RIGHT() section, there are     #
# placed IOs. In the IGNORE() section, the IOs are ignored        #
# by the IOPlacer. In every section, the IO syntax could be:      #
#        for pin:       (IOPIN iopinName.0 );                       #
#        for pad:       iopadName orientation ;                   #
#        for space:     SPACE  value;                             #
# The capital words are keywords. orientation is not required.    #
# The value is the space between the IO above and the IO below it.#
###################################################################

TOP ( # IOs are ordered from left to right
   (IOPIN in_a.0 );
   (IOPIN in_b.0 );
   (IOPIN in_c.0 );

)
BOTTOM ( # IOs are ordered from left to right

   (IOPIN salida.0 );
   (IOPIN out_c.0 );
)
IGNORE ( # IOs are ignored(not placed) by IO Placer
)

8- Y el archivo Makefile:

# /*------------------------------------------------------------\
# |                                                             |
# | File   :                    Makefile                        |
# |                                                             |
# | Author :                 Jacomme Ludovic                    |
# | Modificado: MF                                              |
# \------------------------------------------------------------*/
# /*------------------------------------------------------------\
# |                                                             |
# |                              Cells                          |
# |                                                             |
# \------------------------------------------------------------*/
# /*------------------------------------------------------------\
# |                                                             |
# |                             Binary                          |
# |                                                             |
# \------------------------------------------------------------*/

include ../etc/alliance-env.mk

VASY   = $(ALLIANCE_BIN)/vasy
ASIMUT = $(ALLIANCE_BIN)/asimut
BOOM   = $(ALLIANCE_BIN)/boom
BOOG   = $(ALLIANCE_BIN)/boog
LOON   = $(ALLIANCE_BIN)/loon
OCP    = $(ALLIANCE_BIN)/ocp
NERO   = $(ALLIANCE_BIN)/nero
COUGAR = $(ALLIANCE_BIN)/cougar
LVX    = $(ALLIANCE_BIN)/lvx
DRUC   = $(ALLIANCE_BIN)/druc
S2R    = $(ALLIANCE_BIN)/s2r

DREAL  = $(ALLIANCE_BIN)/dreal
GRAAL  = $(ALLIANCE_BIN)/graal
XSCH   = $(ALLIANCE_BIN)/xsch
XPAT   = $(ALLIANCE_BIN)/xpat
XFSM   = $(ALLIANCE_BIN)/xfsm

TOUCH  = touch

TARGET_LIB      = $(CELLS_TOP)/sxlib
METAL_LEVEL     = 2

# /*------------------------------------------------------------\
# |                                                             |
# |                            Environement                     |
# |                                                             |
# \------------------------------------------------------------*/

ENV_VASY = MBK_WORK_LIB=.; export MBK_WORK_LIB;\
           MBK_CATAL_NAME=NO_CATAL; export MBK_CATAL_NAME

ENV_BOOM = MBK_WORK_LIB=.; export MBK_WORK_LIB;\
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_BOOG = MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_TARGET_LIB=$(TARGET_LIB); export MBK_TARGET_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_LOON = MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_TARGET_LIB=$(TARGET_LIB); export MBK_TARGET_LIB; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_ASIMUT_VASY = MBK_WORK_LIB=.; export MBK_WORK_LIB;\
             MBK_CATAL_NAME=CATAL_ASIMUT_VASY; export MBK_CATAL_NAME;\
             MBK_IN_LO=vst; export MBK_IN_LO;\
    MBK_OUT_LO=vst; export MBK_OUT_LO

ENV_ASIMUT_SYNTH = MBK_WORK_LIB=.; export MBK_WORK_LIB;\
             MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME;\
             MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
             MBK_IN_LO=vst; export MBK_IN_LO;\
    MBK_OUT_LO=vst; export MBK_OUT_LO

ENV_OCP =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_NERO =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME



ENV_COUGAR_SPI =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=spi; export MBK_IN_LO; \
  MBK_OUT_LO=spi; export MBK_OUT_LO; \
           MBK_SPI_MODEL=$(SPI_MODEL); export MBK_SPI_MODEL; \
           MBK_SPI_ONE_NODE_NORC="true"; export MBK_SPI_ONE_NODE_NORC; \
           MBK_SPI_NAMEDNODES="true"; export MBK_SPI_NAMEDNODES; \
           RDS_TECHNO_NAME=$(RDS_TECHNO_REAL); export RDS_TECHNO_NAME; \
           RDS_IN=cif; export RDS_IN; \
           RDS_OUT=cif; export RDS_OUT; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_COUGAR =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=al; export MBK_IN_LO; \
  MBK_OUT_LO=al; export MBK_OUT_LO; \
           RDS_TECHNO_NAME=$(RDS_TECHNO_REAL); export RDS_TECHNO_NAME; \
           RDS_IN=cif; export RDS_IN; \
           RDS_OUT=cif; export RDS_OUT; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_LVX =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_DRUC = MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           RDS_TECHNO_NAME=$(RDS_TECHNO_SYMB); export RDS_TECHNO_NAME; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_S2R  = MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           RDS_TECHNO_NAME=$(RDS_TECHNO_REAL); export RDS_TECHNO_NAME; \
           RDS_IN=cif; export RDS_IN; \
           RDS_OUT=cif; export RDS_OUT; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME


all :  sumador.cif

# /*------------------------------------------------------------\
# |                                                             |
# |                             Vasy                            |
# |                                                             |
# \------------------------------------------------------------*/

sumador.vbe : sumador.vhdl
$(ENV_VASY); $(VASY) -a -B -o -p -I vhdl sumador

# /*------------------------------------------------------------\
# |                                                             |
# |                             Asimut                          |
# |                                                             |
# \------------------------------------------------------------*/

res_vasy_1.pat : sumador.vbe
$(ENV_ASIMUT_VASY); $(ASIMUT) -b sumador sumador res_vasy_1 

res_synth_1.pat : sumador.vst 
$(ENV_ASIMUT_SYNTH); $(ASIMUT) sumador sumador res_synth_1

# /*------------------------------------------------------------\
# |                                                             |
# |                             Boom                            |
# |                                                             |
# \------------------------------------------------------------*/

boom.done : sumador_o.vbe
@$(TOUCH) boom.done

sumador_o.vbe : sumador.vbe sumador.boom res_vasy_1.pat
$(ENV_BOOM); $(BOOM) -VP sumador sumador_o

# /*------------------------------------------------------------\
# |                                                             |
# |                             Boog                            |
# |                                                             |
# \------------------------------------------------------------*/

boog.done : sumador_o.vst
@$(TOUCH) boog.done

sumador_o.vst : sumador_o.vbe
$(ENV_BOOG); $(BOOG) sumador_o

# /*------------------------------------------------------------\
# |                                                             |
# |                             Loon                            |
# |                                                             |
# \------------------------------------------------------------*/

loon.done : sumador.vst
@$(TOUCH) loon.done

sumador.vst : sumador_o.vst
$(ENV_LOON); $(LOON) sumador_o sumador

# /*------------------------------------------------------------\
# |                                                             |
# |                             OCP                             |
# |                                                             |
# \------------------------------------------------------------*/

sumador_p.ap : res_synth_1.pat
$(ENV_OCP); $(OCP) -v -gnuplot -margin 20 -ioc sumador  sumador sumador_p

# /*------------------------------------------------------------\
# |                                                             |
# |                             NERO                            |
# |                                                             |
# \------------------------------------------------------------*/

sumador.ap : sumador_p.ap sumador.vst
$(ENV_NERO); $(NERO) -V -$(METAL_LEVEL) -p sumador_p sumador sumador

# /*------------------------------------------------------------\
# |                                                             |
# |                             Cougar                          |
# |                                                             |
# \------------------------------------------------------------*/

sumador_e.spi : sumador.ap
$(ENV_COUGAR_SPI); $(COUGAR) -v -ac sumador sumador_e

sumador_erc.spi : sumador.ap
$(ENV_COUGAR_SPI); $(COUGAR) -v -ar sumador sumador_erc

sumador_erc.al : sumador.ap
$(ENV_COUGAR); $(COUGAR) -v -ar sumador sumador_erc

sumador_e.al : sumador.ap
$(ENV_COUGAR); $(COUGAR) -v -ac sumador sumador_e

sumador_et.al : sumador.ap
$(ENV_COUGAR); $(COUGAR) -v -ac -t sumador sumador_et

sumador_et.spi : sumador.ap
$(ENV_COUGAR_SPI); $(COUGAR) -v -ac -t sumador sumador_et

sumador_er.al : sumador.cif
$(ENV_COUGAR); $(COUGAR) -v -r -t sumador sumador_er

sumador_real.al : sumador.ap
$(ENV_COUGAR); $(ENV_S2R); $(COUGAR) -v -ac sumador sumador_real

sumador_real_t.al : sumador.ap
$(ENV_COUGAR); $(ENV_S2R); $(COUGAR) -v -t -ac sumador sumador_real_t

# /*------------------------------------------------------------\
# |                                                             |
# |                             Lvx                             |
# |                                                             |
# \------------------------------------------------------------*/

lvx.done : sumador.vst sumador_e.al sumador_e.spi
$(ENV_LVX); $(LVX) vst al sumador sumador_e -f
$(TOUCH) lvx.done

# /*------------------------------------------------------------\
# |                                                             |
# |                             Druc                            |
# |                                                             |
# \------------------------------------------------------------*/

druc.done : lvx.done sumador.ap
$(ENV_DRUC); $(DRUC) sumador
$(TOUCH) druc.done

# /*------------------------------------------------------------\
# |                                                             |
# |                             S2R                             |
# |                                                             |
# \------------------------------------------------------------*/

sumador.cif : druc.done
$(ENV_S2R); $(S2R) -v sumador

# /*------------------------------------------------------------\
# |                                                             |
# |                             TOOLS                           |
# |                                                             |
# \------------------------------------------------------------*/

graal :
$(ENV_S2R); $(GRAAL)

graal_sumador_p : sumador_p.ap
$(ENV_S2R); $(GRAAL) -l sumador_p

graal_sumador : sumador.ap
$(ENV_S2R); $(GRAAL) -l sumador

xsch:
$(ENV_LOON); $(XSCH)

xsch_sumador_o : sumador.vst
$(ENV_LOON); $(XSCH) -l sumador_o

xsch_sumador : sumador.vst
$(ENV_LOON); $(XSCH) -l sumador

xsch_sumador_e: sumador_e.al
$(ENV_COUGAR); $(XSCH) -l sumador_e

xsch_sumador_et: sumador_et.al
$(ENV_COUGAR); $(XSCH) -l sumador_et

xpat: 
$(ENV_ASIMUT_SYNTH); $(XPAT)

xpat_synth: res_synth_1.pat
$(ENV_ASIMUT_SYNTH); $(XPAT) -l res_synth_1

xpat_vasy : res_vasy_1.pat
$(ENV_ASIMUT_SYNTH); $(XPAT) -l res_vasy_1

dreal: 
$(ENV_S2R); $(DREAL)

dreal_sumador : sumador.cif
$(ENV_S2R); $(DREAL) -l sumador


# /*------------------------------------------------------------\
# |                                                             |
# |                              Clean                          |
# |                                                             |
# \------------------------------------------------------------*/

realclean : clean

clean     :
$(RM) -f *.vst sumador_e.spi sumador_et.spi *.vbe res_*.pat *.boom *.done *.xsc *.gpl \
                 *.ap *.drc *.dat *.gds *.cif *.rep \
*.log *.out *.raw *.al

9- Ahora ejecute el comando make desde la línea de comandos ubicada en el directorio del sumador.

10- Verifique los resultados del sumador con xpat y xsch, deberían producir algo como lo siguiente:
Figura 3.1. Salida obtenida del sumador.

Figura 3.2. Diagrama del sumador.

11- También verifique con el comando dreal que obtenga un layout como el siguiente:
Figura 3.3. Layout del sumador.








No hay comentarios:

Publicar un comentario