Académique Documents
Professionnel Documents
Culture Documents
programmable
https://drive.google.com/file/d/1xk5t2-
s7R4RtFVgsrHKFYIbiS8M7G9Zr/view?usp=sharing
Logique programmable :
Problémes de standardisation
Le langage vhdl :
Usages :
militaire , … )
II méthodologie :
Simulation
1- La déclaration de bibliothéque :
Library IEEE ;
Use ieee.std_logic_1164.all ;
Use ieee.std_logic_arith.all ;
Use ieee.std_logic_unsigned.all ;
( signed )
IEEE est un institut NYC qui s’est spécialisé dans la standardisation .
Spécification des états de signaux ( fils de liaisons )
Spécification des outils arithmétiques
Spécification de calculs en logique signée ou non.
NB : cette déclaration de bibliothéques est standard dans de nombreux
cas.
2- La déclaration d’entité :
Entité <====> circuit numérique
Dans la déclaration d’entité nous indiquons l’identificateur du circuit
ainsi que les signaux qui lui sont reliés :
Entity exemple1 is
Port (c : out std_logic;
a, b : in std_logic ) ;
end exemple1 ;
Exemple1 C
A
C
B
a
e
g
b
c
f
d
Library IEEE ;
Use ieee.std_logic_1164.all ;
Use ieee.std_logic_arith.all ;
Use ieee.std_logic_unsigned.all ;
Entity ex2 is
Port ( a, b ,c,d : in std_logic ; g : out std_logic ) ;
end ex2 ;
begin
g <= e and f;
end bhv ;
5- Composants internes :
a b
Entity COD is
End cod ;
e
b g
COD
s
c
f
d
Library IEEE ;
Use ieee.std_logic_1164.all ;
Use ieee.std_logic_arith.all ;
Use ieee.std_logic_unsigned.all ;
Entity ex2 is
Port ( a, b ,c,d : in std_logic ; g : out std_logic ) ;
end ex2 ;
architecture bhv of ex2 is
signal e,f,s : std_logic ;
component cod --- declaration de composant interne
Port (a : in std_logic ; b : out std_logic) ; هذا حق فوق الي هو مركب الي زيدناه للجديد
End component ;
begin
e <= a and b ;
f <= c and d ;
s <= e and f;
c1 : cod port map ( s,g) ; --instantiation de composant interne
end bhv ;
6- Directions des signaux externes :
Un signal entrant : IN
Un signal sortant : OUT
Un signal sortant mais étant rebouclé vers une entrée du circuit : BUFFER
K1,U,K2 : in
X : buffer
La broche à laquelle est relié X est une broche unidirectionnelle ( vers
l’extérieur du circuit ) , mais le signal X est rebouclé à l’intérieur même du
circuit ; aucun périphérique ne peut envoyer une donnée vers notre circuit en
utilisant le signal X.
Remarque : il est préférable d’éviter d’utiliser le mode BUFFER .
Si un signal doit être rebouclé , utiliser un signal interne .
A
ACCUM
ADDER
Library IEEE ;
Use ieee.std_logic_1164.all ;
Use ieee.std_logic_arith.all ;
Use ieee.std_logic_unsigned.all ;
Entity EX4 is
Port ( a : in std_logic_vector(7 downto 0) ; اليمين هي النقاط الضعيفه واليسار القوية
لذا عكسنا
accum : out std_logic_vector(7 downto 0) ) ;
end ex4 ;
architecture bhv of ex4 is
signal accump : std_logic_vector(7 downto 0) ;
begin
accum <= accump ;
accump <= a + accump;
end bhv ;
DATA : INOUT
ADRESS : out
RW/ : out
7- Notion de process :
La liste de sensibilité :
liste des signaux dont tout changement d’état
lance automatiquement l’éxécution du process .
Ex : signal de reset.
Rque : un process s’éxécute au moins une fois !
A RETENIR :
Un process démarre à chaque fois que l’état des signaux de sensibilité est
modifié.
la valeur d’un signal n’est actualisée qu’à la fin d’execution d’un process.
exemples :
b Cnul
C = 0 ? 1 bit
.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
entity ex4_4_12 is
port( a,b : in std_logic_vector(7 downto 0); cnul : out std_logic;
c : out std_logic_vector(7 downto 0));
end ex4_4_12;
architecture bhv of ex4_4_12 is
signal cp : std_logic_vector(7 downto 0);
begin
cp <= a + b;
c <= cp;
process ( cp)
begin
if cp = "00000000" then
cnul <= '1' ;
else
cnul <= '0' ;
end if;
end process;
end bhv;
S Y
00 001
01 101
10 100
Autres combinaisons 111
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
entity ex6 is
port( s : in std_logic_vector(1 downto 0);
Y : out std_logic_vector(2 downto 0));
end ex6;
architecture bhv of ex6 is
begin
process(s)
begin
if s=”00” then
y <= “001”;
elsif s=”01” then
y <= “101”;
elsif s=”10” then
y <= “100”
else
y <= “111”;
end if;
end process;
End bhv ;
Les instructions séquentielles peuvent tout aussi bien servir à implémenter des
circuits séquentiels que des circuits combinatoires. Dans le premier cas , des
bascules seront employées. Cependant , ceci ne doit pas avoir lieu dans le cas d’un
circuit combinatoire .
Ainsi , une erreur courante , consiste à utiliser une table de vérité non exhaustive ;
exemple :
Dans la figure précédente , en (b) la table de vérité n’est pas exhaustive .
Quelles valeurs affecter à y pour sel="10" ou "11" ?
Si nous choisissons la solution qui consiste à ne rien affecter à y pour sel="10" ou
"11" et utilisons le code suivant :
1 --------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 --------------------------------------
5 ENTITY exemple IS
6 PORT (a, b, c, d: IN STD_LOGIC;
7 sel: IN INTEGER RANGE 0 TO 3; -- ou bien sel: in std_logic_vector(1 downto 0);
8 x, y: OUT STD_LOGIC);
9 END exemple;
10 --------------------------------------
11 ARCHITECTURE exemple OF exemple IS
12 BEGIN
13 PROCESS (a, b, c, d, sel)
14 BEGIN
15 IF (sel=0) THEN -- ou bien if sel=”00” then
16 x<=a;
17 y<='0';
18 ELSIF (sel=1) THEN -- ou bien if sel=”01” then
19 x<=b;
20 y<='1';
21 ELSIF (sel=2) THEN -- ou bien if sel=”10” then
22 x<=c;
23 ELSE
24 x<=d;
25 END IF;
26 END PROCESS;
27 END exemple;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
entity ex5 is
port (s,r : in std_logic;
q,qbar : out std_logic);
end ex5;
Architecture bhv of EX5 is
Begin
Process (r)
Begin
If r=’1’ then
Q <= ‘0’ ;
Qbar <= ‘1’;
End if ;
End process ;
Process(s)
Begin
If s=’1’ then
Q <= ‘1’;
Qbar <= ‘0’;
End if;
End process ;
End bhv ;
9. Signaux – constantes - variables - generiques:
CONSTANTE :
La syntaxe de la déclaration d’une constante est :
Constant identificateur : type := valeur ;
Exemple:
CONSTANT set_bit : std_logic := '1';
VARIABLE :
Cette catégorie d’objet représente une information à caractére local . Une variable
ne peut être utilisée qu’à l’intérieur d’un segment de code séquentiel
( process , fonction ou procédure ) et sa valeur ne peut être transmise directement à
l’extérieur dudit segment .
D’un autre côté , l’actualisation d’une variable est immédiate et sa nouvelle
valeur est disponible immédiatement dans la ligne suivante du code VHDL.
De ce fait , il est licite d’utiliser plusieurs affectations à la même variable.
La syntaxe de la déclaration de variable est :
VARIABLE identificateur : type [intervalle] [:= valeur initiale];
Exemples:
VARIABLE control: BIT := '0';
VARIABLE count: INTEGER RANGE 0 TO 100;
VARIABLE y: STD_LOGIC_VECTOR (7 DOWNTO 0) := "10001000";
Cette déclaration ne peut apparaitre que dans la zone déclaration d’un process,
fonction ou procédure. La valeur initiale apparaissant éventuellement dans la
déclaration , n’est pas synthétisable , mais destinée uniquement à la
simulation .
L’opérateur d’affectation à une variable est ‘‘:=’’ (Ex.: count:=35;).
Dénombrement de 1 #1 (Faux)
Soit à concevoir un circuit destiné à dénombrer le nombre de ‘1’ présents dans un
vecteur binaire . Le code suivant n’utilise que des signaux . Le signal TEMP subit
plusieurs affectations en lignes 15 ( 1 seule ) et 18 ( 8 affectations ).De plus ,
comme la valeur de TEMP n’est pas actualisée immédiatement , la ligne 15 est en
conflit avec la ligne 18 : à la suspension du process , quelle valeur est attribuée à
TEMP ? Dans ce genre de situation , il est recommandé d’utiliser une variable.
D’autre part , il peut sembler plus simple d’utiliser directement le signal ONES plutôt
que le signal interne TEMP ( ligne 11) . Pour celà , il est nécessaire de modifier le
mode de ONES : soit BUFFER soit INOUT , car ce signal subit une affectation (ligne
15) et est lu ( ligne 18).
1 ---------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------
5 ENTITY count_ones IS
6 PORT ( din: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
7 ones: OUT INTEGER RANGE 0 TO 8);
8 END count_ones;
9 ---------------------------------------
10 ARCHITECTURE faux OF count_ones IS
11 SIGNAL temp: INTEGER RANGE 0 TO 8;
12 BEGIN
13 PROCESS (din)
14 BEGIN
15 temp <= 0;
16 FOR i IN 0 TO 7 LOOP
17 IF (din(i)='1') THEN
18 temp <= temp + 1;
19 END IF;
20 END LOOP;
21 ones <= temp;
22 END PROCESS;
23 END faux;
24 ---------------------------------------
Dénombrement de 1 #2 (juste)
Reprenons l’exemple du denombrement de ‘1’ présents dans un vecteur binaire et
considérons le code ci-dessous.La seule différence par rapport au code précédent est
que l’objet TEMP est déclaré comme variable et non plus comme signal .
Du moment qu’une variable est actualisée immédiatement à l’issue d’une affectation ,
l’initialisation de temp (ligne 15 ) n’est plus en conflit avec son incrémentation (ligne
18) ; d’autre part , les multiples affectations de la ligne 18 ne produisent plus
d’erreur en cours de compilation .
1 ---------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------
5 ENTITY count_ones IS
6 PORT ( din: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
7 ones: OUT INTEGER RANGE 0 TO 8);
8 END count_ones;
9 ---------------------------------------
10 ARCHITECTURE juste OF count_ones IS
11 BEGIN
12 PROCESS (din)
13 VARIABLE temp: INTEGER RANGE 0 TO 8;
14 BEGIN
15 temp := 0;
16 FOR i IN 0 TO 7 LOOP
17 IF (din(i)='1') THEN
18 temp := temp + 1;
19 END IF;
20 END LOOP;
21 ones <= temp;
22 END PROCESS;
23 END juste;
24 ---------------------------------------
Le bon fonctionnement du circuit peut être vérifié grâce aux résultats de simulation
représentés ci-dessous .
Paramétre Generique :
Exemple:
ENTITY my_entity IS
GENERIC (n : INTEGER := 8);
PORT (...);
END my_entity;
ARCHITECTURE my_architecture OF my_entity IS
...
END my_architecture ;
Exemple : Decodeur
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY decoder IS
Generic ( n : integer := 8 ; m : integer := 3) ;
6 PORT ( ena : IN STD_LOGIC;
7 sel : IN STD_LOGIC_VECTOR (m-1 DOWNTO 0);
8 x : OUT STD_LOGIC_VECTOR (n-1 DOWNTO 0));
9 END decoder;
10 ---------------------------------------------
11 ARCHITECTURE decoder OF decoder IS
12 BEGIN
13 PROCESS (ena, sel)
14 VARIABLE temp1 : STD_LOGIC_VECTOR (n-1 DOWNTO 0);
15 VARIABLE temp2 : INTEGER RANGE 0 TO n-1 ;
16 BEGIN
17 temp1 := (OTHERS => '1');
18 temp2 := 0;
19 IF (ena='1') THEN
20 FOR i IN 0 to m-1 LOOP -- l’intervalle de sel est 2 downto 0
21 IF (sel(i)='1') THEN -- conversion de binaire entier
22 temp2:=2*temp2+1;
23 ELSE
24 temp2 := 2*temp2;
25 END IF;
26 END LOOP;
27 temp1(temp2):='0';
28 END IF;
29 x <= temp1;
30 END PROCESS;
31 END decoder;
32 ---------------------------------------------
CHAPITRE 2 :
D Q D Q
en
Clk
Reset Reset
Régles de fonctionnement :
Pour une bascule D sensible au front montant d’horloge , la sortie Q reproduit
l’état de l’entrée D établie avant l’arrivée du front.Dans le cas où le signal de
validation est présent ( en ) , il doit être actif pour que la sortie suive l’entrée à
l’occurrence du front actif d’horloge.
Le signal reset est asynchrone .
L’entrée D doit être établie avant l’arrivée du front actif d’horloge ( Tsetup ) et
se maintenir constante après le passage de ce même front (Thold ) . Le non
respect de cette régle peut aboutir à des disfonctionnements (métastabilité ).
Dans ce cas , nous utiliserons 2 bascules D : l’une pour Q et la seconde pour
qbar .
2- Registre à décalage :
reset
Din Dout
3 2 1 0
Clk
Dec
reset
Din Dout
8 8
Clk
En
Library ieee ;
Use ieee.std_logic_1164.all ; Process (clk,reset)
Use ieee.std_logic_arith.all ; Begin
Use ieee.std_logic_unsigned.all ; If reset=’1’ then
Entity FFD_8 is dout <= (others =>’0’) ;
Port (Din : in std_logic_vector(7 downto Elsif rising_edge(clk) then
0) ; If en=’1’ then
clk,reset,en : in std_logic ; Dout <= din ;
dout :out std_logic_vector(7 downto 0) ) ; End if ;
End ffd_8 ; End if ;
Architecture bhv of ffd_8 is End process ;
Begin End bhv ;
4- Compteur 8 bits :
INC
Cout
RAZ COUNT 8
CLK
reset
Ce compteur synchrone s’incrémente au moyen du signal INC .
Le signal RAZ sert à la remise à zéro du signal de sortie Cout codé sur 8 bits.
Une bascule est créée à chaque fois qu’un signal subit une affectation suite
à un front survenant sur un autre signal ; il s’agit donc de l’affectation
synchrone.
Une telle affectation ne peut avoir lieu qu’au sein d’un segment de code séquentiel
( process , fonction ou procédure ) et généralement à la suite de
‘‘IF rising_edge . . .’’ ou ‘IF falling_edge . . .’’.
Dans le cas d’une variable qui subit une affectation synchrone , il n’y a pas
nécessairement création d’une bascule :
Si la valeur de la variable n’est utilisée qu’à l’intérieur du segment de code
séquentiel , aucune bascule n’est créée.
Si la valeur de la variable est transmise à l’extérieur du segment de code
séquentiel ( à travers un signal par ex .) , une bascule est créée.
Si la variable est utilisée (lue ) avant qu’elle ne subisse une affectation
synchrone ,alors dans ce cas également une bascule est créée .
Exemple:
Dans cet exemple , la variable temp subit une affectation synchrone et sa valeur est
passée au signal x .Ce dernier sera donc registré.
PROCESS (clk)
VARIABLE temp: BIT;
BEGIN
IF (clk ‘EVENT AND clk='1') THEN
temp := a; -- temp subit une affectation synchrone
END IF;
x <= temp; -- temp est transmise à x qui sera donc registré
END PROCESS;
Exemple :
R1 = /din . /e1./e0
R2=din./e1./e0 E1 = r4 + r5
R3 = din . /e1. E0 E0 = r2 + r3
R4 = /din . /e1. E0 En= r2+r3+r4+r5
R5 = /din . e1. /e0 Raz=r6
R6 = din. E1. /e0
SIGNAL x : STD_LOGIC;
VARIABLE y : STD_LOGIC_VECTOR(3 DOWNTO 0); -- MSB est à gauche
SIGNAL w: STD_LOGIC_VECTOR(0 TO 7); -- MSB est à droite
Les opérandes doivent être de type BIT, STD_LOGIC ou STD_ULOGIC (ou leurs
extensions respectives BIT_VECTOR,STD_LOGIC_VECTOR ou
STD_ULOGIC_VECTOR). Ces opérateurs sont :
Exemples:
---------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------
ENTITY mux IS
PORT ( a, b, c, d, s0, s1: IN STD_LOGIC;
y: OUT STD_LOGIC);
END mux;
---------------------------------------
ARCHITECTURE pure_logic OF mux IS
BEGIN
y <= (a AND NOT s1 AND NOT s0) OR
(b AND NOT s1 AND s0) OR
(c AND s1 AND NOT s0) OR
(d AND s1 AND s0);
END pure_logic;
---------------------------------------
Opérateurs Arithmetiques :
Les opérandes peuvent être de type INTEGER,SIGNED, UNSIGNED, ou REAL (ce type
n’est pas synthétisable).De plus ,si les packages std_logic_signed ou
std_logic_unsigned de la librairie ieee sont invoqués , alors le type
STD_LOGIC_VECTOR peut également être utilisé dans les opérations
d’addition/soustraction. Ces opérateurs sont au nombre de 8 :
Opérateurs de comparaison :
Opérateurs de décalage :
Servent au décalage de données . Ils sont au nombre de 6 et leur syntaxe est la suivante :
<opérande gauche> <opérateur décalage> <opérande de droite>.
L’opérande gauche doit être de type BIT_VECTOR, alors que l’opérande de droite doit être de type INTEGER ( précédé du
signe + ou – éventuellement). Ces opérateurs sont :
sll décalage logique gauche ; avec insertion de ‘0’ à droite
srl décalage logique à droite ; avec insertion de ‘0’ à gauche
sla décalage arithmétique gauche ;
sra décalage arithmétique droit ;
rol rotation à gauche ;
ror rotation à droite ;
remarque : le décalage logique est à distinguer du décalage arithmétique.Ce dernier conserve le signe inchangé aprés
décalage.
Attention : ces opérateurs ne sont pas reconnus sous QUARTUS
Exemple :
Soit la déclaration de signal suivante :
Signal A : std_logic_vector (3 downto 0) := "0111" ; -- A est initialisé à 0111
A <= ‘1’ & A(3 downto 1) ; -- A reçoit 1011
b. When:
Exemple :
outp <= "000" WHEN (inp='0' OR reset='1') ELSE
"001" WHEN ctl='1' ELSE
"010";
WITH / SELECT / WHEN:
la syntaxe est la suivante :
WITH identificateur SELECT
Affectation WHEN valeur,
Affectation WHEN valeur,
...;
Exemple :
With sel SELECT
A <= B when "000",
C when "001",
D when "010",
E when "011",
F when "100",
G when others ;--- les valeurs de sel 101 , 110 , 111 ,X01,X10,… ---
--sont regroupées dans l’affectation A <= G
Exemple :
WITH control SELECT
output <= "000" WHEN '0',
"111" WHEN '1',
UNAFFECTED WHEN OTHERS;
A noter que dans la syntaxe précédente , valeur peut prendre l’une des formes
suivantes :
WHEN valeur -- valeur unique
WHEN valeur1 to valeur2 -- intervalle , à utiliser pour les données de type
-- énuméré uniquement
WHEN valeur1 | valeur2 |... -- valeur1 OU valeur2 OU ...
Exemple : multiplexeur
Ce circuit dispose de 4 entrées scalaires : a , b , c et d , ainsi que d’une entrée
vectorielle Sel sur 2 bits . La sortie scalaire y est égale à l’entrée sélectionnée par
Sel . Nous donnons ci-dessous 3 descriptions de ce même circuit , équivalentes et
synthétisables.
Ce type d’instruction concurrente est équivalent à une boucle : ainsi , une section de
code est répétée un certain nombre de fois. A noter que cette instruction doit être
étiquetée (label ).
La syntaxe pour FOR/GENERATE est la suivante :
label: FOR identifier IN range GENERATE
(affectations concurrentes )
END GENERATE;
Précisons que range doit être une valeur statique ; i.e immédiatement fixée lors de la
compilation.Considérons l’exemple suivant où choice constitue un paramétre d’entrée
(non statique ) . Ce type de code ne peut être synthétisé :
Le code précédent est correct. Par contre , les 2 codes suivants sont incorrects :
En effet , dans les 2 cas précédents accum subit 8 affectations concurrentes ; donc
simultanées , donc fausses.
Exemple:
soit à réaliser un AND entre l’octet X et l’octet de poids fort du mot Y ( à placer dans
zhigh ) ensuite entre X et l’octet de poids faible du mot Y ( à placer dans zlow ).
i. Block simple :
Ce type de construction est juste une façon de partitionner le code pour améliorer sa lisibilité. Ce
block est étiqueté (label) ; s’ensuite une zone déclarative , le mot-clé BEGIN , des instructions
concurrentes et enfin END BLOCK. La syntaxe est :
label: BLOCK
[déclarations]
BEGIN
(instructions concurrentes)
END BLOCK label;
Exemple:
b1: BLOCK
SIGNAL a: STD_LOGIC;
BEGIN
a <= input_sig WHEN ena='1' ELSE 'Z';
END BLOCK b1;
Un block (simple ou gardé ) peut être imbriqué dans un autre block ; la syntaxe est :
label1: BLOCK
[partie déclarative du block externe]
BEGIN
[instructions concurrentes]
label2: BLOCK
[partie déclarative du block interne]
BEGIN
(instructions concurrentes)
END BLOCK label2;
[autres instructions concurrentes du block externe]
END BLOCK label1;
Ce type de block se distingue du précédent par la présence d’une expression dite expression de garde
. Dans le corps du block , sont placées des instructions concurrentes gardées et non gardées. Toute
instruction gardée n’est éxécutée que si l’expression de garde est vraie . Une instruction non gardée
est éxécutée quelque soit la valeur ( vrai/faux) de l’expression de garde. Une instruction gardée se
distingue par la présence en son sein du mot-clé GUARDED.
Example : Latch
Dans cette description , clk='1' (ligne 12) est l’expresion de garde alors que q<=GUARDED d (ligne
14) est l’instruction gardée.
Donc , q<=d uniquement si clk='1'.
1 -------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -------------------------------
5 ENTITY latch IS
6 PORT (d, clk: IN STD_LOGIC;
7 q: OUT STD_LOGIC);
8 END latch;
9 -------------------------------
10 ARCHITECTURE latch OF latch IS
11 BEGIN
12 b1: BLOCK (clk='1')
13 BEGIN
14 q <= GUARDED d;
15 END BLOCK b1;
16 END latch;
17 -------------------------------
Exemple : bascule D
1 -------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -------------------------------
5 ENTITY dff IS
6 PORT ( d, clk, rst: IN STD_LOGIC;
7 q: OUT STD_LOGIC);
8 END dff;
9 -------------------------------
10 ARCHITECTURE dff OF dff IS
11 BEGIN
12 b1: BLOCK (clk'EVENT AND clk='1')
13 BEGIN
14 q <= GUARDED '0' WHEN rst='1' ELSE d;
15 END BLOCK b1;
16 END dff;
17 ------------------------------
2. Instructions séquentielles :
a. IF :
L’emploi de cette instruction est très courant vu l’analogie avec d’autres langages.
La syntaxe de l’instruction IF est la suivante :
IF conditions THEN
Instructions séquentielles;
ELSIF conditions THEN
Instructions séquentielles;
...
ELSE Instructions séquentielles ;
END IF;
Exemple:
IF (x<y) THEN temp:="11111111";
ELSIF (x=y AND w='0') THEN temp:="11110000";
ELSE temp:=(OTHERS =>'0');
End if ;
b. WAIT :
Un process dans lequel apparait l’instruction wait ne peut avoir de liste de sensibilité. Cette instruction
peut prendre 3 formes :
Exemple :
rst et input sont des signaux secondaires , clk est le signal primaire.
Dans ce cas , le process est suspendu jusqu’au prochain changement d’état de l’un des signaux
signal1,signal2,…. .
Exemple :
le process suivant est éxécuté à chaque changement portant sur clk ou rst
PROCESS
BEGIN
WAIT ON clk, rst;
IF (rst='1') THEN
output <= "00000000";
ELSIF (clk'EVENT AND clk='1') THEN
output <= input;
END IF;
END PROCESS;
Input est le signal secondaire , alors que rst et clk sont les signaux primaires.
Cette forme est d’utilisation marginale et est réservée uniquement à la simulation fonctionnelle ( pas
de synthése ).
Exemple: WAIT FOR 5ns;
c. CASE :
La syntaxe de cette instruction est :
CASE identificateur IS
WHEN valeur => affectations;
WHEN valeur => affectations;
...
END CASE;
Exemple:
CASE control IS
WHEN "00" =>
x<=a;
y<=b;
WHEN "01" =>
x<=b;
y<=c;
WHEN OTHERS => x<="0000"; y<="ZZZZ";
END CASE;
L’instruction séquentielle CASE est très similaire à l’instruction concurrente WHEN. Ici
également , toutes les valeurs possibles de l’objet représenté par identificateur doivent
être testées ; aussi , le mot-clé OTHERS peut être d’une aide appréciable .
Cependant , l’équivalent de UNAFFECTED est NULL , à utiliser à chaque fois
qu’aucune action n’est requise. Par exemple :
WHEN OTHERS =>NULL;
d. LOOP :
Cette instruction est utilisée à chaque fois qu’un segment de code séquentiel doit
être répété. Il existe 2 variantes pour cette instruction :
FOR/LOOP et WHILE/LOOP
i. FOR / LOOP:
Exemple:
la boucle suivante est répétée jusqu’à ce que i=5 ( donc 6 fois)
FOR i IN 0 TO 5 LOOP
x(i) <= enable AND w(i+2);
y(0, i) <= w(i);
END LOOP;
Exemple :
dans cet exemple , la boucle est répétée tant que i < 10.
Exemple :
la boucle est abandonnée dés qu’un bit different de ‘0’ est trouvé dans le vecteur
DATA :
Exemple :
dans cet exemple , avec NEXT , une iteration de la boucle est sautée quand i=skip.
FOR i IN 0 TO 15 LOOP
NEXT WHEN i=skip; -- sauter à la prochaine itération
(...)
END LOOP;
Exemple :
Clk
……
Dec ……
library ieee; dout <= d(127);
use ieee.std_logic_1164.all; process (clk,reset)
entity sr is begin
port( din : in std_logic_vector(7 downto 0); if reset='1' then
dout : out std_logic_vector(7 downto 0); for i in 127 downto 0 loop
clk,reset,dec : in std_logic); ---- l’emploi de others est impossible ! car d est un
end sr; -----tableau et non un vecteur
architecture bhv of sr is d(i)<= "00000000";
type ma_table is array (0 to 127) of end loop;
std_logic_vector(7 downto 0); elsif rising_edge(clk) then
signal d : ma_table; if dec='1' then
begin d(0) <= din;
d(1 to 127)<= d(0 to 126);
end if;
end if;
end process;
end bhv;