7
pages
Documents
Le téléchargement nécessite un accès à la bibliothèque YouScribe Tout savoir sur nos offres
7
pages
Documents
Le téléchargement nécessite un accès à la bibliothèque YouScribe Tout savoir sur nos offres
Publié par
Nombre de lectures
101
Publié par
Nombre de lectures
101
Cours/TDVHDL
OPERATEURSARITHMETIQUES
1)Recopier,compiler,écrireletestbenchetsimulerlecodeducomposantdécrit
ci-dessous:
-----------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity add4 is
port (r0:in std_logic;
a,b: in std_logic_vector ( 3 downto 0);
s: out std_logic_vector (4 downto 0));
end add4;
architecture archi of add4 is
signal r: std_logic_vector(4 downto 0);
component c2
port(a,b,rin: in std_logic; s, rout: out std_logic);
end component;
begin
r(0)<=r0;
s(4)<=r(4);
boucle:for i in 0 to 3 generate
inst: c2 port map (rin =>r(i) , a=> a(i), b=> b(i), rout=>r(i+1), s=>s(i));
end generate;
end archi;
-----------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity add4_tb is
end add4_tb;
architecture archi of add4_tb is
signal rin: std_logic;
signal entree1, entree2: std_logic_vector(3 downto 0);
signal sortie: std_logic_vector(4 downto 0);
component add4
port (r0:in std_logic;
a,b: in std_logic_vector ( 3 downto 0);
s: out std_logic_vector (4 downto 0));
end component;
begin
uut: add4 port map (a=> entree1, b => entree2, r0 => rin, s => sortie);
rin <= '0';
entree2<="1011";
stimuli: process
begin
entree1 <= "0000";
wait for 50 ns; loop
entree1 <= entree1 + 1;
wait for 50 ns;
end loop;
end process;
end archi;
-----------------------------------
-Quelleestlastructuredecetteentité?
-Quesignifie«std_logic_vector»?
C’est un vecteur de «std_logic», c’est à dire un bus. La taille de ce bus est
obligatoirementspécifiée.
-Quesignifie«downto»?
signal s : std_logic_vector(3 downto 0) ;
Celasignifiequesestunvecteur(bus)de«std_logic»de4bits,lebitdepoidsfortétant
situéàgaucheetlebitdepoidsfaibleàdroite.
s <="1000"; --correspond à la valeur 8 en base 10 (non-signé)
IlestpossibleenVHDLd’écrirelesvecteursdanslesensinverse(bitdepoidsfortà
droiteetbitdepoidsfaibleàgauche).
Exemple:
s : std_logic_vector(0 to 3) ;
s <="1000"; --correspond à la valeur 1 en base 10 (non-signé)
-Aquoisertle«for…generate»?
Ilpermetdanscecasdesimplifierl’écritureduportmapparuneboucle.Commeilest
nécessairedefaire4instanciationsdec2,plutôtquedel’écrire4fois,onfaituneboucle
avecunevariableivariantde0à3.
-Quelleestlafonctionnalitédecetteentité?
Ils’agitd’unadditionneur4bits.
-Pourquoilasortieestsur5bitsalorsquelesentréessontsur4?
èmeLe5 bitestlebitdecarry(retenue).
-Quellealternativeaurait-onpuutiliserpourconcevoirlamêmefonctionnalité?
Onauraitpuimplantercecircuitdirectementàl’aidedeporteslogiquessansréutiliser
des composants prédéfinis tel que nous l’avons fait ici. La réutilisation permet de
simplifierlaconceptiondescircuitsencréanteshiérarchiesdecomposants.
2)Recopier,compiler,écrireletestbenchetsimulerlecodeducomposantdécrit
ci-dessous:
-----------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity addN is
generic(N: integer := 4);
port ( a,b: in std_logic_vector ( N-1 downto 0);
s: out std_logic_vector (N-1 downto 0));
end addN;
architecture archi of addN is
begin
--process(a,b)
--begin
s <= a + b ;
--end process ;
end archi;
-----------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity addN_tb is
generic( N: integer:=3);
end addN_tb;
architecture archi of addN_tb is
signal entree1, entree2, sortie: std_logic_vector(N-1 downto 0);
component addN
generic(N: integer := 4);
port (a,b: in std_logic_vector ( N-1 downto 0);
s: out std_logic_vector (N-1 downto 0));
end component;
begin
uut: addN generic map (N => N) port map (a=> entree1, b => entree2, s => sortie);
stimuli_entree1: process
begin
entree1 <= (others => '0');
wait for 50 ns;
loop
entree1 <= entree1 + 1;
wait for 50 ns;
end loop;
end process;
stimuli_entree2: process
variable temp: integer;
begin
temp:=1;
for i in 1 to N loop
temp:= temp * 2;
end loop;
for i in 0 to temp-1 loop
entree2 <= (others => '0');
wait for 50 ns;
end loop;
loop
entree2 <= entree2 + 1;
for i in 0 to temp-1 loop
wait for 50 ns;
end loop;
end loop;
end process;
end archi;
-----------------------------------
-Quellessontlesdifférencesentrecettedescriptionetcelledu1)?
Lesentrées/sortiesontsurlemêmenombredebits.Parconséquentonperdlanotion
deretenue(«carry»).
Aulieud’instancierdesblocscontenantdesporteslogiques,onréalisedirectement
l’additionarithmétiqueentreles2vecteursdebits.
-Supprimerles«--»des3lignesencommentaireetsimulervotredesign:qu’est-
cequevousobservez?
Onobserveexactementlesmêmesrésultats.
-Lalistedessignauxentreparenthèsesaprès«process»s’appellelalistede
sensibilité:enleveraoubdecettelisteetsimulezvotrecircuit.Quepeutsignifier
alors«listedesensibilité»?
Sionenlève‘a’parexemple,leprocessnesedéclenchepluslorsqu’ilyaunévénement
(changementdevaleur)quiseproduitsurceport.
Lalistedesensibilité,c’estlalistedessignaux(et/ouports)auxquelsleprocessdoit
réagirlorsqu’ilyaunévénement.
-ModifiezlavaleurdeNetexpliquezl’intérêtde«generic»?
Ce terme, ajouté à une interface de composant, permet de rendre une description
paramétrable.Danslecasdel’additionneur,leparamètreestN,lalargeurdesbus
d’entrées/sortie(nombredebits).
Dansletestbench,onaajoutéégalementunparamètregénériquequivapermettrede
fixerlatailledetouslessignauxutilisés.
Un«genericmap»estégalementajoutéàl’instanciationdeaddNafinde«connecter»
leNdutestbenchauNdeaddN.EnmodifiantsimplementlavaleurdeNdansle
testbench,onpeutpasserd’unadditionneur3bitsàunadditionneur16bits.
Notezégalementles2processdegestiondesstimulisurlessignaux«entree1»et
«entree2»...
3)Recopier,compiler,écrireletestbenchetsimulerlecodeducomposantdécrit
ci-dessous:
--------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity sig_var is
port( d1, d2, d3: in std_logic;
res1, res2: out std_logic);
end sig_var;
architecture behv of sig_var is
signal sig_s1: std_logic;
begin
proc1: process(d1,d2,d3)
variable var_s1: std_logic;
begin
var_s1 := d1 and d2;
res1 <= var_s1 xor d3;
end process;
proc2: process(d1,d2,d3)
begin
sig_s1 <= d1 and d2;
res2 <= sig_s1 xor d3;
end process;
end behv;
--------------------------------------------------------
Question:
-Quelleestladifférenceentreun«signal»etune«variable»enVHDL?
- unsignalpeuts’utiliserhorsoudansunprocess
- unevariablenes’utilisequedansunprocess
- l’intérêtd’unevariableestdestockerdesrésultatsdecalculstemporairesque
l’onveutréinjecterdansd’autrescalculs
- L’affectationd’unevaleuràunevariableestimmédiatealorsquel’affectation
d’unevaleuràunsignalnes’effectue,dansunprocess,quelorsquecelui-ciest
suspendu(c’estàdirelorsqu’ilarriveàun«wait»ouà«endprocess»)
Dansl’exempleducomposantsig_var,onobserveeffectivementquelessortiesres1
etres2sontdifférentes,alorsquecesontlesmêmescalculsquisonteffectués.Dansle
èmecasdu2 process,sortie2estlerésultatd’unxorentresig_s1etd3.Lesignalsig_s1n’étantaffectéquelorsqueleprocessestsuspendu,lasortieres2prendlavaleurde
sig_s1retardéed’uncycled’exécution.
4)Recopier,compiler,écrireletestbenchetsimulerlecodeducomposantdécrit
ci-dessous:
--------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity adder is
port( a,b: in std_logic_vector ( 3 downto 0);
s: out std_logic_vector ( 3 downto 0);
cf, ovf: out std_logic);
end adder;
architecture archi of adder is
begin
p