TODOPIC
Otros Microcontroladores / Dispositivos programables => Lógica Programable => Mensaje iniciado por: bambino 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;
-
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..