Tocci giovanni orologio e display obiettivo: costruzione di un orologio che sappia tenere in conto minuti e secondi. specifiche di progetto: Il nostro orologio, sarà costituito da : divisore di frequenza. contatore modulo 60. contatore modulo 24. contatore modulo 10. contatore modulo 16. flip flop JK. display 7 segmenti. Per creare i nostri contatori siamo partiti da un elemento di memoria fondamentale il flip-flop. Partendo da questo componente possiamo ricavarci il contatore 16 poi il contatore 10, contatore 100, contatore 60 e contatore 24. FLIP-FLOP la nostra entity sarà composta da : clear, clock, preset : IN std_logic; j,k : IN std_logic; q,qn : OUT std_logic); Questo primo componente sarà descritto con un process. Esso riuscirà ad ottenere 4 differenti uscite. Una di memoria, due che permotto il cambio di stato ed infine la j<='1', k<='1' che compongono la memoria negata. Dopo aver descritto il funzionamento del flip-flop, possiamo passare alla simulazione Test banch, dove assegneremo il valore al clear e al preset. cont 16 Il modulo 16 è un contatore formato da 4 flip-flop in cascata. Questo componentne è asincrono perchè il clock entra solo nel primo flip-flop, facendolo propagare sulle uscite. la nostra entity sarà composta da :
clear, clock : IN std_logic; q : OUT std_logic_vector); Mentre per quanto riguarda l' architecture, abbiamo usato la strutturale. TB : Come si può vedere dalla cattura del test-bench, riesce a contare fino a sedici e poi torna a 0 per ricominciare. cont10 Il modulo 10 è formato da un contatore modulo 16. Per ottenere un conteggio minore di 16, doppiamo fermare il contatore a 10, portando le due uscite, q(1) e q(3), ( 1010 =10) in una nand e il segnale uscente collegato a una and con il clear. In questo modo il nostro contatore potrà essere azzerato e farlo ripartire da 0. la nostra entity sarà composta da : clear, clock : IN std_logic; q : OUT std_logic_vector); Questo modulo, sarà descritto con la strutturale e sarà usato per formare il cont 60 e cont 24.
TB : Alla fine grazie al test bench, mettendo il clear a '1', possiamo vedere come riesca a contare da 0 a 9, per poi riazzerarsi e rincominciare. ----------------------------------------------------------------- Timer questo cmponente sarà composto da un top file con all' interno due contatori: cont24 cont60. entity orologio_display is unita_min : out STD_LOGIC_VECTOR (3 downto 0); decine_min : out STD_LOGIC_VECTOR (3 downto 0); unita_ore : out STD_LOGIC_VECTOR (3 downto 0); decine_ore : out STD_LOGIC_VECTOR (3 downto 0)); end orologio_display; le uscite saranno 4, ogni una vettoriale, appunto per differenziare le decine e le unità dei minuti e dei secondi. Come si può vedere dall' illustrazione, abbiamo le uscite dei rispettivi contatori(7-0), che si vanno a suddividere in per poi entrare a loro volta suddivisi in vettori più piccoli (3-0). cont60 formato da due cont10, esso deve portare fuori i segnali dei minuti. entity contatore60 is q : out STD_LOGIC_VECTOR (7 downto 0)) end contatore60;
TB : Alla fine grazie al test bench, mettendo il clear a '1', possiamo vedere come riesca a contare da 0 a 59, per poi riazzerarsi e rincominciare. Cont 24 formato da un cont60, esso deve portare fuori i segnali dei secondi entity contatore24 is q : out STD_LOGIC_VECTOR (7 downto 0)); end contatore24; TB : Alla fine grazie al test bench, mettendo il clear a '1', possiamo vedere come riesca a contare da 0 a 23, per poi riazzerarsi e rincominciare. --------------------------------------------------- display Il display, serve per visualizzare il tempo che scorre. È un 7 segmenti quindi visualizzeremo i secondi e i minuti sopra i display secondo il seguente schema :
Avrà entrate vettoriali per le unità e decine dei secondi e dei minuti, e come uscita, appunto un vettore che si collega ai segmenti del display. entity display is Port ( clk : in STD_LOGIC; en : in STD_LOGIC; D0 : in STD_LOGIC_VECTOR (3 downto 0); D1 : in STD_LOGIC_VECTOR (3 downto 0); D2 : in STD_LOGIC_VECTOR (3 downto 0); D3 : in STD_LOGIC_VECTOR (3 downto 0); AN : out STD_LOGIC_VECTOR (3 downto 0); seg : out STD_LOGIC_VECTOR (0 to 6)); end display; divisore100 il divisore100, è necessario per diminuire la frequenza del clock. La necessità di un divisore di frequenza si ha sia perché con uno stesso segnale di clock si devono pilotare circuiti a frequenza diversa top module la entity del file top model è : entity timer_display is enable : in STD_LOGIC; an : out STD_LOGIC_VECTOR (3 downto 0); seg : out STD_LOGIC_VECTOR (0 to 6)); end timer_display;
Sarà descritto con la forma struttutrale, e sarà composto da : un divisore100: component divisore100 is fc : out STD_LOGIC); end component; dal cont60 + cont24 : component orologio_display is unita_min : out STD_LOGIC_VECTOR (3 downto 0); decine_min : out STD_LOGIC_VECTOR (3 downto 0); unita_ore : out STD_LOGIC_VECTOR (3 downto 0); decine_ore : out STD_LOGIC_VECTOR (3 downto 0)); end component; dal display : component display is Port ( clk : in STD_LOGIC; en : in STD_LOGIC; D0 : in STD_LOGIC_VECTOR (3 downto 0); D1 : in STD_LOGIC_VECTOR (3 downto 0); D2 : in STD_LOGIC_VECTOR (3 downto 0); D3 : in STD_LOGIC_VECTOR (3 downto 0); AN : out STD_LOGIC_VECTOR (3 downto 0); seg : out STD_LOGIC_VECTOR (0 to 6)); end component; Quindi ripartendo dall' inizio, abbiamo un divisore di frequenza per ridurre il clock, due cont rispettivamente suddivisi con uscite vettoriali ed un file display. Mentre per quanto riguarda l' architecture del top file, e quindi il port map, ho collegato i vari segnali alle uscite fino ad arrivare al display il quale con le uscite per il 7 segmenti, andrannop ad azionare il display raffigurando il timer funzionante. begin divisore100_1: divisore100 port map (clock => clock, cl => cl, fc => fc1); orologio_display1 : orologio_display port map ( clock => fc1, cl => cl, decine_min => s,decine_ore => d,unita_min => a,unita_ore=>f); display_1 : display port map ( D0 => s, D1 => a, D2 => d, D3 => f, en => enable, clk => clock, seg => seg, AN=> an); end Behavioral;
file UCF: SIMULAZIONE Per la simulazione, ho implementato il tutto, visualizzando sul display il risultato richiesto, con appunto la visione del tempo che scorre. Nella immaggine di sinistra solo i secondi, mentre a destra sono presenti i minuti.