1 / 13

Progetto sincrono

Progetto sincrono. Una rete riceve in seriale 8 bit, i quali rappresentano un numero binari in valore assoluto, e due segnali di controllo X e Y che comandano la rete. Se XY = 00 bisogna sommare i primi 4 bit con gli ultimi 4 bit. Se XY = 10 bisogna sottrarre i primi 4 bit dagli ultimi 4bit.

varden
Download Presentation

Progetto sincrono

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Progetto sincrono Una rete riceve in seriale 8 bit, i quali rappresentano un numero binari in valore assoluto, e due segnali di controllo X e Y che comandano la rete. Se XY = 00 bisogna sommare i primi 4 bit con gli ultimi 4 bit. Se XY = 10 bisogna sottrarre i primi 4 bit dagli ultimi 4bit. Se XY = 11 bisogna sommare i bit pari con i bit dispari. Se XY = 01 bisogna sottrarre i bit pari dai bit dispari. Infine se in uscita si ha un numero maggiore di 4 bisogna trasmettere l'uscita serialmente altrimenti tramite un registro parallelo.

  2. Schematico A sinistra vi è un registro SR8CE. Per 8 colpi di clock resta attivo per poter ricevere gli 8 bit. Gli 8 multiplexer ricevono i bit e trasmettono l’uscita opportuna in base ai segnali di controllo XY Il full adder riceve gli 8 bit e li somma. Se X e Y sono 10 o 01 il CI del FA è ad 1 (utile per effettuare la sottrazione fra due numeri in complemento a 2). Se il numero ottenuto è minore o uguale a 4 lo si trasmette tramite uscita parallela (la quale si resetterà dopo 4 colpi di clock). Se ,invece, il numero è maggiore di 4 si trasmette l’uscita serialmente(un registro riceve i bit e li invia in un multiplexer, il quale viene regolato dalle uscite di un contatore. La rete viene opportunamente resettata dopo 12 colpi di clock (8 per ricevere i bit più 4 bit per inviare l’uscita serialmente).

  3. Simulazione behavioral Ricevo 00100001. Con XY=00 si sommano i primi 4 bit con gli ultimi 4.Quindi 0010 + 0001 = 0011 Ricevo 00100001. Con XY=01 si sottraggono i 4 bit dispari dai 4 bit pari. Quindi 0001 – 0100, quindi 0001 + 1011 + 1. In uscita avrò 1101 la quale sarà inviata serialmente poiché è maggiore di 4

  4. Ricevo 00100001. Con XY = 10 si sottraggono gli ultimi 4 bit dai primi 4 bit. Quindi 0001 – 0100, ovvero 0001 + 1011 + 1 =1111 Ricevo 00100001. Con XY = 11 si sommano i 4 bit dispari ai 4 bit pari. Quindi 0001 + 0100 = 0101 Si può notare che la rete nei primi 8 colpi di clock riceve il valore serialmente lasciando le uscite a 0. Poi per 4 colpi di clock trasmette l’opportuna uscita per poi resettarsi per poter ricevere un nuovo numero

  5. Simulazione post-route Nella post-route si può notare che la rete trasmette l’uscita con un ritardo pari a 9 ns. XY=00 in uscita si trasmette 0011 con uscita parallela Con XY=01 si ha in uscita 1101 serialmente

  6. Con XY=11 si trasmette in uscita 0101 serialmente Con XY=10 si trasmette in uscita 1111 serialmente

  7. VHDL Per effettuare le operazioni artimetiche abbiamo bisogno di alcune librerie. Definisco le entità opportune library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.NUMERIC_STD.ALL; entityvhdlis Port ( Clock : in STD_LOGIC; X : in STD_LOGIC; Y : in STD_LOGIC; Ser_In : in STD_LOGIC; Reset : in STD_LOGIC; Par_Out : out STD_LOGIC_VECTOR (3 downto 0); Ser_Out : out STD_LOGIC); endvhdl; architectureBehavioral of vhdlis SIGNAL number : STD_LOGIC_VECTOR ( 7 DOWNTO 0) :=(others=>'0'); SIGNAL counter : STD_LOGIC_VECTOR ( 3 DOWNTO 0) :=(others=>'0'); SIGNAL number_op : STD_LOGIC_VECTOR ( 3 DOWNTO 0) :=(others=>'0'); SIGNAL primi : STD_LOGIC_VECTOR ( 3 DOWNTO 0) :=(others=>'0'); SIGNAL ultimi : STD_LOGIC_VECTOR ( 3 DOWNTO 0) :=(others=>'0'); SIGNAL pari : STD_LOGIC_VECTOR ( 3 DOWNTO 0) :=(others=>'0'); SIGNAL dispari : STD_LOGIC_VECTOR ( 3 DOWNTO 0) :=(others=>'0'); Begin Definisco dei segnali interni utili per la realizzazione della rete. Number si memorizza il numero ricevuto. Counter è il nostro contatore. Number_op si memorizza il nuovo numero ottenuto dopo le varie operazioni Primi,Ultimi,Pari e Dispari, corrispondono ai rispettivi bit del numero ricevuto serialmente Tutti inizializzati a 0!

  8. Dichiaro un process che viene invocato ad ogni variamento del clock e del reset. Se il reset è attivo viene resettata la rete ad uno stato pronto per ricevere un nuovo numero. Altrimenti ad ogni fronte di salita del clock si controlla il counter. Se è a 13 bisogna resettare la rete. Se è minore di 8 allora memorizza il bit ricevuto all’interno del segnale number shiftando gli altri bit a sinistra if(counter= 7) then primi(0)<= ser_in; primi(1)<= number(0); primi(2)<= number(1); primi(3)<= number(2); ultimi(0)<= number(3); ultimi(1)<= number(4); ultimi(2)<= number(5); ultimi(3)<= number(6); pari(0)<= ser_in; pari(1)<= number(1); pari(2)<= number(3); pari(3)<= number(5); dispari(0)<= number(0); dispari(1)<= number(2); dispari(2)<= number(4); dispari(3)<= number(6); endif; elsif(counter= 8 ) then if(X='0' and Y='0') then number_op <= primi + ultimi; elsif (X='1' and Y='0') then number_op<= primi + (not ultimi + 1); elsif (X='0' and Y='1') then number_op<= pari + (not dispari + 1); elsif(X='1' and Y='1') then number_op<= pari + dispari; endif; Se il counter è a 7 allora si assegnano gli opportuni valori ai vari segnali. Quando il counter ha campionato 8 fronti positivi di clock tramite i due segnali di controllo si eseguono le opportune operazioni di somma o sottrazione in complemento a 2. rete : process(clock,reset) Variable I: integer; begin if(reset = '1') then Par_Out<="0000"; Ser_Out <= '0'; number <= "00000000"; counter <= "0000"; number_op <= "0000"; elsif(clock'eventAND clock='1') then if(counter = 13) then Par_Out<="0000"; Ser_Out <= '0'; number <= "00000000"; counter <= "0000"; number_op <= "0000"; elsif(counter< 8) then number(0) <= ser_In; forI in 6 downto 0 loop number(I+ 1) <= number( I ); endloop;

  9. elsif(counter > 8) then if(number_op<="0100") then par_out<= number_op; elsif(number_op > "0100") then case counter is when "1001" => ser_out <= number_op(3); when "1010" => ser_out <= number_op(2); when "1011" => ser_out <= number_op(1); when "1100" => ser_out <= number_op(0); when others => null; end case; end if; end if; counter <= counter + 1; end if; end process rete; end Behavioral; Se il counter ha campionato più di 8 fronti positivi di clock allora si controlla il numero ottenuto dalle opportune operazioni, se è minore o uguale a 4 viene inviato in uscita parallela. Se , invece , è maggiore di 4 viene trasmesso in uscita paralle con un opportuno case. Infine si incrementa il counter prima dell’end if (riferito al fronte positivo di clock).

  10. Simulazione Behavioral In ingresso: 00100001. Con XY=00 si trasmette il numero 0011 parallelemente Con XY=01 si trasmette il numero 1101 serialmente

  11. Con XY=11 si trasmette in uscita il numero 0101 serialmente Con XY=10 si trasmette in uscita il numero 1111 serialmente

  12. Simulazione post-route In ingresso: 00100001. Con XY=00 si trasmette il numero 0011 parallelemente Con XY=01 si trasmette il numero 1101 serialmente

  13. Con XY=11 si trasmette in uscita il numero 0101 serialmente Con XY=10 si trasmette in uscita il numero 1111 serialmente

More Related