eWorld Network ReSearch
Last update: 9/11/2003
by Alessandro Polo
Esercizio di ESD2, Addizionatore Seriale 4 bit
   
   
   
Overview

Esercizio di Elettronica dei Sistemi Digitali 2, addizionatore seriale a 4 bit.

Tool di sintesi: Xilinx WebPack (Overview)

   
   

 

 

Specifiche

Massimo valore operando: 1111b = 15d

Massimo valore risoultato: 1111b = 15d

Tempo di calcolo: 10 cicli di clock.

Segnale di start: GO sincrono, attivo alto.

   
   

 

 

Links ai files

Il progetto è divisto in più files per semplificare la gestione dei singoli componenti:

  Ultimo aggiornamento Dimensione
     
Relazione completa (comprende tutto) 9/11/2003 641 Kb
     

Links diretti ai singoli sorgenti VHDL:

    Ultimo aggiornamento Dimensione
       
comp1.vhd Visione Strutturale del progetto: collegamento componenti 9/11/2003 2 Kb
       
mymsf.vhd Macchina a Stati Finiti del progetto [Behavioral] 9/11/2003 2 Kb
       
univreg.vhd Universal Register [Behavioral] 9/11/2003 2 Kb
fulladder.vhd Full Adder [DataFlow] 9/11/2003 1 Kb
ff_dpet.vhd Flip-Flop D PET [Behavioral] 9/11/2003 1 Kb
       

 

   
   

 

 

Visione Strutturale

Circuito da sintetizzare:

file: es1.pdf

Click per immagine ingrandita..

file: es1.pdf


Nota:
Alcuni segnali sono dichiarati BUFFER o INOUT solo per semplificare la simulazione e per ottenere un diagramma temporale completo.

Sintesi in VHDL, visione strutturale:

file: comp1.vhdl

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

Entity SerialAdder4 is port (

go, clk : in std_logic;
A,B : in std_logic_vector (3 downto 0);
SUM : out std_logic_vector (3 downto 0);
ready : out std_logic;

fAUX1, fAUX2, fAUX3, CLD, CKDaux, OPA, OPB, RSHA: inout std_logic

);

End SerialAdder4;


Architecture Structural of SerialAdder4 is

-- signal declarations
signal LDA, LDB, RSHB : std_logic;
--signal fAUX1,fAUX2, fAUX3, CKDaux, CLD : std_logic;

-- Components declarations

Component UnivReg port (

LD, RSH, dIN : in std_logic;
Data : in std_logic_vector(3 downto 0);
Dout : out std_logic;
DataOut : out std_logic_vector(3 downto 0));

End Component;

Component FullAdder port (

in1, in2, Cin : in std_logic;
Cout, S : out std_logic );

End Component;

Component FF_DPET port (

clk, D, CL: in std_logic;
Q : out std_logic );

End Component;

Component MyMSF port (

go, clk : in std_logic;
LDA, LDB, CLD : out std_logic;
RSHA, RSHB : inout std_logic;
ready, CKD : out std_logic );

End Component;

-- Component Linking
Begin

URA: UnivReg
port map (LD => LDA , RSH => RSHA, dIN => OPA, Data => A, Dout => OPA);
URB: UnivReg
port map (LD => LDB , RSH => RSHB, dIN => fAUX1, Data => B, Dout => OPB, DataOut => SUM);

FA1: FullAdder
port map (in1 => OPA, in2 => OPB, Cin => fAUX3, Cout => fAUX2, S => fAUX1);

MyFF:FF_DPET
port map (clk => CKDaux, D => fAUX2, CL => CLD, Q => fAUX3);

TheMSF: MyMSF
port map (go => go, clk => clk, LDA => LDA, LDB => LDB, CKD => CKDaux, CLD => CLD, RSHA => RSHA, RSHB => RSHB, ready => ready);

End Structural;

file: comp1.vhdl

 

Diagramma temporale (simulazione):

test data file: sadd4.wlf

Click per immagine ingrandita..

test data file: sadd4.wlf

 

   
   

 

 

MSF

Macchina a Stati finiti di Mealy. 2 stati:

    • IDLE
      Stato di attesa del segnale go e di reset. Mantiene il FF (memorizza il riporto) a 0 (reset attivo basso).
    • WORK
      Stato di lavoro, genera il clock interno della macchina (dura 2 cicli di clock esterno), un contatore termina il processo di calcolo e modifica lo stato in IDLE per una successiva operazione.
      Da notare che il risultato (disponibile direttamente dal Registro Universale) è errato (parziale) durante l'operazione e al termine viene mantenuto corretto fino all'attivazione del segnale go.
      Un uscita ausiliaria (necessaria in realtà) è il segnale ready, implementato in questo modo è 0 solo durante il calcolo. [Nota: per quanto riguarda la prima esecuzione il segnale è 'U' (std_logig: sconosciuto) fino all'attivazione del segnale go.]

I cambi di stato e le operazioni sono eseguite al fronte di salita, il segnale di controllo GO è sincrono e avvia l'esecuzione..

 

file: mymsf.vhdl

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

Entity MyMSF is port (

go, clk : in std_logic;
LDA, LDB, CLD : out std_logic;
RSHA, RSHB : inout std_logic;
ready,CKD : out std_logic );

End MyMSF;

Architecture Behavioral of MyMSF is

Type statetype is (idle, work);
Signal state : statetype;
Signal BitPnt : std_logic_vector(3 downto 0);

Begin
Process(clk)

Begin
LDA <= '0';
LDB <= '0';

if (rising_edge(clk)) then

Case state is

when idle =>

RSHA <= '0'; --i valori nei registri vengono mantenuti
RSHB <= '0';
CLD <= '0'; --il FF (riporto) mantenuto a 0 (reset)
CKD <= '0';
if (go = '1') then

ready <= '0'; --abbasso ready solo durante il calcolo
LDA <= '1'; -- > durata 2clk (tra i due fronti di salita)
LDB <= '1'; --/
BitPnt <= "0000"; -- inizializzo contatore
state <= work;

end if;

when work =>

if (BitPnt = "1001") then

state <= idle;
ready <= '1';

else

CLD <= '1'; -- disattivo reset
CKD <= RSHA; -- clock ff (riporto) = not RSH
RSHA <= NOT RSHA; -- || creo clock RSH, durata 2 clk
RSHB <= NOT RSHB; -- ||
BitPnt <= BitPnt + 1; -- contatore

end if;

End Case;

end if;

End Process;

End Behavioral;

file: mymsf.vhdl

 

Diagramma temporale (simulazione):

test data file: mymsf.wlf

Click per immagine ingrandita..

test data file: mymsf.wlf

 

   
   

 

 

Universal Register

Registro universale, caricamento dati (LD) asincrono attivo alto. Il segnale di controllo RSH, attivo sul fronte di salita, esegue uno shift verso destra dei dati, sostituendo il bit più significativo Data(3) con il segnale ingresso dIN.

 

file: univreg.vhdl

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

Entity UnivReg is port (

LD, RSH, dIN : in std_logic;
Data : in std_logic_vector(3 downto 0);
Dout : out std_logic;
DataOut : out std_logic_vector(3 downto 0) );

End UnivReg;

Architecture Behavioral of UnivReg is

Signal currVal : std_logic_vector(3 downto 0);

Begin

Process(LD, RSH)

Begin
if (LD = '1') then --carica dati

currVal(3 downto 0) <= Data(3 downto 0);
dOUT <= Data(0);

else

if (rising_edge(RSH)) then --< impongo uscita seriale

dOUT <= currVal(0);

--< tempo necessario per l'elaborazione

elsif (falling_edge(RSH)) then--< shift destra 0101 -> X010 (X = dIN)

currVal(2 downto 0) <= currVal(3 downto 1);
currVal(3) <= dIN;

end if;

DataOut(3 downto 0) <= currVal(3 downto 0); -- uscita parallela ad ogni cambiamento RSH

end if;

End Process;
End Behavioral;

file: univreg.vhdl

 

Diagramma temporale (simulazione):

test data file: ur_test.wlf

Click per immagine ingrandita..

test data file: ur_test.wlf

 

   
   

 

 

Full Adder

Sommatore con riporto.
Puo essere implementato con due Half Adder (sommatori parziali) o tramite la descrizione dataflow.

In questo caso il costrutto in1 XOR in2 è assiociato ad una variabile (l'assegnamento è istantaneo), le altre due funzioni logiche (logica combinatoria) ottengono direttamente le 2 uscite (S= somma, Cout= riporto).

file: fulladder.vhdl

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

Entity FullAdder is port (

in1, in2, Cin : in std_logic;
Cout, S : out std_logic );

End FullAdder;

Architecture Dataflow of FullAdder is

Begin

Process(in1, in2)

Variable temp : std_logic;

Begin --- Esegue addizzione dopo tempo DELTA

temp := in1 XOR in2;
S <= temp XOR Cin;
Cout <= (in1 AND in2) OR (temp AND Cin);

End Process;

End Dataflow;

file: fulladder.vhdl

 

Diagramma temporale (simulazione):

test data file: fa_test.wlf


Click per immagine ingrandita..

test data file: fa_test.wlf

 

   
   

 

 

Flip-Flop D PET

Componente Flip-Flop tipo D PET con reset asincrono attivo basso.

file: ff_dpet.vhdl

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

Entity FF_DPET is PORT (

clk, D, CL: in std_logic;
Q : out std_logic );

End FF_DPET;

Architecture Behavioral of FF_DPET is
Begin

Process(clk)

Begin

if (CL = '0') then

Q <= '0';

elsif (rising_edge(clk)) then

Q <= D;

end if;

End Process;

End Behavioral;

file: ff_dpet.vhdl

 

Diagramma temporale (simulazione):

test data file: ff_test.wlf


Click per immagine ingrandita..

test data file: ff_test.wlf

 

   
   
   
 

All trademarks are property of their respective owners.
Any tools listed and avaiable in zip package is free and was downloaded from the Internet.
You are authorized to copy, redistribute and print this paper, keeping Author's credits visible and without changing the document's content.
Author is not responsible for any consequences or damages while upgrading your System.

Last update: 9/11/2003

     
     
     
     
ReSearch Home open source 2003 | by Alessandro Polo eWorld Network