Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Soluzione: fft.vhdl
Entity fft is port(Reset, clock : in bit; Q : out bit); End Entity; Architecture fft_arc of fft is signal status : bit := '0'; Begin status <= '0' when Reset = '1' else not status when (clock = '0' and clock'event) else status; Q <= status; End Architecture; Entity counter8 is port(reset, ck : in bit; ripple : out bit; cnt : out bit_vector(7 downto 0)); End Entity; Architecture count8_arch of counter8 is Component fft is port(Reset, clock : in bit; Q : out bit); End Component; For All : fft use Entity work.fft(fft_arc); signal link : bit_vector(7 downto 0); Begin c0 : fft port map(reset, ck, link(0)); c1 : fft port map(reset, link(0), link(1)); c2 : fft port map(reset, link(1), link(2)); c3 : fft port map(reset, link(2), link(3)); c4 : fft port map(reset, link(3), link(4)); c5 : fft port map(reset, link(4), link(5)); c6 : fft port map(reset, link(5), link(6)); c7 : fft port map(reset, link(6), link(7)); cnt(7 downto0) <= link; ripple <= '1' when link = X"11" else '0' after 10 ns; End; macchina.vhdl Entity macchina is port(reset, clk: in bit; x, sel: in bit_vector(1 downto 0); y: out bit_vector(7 downto 0)); End entity; Architecture macchina_arc of macchina is Component cont is port(reset, ck: in bit; ripple: out bit; cnt: out bit_vector(7 downto 0)); End Component; For All: cont use Entity work.counter8(count8_arch); signal rip1, rip2, rip3, rip4: bit; signal resetcont, decsel, decx, contck: bit_vector(0 to 3); signal temp_x: bit_vector(1 downto 0); -- matrice di memoria fatta da tre contatori TYPE matrice is ARRAY (0 to 3) of bit_vector(7 downto 0); signal contoutput: matrice; Begin -- campiono la x temp_x <= "00" when reset = '1' and reset'event else x when clk = '1' and clk'event and reset = '0' else temp_x; -- a seconda del valore di x, devo selezionare uno dei contatori with temp_x select decx <= "0001" when
"00","0010" when "01","0100" when "10","1000" when "11";--faccio la nand fra il vettore decx che dice quale contatore è abilitato, e un vettore diclock,. che vale tutti 1 quando il clock vale 1, e quindi facendo la nand attivo solo ilcontatore che ha:--al vettore decx ho 1 cioe l ho selezionato con la x--al vettore clock=1, quindi il clock è attivo, in tal caso 1 nand 1=0 , e quindi il clockè 0 e quindi il fft contacontck<=decx nand (clk & clk & clk & clk);with sel selectdecsel<= "0001" when "00","0010" when "01","0100" when "10","1000" when "11";--faccio la and fra il vettore decsel , che ha un 1 nella posizione corrispondnete alcontatore che ho selezionato con i bit sel, e fra il vettore di ttuti reset che vale quinditutti 1 quando il reset è altpo:--quando ho un 1 nella posizione orrente
del contatore abilitato da sel, ed il reset è alto, ho la AND fra 1 e 1 che fa 1, e quindi dando questo resetcont(i) al contatore in questione gli sto abilitando o meno il reset.
resetcont <= decsel and (reset and reset and reset and reset);
--ai componenti contatori assegno un clock e un reset personalizzati che sono la posizione i-sima dei segnali resetcont e contclock che tiro fuori dal confronto fra due vettori, e che quindi valgono 0 o 1:
-- se contclock(i)=0 dico al contatore di contare
-- se resetcont=1 dico al contatore di resettarsi
cn1: cont port map(resetcont(0), contck(0), rip1, contoutput(0));
cn2: cont port map(resetcont(1), contck(1), rip2, contoutput(1));
cn3: cont port map(resetcont(2), contck(2), rip3, contoutput(2));
cn4: cont port map(resetcont(3), contck(3), rip4, contoutput(3));
-- Osservazione: quindi nella simulazione il clock lo usciamo solo per fare questo conto con i vettori, perciò se anche abbiamo messo che il fft conta sul fronte di discesa, in realtà con questo```html
confronto l'incremento del contatore si ha quando clock(i)=1 e decx(i)=1, e cioè sul fronte di salita del clock dell'esercizio che da questo confronto vuol dire il fronte dare un fronte di discesa a quel particolare contatore
with sel select y <= contoutput(3) when "00", contoutput(2) when "01", contoutput(1) when "10", contoutput(0) when "11"; End; macchina_tb.vhdl Entity macchina_tb is End entity; Architecture macchina_tb_arc of macchina_tb is Component m is port(reset, clk: in bit; x, sel: in bit_vector(1 downto 0); y: out bit_vector(7 downto 0)); End component; For All : m use Entity work.macchina(macchina_arc); signal clock, reset: bit; signal x, sel: bit_vector(0 to 1); signal y: bit_vector(7 downto 0); Begin clock <= not clock after 5 us; reset <= '1' after 87 us, '0' after 88 us; sel <= "00" after 5 us, "11" after 28 us, "00" after 50 us, "11" after 80 us; x <= "00" after```
5 us,"11" after 56 us;m1: m port map(reset,clock,x,sel,y);End;
Con il reset
Senza Reset
Riflessioni Compito di Architettura dei Calcolatori
Compito di Macchine per l'elaborazione dell'Informazione
16/10/2014
Nome ________________ Cognome ________________
Progettare e sviluppare in VHDL una macchina che accetta in ingresso:
- un clock di periodo 10 us,
- un segnale di reset,
- un segnale X da 8 bit,
- un segnale LOAD da 1 bit
La macchina presenta in uscita:
- un segnale STROBE da 1 bit,
- un segnale ADDR da 16 bit,
- segnale D da 8 bit.
La macchina gestisce 4 canali ognuno dei quali caratterizzato da un registro indirizzo da 16 bit, un registro contatore da 6 bit.
Quando il segnale di LOAD è alto la macchina campiona 3 byte in sequenza sulle linee X.
I primi 2 bit del primo byte indicano il canale, i restanti 6 bit rappresentano il valore di inizializzazione del suo contatore.
I secondi 2 byte rappresentano l'indirizzo di partenza per il canale specificato dal
- abilita un canale diverso in round robin
- decrementa il contatore per quel canale
- decrementa l'indirizzo per quel canale
- alza lo STROBE se il contatore è diverso da 0
- fornisce in uscita su D il byte X in ingresso
library ieee;
use ieee.std_logic_1164.all;
Entity fa is
port(x,y,rin: IN std_logic;
z,rout: OUT std_logic);
End fa;
Architecture fa_arc of fa is
Begin
z <= x xor y xor rin;
rout <= (x and y) or (x and rin) or (y and rin);
End;
library ieee;
use ieee.std_logic_1164.all;
Entity adder8 is
port(x8,y8: IN std_logic_vector(7 downto 0);
s8: OUT std_logic_vector(7 downto 0);
r8out: OUT std_logic;
r8in: IN std_logic);
End entity;
Architecture adder8_arc of adder8 is
Component fac is
port(x,y,rin: IN std_logic;
z,rout: OUT std_logic);
End Component;
for all: fac use
Entity work.fa(fa_arc); signal temp: std_logic_vector(6 downto 0); Begin fa1 : fac port map(x8(0),y8(0),r8in, s8(0),temp(0)); fa2 : fac port map(x8(1),y8(1),temp(0), s8(1),temp(1)); fa3 : fac port map(x8(2),y8(2),temp(1), s8(2),temp(2)); fa4 : fac port map(x8(3),y8(3),temp(2), s8(3),temp(3)); fa5 : fac port map(x8(4),y8(4),temp(3), s8(4),temp(4)); fa6 : fac port map(x8(5),y8(5),temp(4), s8(5),temp(5)); fa7 : fac port map(x8(6),y8(6),temp(5), s8(6),temp(6)); fa8 : fac port map(x8(7),y8(7),temp(6), s8(7),r8out); End; m.vhdl library ieee; use ieee.std_logic_1164.all; use IEEE.numeric_std.all; Entity m is port (x,sel: in std_logic_vector(1 downto 0); ck,reset: in std_logic; y: in std_logic_vector(7 downto 0); out_count: out std_logic_vector(7 downto 0)); End Entity; Architecture m_arc of m is Type mem is array (3 downto 0) of std_logic_vector(7 downto 0); signal counters : mem; signal temp_x: std_logic_vector(1 downto 0):="00"; signal adder1,temp_y, sum: std_logic_vector(7 downto 0); signal rout:
std_logic := '0'; Component sum8 is port ( x8, y8: IN std_logic_vector(7 downto 0); s8: OUT std_logic_vector(7 downto 0); r8out: OUT std_logic; r8in: IN std_logic ); End Component; for all: sum8 use entity work.adder8(adder8_arc); Begin -- campiono x, nel testbench metto il periodo del colck ogni 5 us, cosi ogni 10 us campiono il valore di x temp_x <= "00" when reset = '1' and reset'event else x when ck = '0' and ck'event else temp_x; -- campiono il valore di y ogni 10 us temp_y <= X"00" when reset = '1' and reset'event else y when ck = '0' and ck'event else temp_y; -- in adder1 indica quale banco di memoria è stato selezionato dal valore campionato di x adder1 <= counters(to_integer(unsigned(temp_x))); s8: sum8 port map (temp_y, adder1, sum, rout, '0'); -- metto il risultato della somma nel registro indicato dal valore campionato di x quando sono sul fronte di salita del clock gen_counters: for i in 0 to 3 loop -- codice qui end loop; End;
generate
up_count:
counters(i) <= X"00" when reset='1' and reset'event else
sum when to_integer(unsigned(temp_x))=i and ck='1' and ck'event;
end generate;
-- metto in uscita il banco di memoria indicato da SEL sempre sul fronte di discesa del clock
out_count <= counters(to_integer(unsigned(sel))) when ck='0' and ck'event;
End Architecture;
tb.vhdl
library ieee;
use ieee.std_logic_1164.all;
use IEEE.numeric_std.all;
Entity tb is
End Entity;
Architecture tb_arc of tb is
Component cm is
port (
x, sel: in std_logic_vector(1 downto 0);
ck, reset: in std_logic;
y: in std_logic_vector(7 downto 0);
out_count: out std_logic_vector(7 downto 0)
);
End Component;
for all: cm use entity work.m(m_arc);
signal tbx, tbsel: std_logic_vector(1 downto 0) := "00";
signal tbck, tbreset: std_logic := '0';
signal tby, tbout: std_logic_vector(7 downto 0) := X"00";
Begin
tbck <= not tbck after 5 us;
tbreset <= '1' after 7 us, '0' after 9
us;tbx<="11" after 12 us,"11" after 32 us,"10" after 80 us;tbsel<="