Académique Documents
Professionnel Documents
Culture Documents
VHDL
OPERATEURS
ARITHMETIQUES
1)
Recopier,
compiler,
crire
le
testbench
et
simuler
le
code
du
composant
dcrit
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;
-----------------------------------
-
Que
signifie
std_logic_vector
?
Cest
un
vecteur
de
std_logic
,
cest
dire
un
bus.
La
taille
de
ce
bus
est
obligatoirement
spcifie.
-
Que
signifie
downto
?
signal s : std_logic_vector(3 downto 0) ;
Cela
signifie
que
s
est
un
vecteur
(bus)
de
std_logic
de
4
bits,
le
bit
de
poids
fort
tant
situ
gauche
et
le
bit
de
poids
faible
droite.
s <="1000"; --correspond la valeur 8 en base 10 (non-sign)
Il
est
possible
en
VHDL
dcrire
les
vecteurs
dans
le
sens
inverse
(bit
de
poids
fort
droite
et
bit
de
poids
faible
gauche).
Exemple
:
s : std_logic_vector(0 to 3) ;
s <="1000"; --correspond la valeur 1 en base 10 (non-sign)
-
A
quoi
sert
le
for
generate
?
Il
permet
dans
ce
cas
de
simplifier
lcriture
du
port
map
par
une
boucle.
Comme
il
est
ncessaire
de
faire
4
instanciations
de
c2,
plutt
que
de
lcrire
4
fois,
on
fait
une
boucle
avec
une
variable
i
variant
de
0
3.
-
Quelle
est
la
fonctionnalit
de
cette
entit
?
Il
sagit
dun
additionneur
4
bits.
-
Pourquoi
la
sortie
est
sur
5
bits
alors
que
les
entres
sont
sur
4
?
Le
5me
bit
est
le
bit
de
carry
(retenue).
-
Quelle
alternative
aurait-on
pu
utiliser
pour
concevoir
la
mme
fonctionnalit
?
On
aurait
pu
implanter
ce
circuit
directement
laide
de
portes
logiques
sans
rutiliser
des
composants
prdfinis
tel
que
nous
lavons
fait
ici.
La
rutilisation
permet
de
simplifier
la
conception
des
circuits
en
crant
es
hirarchies
de
composants.
2)
Recopier,
compiler,
crire
le
testbench
et
simuler
le
code
du
composant
dcrit
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;
-----------------------------------
in std_logic;
out std_logic);
Question:
-
Quelle
est
la
diffrence
entre
un
signal
et
une
variable
en
VHDL
?
- un
signal
peut
sutiliser
hors
ou
dans
un
process
- une
variable
ne
sutilise
que
dans
un
process
- lintrt
dune
variable
est
de
stocker
des
rsultats
de
calculs
temporaires
que
lon
veut
rinjecter
dans
dautres
calculs
- Laffectation
dune
valeur
une
variable
est
immdiate
alors
que
laffectation
dune
valeur
un
signal
ne
seffectue,
dans
un
process,
que
lorsque
celui-ci
est
suspendu
(cest
dire
lorsquil
arrive
un
wait
ou
end
process
)
Dans
lexemple
du
composant
sig_var,
on
observe
effectivement
que
les
sorties
res1
et
res2
sont
diffrentes,
alors
que
ce
sont
les
mmes
calculs
qui
sont
effectus.
Dans
le
cas
du
2me
process,
sortie2
est
le
rsultat
dun
xor
entre
sig_s1
et
d3.
Le
signal
sig_s1
ntant
affect
que
lorsque
le
process
est
suspendu,
la
sortie
res2
prend
la
valeur
de
sig_s1
retarde
dun
cycle
dexcution.
4)
Recopier,
compiler,
crire
le
testbench
et
simuler
le
code
du
composant
dcrit
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
process(a,b)
variable temp: std_logic_vector(4 downto 0);
begin
temp := ( 0 & a ) + ( 0 & b ) ;
s <= temp (3 downto 0) ;
cf <= temp(4) ;
ovf <= temp(3) xor a(3) xor b(3) xor temp(4) ;
end process;
end archi;
--------------------------------------------------------