Contatore 4 bit con uscita per led

Sezione dedicata al linguaggio di descrizione hardware per logiche programmabili

Contatore 4 bit con uscita per led

Postby lukarusso89 » 11 Nov 2012, 16:00

Salve a tutti,
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 :D


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;      
      
Attachments
simulazione.jpg
Simulazione
simulazione.jpg (217.3 KiB) Viewed 4722 times
lukarusso89
 
Posts: 12
Joined: 21 Oct 2012, 18:05

Re: Contatore 4 bit con uscita per led

Postby peter90 » 11 Nov 2012, 20:16

luka89,
mi piace l'idea che hai avuto,
ovvero quella di pubblicare il tuo progetto anche se pur semplice.
si tratta di una applicazione da cui sicuramente partire per iniziare a studiare il vhdl.

io chiederei all'amm di creare una sub-sezione vhdl per raccogliere eventualmente sorgenti e codici di vari.
ciao a tutti
peter90
 
Posts: 44
Joined: 11 Apr 2012, 19:46

Re: Contatore 4 bit con uscita per led

Postby flz47655 » 11 Nov 2012, 20:48

Ottimo lavoro, benvenuto nel mondo di VHDL :D
Solo una nota: vedo che inizializzi i segnali e le variabili es.

Code: Select all
signal a_clk_1 : std_logic := '0';
variable out_interno : std_logic_vector (1 downto 0) := (others => '0');


Non fare troppo affidamento a questa inizializzazione in quanto mi sembra che sia SOLO valida per la simulazione, non viene SEMPRE realmente sintetizzata e quindi potresti trovarti incoerenze tra la simulazione e la realtà. Io uso in genere un segnale di reset che assegna i valori iniziali.

Prova a leggere http://quartushelp.altera.com/11.0/mergedProjects/hdl/vhdl/vhdl_pro_power_up_state.htm

Ciao
PS: Se puoi ridimensiona appena l'immagine altrimenti la pagina mi esce dallo schermo
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: Contatore 4 bit con uscita per led

Postby flz47655 » 11 Nov 2012, 21:09

Se hai in ingresso un clock di 50 MHz (20ns) ottieni 125.6 KHz in uscita (7960ns)
Dividi per 199 per ogni semi-periodo quindi dividi il clock iniziale per 398, volevi fare così?
Nel commento nel codice sembra che volevi invece 2.5 MHz

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: Contatore 4 bit con uscita per led

Postby lukarusso89 » 12 Nov 2012, 00:20

Grazie per la dritta sull'inizializzazione, in effetti creare un reset può essere anche più semplice ed immediato. :D

Per quanto riguarda il clock, volevo ottenere 2.5 mhz in uscita. Ma ho diviso 199 considerando ogni semi-periodo di clock! Invece avrei dovuto dividere per 99.5 per ottenere 2.5mhz.

Grazie mille, non mi ero accorto di questo errore.

Ciao a tutti.
lukarusso89
 
Posts: 12
Joined: 21 Oct 2012, 18:05

Re: Contatore 4 bit con uscita per led

Postby flz47655 » 12 Nov 2012, 09:46

Mmmh.. il calcolo non mi convince, se parti da 50MHz e vuoi ottenere 2.5MHz devi dividere per 50/2.5=20, quindi per 10 ad ogni semiperiodo e non per 99.5

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: Contatore 4 bit con uscita per led

Postby lukarusso89 » 12 Nov 2012, 13:59

Giustissimo.. In quel modo non ottengo Mhz!!:S
Quindi eventualmente dovrei dividere per 9.95 e non per 99.5!! E quindi dieci come dicevi tu..

Grazie ancora. Spero di essere più attento la prossima volta! :p

Ciao
lukarusso89
 
Posts: 12
Joined: 21 Oct 2012, 18:05


Return to VHDL x FPGA

Who is online

Users browsing this forum: No registered users and 0 guests

cron