You are on page 1of 0

SNTESIS DE MDULOS SECUENCIALES

La sntesis de mdulos secuenciales puede materializarse de forma directa a partir de descripciones RTL o
comportamental de los mdulos secuenciales tradicionalmente conocidos, como son registros, registros de
desplazamiento, contadores, monoestables, LFSR, etc.
En este captulo, a partir de los elementos descriptivos del VHDL ya introducidos en captulos anteriores se
van a realizar diversas implementaciones de los mdulos secuenciales ms conocidos. Cada mdulo se
modelar mediante una o varias descripciones. Como se observar, la descripcin de los modelos a partir del
VHDL simplifica enormemente la sntesis de sistemas digitales.
Registro
El registro es un mdulo secuencial capaz de almacenar un conjunto de datos que son cargados a partir de
una seal de carga o load. Los datos que se cargan en el registro provienen del bus externo de datos d. Puesto
que el registro contiene un conjunto de flip-flops, su estado viene dado directamente por los datos que
almacena y se visualiza al exterior a travs del bus de salida q.
El registro suele contener tambin una seal de reset o preset asncrona que inicializa el registro a 0 o 1. Por
consiguiente, su tabla de estados puede describirse de la forma siguiente:
Estado actual (q) Prximo estado (Q)
nreset =0
load =0 y ck
load =1 y ck
-
q
q
0
q
d
Tabla 1. Tabla de estados del registro.
Su funcionamiento es simple y, como tal, puede considerarse como el mdulo punto de partida para la
construccin del resto de mdulos secuenciales.
La descripcin VHDL, a nivel comportamental, es trivial a partir de la tabla 3.
Library ieee;
Use ieee.std_logic_1164.ALL;
Entity Registro is
generic (N:integer :=4);
port ( d: in std_logic_vector(N-1 downto 0);
ck, nreset, load: in std_logic;
q: out std_logic_vector(N-1 downto 0));
end;
architecture bhr of Registro is
begin
process (ck, nreset)
begin
if nreset='0' then q <=(others =>'0');
else if ck'event and ck='1' then
if load ='1' then
q <=d;
end if;
end if;
end if;
end process;
end;
La figura 1 muestra una sntesis posible del registro.

Figura 1. Registro.
La figura 2 muestra la simulacin temporal del registro.

Figura 2. Grfica termporal del registro.
Registro de desplazamiento.
El registro de desplazamiento, adems del almacenamiento de datos propio del registro, es capaz de
establecer comunicacin entre los elementos (flip-flops) vecinos permitiendo el transporte de datos (de forma
serie) a derecha e izquierda del registro. Por consiguiente, las operaciones que un registro de desplazamiento
puede contener son: inicializacin, carga de datos, desplazamiento a la derecha, desplazamiento a la
izquierda y no operacin.
Todas las operaciones, excepto la de inicializacin asncrona, pueden estar controladas a travs de una seal
de control, ctrl, de dos bits.
La tabla 2 muestra la tabla de estados del registro de desplazamiento. Para los desplazamientos a derecha e
izquierda se necesita, adems, una seal de entrada serie por la izquierda, il, y otra por la derecha, ir,
respectivamente.
Estado actual (q) Prximo estado
(Q)
Inicializacin
No operacin
Carga
Desplazamiento a derecha
Desplazamiento a izquierda
nreset =0
ctrl =00 y ck
ctrl =01 y ck
ctrl =10 y ck
ctrl =11 y ck
-
q
q
(qn-1, ..., q0)
(qn-1, ..., q0)
0
q
d
(il, qn-1, ..., q1)
(qn-2, ..., q0, ir)
Nota: Se consideraq
n-1
como el bit ms significativo (izquierda) y q
0
como el menos significativo (derecha).
Tabla 2. Tabla de estados del registro.
A partir de la descripcin de la tabla de estados del registro de desplazamiento es fcil comprender la
descripcin VHDL. La descripcin se ha realizado de forma genrica y se ha implementado para n=4 (bus de
4 datos). Se puede observar cun fcil es implementar los distintos modos de funcionamiento del registro de
desplazamiento utilizando la instruccin case-when. Adems se ha aprovechado la intruccin when others
=> NULL para implementar el modo Noop del registro de desplazamiento.
-- Registro de desplazamiento
Library ieee;
Use ieee.std_logic_1164.ALL;
Entity sr is
generic (N:integer :=4);
port ( ck, nreset, ir, il: in std_logic;
ctrl: in std_logic_vector(1 downto 0);
d: in std_logic_vector(N-1 downto 0);
q: inout std_logic_vector(N-1 downto 0));
end;
architecture bhr of sr is
begin
process (ck, nreset)
begin
if nreset='0' then q <=(others =>'0');
else if ck'event and ck='1' then
case ctrl is
when "01" =>q <=d;
when "10" =>q(N-1 downto 0) <=il & q(N-1 downto 1);
when "11" =>q(N-1 downto 0) <=q(N-2 downto 0) & ir;
when others =>NULL;
end case;
end if;
end if;
end process;
end;

La figura 3 muestra una posible sntesis, a nivel de componente, del registro de desplazamiento. Es fcil
identificar en ella, los distintos elementos que lo conforman.

Figura 3. Sntesis del registro de desplazamiento.
La figura 4 muestra un diagrama temporal del funcionamiento del registro de desplazamiento. El diagrama
muestra la operatividad para todas las modos de funcionamiento.

Figura 4. Diagrama temporal del registro de desplazamiento.
Contador.
Un contador es un circuito secuencial capaz de seguir una secuencia completa de estados y que no pasa por
un mismo estado por segunda vez hasta que se han sucedido todos los dems.
La clasificacin de contadores puede realizarse por la forma de contar y por el cdigo que utiliza en el conteo.
Por la forma de contar tenemos los contadores ascendente o up, de estado menor a mayor; descendente o
down, de estado mayor a menor; y ascendente/descendente o up/down, donde existe un seal que controla si
se cuenta de menor a mayor o de mayor a menor, respectivamente.
Si se atiende al cdigo de conteo utilizado, se tienen los contadores binarios, BCD (binario decimal, es decir,
del estado 0 al 9), J ohnson, Gray, etc.
Centrando la discusin en un contador binario ascendente, el contador suele disponer de las entradas:
- ck, o seal de reloj
- Load o carga paralela. Los datos a cargar en el contador proviene de un bus de datos d.
- Enable o capacitacin de conteo. El contador slo contar cuando Enable=1.
- Y reset o preset sncronos o asncronos.
El contador suele disponer de las salidas:
- q o estado actual.
- Y la salida terminal, o terminal counter: TC.
La tabla 3 de estados corresponde a la de un contador binario ascendente de 2
n
estados (n flip-flops) con
reset asncrono, seal de reloj, carga paralela, enable y con salida terminal.
Estado actual (q) Prximo estado (Q)
Inicializacin
No operacin
Carga
Conteo
nreset =0
Enable =Load =0
Load =1 y ck
Enable =1 y ck
-
q
q
q
0
q
d
q =(q +1)mod 2
n

Tabla 3. Tabla de estados de un contador binario ascendente.
La descripcin VHDL del contador es inmediata a partir de su tabla de estados:
Library ieee;
use ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.ALL;
Entity counter is
generic(N: integer:=4);
port(ck, enable, nreset, load:in std_logic;
d: in std_logic_vector(N-1 downto 0);
tc:out std_logic;
q: out std_logic_vector(N-1 downto 0));
end counter ;
Architecture bhr of counter is
signal estado:std_logic_vector(N-1 downto 0);
begin
process(ck, nreset)
begin
if nreset ='0' then estado <=(others =>'0');
else if ck'event and ck ='1' then
if load ='1' then estado <=d;
else if enable ='1' then estado <=estado +1;
end if;
end if;
end if;
end if;
if (estado =2**N-1) then tc <='1';
else tc <='0';
end if;
end process;
q <= estado;
end bhr;

En la descripcin VHDL del contador se utiliza una seal interna, estado, para mejorar la legibilidad del
cdigo. Por otra parte, el uso de esta variable evita tener que considerar a como seal inout.
La figura 5 muestra el circuito correspondiente al contador en un formato RTL.

Figura 5. Esquema RTL del circuito contador
En la figura 6 se puede observar el resultado de la simulacin del contador despus de sintetizarlo en el
programable EPM7032.

Figura 6. Diagrama temporal del contador binario ascendente.
En un contador la inicializacin puede implementarse sncrona o asncrona. En el ejemplo realizado la seal
nreset inicializa el circuito de forma asncrona, puesto que la inicializacin se lleva a cabo tan pronto la seal
nreset se pone a 0-lgico, de acuerdo con la modelizacin realizada del mismo en la descripcin VHDL. El
ejemplo siguiente corresponde a un circuito contador con seal nreset sncrona, puesto que la activacin est
supeditada al evento cambio en flanco de subida en la seal seal de reloj.
--EXEMPLE COMPTADOR
-- Contador divisor per 2^N con seal nreset asncrona
Library ieee;
use ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.ALL;
Entity counter is
generic(N: integer:=4);
port(ck, enable, nreset, load:in std_logic;
d: in std_logic_vector(N-1 downto 0);
tc:out std_logic;
q: out std_logic_vector(N-1 downto 0));
end counter ;
Architecture bhr of counter is
signal estat:std_logic_vector(N-1 downto 0);
begin
proper_estat: process(ck, nreset)
begin
wait until ck='1';
if nreset='0' then estat <=(others=>'0');
elsif load ='1' then estat <=d;
elsif enable='1' then estat<=estat+1;
end if;
end process;
sortida: process(estat)
begin
if (estat=2**N-1) then tc<='1';
else tc<='0';
end if;
q<=estat;
end process;
end bhr;

A diferencia del funcionamiento del contador asncrono (comparar los resultados de simulacin de las
figuras 6 y 7), en caso de resolverse una inicializacin durante el funcionamiento normal del circuito, el
contador sncrono salta al estado inicial en el momento en que se produce el flanco de reloj, por lo que
siempre los estados mantienen el mismo periodo.

Figura 7. Resultado de simulacin de un contador con seal nreset sncrona.
El divisor de frecuencia.
El divisor de frecuencia no es ms que un contador que cuenta un nmero de estados determinado, no
necesariamente igual a 2^n. En particular, un contador de n flip-flops puede considerarse como un divisor de
frecuencia de 2^n estados.
Un divisor de mestados (mdistinto a una potencia de 2) se construye a partir de un contador de 2^n estados,
con 2^n >m, en el que al llegar al estado m-1 se vuelve al estado inicial.
Existen dos formas clsicas de realizar el divisor de frecuencias. La primera es volviendo al estado inicial
por medio de la seal asncrona reset. El segundo mtodo utiliza la seal sncrona de carga. Siempre que sea
posible, se recomienda utilizar el segundo mtodo en tanto que garantiza un circuito ms inmune a glitches.
El cdigo VHDL siguiente corresponde a un divisor de frecuencia por m=11. Para ello se ha tenido que
utilizar un N=4. Para simplificar el ejemplo se ha considerado el mnimo nmero necesario de seales. Como
entradas slo son necesarias las seales de reloj y el reset asncrono. Como salidas se da el estado y la salida
div que corresponde a la salida terminal cuando se llega al estado deseado. Esta misma seal se utiliza para
devolver al divisor al estado inicial.
Library ieee;
use ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.ALL;
Entity divisor is
generic(N: integer:=4;
M: integer:=10); -- M =ltimo estado m =11.
port( ck, nreset:in std_logic;
div: inout std_logic;
q: inout std_logic_vector(N-1 downto 0));
end divisor;
Architecture bhr of divisor is
begin
process(ck, nreset)
begin
if nreset='0' then q <=(others=>'0');
elsif ck'event and ck='1' then
if div='1' then q <=(others=>'0');
else q <=q +1;
end if;
end if;
if (q =m) then div <='1';
else div <='0';
end if;
end process;
end bhr;

La sntesis realizada contra el circuito de Altera EPM7032, da como resultado el circuito de la figura 7.

Figura 7. Sntesis del divisor por m=10.
La figura 8 muestra el resultado de la simulacin a nivel temporal. Se comprueba fcilmente que el contador,
en cuanto llega al estado 10 reinicializa el circuito, realizando de esta forma un conteo de m=11 estados.

Figura 8. Diagrama temporal del divisor de m = 11 estados.