Cours:TP M1102 TP 2 Corr
Sommaire
TP2
Exercice 1 : Multiplieur de deux nombres de 2 bits
Si X est un nombre sur 2 bits (X1,X0)2, Y est un nombre sur 2 bits (Y1,Y0)2 alors le réultat Z est un nombre sur 4 bits (Z3,Z2,Z1,Z0)2. En effet, X et Y qui sont donc sur 2 bits peuvent varier entre 0 et 3 et donc leur produit Z entre 0 et 9 ce qui est un nombre sur 4 bits.
- Table de vérité
Entrées Sorties Résultat numérique X Y Z Z = X x Y X1 X0 Y1 Y0 Z3 Z2 Z1 Z0 0 0 0 0 0 0 0 0 0 = 0 x 0 0 0 0 1 0 0 0 0 0 = 0 x 1 0 0 1 0 0 0 0 0 0 = 0 x 2 0 0 1 1 0 0 0 0 0 = 0 x 3 0 1 0 0 0 0 0 0 0 = 1 x 0 0 1 0 1 0 0 0 1 1 = 1 x 1 0 1 1 0 0 0 1 0 2 = 1 x 2 0 1 1 1 0 0 1 1 3 = 1 x 3 1 0 0 0 0 0 0 0 0 = 2 x 0 1 0 0 1 0 0 1 0 2 = 2 x 1 1 0 1 0 0 1 0 0 4 = 2 x 2 1 0 1 1 0 1 1 0 6 = 2 x 3 1 1 0 0 0 0 0 0 0 = 3 x 0 1 1 0 1 0 0 1 1 3 = 3 x 1 1 1 1 0 0 1 1 0 6 = 3 x 2 1 1 1 1 1 0 0 1 9 = 3 x 3
Le programme VHDL correspondant est :
-- verifié le 18/09/20 pas S. Moutou
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
ENTITY multiplier IS PORT(
X,Y : in std_logic_vector(1 downto 0);
Z : out std_logic_vector(3 downto 0));
END multiplier;
ARCHITECTURE arch of multiplier IS
signal entrees : std_logic_vector(3 downto 0);
BEGIN
-- construction de entrées :
entrees <= Y & X;
-- Table de vérité
with entrees select
Z <= "0000" when "0000",
"0000" when "0001",
"0000" when "0010",
"0000" when "0011",
"0000" when "0100",
"0001" when "0101",
"0010" when "0110",
"0011" when "0111",
"0000" when "1000",
"0010" when "1001",
"0100" when "1010",
"0110" when "1011",
"0000" when "1100",
"0011" when "1101",
"0110" when "1110",
"1001" when others;
END arch;
Et voici le fichier de contraintes associé :
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation X[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,, X[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,, Y[0],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,, Y[1],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,, Z[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,, Z[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,, Z[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,, Z[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,
Exercice 2 : Transcodeur binaire 7 segments
Si l'on vous demande de lire attentivement la première ligne de la table de vérité, c'est simplement pour vous faire constater qu'un zéro se fait en éteignant le segment 'g' et que donc pour éteindre un segment il faut lui mettre un 1 logique ce qui permet de déduire que pour allumer un segment il faut mettre un 0 logique.
- Table de vérité
Entrées Sorties sw3 sw2 sw1 sw0 g f e d c b a 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 1 0
Et voici un programme VHDL de correction qui n'utilise que des std_logic dans l'entité :
-- vérifié le 28/09/20
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
ENTITY transcod7segs IS PORT(
sw0,sw1,sw2,sw3 : in std_logic; -- 4 entrées
g,f,e,d,c,b,a : out std_logic); -- 7 sorties
END transcod7segs;
ARCHITECTURE arch of transcod7segs IS
signal entree4 : std_logic_vector(3 downto 0);
signal s7segments : std_logic_vector(6 downto 0);
BEGIN
-- construction de l'entrée 4 bits
entree4 <= sw3 & sw2 & sw1 & sw0;
-- table de vérité avec with select when
with entree4 select
--gfedcba
s7segments <= "1000000" when "0000",
"1111001" when "0001",
"0100100" when "0010",
"0110000" when "0011",
"0011001" when "0100",
"0010010" when "0101",
"0000010" when "0110",
"1111000" when "0111",
"0000000" when "1000",
"0010000" when "1001",
"0001000" when "1010",
"0000011" when "1011",
"1000110" when "1100",
"0100001" when "1101",
"0000110" when "1110",
"0001110" when others;
-- construction des sorties individuelles
a <= s7segments(0);
b <= s7segments(1);
c <= s7segments(2);
d <= s7segments(3);
e <= s7segments(4);
f <= s7segments(5);
g <= s7segments(6);
END;
et le fichier de contraintes associé :
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation SW0,Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,, SW1,Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,, SW2,Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,, SW3,Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,, a,Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,, b,Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,, c,Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,, d,Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,, e,Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,, f,Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,, g,Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,
Il faudra lui préférer une version uniquement avec des std_logic_vectors qui est en général plus facile à câbler.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
ENTITY transcod7segs IS PORT(
sw : in std_logic_vector(3 downto 0);
s7segs : out std_logic_vector(6 downto 0));
END transcod7segs;
ARCHITECTURE arch of transcod7segs IS
BEGIN
with sw select
--gfedcba
s7segs <= "1000000" when "0000",
"1111001" when "0001",
"0100100" when "0010",
"0110000" when "0011",
"0011001" when "0100",
"0010010" when "0101",
"0000010" when "0110",
"1111000" when "0111",
"0000000" when "1000",
"0010000" when "1001",
"0001000" when "1010",
"0000011" when "1011",
"1000110" when "1100",
"0100001" when "1101",
"0000110" when "1110",
"0001110" when others;
END;
Son fichier csv de containtes est :
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation SW[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,, SW[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,, SW[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,, SW[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,, s7segs[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,, s7segs[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,, s7segs[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,, s7segs[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,, s7segs[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,, s7segs[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,, s7segs[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,
Exercice 3 Transcodeur pour dé
Question 1
Les entrées "tout le monde à 0" et "tout le monde à 1" ne sortent aucun affichage (toutes les leds éteintes)
- Table de vérité
Entrées Sorties e2 e1 e0 D7 D6 D5 D4 D3 D2 D1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0
Et voici le programme VHDL correspondant
-- Vérifié le 28/09/20 par S.Moutou
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
ENTITY transcodDE IS PORT(
sw : in std_logic_vector(2 downto 0);
D : out std_logic_vector(7 downto 1));
END transcodDE;
ARCHITECTURE arch of transcodDE IS
BEGIN
with sw select
-- D7.....D1
D <= "0000000" when "000",
"0001000" when "001",
"1000001" when "010",
"1001001" when "011",
"1010101" when "100",
"1011101" when "101",
"1110111" when "110",
"0000000" when others;
END;
Et voici maintenant le fichier de contraintes associé :
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation SW[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,, SW[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,, SW[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,, D[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,, D[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,, D[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,, D[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,, D[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,, D[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,, D[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,
Question 2
Il est possible d'assembler deux "with select when" ensemble sans port map. Un couper/coller en adaptant les entrées et sorties fait l'affaire :
-- Vérifié le 28/09/20 par S. Moutou
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- ADAPTER l'entité au problème !!!!!!
ENTITY transcodDE7segs IS PORT(
sw : in std_logic_vector(2 downto 0);
D : out std_logic_vector(7 downto 1);
s7segments: out std_logic_vector(6 downto 0));
END transcodDE7segs;
ARCHITECTURE arch of transcodDE7segs IS
BEGIN
-- transcodeur du Dé
with sw select
-- D7.....D1
D <= "0000000" when "000",
"0001000" when "001",
"1000001" when "010",
"1001001" when "011",
"1010101" when "100",
"1011101" when "101",
"1110111" when "110",
"0000000" when others;
-- Ajouter la deuxième partie maintenant
-- transcodeur 7 segments
with sw select
--gfedcba
s7segments <= "1000000" when "000",
"1111001" when "001",
"0100100" when "010",
"0110000" when "011",
"0011001" when "100",
"0010010" when "101",
"0000010" when "110",
"1111000" when others;
END arch;
- L'entée (000)2 n'affiche aucune led pour le dé mais affiche naturellement 0 sur l'afficheur sept segments.
- L'entée (111)2 n'affiche aucune led pour le dé mais affiche naturellement 7 sur l'afficheur sept segments.
L'inconvénient de la méthode ci-dessus est que l'on modifie le code source du transcodeur pour l'adapter au problème très particulier que l'on cherche à résoudre. Ici on a amputé le "with select when" du transodeur 7 segments de la moitié de ses lignes. On lui préférera par la suite une méthode de câblage (PORT MAP) qui adapte uniquement par câblage. On n'utilise pas le poids fort des entrées, alors on la câble à '0' et le compilateur fera les simplifications. C'est cette méthode que l'on utilisera dans l'exercice suivant, méthode qui nécessite un certain entraînement.
Et voici maintenant le fichier de contraintes associé :
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation SW[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,, SW[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,, SW[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,, D[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,, D[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,, D[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,, D[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,, D[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,, D[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,, D[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,, s7segments[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,, s7segments[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,, s7segments[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,, s7segments[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,, s7segments[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,, s7segments[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,, s7segments[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,,
Exercice 4 : transcodeur binaire sept segments sur deux digits
Comme il est dit dans l'énoncé, il existe plusieurs méthodes pour résoudre cet exercice. Il faut d'abord comprendre quelles sont les entrées et quelles sont les sorties. En clair, comme d'habitude on résout le problème de l'entité. entity exo4a is port(
sw : in std_logic_vector(7 downto 0); -- 8 entrées pour deux digits en entree
hex0, hex1 : out std_logic_vector(6 downto 0)); -- deux digits de 7 segments en sortie
end exo4a;
Il reste maintenant à réaliser les deux with select when dans l'architecture. Cette méthode qui consiste à gérer deux "with select when" séparés se fait facilement parce qu'en fait les deux "with select when" sont complètement indépendants. |
Voici donc le programme complet :
-- Vérifié le 28/09/20 par S. Moutou
library ieee;
use ieee.std_logic_1164.all;
--use ieee.std_logic_arith.all;
--use ieee.std_logic_unsigned.all;
entity exo4a is port(
sw : in std_logic_vector(7 downto 0); -- 8 entrées pour deux digits en entree
hex0, hex1 : out std_logic_vector(6 downto 0)); -- deux digits de 7 segments en sortie
end exo4a;
ARCHITECTURE behavior OF exo4a IS
BEGIN
-- on commence par la gestion du transcodeur du poids faible
with sw(3 downto 0) select
--gfedcba
hex0 <= "1000000" when "0000",
"1111001" when "0001",
"0100100" when "0010",
"0110000" when "0011",
"0011001" when "0100",
"0010010" when "0101",
"0000010" when "0110",
"1111000" when "0111",
"0000000" when "1000",
"0010000" when "1001",
"0001000" when "1010",
"0000011" when "1011",
"1000110" when "1100",
"0100001" when "1101",
"0000110" when "1110",
"0001110" when others;
-- on poursuit par la gestion du transcodeur du poids fort
with sw(7 downto 4) select
--gfedcba
hex1 <= "1000000" when "0000",
"1111001" when "0001",
"0100100" when "0010",
"0110000" when "0011",
"0011001" when "0100",
"0010010" when "0101",
"0000010" when "0110",
"1111000" when "0111",
"0000000" when "1000",
"0010000" when "1001",
"0001000" when "1010",
"0000011" when "1011",
"1000110" when "1100",
"0100001" when "1101",
"0000110" when "1110",
"0001110" when others;
END behavior;
Et voici le fichier de contrainte correspondant :
To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation SW[0],Unknown,PIN_C10,7,B7_N0,PIN_C10,3.3-V LVTTL,,,,, SW[1],Unknown,PIN_C11,7,B7_N0,PIN_C11,3.3-V LVTTL,,,,, SW[2],Unknown,PIN_D12,7,B7_N0,,3.3-V LVTTL,,,,, SW[3],Unknown,PIN_C12,7,B7_N0,,3.3-V LVTTL,,,,, SW[4],Unknown,PIN_A12,7,B7_N0,,3.3-V LVTTL,,,,, SW[5],Unknown,PIN_B12,7,B7_N0,,3.3-V LVTTL,,,,, SW[6],Unknown,PIN_A13,7,B7_N0,,3.3-V LVTTL,,,,, SW[7],Unknown,PIN_A14,7,B7_N0,,3.3-V LVTTL,,,,, SW[8],Unknown,PIN_B14,7,B7_N0,,3.3-V LVTTL,,,,, SW[9],Unknown,PIN_F15,7,B7_N0,,3.3-V LVTTL,,,,, HEX0[0],Unknown,PIN_C14,7,B7_N0,,3.3-V LVTTL,,,,, HEX0[1],Unknown,PIN_E15,7,B7_N0,,3.3-V LVTTL,,,,, HEX0[2],Unknown,PIN_C15,7,B7_N0,,3.3-V LVTTL,,,,, HEX0[3],Unknown,PIN_C16,7,B7_N0,,3.3-V LVTTL,,,,, HEX0[4],Unknown,PIN_E16,7,B7_N0,,3.3-V LVTTL,,,,, HEX0[5],Unknown,PIN_D17,7,B7_N0,,3.3-V LVTTL,,,,, HEX0[6],Unknown,PIN_C17,7,B7_N0,,3.3-V LVTTL,,,,, HEX1[0],Unknown,PIN_C18,7,B7_N0,,3.3-V LVTTL,,,,, HEX1[1],Unknown,PIN_D18,6,B6_N0,,3.3-V LVTTL,,,,, HEX1[2],Unknown,PIN_E18,6,B6_N0,,3.3-V LVTTL,,,,, HEX1[3],Unknown,PIN_B16,7,B7_N0,,3.3-V LVTTL,,,,, HEX1[4],Unknown,PIN_A17,7,B7_N0,,3.3-V LVTTL,,,,, HEX1[5],Unknown,PIN_A18,7,B7_N0,,3.3-V LVTTL,,,,, HEX1[6],Unknown,PIN_B17,7,B7_N0,,3.3-V LVTTL,,,,,