viernes, 22 de noviembre de 2013

Evaluación lúdica sobre Máquinas de Estado Algorítmicas

Para todos  los puntos tenga en cuenta la siguiente información, y marque la respuesta correcta en el test.

El siguiente diagrama ASM  corresponde a un sistema digital donde en el procesador de datos hay un motor DC que se maneja a través de un flip-flop J-K de salida M y un contador de década Ascendente/Descendente: C.    S es un pulsador de inicio (Start) y D1,D2 son detectores para el contador.


Solución:
Respuestas al Test de Selección Múltiple con única respuesta:
1. C     2.C     3.B     4.A     5.D     6.B     7.C     8.A     9.B     10.D     11.C     12.B     13.C     14.B
15.A     16.A     17.B     18.D

Mensaje desencriptado:

miércoles, 20 de noviembre de 2013

Contador de "UNOS" de un registro de 8 bits con VHDL

Se trata de implementar un contador que detecte el número de bits en nivel alto presentes en un registro, para implementar con la FPGA de la tarjeta Digilent Basys 2.

Se hace uso del método de Máquina de Estado Algorítmico ASM.

El ejercicio se plantea y resuelve en el libro Fundamentos de Lógica Digital con diseño VHDL de Stephen Brown y Zvonko Vranesic.

Una máquina ASM dispone de una Unidad de Control y de un procesador de datos.

En el procesador de datos se dispone de un registro A que carga en paralelo los 8 bits Data y además puede desplazar los bits de izquierda a derecha (del más al menos significativo). Con la compuerta NOR de 8 entradas se detecta si A = 0, haciendo Z = 1 cuando ello ocurra. Si el bit menos significativo de A (A0 = 1), un contador B que inicia reseteado al cargar sus 8 bits en cero incrementa. Si Z = 1, quiere decir que A =0, y B indicará el número de "Unos" presentes en el registro A. Un led denominado "Done" indicará que ha finalizado el conteo de bits en nivel alto presentes en A.
El registro A  esquemáticamente es similar a la siguiente figura
 Si L = 1, se carga en los flip-flops los datos R, paralelamente, sin importar el enable E.
Si L = 0, y, E=1, hay corrimiento en este caso desde la entrada serial W a Q0, de Q0 a Q1, de Q1 a Q2, etc.
Si L=0, E=0, las salidas Q de los flip-flops no cambian
aunque se presente el flanco de subida del reloj.

La carta o diagrama ASM es tal como se muestra
S responde a un pulso de inicio (start) para que se inicie el proceso de conteo de los bits en nivel alto presentes en el registro A. Mientras S no sea 1 no comienza el conteo de bits.

La unidad de control sigue un diagrama similar a la carta ASM anterior
Si los enables EA y EB estan en nivel alto A desplaza y B incrementa, siempre y cuando las entradas de carga LA y LB esten en nivel bajo. Z=1 si el registro A tiene sus 8 bits en cero, y la bandera "Done" avisa que el conteo de "unos" ha finalizado.

El libro de Brown muestra el código VHDL para el contador de bits y la siguiente simulación realizada en Altera
Para que Xilinx sintetize el código VHDL del contador de bits completo hay que sintetizar previamente el registro A de desplazamiento a la derecha el cual debe ser empaquetado en la librería de Work para que el código de contador de bits lo pueda llamar y ejecutar.
Veamos el código VHDL del registro llamado reg_derecha  con su empaquetamiento:

--Registro de desplazamiento a la derecha,con carga ---paralela y enable (habilitación)

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL;

entity reg_derecha is
    Port ( R : in  STD_LOGIC_VECTOR (7 downto 0);
           L,E,W : in  STD_LOGIC;
           Clock : in  STD_LOGIC;
               Q : buffer  STD_LOGIC_VECTOR (7 downto 0));
end reg_derecha;

architecture Behavioral of reg_derecha is

begin
  Process
  Begin
   wait until Clock'event and Clock = '1';
   If E = '1' then 
     If L = '1' then Q <= R;
     else
      For i IN 0 to 6 LOOP
      Q(i) <= Q(i+1);
      END LOOP;
      Q(7) <= W;
     END if;
   END if;
 END Process;
end Behavioral;

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL;

PACKAGE reg_derecha_PACKAGE IS
 Component reg_derecha
   Port ( R : in  STD_LOGIC_VECTOR (7 downto 0);
           L,E,W : in  STD_LOGIC;
           Clock : in  STD_LOGIC;
               Q : buffer  STD_LOGIC_VECTOR (7 downto 0));
 END component;
END  reg_derecha_PACKAGE;

Chequeamos sintaxis y sintetizamos, y luego procedemos a elaborar el código VHDL del contador de bits completo así:

--Contador de UNOS para registro de 8 bits
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.reg_derecha_PACKAGE.all;

entity bitcount is
    Port ( Clock, Resetn : in  STD_LOGIC;
           LA, S : in  STD_LOGIC;
           Data :  in  STD_LOGIC_VECTOR (7 downto 0);
           B    :  BUFFER   INTEGER RANGE 0 TO 8;
           Done :  out  STD_LOGIC);
end bitcount;

architecture Behavioral of bitcount is
TYPE estado IS (S1,S2,S3);
SIGNAL y: estado;
SIGNAL A: STD_LOGIC_VECTOR (7 downto 0);
SIGNAL  Z,EA,LB,EB,LOW: STD_LOGIC;
begin

CONTROL: PROCESS(Clock, Resetn)
  BEGIN
    IF Resetn = '1' THEN y <= S1;
elsif (Clock'EVENT and Clock = '1') THEN
 CASE y is
  WHEN S1 =>
 if S = '0' then y <= S1; else y <= S2;
                  end if;
WHEN S2 =>
 if Z = '0' then y <= S2; else y <= S3; 
                  end if;
WHEN S3 =>
 if S = '1' then y <= S3; else y <= S1;
                  end if;  
End CASE;
  End if;
End Process;

SALIDAS: PROCESS(y,A(0))
begin
EA <= '0'; LB <= '0'; EB <= '0'; Done <= '0';
CASE y IS
  WHEN S1 => 
   LB <= '1'; 
WHEN S2 => 
   EA <= '1'; 
IF A(0) ='1' THEN EB <= '1'; else EB <= '0'; END IF;
WHEN S3 => 
   Done <= '1'; 
 END CASE;
END PROCESS;

upcount: PROCESS(Resetn, Clock)
begin
 if Resetn = '1' THEN
   B <= 0;
 ELSIF (Clock'EVENT and Clock = '1') THEN
   IF LB = '1' THEN B <= 0;
   ELSIF EB = '1' then B <= B + 1;
   END IF;
 END IF;
END PROCESS;

 LOW <= '0';
 SHIFTA:reg_derecha  
PORT MAP(Data,LA,EA,LOW,Clock,A);
 Z <= '1' when A ="00000000" else '0';

end Behavioral;

El código VHDL completo se sintetiza satisfactoriamente

Desde luego hay que adicionar el divisor de frecuencia de 50 Mhz a 1 hz para poder visualizar en la tarjeta Basys2.

viernes, 8 de noviembre de 2013

Multiplicador binario en VHDL con FPGA de Basys 2

Invito al lector a consultar el interesante artículo de Gerardo Muñoz, ingeniero electrónico egresado de la UAN y actualmente docente investigador de la Universidad Distrital,  : donde se muestra como diseñar un multiplicador binario por máquina de estado algoritmico con VHDL:

Un método simple para pasar de un algoritmo a un modelo VHDL

jueves, 26 de septiembre de 2013

¿ Que tanto sabemos ? Contadores asíncronos y síncronos



Solución:
a) La entrada CLR, activa con nivel ALTO, permite resetear el circuito secuencial, que es un contador binario asíncrono descendente de 3 bits.
b) El bloque Clk1Hz  es un divisor de frecuencia que tiene como entrada el reloj a cristal de 50 Mhz disponible en la tarjeta Basys 2 y como salida 1 Hz. Es imposible crearlo esquemáticamente. Sólo puede realizarse a través de un lenguaje HDL, como VHDL o Verilog.
c) Las ondas deben indicar un contador descendente, que con CLR =1, inicia en 0, y si CLR = 0, cada pulso de subida de reloj cambian en decimal a  6, 5,4,3,2,1,0, 7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,...
d) La secuencia que se presenta al ojo humano aparenta un conteo tal como se indicó anteriormente. Sin embargo, debido a los retardos en cascada en los flip-flops, sucede un conteo incorrecto, el cual se evidencia al cambiar los 3 bits, por ejemplo, cuando cambia del 0 al 7, o del 4 al 3.
Veamos el cambio del contador del 0 al 7, cuando comienza a descender:

2. a)

b) Mapas de Karnaugh y  Ecuaciones de entrada de los Flip-flops:
    
  
D ( Q2) =  Q1 Q0 + Q2 Q0' 

D(Q1) = Q2' Q1' Q0 + Q1 Q0' 


D(Q0) = Q0' 


c) Circuito lógico:


Ejercicios prácticos con la terjeta Basys2:
Implementar en esquemático cada uno de los dos contadores y verificar su comportamiento.Es indispensable el divisor de frecuencia que a partir del cristal de 50 Mhz genere la frecuencia de 1 Hz.

domingo, 30 de junio de 2013

Arquitectura de la FPGA




Básicamente  una FPGA ((Field Programmable Gate Array)  está estructurada  por un gran número de bloques lógicos configurables ( Formado por los Slices) interconectados a través de canales de enrutamiento también programables y todo el arreglo se encuentra  rodeado de bloques de entradas y salidas (I/O Pads).
  En los Slices se realiza la mayor parte dela funcionalidad de la FPGA y suelen estar agrupados de 2 en 2 o de 4 en 4 formando los  bloques lógicos configurables (CLBs). Dentro de este componente encontramos los módulos LUT, registros y multiplexores programables en un número que depende de familia de FPGA, y tal como se muestra en la siguiente figura:

Los elementos programables más importantes en el  Slice  son los generadores reprogramables de función lógica, realizadas por las denominadas LUT (Look-up Table) o tablas de búsqueda, que son celdas de memoria SRAM  volátiles  y multiplexores para seleccionar la salida.
 Veamos, por ejemplo,  una LUT para una función  F = X1' X2 + X1 X2'  =  X1 xor X2
 La LUT  se puede simplificar en su gráfica:
            
Se pueden tener LUTs de 3 o más variables.Veamos, por ejemplo una de tres variables que genera la función  F =   X3  X4    +    X3 X4' X5'

Observe que para generar la tabla en la RAM, la función simplificada debe expandirse en mintérminos.
En este caso, se hace:  X3 X4 = X3 X4 X5' + X3 X4 X5
Supongamos ahora que se desea implementar la función F = (X1 xor X2) + (  X3  X4    +    X3 X4' X5')
Expandiendo queda así:  F =  X1´ X2    +    X1 X2´  +    X3  X4 X5'     +    X3 X4' X5'   +   X3 X4 X5

Para su implementación se necesitan la LUT de 2 entradas que realiza la compuerta XOR, la LUT de 3 entradas, y otra LUT de 2 entradas para la OR requerida.


Luego :  F =  X1´ X2    +    X1 X2´  +    X3  X4 X5'     +    X3 X4' X5'   +   X3 X4 X5 se genera así:

Las LUTS  tal como se trabajan físicamente en la FPGA se muestran en la siguiente figura:
Observe que se implementan Multiplexores de 4 a 1, de 8 a 1, y de 16 a 1, utilizando sólo multiplexores 2/1.
Los bloques de Entrada/Salida de las FPGAs cumplen la misma función que las macroceldas de salida en otros dispositivos lógicos programables,  como las  CPLD o las GAL, pero con más controles lógicos, entre los que se incluyen, configuraciones de entrada y salida combinacionales o registradas, alta impedancia, elementos de retardo, controlesanalógicos y otros.
Según se dijo ya cada bloque lógico CLB en la FPGA se encuentra incrustado en la estructura de interconexión, que se componen en realidad de cables con conexiones programables para ello.

La FPGA Spartan 3E  de Xilinx   dispone además de diversos dispositivos embebidos como memorias, multiplicadores, DCMs (administradores de reloj), etc.
La programación de la FPGA se hace vía JTAG,un acrónimo para Joint Test Action Group (Grupo de acción conjunta de prueba).
La interfaz JTAG es un conector de 4 hilos:
  1. TDI (Entrada de Datos de Testeo)
  2. TDO (Salida de Datos de Testeo)
  3. TCK (Reloj de Testeo)
  4. TMS (Selector de Modo de Testeo)

  Ya que posee una sola línea de datos, el protocolo es necesariamente serial, como el Serial Peripheral Interface. La entrada de la señal de reloj es por el pin TCK. La configuración del dispositivo se realiza manipulando una máquina de estados de un bit empleando el pin TMS. Un bit de datos es cargado en TDI y otro sacado en TDO por cada pulso de reloj de la señal TCK.