Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 7 ... · Web viewElettronica dei Sistemi...

5
D1 D2 D3 CK DATO READY non valido non valido non valido RESET SET INC ACC X6 0000000 0 0000000 1 n 0000001 0 0000001 1 n1 n2 0000000 0 …. 0000010 0 7 7 8 FPGA DATO[0..7] READY N_UNITA[0..6 ] N_DECINE[0.. 6] RES > Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 12 Luglio 2012 Un 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 is

Transcript of Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 7 ... · Web viewElettronica dei Sistemi...

Page 1: Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 7 ... · Web viewElettronica dei Sistemi Digitali L-A – Prova di VHDL – 12 Luglio 2012 Un sistema FPGA riceve in ingresso

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).

Page 2: Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 7 ... · Web viewElettronica dei Sistemi Digitali L-A – Prova di VHDL – 12 Luglio 2012 Un sistema FPGA riceve in ingresso

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

Page 3: Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 7 ... · Web viewElettronica dei Sistemi Digitali L-A – Prova di VHDL – 12 Luglio 2012 Un sistema FPGA riceve in ingresso

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);

Page 4: Elettronica dei Sistemi Digitali L-A – Prova di VHDL – 7 ... · Web viewElettronica dei Sistemi Digitali L-A – Prova di VHDL – 12 Luglio 2012 Un sistema FPGA riceve in ingresso

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;