Envío Gratis en compras mínimas de $1200 mxn Enviamos a toda la Republica Mexicana
Buscar

Librería Mod Display

El display de 7 segmentos es un dispositivo muy común y es usado en una gran cantidad de aplicaciones. Cuando se utilizan más de 1 display, normalmente se usa un sólo bus de datos por cada segmento y se hace un multiplexeo para encender a cada display durante un tiempo corto (que puede variar entre 1 y 10 milisegundos). Esta librería permite controlar hasta 8 displays usando 8 bits para conectar los segmentos de todos los displays incluyendo el punto decimal y 8 bits para controlar los transistores.

 

 

La librería contiene los siguientes puertos:

 

FPGA_CLK:Puerto genérico de tipo INTEGER donde se especificará la frecuencia de reloj del FPGA.

NUM_DISPLAY: Puerto genérico de tipo INTEGER que indica el número de displays que se utilizarán. La librería soporta máximo 8 displays.

SEL_ANODO_CATODO: Puerto genérico de un bit para seleccionar la configuración del display, si es de ánodo (‘0’) o cátodo (‘1’) común. El segmento se activa con un ‘0’ cuando se conecta en ánodo común y se activa con un ‘1’ cuando se conecta en cátodo común.

SEL_TRANSISTOR: Puerto genérico de un bit para indicar si el transistor se activa en alto (‘1’) o en bajo (‘0’).

CLK: Puerto de entrada de la señal de reloj.

NUM_BIN: Puerto de entrada de 27 bits, es el número binario que se convertirá a decimal y se mostrará en los displays. El valor máximo a convertir es 99,999,999 (b’101111101011110000011111111′).

PUNTOS: Puerto de 8 bits que activa los puntos decimales siendo el LSb el display de las unidades.

DISPLAY: Puerto de 8 bits conectado al bus de los displays. El MSb se conecta al segmento “A” y el LSb se conecta al punto decimal.

T: Puerto de 8 bits conectado a los transistores que controlan a los Displays.

BINARIO_A_DECIMAL: Componente que contiene un código que divide el número binario de entrada en unidades, decenas, centenas, etc. utilizando ciclos for.

Modo de uso

El primer paso es identificar el tipo de display que se está utilizando, si es de ánodo o de cátodo común.

 

 

Después se debe configurar la librería dependidendo de las conexiones con las que se esté trabajando.

 

INSTANCIA

 

Ejemplo de instancia utilizando un reloj de 100MHz, 5 displays conectados en ánodo común y los transistores activos en bajo.

 

component LIB_DISPLAY7SEG_RevB is

GENERIC( FPGA_CLK         : INTEGER   := 100_000_000;
         NUM_DISPLAY      : INTEGER   := 5;
         SEL_ANODO_CATODO : STD_LOGIC := '0';
         SEL_TRANSISTOR   : STD_LOGIC := '0' );

PORT( CLK     : IN  STD_LOGIC;
      NUM_BIN : IN  STD_LOGIC_VECTOR(26 DOWNTO 0);
      PUNTOS  : IN  STD_LOGIC_VECTOR(7  DOWNTO 0);
      DISPLAY : OUT STD_LOGIC_VECTOR(7  DOWNTO 0);
      T       : OUT STD_LOGIC_VECTOR(7  DOWNTO 0) );

end component LIB_DISPLAY7SEG_RevB;

 

CÓDIGO DE EJEMPLO

Contador de 0 a 999

 

Dentro del diseño del código se agregará a la librería y al convertidor como componentes dentro de un TOP , tal y como se muestra en la imagen.

 

 

El código en VHDL del TOP ejemplo1_contador0to99 quedaría de la siguiente manera:

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;

entity ejemplo1_contador0to99 is
port( clk     : in std_logic;
      display : out std_logic_vector(7 downto 0);
      T       : out std_logic_vector(7 downto 0) );
end ejemplo1_contador0to99;

architecture Behavioral of ejemplo1_contador0to99 is

component LIB_DISPLAY7SEG_RevB is
GENERIC( FPGA_CLK         : INTEGER   := 100_000_000;
         NUM_DISPLAY      : INTEGER   := 5;
         SEL_ANODO_CATODO : STD_LOGIC := '0';
         SEL_TRANSISTOR   : STD_LOGIC := '0' );

PORT( CLK     : IN  STD_LOGIC;
      NUM_BIN : IN  STD_LOGIC_VECTOR(26 DOWNTO 0);
      PUNTOS  : IN  STD_LOGIC_VECTOR(7  DOWNTO 0);
      DISPLAY : OUT STD_LOGIC_VECTOR(7  DOWNTO 0);
      T       : OUT STD_LOGIC_VECTOR(7  DOWNTO 0) );

end component LIB_DISPLAY7SEG_RevB;

CONSTANT FPGA_CLK    : INTEGER := 100_000_000;
CONSTANT MAX_RETARDO : INTEGER := FPGA_CLK-1;
CONSTANT PUNTOS      : STD_LOGIC_VECTOR(7  DOWNTO 0) := "11111111";
signal b             : std_logic := '0';
signal num_bin       : std_logic_vector(26 downto 0);
signal conta_retardo : integer range 0 to MAX_RETARDO := 0;
signal contador      : integer range 0 to 999 := 0;

begin

lib: LIB_DISPLAY7SEG_RevB
GENERIC map( FPGA_CLK         => FPGA_CLK,
             NUM_DISPLAY      => 3,
             SEL_ANODO_CATODO => '0',
             SEL_TRANSISTOR   => '0' )

PORT map( CLK, NUM_BIN, PUNTOS, DISPLAY, T );

process(CLK)
begin
if rising_edge(CLK) then
   conta_retardo <= conta_retardo+1;
   if conta_retardo = MAX_RETARDO then
      conta_retardo <= 0;
      b <= '1';
   else
      b <= '0';
   end if;
end if;
end process;

process(CLK)
begin
if rising_edge(CLK) then
   if b = '1' then
      contador <= contador+1;
      if contador = 999 then
         contador <= 0;
      end if;
    end if;
end if;
end process;

num_bin <= conv_std_logic_vector(contador,27);

end Behavioral;