Autor Tema: Empezando con VHDL  (Leído 11613 veces)

0 Usuarios y 1 Visitante están viendo este tema.

bambino

  • Visitante
Empezando con VHDL
« en: 18 de Junio de 2009, 07:47:59 »
Hola. Estoy empezando con VHDL y he descrito un circuito con ISE de Xilinx, que realiza una cuenta ascendente/descendente de 00 a 99 (o de 99 a 00) seleccionando la dirección mediante un switch. La visualización de la cuenta se realiza en un solo display de 7 segmentos, es decir, mediante otro switch indicamos si queremos ver la parte correspondiente a las unidades o a las decenas.

He comprobado el funcionamiento utilizando una  SpartanIII de Xilinx y el funcionamiento es correcto, pero no me convence mucho el código que he escrito. Además aparece el siguiente warning durante el proceso de síntesis : WARNING:Xst:2734 - Property "use_dsp48" is not applicable for this technology.

Agradecería sus opiniones. Gracias.

El código es el siguiente:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity tipo1 is
    Port ( clk : in  STD_LOGIC;
           reset : in  STD_LOGIC;
           sw0 : in  STD_LOGIC;
           sw2 : in  STD_LOGIC;
           Led0 : out  STD_LOGIC;
           Led7 : out  STD_LOGIC;
           AN : out STD_LOGIC_VECTOR(3 DOWNTO 0);
           Display : out  STD_LOGIC_VECTOR (6 downto 0));
end tipo1;

architecture Behavioral of tipo1 is
--Señales reloj
signal divisor : std_logic_vector(26 downto 0);
signal OneSecond : std_logic;
--Señales contador99
signal Unidades : integer range 0 to 9;
signal Decenas : integer range 0 to 9;
--Señales UnidadesDecenas
signal Binary : std_logic_vector(3 downto 0);

BEGIN
reloj:
  process(clk,reset)
    begin
      if (reset = '1') then
        divisor <= (others => '0');
      elsif (clk' event and clk = '1') then
        if divisor = 25000000 then
          divisor <= (others => '0');
          OneSecond <= not(OneSecond);
        else divisor <= divisor + 1;
        end if;
      end if;
  end process reloj;

--Contador de 00 a 99 ascendente/descendente. 
contador99:
  process (OneSecond,reset,sw2,Decenas,Unidades)
 
    begin
      if (reset = '1')then
        unidades <= 0;
        decenas <= 0;
        led0 <= '1';  --display de ampliacion activo a nivel bajo.
        led7 <= '0';  --display de la placa activo a nivel alto.
      elsif (OneSecond' event and OneSecond = '1') then
        if (sw2 = '0') then  --cuando sw2 = '0' cuenta ascendente
          if (Unidades /= 9 or Decenas /= 9) then
            case unidades is
              when 9 => Unidades <= 0;
                        case Decenas is
                          when 9 => Decenas <= 0;
                          when others => Decenas <= Decenas + 1;
                        end case;
              when others => Unidades <= Unidades + 1;
            end case;
          else led0 <= '0';
          end if;
        else  --Cuando sw2 = '1' cuenta descendente
          if (Unidades /= 0 or Decenas /= 0) then
            case Unidades is
              when 0 => Unidades <= 9;
                        case Decenas is
                          when 0 => Decenas <= 9;
                          when others => Decenas <= Decenas - 1;
                        end case;
              when others => Unidades <= Unidades - 1;
            end case;
           else led7 <= '1';
          end if;          
        end if;
      end if;
   end process contador99;
   
   
UnidadesDecenas:

   Binary <= conv_std_logic_vector(Unidades,4) when sw0 = '0' else
             conv_std_logic_vector(Decenas,4) when sw0 = '1';
    
--El decodificador está implementado para los displays
--de ampliación.

decodificador:
           --"gfedcba"
  Display <= "1000000" when Binary = "0000" else
             "1111001" when Binary = "0001" else
             "0100100" when Binary = "0010" else
             "0110000" when Binary = "0011" else
             "0011001" when Binary = "0100" else
             "0010010" when Binary = "0101" else
             "0000010" when Binary = "0110" else
             "1111000" when Binary = "0111" else
             "0000000" when Binary = "1000" else
             "0011000";
            
SelecDisplay:
  AN <= "0111";

end Behavioral;

Desconectado siciliano

  • PIC10
  • *
  • Mensajes: 6
Re: Empezando con VHDL
« Respuesta #1 en: 02 de Febrero de 2010, 14:32:46 »
Hola para probar tu programa necesito saber cuales son los pines que le asignas a la fpga por tal hay que ir a USER CONSTRAINTS --ASSING PACKAGE PINS
el tema es que no se como hago para relacionar tus variables con los pines del FPGA me podrias indicar gracias..


 

anything