Anteprima
Vedrai una selezione di 4 pagine su 12
Relazione progetto Select Carry Adder Pag. 1 Relazione progetto Select Carry Adder Pag. 2
Anteprima di 4 pagg. su 12.
Scarica il documento per vederlo tutto.
Relazione progetto Select Carry Adder Pag. 6
Anteprima di 4 pagg. su 12.
Scarica il documento per vederlo tutto.
Relazione progetto Select Carry Adder Pag. 11
1 su 12
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

Circuito Carry Select Adder a n bit

A0 B O0 8 S[16:0]SEL MUfor_1[1].MUiA1 B O1 9SEL MUfor_1[2].MUiA2 B O2 10SEL MUfor_1[3].MUiA3 B O3 11SEL MUfor_1[4].MUiA4 B O4 12SEL MUfor_1[5].MUiA5 B O5 13SEL MUfor_1[6].MUiA6 B O6 14SELRCA_0 MUA[7:0] S[7:0]...A[15:0] for_1[7].MUiB[7:0] cout...B[15:0] cin FA_0 A7RCA_nBit B O7 15A S15 SELB cout15 MUcin FARCA_1 for_1[8].MUiFA_1A[7:0] S[7:0] A... B[7:0] cout B O... 16A S15cin SELB cout15RCA_nBit MUcin FA for_1[8].if_end.MU_lastRCA_LSB AA[7:0] S[7:0] B O7:0 7:0 coutB[7:0] cout SEL7:0 cin MUcin RCA_nBit

È il circuito principale che racchiude tutti gli altri componenti fino ad ora citati.

Il Carry Select Adder a n bit (parametrico) prende in input due numeri (a n bit) e ne restituisce la somma e il riporto in uscita.

Il circuito in questione è stato implementato per lavorare con operandi in complemento a due, quindi ne è stata fatta l'estensione con segno attraverso due segnali: Ia, Ib. In questo modo gli operandi hanno lunghezza pari a n+1 bit.

L'idea che sta alla base del circuito Carry Select Adder è quella di suddividere l'addizione in due parti: una parte che si occupa di sommare i bit meno significativi (LSB) e una parte che si occupa di sommare i bit più significativi (MSB).

CSA è che la somma dei primi n/2 bit meno significativi viene gestita da un RippleCarry Adder a n/2 bit. La somma degli altri n/2 bit più significativi viene svolta invece da due RCA: uno con riporto con riporto in ingresso pari a '0' e l'altro con riporto in ingresso pari a '1'. La somma dell'ultimo bit è trattata con due FA, con la stessa logica dei due RCA precedentemente descritti: uno prende il riporto in entrata dal blocco di RCA '0' e l'altro dal blocco di RCA '1'. Il riporto in uscita di quest'ultimi viene immesso in un multiplexer finale che, in base al riporto del primo blocco di RCA (n/2 bit meno significativi), seleziona il riporto finale dell'intero CSA. Il corretto risultato da mettere nella somma è deciso da n/2 + 1 multiplexer in base al riporto in uscita del primo blocco di RCA (n/2 bit meno significativi). Il riporto in uscita del CSA è inutile ai fini del calcolo dell'addizione tra

numeri in complemento a due.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.MyDef.ALL;

entity CSA_n is
    Port ( A : in STD_LOGIC_VECTOR (n - 1 downto 0);
           B : in STD_LOGIC_VECTOR (n - 1 downto 0);
           cin : in STD_LOGIC;
           cout : out STD_LOGIC;
           S : out STD_LOGIC_VECTOR (n downto 0));
end CSA_n;

architecture Behavioral of CSA_n is
    component RCA_nBit is
        Port ( A : in STD_LOGIC_VECTOR (nRCA - 1 downto 0);
               B : in STD_LOGIC_VECTOR (nRCA - 1 downto 0);
               cin : in STD_LOGIC;
               cout : out STD_LOGIC;
               S : out STD_LOGIC_VECTOR (nRCA - 1 downto 0));
    end component;

    component MU is
        port (A, B, SEL : in STD_LOGIC;
              O : out STD_LOGIC);
    end component;

    component FA is
        Port ( A : in STD_LOGIC;
               B : in STD_LOGIC;
               cin : in STD_LOGIC;
               cout : out STD_LOGIC;
               S : out STD_LOGIC);
    end component;

    -- Segnali in
    signal Ia, Ib : STD_LOGIC_VECTOR (n - 1 downto 0);

C _ V E C T O R ( n downto 0) ;
35 signal Ocout_LSB : STD_LOGIC ;
36 signal Ocout_0 , Ocout_1 : S T D _ L O GI C _ V E C T O R (1 downto 0) ;
37 signal S_0 , S_1 : ST D _ L O G I C _ V E C T O R ( n /2 downto 0) ;
38
39
40
41 begin
42 -- estensione del segno per numeri in complemento a due
43 Ia <= A (n -1) & A ;
44 Ib <= B (n -1) & B ;
45 -- RCA che calcola la somma dei bit meno significativi
46 RCA_LSB : RCA_nBit port map ( Ia ( n /2 -1 downto 0) , Ib ( n /2 -1 downto 0) , cin , Ocout_LSB ,S ( n /2 -147 downto 0) ) ;
48 -- RCA che calcola la somma degli altri n /2 bit con riporto in ingresso pari a ’0 ’
49 RCA_0 : RCA_nBit port map ( Ia (n -1 downto n /2) , Ib (n -1 downto n /2) , ’0 ’ , Ocout_0 (0) , S_0 ( n /2 -150 downto 0) ) ;
-- Siccome abbiamo fatto l ’ estensione del segno , la somma s a r a n +1 bit . Questo Full Adder
51 serve per sommare quindi-- l ’ ultimo bit ( n +1) . Non posso sommarlo con RCA in quanto si aspetta un ingresso di 8
bit52 .-- Prende come cin , il Cout generato dal RCA_053 FA_0 : FA port map ( Ia ( n ) , Ib ( n ) , Ocout_0 (0) , Ocout_0 (1) , S_0 ( n /2) ) ;5455 -- RCA che calcola la somma degli altri n /2 bit , con riporto in ingresso pari a ’1 ’56 RCA_1 : RCA_nBit port map ( Ia (n -1 downto n /2) , Ib (n -1 downto n /2) , ’1 ’ , Ocout_1 (0) , S_1 ( n /2 -157 downto 0) ) ;-- Come FA_0 . Prende come cin , il Cout generato da RCA_158 FA_1 : FA port map ( Ia ( n ) , Ib ( n ) , Ocout_1 (0) , Ocout_1 (1) , S_1 ( n /2) ) ;5960 -- Genera n /2 Multiplexer per scegliere gli n /2 bit che andranno nella somma , oltre quelli61 gia immessi dal RCAA_LSBfor_1 : for i in 0 to n /2 generate62 MUi : MU port map ( S_0 ( i ) , S_1 ( i ) , Ocout_LSB , S ( n /2+ i ) ) ;63 if_end : if i = n /2 generate64 -- Multiplexer che genera il Cout finale , prendendo come input il riporto in uscita di65 FA_0 e FA_1MU_last : MU port map ( Ocout_0 (1) , Ocout_1 (1) , Ocout_LSB , cout ) ;66 end generate ; --
if_end67 end generate ; -- for_16869 end Behavioral ;70 6Libreria Customizzata ”MyDef”library IEEE ;1 use IEEE . STD_LO GIC_1164 . ALL ;23 package myDef is -- dichiarare librerie custom4 constant n : integer :=16;5 constant nRCA : integer :=( n /2) ;6 end package ;7

Per allegerire la sintassi del codice abbiamo creato una libreria custom, dove abbiammo dichiarato due costanti intere. La costante n indica il numero di bit del CSA, mentre la costante nRCA indica il numero di bit dei RCA presenti nel progetto.

Simulazioni Testbench

Nella Behavioral simulation è riportato il componente CSA. Successivamente sono stati creati i segnali necessari alla simulazione: Ia, Ib sono i vettori di segnali dedicati agli operandi in ingresso. Icin è il riporto in ingresso dell’intero circuito, Ocout è il riporto in uscita del circuito, mentre OS è il vettore di segnali in cui andrà la somma finale. A differenza dei vettori di segnali dei numeri in ingresso (n-1) bit, OS è

inizializzato a n bit perché deve contenere la somma dei numeri ai quali è stata effettuata l'estensione del segno. Infine, sono state eseguite delle operazioni di prova intervallate da t = 10ns di "wait". Di seguito riportiamo il codice della simulazione:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.MyDef.ALL;

entity Sim_nbit is
end Sim_nbit;

architecture Behavioral of Sim_nbit is
  component CSA_n is
    Port (
      A : in STD_LOGIC_VECTOR(n-1 downto 0);
      B : in STD_LOGIC_VECTOR(n-1 downto 0);
      cin : in STD_LOGIC;
      cout : out STD_LOGIC;
      S : out STD_LOGIC_VECTOR(n downto 0)
    );
  end component;

  signal IA, IB : STD_LOGIC_VECTOR(n-1 downto 0);
  signal Icin : STD_LOGIC;
  signal Ocout : STD_LOGIC;
  signal OS : STD_LOGIC_VECTOR(n downto 0);
begin
  circuit: CSA_n port map (IA, IB, Icin, Ocout, OS);
  Icin <= '0';

process24 begin
    wait for 20 ns ;
    IA <= " 0 1 0 0 0 0 0 0 0 0 0 0 0 0 00 " ; -- 1638427
    IB <= " 0 0 1 1 1 1 1 1 1 1 1 1 1 1 11 " ; -- 16383 = 32.76728
    wait for 10 ns ;
    IA <= " 1 0 0 1 0 0 0 1 0 1 0 1 0 1 00 " ; -- -2833230
    IB <= " 0 0 0 0 1 1 0 1 0 1 0 1 0 1 01 " ; -- 3413 = -24.91931
    wait for 10 ns ;
    IA <= " 1 0 0 0 0 0 0 0 1 0 1 1 0 0 11 " ; -- -3258933
    IB <= " 0 1 1 1 1 1 1 1 0 1 0 0 1 1 01 " ; -- 32589 = 034
    wait for 10 ns ;
    IA <= " 1 1 0 1 1 1 1 0 0 0 0 0 1 0 01 " ; -- -869536
    IB <= " 1 0 1 0 1 1 1 1 0 0 1 0 1 0 01 " ; -- -20695 = -2939037
    wait for 10 ns ;
    IA <= " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 " ; -- -139
    IB <= " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 " ; -- 1 = 040
end process ;
end Behavioral ;
Behavioral Timing Simulation
Nella Behavioral Simulation si simula il comportamento del circuito al livello di codice, non tenendo conto del ritardo

dei componenti reali. Infatti come si nota dall'immagine tutti i segnali sono sincronizzati perfettamente. Questo di simulazione è volta al solo scopo di valutare la correttezza del codice del circuito evidenziando dunque gli errori al livello ideale della sintassi. Grazie a questo strumento si può quindi verificare la correttezza dei segnali in ogni istante di tempo, aiutati anche dalla sua interfaccia che usa i colori per segnalare eventuali anomalie; come per esempio nell'immagine "per 0ns < t < 20ns i segnali IA, IB, Ocout sono nello stato di U (Unitialized) per i primi due e nello stato di X (Undetermined) per il terzo. Questa prova è stata effettuata volutamente, infatti nel codice della Simulazione(Testbench), i suddetti segnali vengono inizializzati dopo una 'wait' di 10ns.

Post-Synthesis Timing Simulation

In questo tipo di simulazione, il programma impiega più tempo in quanto tiene in considerazione del

Il comportamento delle singole LUT, quindi, non è una simulazione astratta. Una LUT, che sta per LookUp Table, è fondamentalmente una tabella che determina quale sia l'output per un dato input. Nella logica combinatoria è la tabella di verità, la quale definisce in modo efficace il comportamento della logica combinatoria.

Il risultato della somma risulta sfasato rispetto agli ingressi in quanto viene tenuto conto del ritardo causato dalle LUT per fornire l'uscita corrispondente a un dato indirizzo. Non stiamo ancora tenendo conto dei collegamenti delle LUT. In prima istanza i segnali dei due ingressi Ia e Ib arrivano a t = 20ns e la loro somma viene prodotta a t = 24,986ns, quindi si verifica un ritardo pari a 4,986ns.

Post-Implementation Timing Simulation

Simulazione finale che tiene conto di tutti i comportamenti reali del circuito. Si può notare che tra una addizione e l'altra, il cambio del risultato della somma non è lineare, ci sono dei valori intermedi (errati).

Essi vengono dettidi 'assestamento', poichè legati al fatto che gli n+1 bit di uscita sono calcolati ognuno con un tempo differente. Quando tutti i bit si sono assestati l'uscita diventa corretta. Anche in questo caso i due se
Dettagli
A.A. 2021-2022
12 pagine
SSD Ingegneria industriale e dell'informazione ING-INF/01 Elettronica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher andrea.dellosso.1 di informazioni apprese con la frequenza delle lezioni di Elettronica digitale e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università della Calabria o del prof Costanzo Sandra.