Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 7 ... · Web viewElettronica dei Sistemi...
Transcript of Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 7 ... · Web viewElettronica dei Sistemi...
D1 D2 D3
CK
DATO
READY
non valido non valido non valido
RESET
SET
INC
ACC
X6
00000000
00000001 n
00000010
00000011 n1 n2 00000000….
00000100
7
7
8
FPGADATO[0..7]READY
N_UNITA[0..6]N_DECINE[0..6
]RES>
Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 12 Luglio 2012Un sistema FPGA riceve in ingresso sulla porta DATO dei dati e dei comandi ad 8 bit. I dati sono da reputare validi solo in
corrispondenza di un impulso su un N_DECINEnale READY che ha sempre durata pari ad un ciclo di clock.
Come mostrato nella successiva figura, il sistema FPGA controlla inoltre in uscita due display a 7 N_DECINEmenti che indicano rispettivamente la cifra delle unità e la cifra delle decine di un numero N memorizzato dal sistema. Il numero N viene calcolato dall’FPGA basandosi sui comandi e sui dati che vengono ricevuti sulla porta DATO. I comandi ricevuti hanno lunghezza e numero di argomenti variabili e sono riportati di N_DECINEuito:
- Alla ricezione del comando RESET, il valore di N deve diventare 0.- Alla ricezione del comando SET e del successivo unico argomento n, il valore di N deve essere impostato a n.- Alla ricezione del comando INC il valore di N deve essere incrementato di una unità.- Alla ricezione del comando ACC, il valore dei successivi argomenti (n1, n2, …) deve essere sommato ad N fino a che
non viene ricevuto un argomento pari a 0 (che interrompe la sequenza e termina il comando).- Alla ricezione del comando X6, il valore di N deve essere moltiplicato per 6.
Ad esempio, alla fine della sequenza: __RESET_ ______SET _7_______ __INC___ ______INC__1, 3_______________________ __X6___ 00000000 00000001 00000111 00000010 00000011 00000001 00000011 00000000 00000100 il valore finale di N dovrà essere pari a 72.
La rete dovrà avere la N_DECINEuente interfaccia:
entity CMD_PROCESSOR isport( CK : in std_logic;
RES : in std_logic; DATO : in std_logic_vector(7 downto 0); READY : in std_logic;
N_UNITA : out std_logic_vector(6 downto 0); N_DECINE: out std_logic_vector(6 downto 0) );
end CMD_PROCESSOR;
Si descriva la rete utilizzando il linguaggio VHDL adottando uno stile di descrizione RTL.
Si simuli la rete logica realizzando delle forme d’onda in ingresso rappresentative del funzionamento, visualizzando il comportamento delle uscite e dei principali nodi interni, incluso il valore del numero N
Si effettui la sintesi logica della rete di interfaccia su dispositivi FPGA Altera e si indichino, come commenti nel codice VHDL, la famiglia ed il dispositivo logico utilizzati, il numero di LE e flip-flop necessari e la massima frequenza di funzionamento.
Si conN_DECINEnino il file .VHD (indicando nome e cognome come commenti ) e il file .VWF delle forme d’onda utilizzato in simulazione (possibilmente quello in uscita dal rapporto di simulazione).
Soluzione (non controllata)
library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;
entity CMD_PROCESSOR isport( CK : in std_logic; RES : in std_logic; DATO : in std_logic_vector(7 downto 0);
READY : in std_logic;
N_UNITA : out std_logic_vector(6 downto 0); N_DECINE: out std_logic_vector(6 downto 0) );
end CMD_PROCESSOR;
architecture A of CMD_PROCESSOR issignal nN, N: unsigned(7 downto 0);signal N_per_6 : unsigned(10 downtp 0);signal D,U: unsigned(3 downto 0);type my_state is (idle, set, acc);signal cs, ns: my_state;
begin
process(CK)begin
if ck’event and ck=’1’ then if res=’1’ then N <= conv_unsigned(0,8); else
N <= nN; end if; end if;end process;
process(n) begin if n<conv_unsigned(10,6) then d <= conv_unsigned(0,4); u <= n(3 downto 0); elsif n<conv_unsigned(20,6) then d <= conv_unsigned(1,4); u <= conv_unsigned(n-conv_unsigned(10,6), 4); elsif n<conv_unsigned(30,6) then d <= conv_unsigned(2,4); u <= conv_unsigned(n-conv_unsigned(20,6), 4); elsif n<conv_unsigned(40,6) then d <= conv_unsigned(3,4); u <= conv_unsigned(n-conv_unsigned(30,6) ,4); elsif n<conv_unsigned(50,6) then d <= conv_unsigned(4,4); u <= conv_unsigned(n-conv_unsigned(40,6), 4); elsif n<conv_unsigned(60,6) then d <= conv_unsigned(5,4); u <= conv_unsigned(n-conv_unsigned(50,6), 4); elsif n<conv_unsigned(70,6) then d <= conv_unsigned(6,4); u <= conv_unsigned(n-conv_unsigned(60,6), 4); elsif n<conv_unsigned(80,6) then
d <= conv_unsigned(7,4); u <= conv_unsigned(n-conv_unsigned(70,6), 4); elsif n<conv_unsigned(90,6) then d <= conv_unsigned(8,4); u <= conv_unsigned(n-conv_unsigned(80,6), 4); else d <= conv_unsigned(9,4); u <= conv_unsigned(n-conv_unsigned(90,6), 4); end if;
end process;
process(U) begin case U is when conv_unsigned(0,4) => N_UNITA <= "1000000"; when conv_unsigned(1,4) => N_UNITA <= "1111001"; when conv_unsigned(2,4) => N_UNITA <= "0100100"; when conv_unsigned(3,4) => N_UNITA <= "0110000"; when conv_unsigned(4,4) => N_UNITA <= "0011001"; when conv_unsigned(5,4) => N_UNITA <= "0010010"; when conv_unsigned(6,4) => N_UNITA <= "0000010"; when conv_unsigned(7,4) => N_UNITA <= "1111000"; when conv_unsigned(8,4) => N_UNITA <= "0000000"; when conv_unsigned(9,4) => N_UNITA <= "0010000"; when others => N_UNITA <= "0000110"; end case;end process;
process(D) begin case D is when conv_unsigned(0,4) => N_DECINE <= "1000000"; when conv_unsigned(1,4) => N_DECINE <= "1111001"; when conv_unsigned(2,4) => N_DECINE <= "0100100"; when conv_unsigned(3,4) => N_DECINE <= "0110000"; when conv_unsigned(4,4) => N_DECINE <= "0011001"; when conv_unsigned(5,4) => N_DECINE <= "0010010"; when conv_unsigned(6,4) => N_DECINE <= "0000010"; when conv_unsigned(7,4) => N_DECINE <= "1111000"; when conv_unsigned(8,4) => N_DECINE <= "0000000"; when conv_unsigned(9,4) => N_DECINE <= "0010000"; when others => N_DECINE <= "0000110"; end case;end process;
process(CK)begin
if ck’event and ck=’1’ then if res=’1’ then cs <= idle; else
cs <= ns; end if; end if;end process;
process(cs, DATO, READY, N, N_per_6)begin case cs is
when idle =>
if READY=’1’ and DATO=conv_unsigned(0,8) then nN <= conv_unsigned(0,8);
ns <= idle; elsif READY=’1’ and DATO=conv_unsigned(1,8) then ns <= set; nN <= N; elsif READY=’1’ and DATO=conv_unsigned(2,8) then nN <= N + conv_unsigned(1,8); ns <= IDLE; elsif READY=’1’ and DATO=conv_unsigned(3,8) then nN <= N; ns <= ACC; elsif READY=’1’ and DATO=conv_unsigned(4,8) then nN <= N_per_6(7 downto 0); ns <= IDLE; else nN <= N; ns <= IDLE; end if;end process;
N_per_6 <= N*conv_unsigned(6,8);
end A;