questo è il primo topic che apro e lo faccio in relazione alla prima simulazione vhdl un po' più seria che porto a compimento.
Il mio scopo iniziale era quello di realizzare un codice che simulasse il comportamento di un contatore a 4 bit, che fosse in uscita collegato a dei led. In esso è presente un enable, e un up/down per simulare il comportamento di uno switch.
Il clock iniziale è a 50 mhz, e per rendere apprezzabile il conteggio sugli ipotetici led, ho anche creato un divisore di clock per portare il mio clock a 2.5 mhz.
Credo che tutto sia andato a buon fine, ma essendo ancora agli inizi, si accetano suggerimenti per migliorie o per la segnalazione di errori. Vi posto sia il codice vhdl che le immagini della simulazione in modelsim
- Code: Select all
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity contatore_completo is
port(en_in1 : in std_logic;
clk_in1 : in std_logic;
ud_in1 : in std_logic;
out_led : out std_logic_vector(1 downto 0)
);
end contatore_completo;
architecture behavioral of contatore_completo is
-- dichiaro i componenti
component contatore_fpga is
port(en :in std_logic;
ud : in std_logic;
clk : in std_logic;
out1 : out std_logic_vector(1 downto 0)
);
end component;
component divisore_clock is
port(clk_in: in std_logic;
clk_1: out std_logic
);
end component;
signal signal_clk : std_logic;
begin
contatore_fpga1 : contatore_fpga
port map(clk => signal_clk ,
en => en_in1 ,
ud => ud_in1 ,
out1 => out_led
);
divisore_clock1 : divisore_clock
port map(clk_in => clk_in1 ,
clk_1 =>signal_clk
);
end behavioral;
- Code: Select all
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity contatore_fpga is
port(en :in std_logic;
ud : in std_logic;
clk : in std_logic;
out1 : out std_logic_vector(1 downto 0)
);
end contatore_fpga;
architecture behavioral of contatore_fpga is
begin
processo : process(clk)
variable out_interno : std_logic_vector (1 downto 0) := (others => '0');
begin
if (clk 'event) and (clk ='1') then
if en ='1' then
if ud ='1' then
out_interno := out_interno + 1;
end if;
end if;
end if;
out1 <= out_interno;
end process;
end behavioral;
- Code: Select all
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity divisore_clock is
port(clk_in: in std_logic;
clk_1: out std_logic
);
end divisore_clock;
architecture behavioral of divisore_clock is
signal a_clk_1 : std_logic := '0';
begin
processo: process(clk_in)
variable cont :integer range 0 to 200;
begin
if (clk_in 'event) and (clk_in ='1') then
if (cont mod 199) = 0 then
a_clk_1 <= not a_clk_1;
end if;
if (cont = 199) then -- voglio 2.5 mhz
cont :=1;
else
cont := cont + 1;
end if;
end if;
end process;
clk_1 <= a_clk_1;
end behavioral;