You are on page 1of 44

Implementacin de RTL usando

VHDL
Elementos Esenciales

Secciones de un mdulo descrito


usando VHDL.

Entity.
Architecture.
Process.
Type.
Signal.

Entidades que usan vectores del tipo standard logic


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity PROM is
Port ( A : in STD_LOGIC_VECTOR(0 to 1);
B : in STD_LOGIC_VECTOR (0 to 1);
C : out STD_LOGIC_VECTOR (0 to 1));
end PROM;

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity MULTIVECTOR is
Port ( E0, E1, E2, E3 : in STD_LOGIC _VECTOR (3 downto 0);
S0, S1 : in STD_LOGIC;
F : out STD_LOGIC _VECTOR (3 downto 0));
end MULTIVECTOR;

IDENTIFICADORES.

ARCHITECTURE
architecture arch_name of entity_name is
-- declaraciones de la arquitectura
-- signals ;
-- nuevos tipos de seales ;
begin
-- operaciones lgicas aritmticas concurrentes;
-- asignaciones a seales;
process
begin
-- cdigo de descripcin
end process;
end arch_name;

Operaciones Lgicas:
and | or | not | nand | nor | xor | xnor
(se pueden aplicar a bits y a vectores).
Operaciones Aritmticas:
+ | - (suma y resta )
&
(Concatenacin similar a ,)
* | ** | / | mod | rem (Multiplicacion, potencias,
divisin, mdulo y residuo)
Operaciones Relacionales:
= | /= | < | <= | > | >=
(igual, diferente, menor que, menor o igual, mayor, mayor o igual)
Operaciones de Traslacin:
sll | srl | sla | sra | rol | ror
(a la izquierda, lgica a la derecha, aritmtica a la derecha, rotacin
izquierda, rotacin derecha)

Ejemplos de uso de operadores


Ejemplo:
ENTITY example1 IS
PORT ( x1, x2, x3
f
END example1 ;

: IN
: OUT

BIT ;
BIT ) ;

ARCHITECTURE LogicFunc OF example1 IS


BEGIN
f <= (x1 AND x2) OR (NOT x2 AND x3) ;
END LogicFunc ;

==========================================================
entity mux2 is
port (D0, D1, S0: in std_logic;
O : out std_logic);
end mux2;
architecture behavioral2 of mux2 is
begin
multiplexor: process( D0,D1,S0)
if(S0 = 1) then O <= D1;
else O <= D0;
end if;
end process;
end behavioral2;

Decodificador Genrico
entity dcdr_n
generic (
Port ( Xi
Yo
end dcdr_n;

is
n : integer := 4);
: in STD_LOGIC_VECTOR (0 to n-1);
: out STD_LOGIC_VECTOR (0 to (2**n)-1));

architecture Behavioral of dcdr_n is


begin
dcd: process(Xi)
begin
for i in 0 to (2**n)-1 loop
if Xi = conv_std_logic_vector(i,n-1) then
Yo(i) <= '1' ;
else
Yo(i) <= '0' ;
end if;
end loop;
end process dcd;
end Behavioral;

PROCESS
El proceso la seccin que contiene las operaciones que se
ejecutan secuencialmente. El proceso posee el siguiente
formato:
<etiqueta>: process (lista sensible)
begin
-- operaciones o estructuras secuenciales
end process <etiqueta>
-- la etiqueta es opcional

PROCESS

La mayora de las estructuras de control son secuenciales por lo que solamente


pueden incluirse como parte de procesos.
IF ELSIF ELSE END IF :
IF(condicin_lgica_1) then
-- operaciones que se ejecutan si la
-- condicin 1 se cumple
ELSIF(condicin_lgica_2) then
-- operaciones que se ejecutan si la
-- condicin 1 no se
-- cumple, pero si la condicin 2.
ELSE
-- operaciones que se ejecutan si ni la
-- condicin 1 ni la 2 se cumplen.
END IF; -- seala el cierre de la estructura.

PROCESS
FOR GENERATE;
<etiqueta>: FOR <ndice> IN (valor inicial) TO
(valor final) GENERATE
<asignacin1 que depende de ndice> ;
<asignacin2 que depende de ndice> ;

END GENERATE ;

CASE WHEN
case expresin is
when alternativa_l => ... --seq. statements

when alternativa_n => ... --seq. statements


when others => ... --seq. statements
end case;

Ejemplo if end if

Define el proceso
Compara el cual se
ejecuta
secuencialmente

Arquitectura
funcional de la
entidad comp.

Ejemplo CASE WHEN


ENTITY mux2to1 IS
PORT ( w0, w1, s
f
END mux2to1 ;
ARCHITECTURE Behavior OF
BEGIN
PROCESS ( w0, w1, s
BEGIN
CASE s IS
WHEN '0'
=>
WHEN OTHERS =>
END CASE ;
END PROCESS ;
END Behavior ;

: IN
: OUT

STD_LOGIC ;
STD_LOGIC ) ;

mux2to1 IS
)

f <= w0 ;
f <= w1 ;

Ejemplo FOR GENERATE


component comp
port( x: in bit; y: out bit);
end component comp

signal a, b: bit_vector(0 to 7)

gen: for i in 0 to 7 generate


u: comp port map(a(i),b(i));
end generate gen;

Descripcin de un biestable con entrada de control alto-activa


Para la declaracin de flip-flops se usan estructuras secuenciales en un proceso:
Ejemplo: Describa un flip-flop tipo D con entrada de control alto activa C.
Solucin:
entity Biestable_D is
port (D, C: in bit;
Q: out bit);
end Biestable_D;
architecture ARCH of Biestable_D is
begin
process (C)
begin
if (C = '1') then Q <= D ;
end if ;
end process
end ARCH ;

Flip-flops en VHDL

Describir un flip-flop tipo D con entrada de reloj clk activada por flanco
negativo.
FFD: process (clk)
begin
if (clkevent and
Q <= D;
end if;
end process FFD;

clk = 0) then

Se usa el atributo event para sealar un evento en la


entrada de reloj.

Descripcin de un flip-flop D con entrada de reloj activada por


el flanco de atraso y entrada clear asincrnica.
entity Biestable_rD is
port( D, clk, cr: in bit;
Q: out bit);
end Biestable_rD;
architecture ARCH of Biestable_rD is
begin
process (clk, cr)
begin
if ( cr = '0') then
Q <= '0' ;
elsif clk = 0' and clk'event then
Q <= D ;
end if ;
end process ;
end ARCH ;

Flip-flop tipo D con entrada de clear y preset.

Ejemplo:
Presente la descripcin de un flip-flop tipo D con entrada de clear nCR y preset nPR,
la entrada de reloj es activa en el flanco de atraso.
process (CLK,nPR,nCR)
begin
if nCR = '0' then
Q <= '0' ;
elsif nPR = '0' then
Q <= '1' ;
elsif (CLK'event and CLK = 0') then
Q <= D ;
end if ;
end process;
Se realiza un flip-flop tipo D cuya entrada clear posee prioridad superior a CLK y a D

Registros en VHDL
Las declaraciones en VHDL de los registros es similar a los flip-flops con la
diferencia de que ahora las entradas son declaradas como vectores,
ejemplo:

Signals

Muchas veces se utilizan recursos que solo se reflejan en la arquitectura y no en


la entidad ya que no son ni entradas ni salida. Este tipo de recursos se declaran
como seales a travs de la sentencia signal, cuyo formato es :
architecture algun_circuito of alguna_entidad is
signal seal_interna: std_logic;
Signal vector_interno: std_logic_vector( 0 to n);
begin
...
La declaracin de la seal va despus del inicio de la arquitectura pero antes del
begin del cuerpo de la arquitectura.
Lugar donde se agrupan las declaraciones de componentes y de otros tipos
nuevos de seales.

Componentes

Este recurso nos permite crear mdulos que posteriormente podremos utilizar para
agilizar nuestro diseo. Los componentes estn orientados para ser almacenados
en paquetes pero se pueden especificar con archivos dentro de un proyecto.
Para poder utilizar un diseo como un componente hay que declararlo como tal ya
sea en una librera propia o dentro del mdulo donde ser utilizado.

Definicin de la entidad en el
diseo del componente

Declaracin del componente en el


diseo donde ser utilizado.

Uso de los Componentes


Asociacin de seales por
asignacin:
cal_dl_dico => cal_dl_compont

Uso de los Componentes

Asociacin de seales
por posicin:

De RTL a VHDL

VHDLRTL

Aspectos Importantes
Transferencia condicionada:
DV*(F) <= OCLM*(G).
Buses y conexiones:
BUS = OCLM*(H).
Unidad de control.

Metodologa a partir de una secuencia


de control que simula correctamente
Realizar el circuito de control.
Obtener la secuencia de pasos incluyendo las entradas que influyen a la secuencia.
Usar la herramienta para la realizacin automatizada de mquinas de estado de VHDL.
Definir esta mquina de estado como un componente.

Descripcin de los registros que componen al sistema.


Obtener el listado de transferencias de cada registro que componen al diseo.
Resumir todas las transferencias de cada registro a una transferencia condicionada por
registro. De seguro tendr condiciones a la izquierda y a la derecha.
Expresar cada registro en base a un proceso siguiendo el patrn de la plantilla propuesta
para las transferencias condicionadas.

Implementar los buses que forman parte del sistema.


Obtener el listado de conexiones de los buses.
Resumir todas las conexiones de cada bus a una conexin unificada con condiciones a la
derecha.
Expresar cada conexin usando una estructura concurrente.
Se recomienda que cada bus sea declarado como un componente.

Patrn para Transferencias condicionadas


A continuacin se presenta un patrn que resulta cuando se resumen las diferentes
transferencias al registro DV dentro de una secuencia de control que SUPER la
etapa de simulacin.
La condicin a la izquierda resume los pasos y las condiciones de entrada que
producen algn cambio en el valor del registro destino, las condiciones a la derecha
recopilan las diferentes orgenes de datos en las distintas transferencias dentro de
todos los pasos de la secuencia de control.

DV*[f1(csl[i],IR[j]) + f2(csl[i],IR[j]) + + fn(csl[i],IR[j])] <=


(OV1!OV2!...!Ovn)*[f1(csl[i],IR[j]),f2(csl[i],IR[j]), , fn(csl[i],IR[j])]

Patrn para Transferencias condicionadas


DV*[f1(csl[i],IR[j]) + f2(csl[i],IR[j]) + + fn(csl[i],IR[j])] <=
(OV1!OV2!...!OVn)*[f1(csl[i],IR[j]),f2(csl[i],IR[j]), , fn(csl[i],IR[j])]
signal f : std_logic_vector (1 to n) ;
signal log1 : std_logic ;
...
begin
f(1) <= f1(csl[i],IR[j]) ;
f(2) <= f2(csl[i],IR[j]) ;
...
f(n) <= fn(csl[i],IR[j])] ;
log1 <= f(1) or f(2) or ... or f(n) ;
DVR: process (clk)
begin
if (clkevent and clk = 0 and log1 = 1) then
if
f(1) = 1 then DV <= OV1 ;
elsif f(2) = 1 then DV <= OV2 ;
...
elsif f(n-1) = 1 then DV <= OVn-1 ;
else DV <= OVn ;
end if ;
end if ;
end process DVR ;

Estas declaraciones
van al inicio de la
architecture pero
antes de begin

Patrn para conexiones a buses


xBUS = (OV1!OV2!...!OVn)*[f1(csl[i],IR[j]),f2(csl[i],IR[j]), , fn(csl[i],IR[j])]

signal f
...
begin
f(1) <=
f(2) <=
...
f(n) <=

: std_logic_vector (1 to n) ;

f1(csl[i],IR[j]) ;
f2(csl[i],IR[j]) ;
fn(csl[i],IR[j])] ;

Xbus : process (f)


Begin
if
f(1) = 1 then DV <=
elsif f(2) = 1 then DV <=
...
elsif f(n) = 1 then DV <=
else DV <= ( others => 0)
end if ;
end process xBUS;

OV1 ;
OV2 ;
OVn ;
;

Unidad de Control
1. La unidad de control puede realizarse en un archivo separado que luego ser
conectado como componente en el archivo de datos.
2. Usar la herramienta para la implementacin automatizada de mquinas de
estado, de esta forma se realiza usando la cantidad mnima de flip-flops.
Patrn de encabezado:
entity fsm is
Port ( clk, rst, : in STD_LOGIC; -- clk y rst siempre incluidas.
-- Aqu se incluyen las declaracin de otras seales o vectores
-- que influyen en los saltos condicionales (Entradas e IR) ;
fsmout : out STD_LOGIC_VECTOR (1 to n));
-- la salida siempre ser un vector de n bits
-- n = nmero de pasos DELAY de la secuencia de control,
-- note que empieza desde 1 y no desde 0.
end fsm ;

Unidad de Control

1. Formato de una mquina de estado.


Patrn de arquitectura:

Architecture UNID_CNTL of fsm is


type ESTADOS is (S1, S2, ... Sn) ; -- Declara el tipo de seal que
-- corresponde a los estados.
signal stdo, stdo_sig : ESTADOS ;
signal c : std_logic_vector (1 to n) ; -- c puede ser usado como
-- entrada y como salida.
begin
sinc: process (rst,clk) -- Proceso sincrnico.
begin
if rst = 1 then stdo <= S1 ;
elsif (clkevent and clk=0) then stdo <= stdo_sig ;
end if ;
end process sinc ;

Contina

Unidad de Control

1. Formato de una mquina de estado.


Patrn de la arquitectura (continuacin):

log: process (stdo,entradas)


begin
case stdo is
when S1 =>
c <= (1 = 1,others => 0);
if (condicin de entradas) then stdo_sig <= (estado segn la sec. de control);
else
stdo_sig <= (estado segn la sec. de control);
end if ;
when S2 =>
c <= (2 = 1,others => 0);
stdo_sig <= (estado segn sec. de control) cuando el salto es incondicional.
...
when Sn =>
c <= (n = 1, others => 0);
stdo_sig <= S1 ;
end case
end process log ;
fsmout <= c ;
end UNID_CNTL ;

Ejemplo:
Implementar en VHDL la secuencia de control obtenida para el ejemplo 4.3 que se
presenta a continuacin:
AHPLMODULE: EJEMPLO43
MEMORY: AR[16];DR[32];CT[2].
EXINPUTS: X[8];READY;WORD.
OUTPUTS: WRITE;ACCEPT;DBUS[32];ADBUS[16].
1 =>(^READY,READY&WORD,READY&^WORD)/(1,2,3).
2 CT<=2$0.
3 (DR[0:7]!DR[8:15]!DR[16:23]!DR[24:31])*(^CT[0]&^CT[1],
^CT[0]&CT[1],CT[0]&^CT[1],CT[0]&CT[1])<= X; ACCEPT=\1\;
CT <= (CT[0]@CT[1],^CT[1]);
=>(^(CT[0]&CT[1]))/(1).
4 =>(^READY,READY&WORD,READY&^WORD)/(4,2,5).
5 AR[0:7]<= X; ACCEPT=\1\.
6 =>(^READY,READY&WORD,READY&^WORD)/(6,2,7).
7 AR[8:15] <= X; ACCEPT=\1\.
8 WRITE=\1\; DBUS = DR; ADBUS = AR;
=>(1).

Solucin:
Paso 1 / El encabezado: Afecta al entity y a la architecture por los nombres en
los terminales de entrada y de salida y dems recursos que utiliza el mdulo.
AHPLMODULE: EJEMPLO43
MEMORY: AR[16];DR[32];CT[2].
EXINPUTS: X[8];READY;WORD.
OUTPUTS: WRITE;ACCEPT;DBUS[32];
ADBUS[16].

entity EJ43 is
Port ( X : in STD_LOGIC_VECTOR (0 to 7);
ready, word, clk, rst : in STD_LOGIC;
ADBUS : out STD_LOGIC_VECTOR (0 to 15);
DBUS : out STD_LOGIC_VECTOR (0 to 31);
wrt, accpt : out STD_LOGIC);
end EJ43;
architecture Behavioral of EJ43 is
signal
signal
signal
signal

Las seales en rojo deben ser agregadas


en todos los casos.

ar :
dr :
ct :
C :

std_logic_vector
std_logic_vector
std_logic_vector
STD_LOGIC_VECTOR

(0
(0
(0
(1

to
to
to
to

15);
31);
1);
8);

Solucin:
Paso 2 / La seccin de datos: Recopilar las transferencias de todos los registros
en una sola transferencia incluyendo en las condiciones las seales de control.
2 CT<=2$0.
3 (DR[0:7]!DR[8:15]!DR[16:23]!DR[24:31])*(^CT[0]&^CT[1],
^CT[0]&CT[1],CT[0]&^CT[1],CT[0]&CT[1])<= X; ACCEPT=\1\;
CT <= (CT[0]@CT[1],^CT[1]).
5 AR[0:7]<= X; ACCEPT=\1\.
7 AR[8:15] <= X; ACCEPT=\1\.
8 WRITE=\1\; DBUS = DR; ADBUS = AR.

Resumen de transferencias para CT:


CT*(CSL2+CSL3)<= (2$0!(CT[0]@CT[1],^CT[1]))*(CSL2,CSL3)

Resumen de transferencias para DR: para DR se deben separar las diferentes


particiones como registros independientes.
DR(0:7)*(CSL3&^CT[0]&^CT[1]) <= X El resto de las particiones son similares.

Resumen de conexiones:
ACCEPT = CSL3 + CSL5 + CSL7;

WRITE = CSL8 ; DBUS = DR*CSL8 ; ADBUS = AR*CSL8

Solucin:
Paso 3 / La seccin de datos: Expresar las transferencias en los procesos y las
conexiones concurrentes.
Implementacin de CT:
CT*(CSL2+CSL3)<= (2$0!INC(CT))*(CSL2,CSL3)

log1 <= C(2) or C(3);


cnt: process(clk)
begin
if clk'event and clk ='0' and log1 = '1' then
if C(2) = '1' then ct <= "00" ;
else ct <= ct + 1 ;
end if ;
end if ;
end process cnt ;

Solucin:
Paso 3 / La seccin de datos: Expresar las transferencias en los procesos.
Implementacin de DR: para DR se deben separar las diferentes particiones como
registros independientes.
DR(0:7)*(CSL3&^CT[0]&^CT[1]) <= X
El resto de las particiones son similares.
datr: process (clk)
begin
if clk'event and clk
dr(0 to 7) <= x ;
end if;
if clk'event and clk
dr(8 to 15) <= x ;
end if;
if clk'event and clk
dr(16 to 23) <= x;
end if;
if clk'event and clk
dr(24 to 31) <= x;
end if;
end process datr ;

= '0' and ct = "00" and C(3) = '1' then

= '0' and ct = "01" and C(3) = '1' then

= '0' and ct = "10" and C(3) = '1' then

= '0' and ct = "11" and C(3) = '1' then

Solucin:
Recopilacin de conexiones:
ACCEPT = CSL3 + CSL5 + CSL7;

WRITE = CSL8 ; DBUS = DR*CSL8 ; ADBUS = AR*CSL8

DBUS <= dr when C(8) = '1' else (others => '0') ;


ADBUS <= ar when C(8) = '1' else (others => '0') ;
wrt <= C(8) ;
accpt <= C(3) or C(5) or C(7) ;

FIN DE LA SECCIN DE DATOS

Solucin:
Paso 4 / La seccin de control: Definir el archivo para la seccin de control
1
2
3
4
5
6
7
8

=>(^READY,READY&WORD,READY&^WORD)/(1,2,3).
=>(3).
=>(^(CT[0]&CT[1]))/(1).
=>(^READY,READY&WORD,READY&^WORD)/(4,2,5).
=>(6).
=>(^READY,READY&WORD,READY&^WORD)/(6,2,7).
=>(8).
=>(1).

Definicin del encabezado:


entity EJ43CNTL is
Port ( clk, rst, ready, word : in STD_LOGIC;
ct : in STD_LOGIC_VECTOR (0 to 1);
fsmout : out STD_LOGIC_VECTOR (1 to 8));
end EJ43CNTL;
architecture Behavioral of EJ43CNTL is
type estado is (s1, s2, s3, s4, s5, s6, s7, s8) ;
signal q, qnext : estado ;
signal c : std_logic_vector (1 to 8) ;

Solucin:
Paso 4 / La seccin de control: Definir el archivo para la seccin de control
Definicin de la mquina de estado.
fsm: process (clk,rst)
begin
if rst = '1' then
q <= s1 ; -- CONTROLRESET(1)
elsif clk'event and clk = '0' then
q <= qnext ;
end if ;
end process fsm ;

1
2
3
4
5
6
7
8

=>(^READY,READY&WORD,READY&^WORD)/(1,2,3).
=>(3).
=>(^(CT[0]&CT[1]))/(1).
=>(^READY,READY&WORD,READY&^WORD)/(4,2,5).
=>(6).
=>(^READY,READY&WORD,READY&^WORD)/(6,2,7).
=>(8).
=>(1).

Definicin de la lgica que define el siguiente estado.


logic: process (ready, word, ct, q)
begin
case q is
when s1 =>
c <= ( 1=>'1', others =>'0');
if ready = '0' then
qnext <= s1 ;
elsif ready = '1' and word = '1' then
qnext <= s2 ;
else
qnext <= s3 ;
end if;

Contina...

Solucin:
Paso 4 / La seccin de control: Definir el archivo para la seccin de control
Definicin del siguiente estado (continuacin).
when s2 =>
c <= ( 2=>'1', others
qnext <= s3 ;
when s3 =>
c <= ( 3=>'1', others
if ct /= "11" then
qnext <= s1 ;
else
qnext <= s4 ;
end if;
when s4 =>
c <= ( 4=>'1', others
if ready = '0' then
qnext <= s4 ;
elsif ready = '1' and
qnext <= s2 ;
else
qnext <= s5 ;
end if ;

=>'0') ;

=>'0') ;

1
2
3
4
5
6
7
8

=>(^READY,READY&WORD,READY&^WORD)/(1,2,3).
=>(3).
=>(^(CT[0]&CT[1]))/(1).
=>(^READY,READY&WORD,READY&^WORD)/(4,2,5).
=>(6).
=>(^READY,READY&WORD,READY&^WORD)/(6,2,7).
=>(8).
=>(1).

=>'0') ;

word = '1' then

Contina...

Solucin:
Paso 5 / La entidad debe ser declarada como un componente antes de que
pueda ser utilizada.
Declaracin de la unidad de control como componente.
architecture Behavioral of EJ43 is
component EJ43CNTL is
Port ( clk, rst, ready, word : in STD_LOGIC;
ct : in STD_LOGIC_VECTOR (0 to 1);
fsmout : out STD_LOGIC_VECTOR (1 to 8));
end component EJ43CNTL ;
signal C : . . .

Utilizacin del componente que implementa la unidad de control.


. . .
begin
ufsm: EJ43CNTL port map ( clk, rst, ready, word, ct, C);
. . .

Decodificador Generico
entity dcdr_n
generic (
Port ( Xi
Yo
end dcdr_n;

is
n : integer := 4);
: in STD_LOGIC_VECTOR (0 to n-1);
: out STD_LOGIC_VECTOR (0 to (2**n)-1));

architecture Behavioral of dcdr_n is


begin
dcd: process(Xi)
begin
for i in 0 to (2**n)-1 loop
if Xi = conv_std_logic_vector(i,n-1) then
Yo(i) <= '1' ;
else
Yo(i) <= '0' ;
end if;
end loop;
end process dcd;
end Behavioral;

Ejemplo:
Implementar en VHDL la secuencia de control obtenida para el ejercicio 5.21 que se
presenta a continuacin:
AHPLMODULE: STACK
EXINPUTS: PUSH; POP.
MEMORY: SP[8];M<256>[16].
EXBUSES: DBUS[16].
CLUNITS: INC[8];DEC[8]; DCD[256];BUSFN[16].
1 =>(^(PUSH + POP),PUSH&^POP,^PUSH&POP)/(1,2,4).
2 M*DCD(SP) <= DBUS; SP <= INC(SP).
3 =>(PUSH,^PUSH)/(3,1).
4 SP <= DEC(SP).
5 DBUS = BUSFN(M;DCD(SP));
=>(POP,^POP)/(5,1).
ENDSEQUENCE
CONTROLRESET(1).
END.

Este ejemplo usa una memoria externa.

You might also like