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.


sábado, 29 de junio de 2013

Contador de anillo con VHDL en Basys 2

EJERCICIO: Solo uno de los 8 leds disponibles en la tarjeta Basys 2 debe encender  cada segundo en una secuencia  contador de anillo.

Solución: 

1).Creamos nuevo proyecto: contador_de_anillo y guardamos en la carpeta apropiada efectuando la debida configuración de acuerdo a las propiedades del proyecto y características de la FPGA.

2) Como nueva fuente trabajamos el código en VHDL creando el archivo contadordeanillo.vhd

3) Se chequea sintasis y luego se efectúa la síntesis.Para este caso no efectuamos la simulación.

4) Asignamos pines en User Constraints ---> Floorplan Area / IO / Logic- Post-Synthesis

El reloj de 50 Mhz está localizado en el pin B8 de la tarjeta Basys 2.Para los LEDS vienen marcados en la tarjeta.

5) Implementamos el diseño, se genera el archivo de programación y se configura el dispositivo en la tarjeta.

6) Antes de alimentar la tarjeta  y programar la FPGA es conveniente en el Resúmen del Diseño de la FPGA  (FPGA Design Summary)  verificar que los pines del reloj y de los LEDs están todos correctos.


Para esto se da click en View Design Summary, luego en Pinout Report y por último en Signal Name.

5) Se alimenta la tarjeta a través del conector USB. Se llama el programa ADEPT y se busca y se programa la FPGA con el archivo contadordeanillo.bit. Se dice Si a las advertencias.

El led rojo titila indicando que se está efectuando la programación y en el mensaje de la ventana de Digilent Adept debe indicarse que la programación se ha efectuado exitosamente (Programming Successful).

Compuertas lógicas en Basys 2 con VHDL

EJERCICIO: Utilizando dos Switches se dan valores binarios a las entradas X,Y y se generan las diferentes compuertas lógicas para ser visualizadas en los leds de la tarjeta Basys 2.

Vamos a indicar los pasos básicos sin entrar en detalle. Si el lector requiere paso a paso las indicaciones se sugiere previamente  estudiar los laboratorios con la tarjeta Spartan 3E explicados en  entradas anteriores del blog para que adquiera habilidad en el manejo del software Xilinx ISE 10.1

1). Primero cerramos el proyecto existente en el navegador de Xilinx 10.1 y creamos un nuevo proyecto que vamos a guardar en una carpeta que previamente se ha creado para trabajar con Basys 2.
El proyecto lo llamamos compuertas  e indicamos  como HDL el tipo de nivel superior de fuente   en el que se van a trabajar las compuertas lógicas.

Indicamos las propiedades  del proyecto  y las características propias de la FPGA de la tarjeta basys 2:


2). Creamos como nueva fuente un módulo VHDL para indicar el programa respectivo:

 3). Se efectúa la síntesis del circuito para compilar el archivo VHDL después de haber chequeado su sintásis.

 4),  Se hace ahora la simulación respectiva:
5).. Se efectúa la asignación de pines y luego editamos el archivo compuertas.ucf para verificar que está correcto.



6).estando el circuito sintetizado y simulado, se procede a implementar el diseño, generar el archivo de programación y configurar la FPGA en la tarjeta Basys 2, tendiente a generar el archivo compuertas.bit, que es el objetivo final.  En las FPGA el archivo .bit es el equivalente al archivo .JED para programar  las GAL:

7) Se conecta el cable  USB que alimenta y permite la programación de la FPGA de la tarjeta Basys 2.
Abrimos el software ADEPT de la empresa Digilent, fabricante de la tarjeta.
Con Browse  buscamos el archivo compuertas.bit en la carpeta donde guardamos el proyecto.
Damos Si  en la advertencia que aparece.
Se da click en program, y si nuevamente a la ventana con adevertencia, y la tarjeta debe funcionar perfectamente despues de titilar brevemente el led rojo, indicativo de que la programación ha sido exitosa.
En Adept  debe aparecer en la parte de abajo un mensaje indicando que la programación de la FPGA se ha efectuado satisfactoriamente.
 Mediante Adept se puede chequear el correcto funcionamiento de la tarjeta con un test de prueba.

 Se muestra en tiempo real que switches o pulsadores se accionan.Los displays de 7 segmentos muestran un contador en hexadecimal desde 0000 hasta FFFF (4 dígitos unificados)

Después de realizado el test de prueba se requiere volver a grabar la FPGA para que vuelva a funcionar.
Si se desenergiza se pierde la programación.Ello es debido a que las LUTS (tablas de búsqueda) de la FPGA se efectúan sobre memorias RAM volátiles. Si se desea que el programa perdure aun cuando se quite  la alimentación hay que grabarlo en la memoria PROM Flash que dispone la tarjeta junto con la FPGA.