Vous êtes sur la page 1sur 37

CONCEPTION CIRCUIT NUMÉRIQUE

3- Circuit combinatoire

1
Circuit combinatoire
• Un circuit combinatoire est
– Les sorties ne sont qu’une une fonctions des entrées: les
mêmes sorties donnent toujours les mêmes entrées.
– Une généralisation des portes logiques

2
Circuit combinatoire
• Pour tout circuit combinatoire, on peut construire une
table de vérité avec 𝑛 colonnes pour les entrées et 𝑚
colonnes pour les sorties.
• En VHDL, plusieurs approches existent
– Conception à partir de table de vérité
– Conception à partir d’expression logique
– Conception à partir d’ circuit logique
– Conception à partir d’une fonction à réaliser
• On va procédé par des exemples.

3
Table de vérité
Demi additionneur
A B C SUM A SUM
0 0 0 0 B
0 + 0 = 00
0 + 1 = 01 0 1 0 1
1 + 0 = 01 C
1 0 0 1
1 + 1 = 10
1 1 1 0

Expression booléenne: In VHDL:

ҧ + 𝐴𝐵ത = 𝐴 𝑥𝑜𝑟 𝐵
SUM = 𝐴𝐵 SUM <= A XOR B;

C = 𝐴𝐵 C <= A AND B;

4
Table de vérité
Additionneur complet
C’est une addition sur 2 bits, avec une retenu possible
SUM = 𝐴ҧ𝐵𝐶𝑖𝑛
ത ҧ
+ 𝐴𝐵𝐶𝑖𝑛 ത
+ 𝐴𝐵𝐶𝑖𝑛 + 𝐴𝐵𝐶𝑖𝑛

ҧ
Cout =𝐴𝐵𝐶𝑖𝑛+𝐴 ത
𝐵𝐶𝑖𝑛+𝐴ҧ𝐵𝐶𝑖𝑛+𝐴𝐵𝐶𝑖𝑛+𝐴𝐵𝐶𝑖𝑛

A B Cin SUM Cout
0 0 0 0 0
Avec l’algèbre de Bool (ou tableau de Karnaugh) on peut
0 0 1 1 0 simplifier l’expression
0 1 0 1 0
0 1 1 0 1 SUM = 𝐴 ⊕ 𝐵 ⊕ 𝐶𝑖𝑛
1 0 0 1 1 Cout =𝐴. 𝐵 + (𝐶𝑖𝑛. 𝐴 ⊕ 𝐵 )
1 0 1 0 1
1 1 0 0 1 En VHDL

1 1 1 1 1 SUM <= (A XOR B) XOR Cin;


Cout <= (A AND B) OR (Cin AND (A XOR B));

5
4-bit addition
𝑥 = 𝑥3 𝑥2 𝑥1 𝑥0
𝑦 = 𝑦3 𝑦2 𝑦1 𝑦0

𝑧 = 𝑥 + 𝑦 = 𝑐𝑎𝑟𝑟𝑦 𝑜𝑢𝑡 𝑧3 𝑧2 𝑧1 𝑧0

In VHDL:
signal x,y,z : std_logic_vector(3 downto 0);
Z <= x + y;
Combinatorial circuit: 7-seg encoder
hex g f e d c b a
0000 1 0 0 0 0 0 0
0001 1 1 1 1 0 0 1

1111 0 0 0 1 1 1 0

a=1 pour hex=1, 4, B, ou D


On peut donc construire l’expression logique pour la LED ‘a’

hex seg La même chose pour les autres LEDs


VHDL vous permet de ne écrire vous-même toutes les expressions
pour les segments. On verra comment par la suite,

Exercice: Donner l’expression logique et le code VHDL pour le segment ‘a’.


Pour décrire les bus, on utilise le type std_logic_vector:
signal hex : std_logic_vector(3 downto 0);
signal seg : std_logic_vector(6 downto 0);
7
Exercise

Donner la table de vérité de ce circuit.

Ce circuit peut être implanté en utilisant


un LUT (Look-Up Table) 3-entrée/1
sortie. C’est comme une mémoire de 8
bits (8 cases de 1 bit chaque)

Remarque: tout circuit combinatoire


avec 𝑛 entrées et 𝑚 sorties peut être
implanté par une mémoire (ROM) de
taille 2𝑛 case chacune de taille 𝑚 memory
bits.
Look-Up Table
A B SUM C
0 0 0 0
Un LUT est un tableau qui remplace les calculs en
temps réel par un indexage. 0 1 1 0
1 0 1 0
1 1 0 1
La table de vérité de demi-additionneur peut être adresse Data
considérée comme une mémoire de taille 4 fois 2
bits.
Address bus Data
Les valeurs de la mémoire ont été calculées et Memory
enregistrées à priori dans la mémoire. Le bus
d’adresse est connecté à A et B. Donc, pour A=0 et
B=0, on adresse la première case, qui est 00:
SUM=0 et C=0.
A SUM

B LUT C
Par exemple une mémoire de taille 16 avec chaque
case sur 2 bits, peut remplacer n’importe quel circuit
combinatoire à 4 entrées et deux sorties.
9
Activities on Vivado
Very beginning with VHDL
Activity

Modify your last Vivado project to implement the circuit given in the exercise.

Modify the vhdl program: main.vhd

Modify the xdc pin connection file


to connect the signal C to sw2

Generate the bit stream, and


program the FPGA

Once the program in FPGA, verify the circuit.


Affectation sans condition
En VHDL
• Un circuit combinatoire peut se concrétiser directement
avec des opérations logiques
– AND, OR, XOR, NOT, NAND, NOR, XNOR

• Il est possible de synthétiser des affectations


conditionnelles par des portes logiques en écrivant leur
table de vérité
– Il y a en VHDL, des instructions d’affectation conditionnée qui
facilite ce genre de situation

12
[index]

Instruction conditionnelle
Affectation conditionnelle: when – else

sel
2

A
M
B Y
U
C X
4
D

13
[index]

Instruction concurrente sélective


• Affectation conditionnelle: with-select
• La condition se fait sur un seul objet (comme le signal sel ci-dessous)
• Le mot clé others doit être utilisé à la fin pour couvrir les cas non
spécifiés

sel
2

A
M
B Y
U
C X
4
D

14
Exercices

Nous avons ce dispositif pour remplir un réservoir d’eau.


Le robinet est contrôlé par 2 fils mais n’a que trois états:
00 pour arrêter, 01 pour débit faible, 10 pour débit fort, et
11 n’est pas exploité.
Si un capteur est submergé, il sort 1 sinon 0.
Ecrire un programme VHDL pour essayer de garder l’eau
du réservoir au même niveau que le capteur supérieur.
Remarque : Avec un circuit combinatoire on ne peut pas
garder le niveau d’eau entre les deux niveaux. Il nous
faudra un circuit séquentiel.

15
Exercice
• Tracer la table de vérité d’un demi-additionneur

• Construire ce demi-additionneur en utilisant un


multiplexeur.

• Ecrire le programme VHDL utilisant when-else

• Ecrire le programme VHDL utilisant with-select

16
Exemple : ALU
entity ALU is
port (A,B :in std_logic_vector(7 downto 0);
SEL : in std_logic_vector(1 downto 0);
S : out std_logic_vector(7 downto 0));
end ALU;

architecture V1 of ALU is architecture V2 of ALU is


Begin Begin
with SEL select S <= A+B when SEL="00" else
S <= A+B when "00", A-B when SEL="01" else
A-B when "01", A and B when SEL="10" else
A and B when "10", A or B when others;
A or B when others; end V2;
end V1;

17
Exemple : Codeur sept-segment
with HEX select
LED<= "1111001" when "0001", --1
"0100100" when "0010", --2
"0110000" when "0011", --3
"0011001" when "0100", --4
"0010010" when "0101", --5
"0000010" when "0110", --6
"1111000" when "0111", --7
"0000000" when "1000", --8
"0010000" when "1001", --9 7
"0001000" when "1010", --A
"0000011" when "1011", --b Circuit
"1000110" when "1100", --C
"0100001" when "1101", --d combinatoire
"0000110" when "1110", --E
"0001110" when "1111", --F 4
"1000000" when others; --0

18
CONCEPTION CIRCUIT NUMÉRIQUE

4- Circuit séquentiel

19
Circuit séquentiel
• Un circuit séquentiel est un circuit qui possède de la mémoire
interne
• Avec les mêmes entrées il peut avoir des sorties différentes
• Exemple bascule D
D EN Q
D
0 0 ?
EN 1 0 ?

Q 0 1 0
1 1 1

• Les programme séquentiels ne peuvent pas s’écrire dans une


architecture directement, nous avons besoin d’une zone, dites
séquentielle. Ceci se fait par une process.

20
[index]

Process
• Process est une instruction pour créer une zone séquentielle.

Syntaxe de process :
• label : -- optionnel
process (liste de sensibilité)
{partie déclarative}
begin
suite d’instructions séquentielles
end process;

• Attention: Les instructions when-else et with-select étant concurrent,


vous ne pouvez pas les mettre dans une process !

21
Détails de Process
• Un process peut posséder une liste de sensibilité

• Le process se réveille (s’exécute) quand il y a un évènement (un


changement) sur un des signaux de la liste

• Une fois process réveillé, les instructions sont exécutées une par une et
dans l’ordre

• Au cours d’exécution d’un process, tous les signaux sont constants (ne
change pas de valeur) jusquàà ce que l’exécution soit suspendue

• C’est uniquement quand le process est suspendu que les signaux sont
actualisés

• Suspension d’un process se réalise quand on arrive à l’instruction wait, ou à


la fin de process.

• Un process qui possède une liste de sensibilité, n’a pas de wait.

• Un process qui n’a pas de liste de sensibilité s’exécute automatiquement

22
Exemple
1
1- process se réveille
Compléter le chronogramme
2- C <= (A and B) = (‘0’ and ‘0’) = ‘0’, mais
ce sera effectif au moment de suspension
Process(A,B)
Begin 3- B <= ‘1’ mais au moment de suspension
C <= A and B; 4- C <= (A or B) = (‘0’ or ‘0’) = ‘0’ mais au
B <= ‘1’; moment de suspension
C <= A or B;
End process; 5- end process (suspension) donc B <= ‘1’,
C <= ‘0’

1 6- un évènement sur B, le process se


réveille encore une fois
A
7- C <= (A and B) = (‘0’ and ‘1’) = ‘0’ mais
B au moment de suspension
8- B <= ‘1’ mais au moment de suspension
C
9- C <= (A or B) = (‘0’ or ‘1’) = ‘1’ mais au
moment de suspension
10- end process donc B <= ‘1’, C <= ‘1’
23
[index]

Variable
• Les variables sont utilisées uniquement dans les process.
• Elles sont déclarées dans le process avant le mot clé « begin »
(begin du process).
• Contrairement aux signaux, les variables sont affectées tout de
suite, on n’a pas besoin d’attendre la suspension du process.
• Affectation se fait par ":=" et non pas par "<=" :
• Var_x := not Var_x;
• Une variable peut avoir le même type qu’un signal
• On peut copier une variable dans un signal ou un signal dans une
variable:
var_x := Sig_x ; Sig_x <= Var_x ;

variable current_bit: std_logic := ‘0’;


Initialisation optionnelle 24
[index]

Instructions conditionnelle

if condition then
sequential statements
[elsif condition then
sequential statements ]
[elsif condition then
sequential statements ]
[else
sequential statements ]
end if;

25
Exemple: multiplexeur 4 voies
Ce circuit combinatoire peut être réalisé par with-select, ou when-else,
mais aussi par un process.
S1 S0

A
entity MUX_4 is
port (S1, S0, A, B, C, D: in std_logic; B

MUX
Z: out std_logic); Z
end MUX_4; C

D
architecture behav_MUX_4 of MUX_4 is
begin
P1: process (S1, S0, A, B, C, D) - - la liste de sensibilité
begin
if (( not S1 and not S0 )=’1’) then Z <= A;
elsif (( not S1 and S0) = ‘1’) then Z <=B;
elsif ((S1 and not S0) =’1’) then Z <=C;
else Z <=D;
end if;
end process P1;

end behav_MUX_4;
26
Remarque
Solution alternative
entity MUX_4 is
port (S1, S0, A, B, C, D: in std_logic;
Z: out std_logic);
end MUX_4;

architecture behav_MUX_4 of MUX_4 is


begin
P1: process (S1, S0, A, B, C, D) - - la liste de sensibilité
variable sel : std_logic_vector(1 downto 0);
begin
sel := S1 & S0 ;
if sel = "00" then Z <= A;
elsif sel = "01" then Z <=B;
elsif sel = "10" then Z <=C;
else Z <=D;
end if;
end process P1;

end behav_MUX_4;

27
[index]

Instruction sélective
Permet de sélectionner une suite d’instructions à exécuter en
fonction de la valeur d’une expression.

case EXPRESSION is
when VAL1 => suite d’instructions séquentielles
when VAL2|VAL3|VAL4 => suite d’instr séquentielles
when VAL5 to VAL7 => suite d’instr séquentielles
when others => suite d’instr séquentielles
end case;

•L’ordre des branches n’a pas d’importance (sauf others)

•La branche « others » est obligatoire si toutes les valeurs de


l’expression ne sont pas énumérées.

Process

28
Multiplexeur avec case
entity MUX_4 is
port (SEL : in std_logic_vector(1 downto 0);
A, B, C, D: in std_logic; Z: out std_logic);
end MUX_4;

architecture behav_MUX_4 of MUX_4 is


begin
P1: process (S, A, B, C, D) - - la liste de sensibilité
begin
case SEL is
when "00" => Z <= A;
when "01" => Z <= B;
when "10" => Z <= C;
when others => Z <= D;
end case;
end process P1;

end behav_MUX_4;

29
[index]

Instructions wait
L’exécution des lignes d’un process s’arrête quand on arrive à
la commande « wait », on dit que le process est suspendu ! Le
process pourra redémarrer suivant une condition.

•Wait

•wait until condition;


•wait until A=‘ 1 ’;
•wait until CLK’event and CLK=’1’;

• wait for time expression; (NON SYNTHETISABLE)


•wait for 5 ns;

• wait on signal;
•wait on A , B

30
Exemple test bench
La génération de l’horloge et en même temps d’un signal Reset.
clock_gen: process
begin
CLK_TB <= '1';
wait for 5 ns;
CLK_TB <= '0'; Instructions
wait for 5 ns; séquentielles
end process;
---------------------------------------
reset_gen: process
begin Instructions
RST_TB <= ‘0’; wait for 5ns; concurrentes
RST_TB <= ‘1’; wait for 15ns;
RST_TB <= ‘0’; Instructions
wait; séquentielles
end process;
---------------------------------------
inst: counter
port map ( CLK => CLK_TB, RST => RST_TB, Q => DATA_OUT );

ATTENTION: ce programme est un testbench et ne pourra pas être synthétisé.


31
Affectation séquentielle

Attention : affectation d’une valeur à un signal dans un process n’est pas


immédiate !
L’affectation se réalise quand le process est suspendu, ou quand on arrive à la
fin du process.
Dans un process tous les signaux sont constants, ils sont actualisés quand le
process est suspendu (end de process, ou wait)
Exemple:
process(A)
begin
A <= ‘0’; --ici le signal A ne recevra pas ‘0’
B <= A; --ici donc, B recevra l’ancienne valeur de A mais
--au moment où le process sera suspendu
end process; --c’est ici que A reçoit ‘0’ et B reçoit
--l’ancienne valeur de A

32
Affectation dans process
• L’affectation à un signal utilisant le signe <=

• L’affectation dans un process n’est pas immédiate mais retardé


jusqu’à la suspension

Le process ci-dessous ne produira


pas le signal ci-contre

Évènement
Process (x) sur x
begin
SIG <= '0';
SIG
SIG <= '1';
SIG <= '0';
end process;
SIG
Les mêmes lignes en architecture
serait une erreur (multi source)!
33
[index]

Process combinatoire

Implantation en VHDL par des process:


Un process est combinatoire si les conditions suivantes sont
toutes respectées :
•le process comporte une liste de sensibilité
•la liste de sensibilité comprend tous les signaux lus
•tous les signaux doivent être affectés quelle que soit les
entrées (Attention dans un "if-else" ou dans un "case")
•toutes les variables doivent être affectées avant d'être lues

34
Circuits combinatoires : équation logique

Architecture COMB1 of NONET is


Architecture COMB3 of NONET is
begin
begin
--équation logique --Traduction de la table
S <= A nand B; --de vérité dans un process
end COMB1; process(A,B)
begin
if A='1' and B='1' then
S <= '0';
Architecture COMB2 of NONET is else
begin S <= '1';
--Traduction de la table end if;
--de vérité dans un process end process;
S <= '0' when A='1' and B='1' end COMB3;
else '1';
end COMB2;
C’est un process
combinatoire car il respecte
les conditions nécessaires.

35
Exemple des Circuits non-combinatoires

Architecture COMB of NONET is Architecture non_comb of verrou is


begin begin
--Traduction de la table --Traduction de la table
--de vérité dans un process --de vérité dans un process
process(A,B) process(EN)
begin begin
if A='1' and B='1' then if EN ='1' then
S <= '0'; Q <= D;
end if; end if;
end process; end process;
end COMB3; end COMB3;

La sortie reste La sortie ne change


toujours à zéro !!! pas si EN=‘0’

36
Conclusion
• Nous avons appris à programmer en VHDL.

• Nous avons appris à générer des testbench pour simuler


nos programmes.
• Nous avons vu les circuits combinatoires et les circuits
séquentiels
• Nous avons vu les process

• On sait comment écrire un process pour qu’il décrit un


circuit combinatoire

37

Vous aimerez peut-être aussi