Académique Documents
Professionnel Documents
Culture Documents
Techniques avancées
de conception de circuits combinatoires
Pierre Langlois
http://creativecommons.org/licenses/by-nc-sa/2.5/ca/
vérification de la puce
annotation
vérification par simulation
des délais
code HDL
génération du
schéma synthèse implémentation fichier de puce
génération configuration
de code
diagramme HDL
d’états
contraintes
(temps et
espace)
amendement
# vote1 (A) vote2 (B) vote3 (C) vote4 (D)
approuvé (F)
0 0 0 0 0 0
1 0 0 0 1 0
2 0 0 1 0 0
3 0 0 1 1 0
4 0 1 0 0 0
5 0 1 0 1 0
6 0 1 1 0 0
7 0 1 1 1 1
8 1 0 0 0 0
9 1 0 0 1 0
10 1 0 1 0 0
11 1 0 1 1 1
12 1 1 0 0 0
13 1 1 0 1 1
14 1 1 1 0 1
15 1 1 1 1 1
-- compter les votes, sans restriction sur le type de -- compter les votes, avec restriction sur le type de
compte compte
architecture comportementale1 of vote is architecture comportementale2 of vote is
begin begin
process(lesvotes) process(lesvotes)
variable compte : integer; variable compte : natural range 0 to lesvotes'length;
begin begin
compte := 0; compte := 0;
for k in 0 to lesvotes'length - 1 loop for k in lesvotes'range loop
if lesvotes(k) = '1' then if lesvotes(k) = '1' then
compte := compte + 1; compte := compte + 1;
end if; end if;
end loop; end loop;
if compte >= 3 then if compte >= 3 then
approbation <= '1'; approbation <= '1';
else else
approbation <= '0'; approbation <= '0';
end if; end if;
end process; end process;
end comportementale1; end comportementale2;
+, -, *, /,
abs (valeur absolue), type
mod (modulo), type numérique type
arithmétique rem (reste) numérique numérique
** (exponentiation) integer
vérification de la puce
annotation
vérification par simulation
des délais
code HDL
génération du
schéma synthèse implémentation fichier de puce
génération configuration
de code
diagramme HDL
d’états
contraintes
(temps et
espace)
réponses attendues
observation
génération de
des réponses
vecteurs de succès/échec
test et de
comparaison
réponses
aux réponses
attendues
attendues
fichier de vecteurs de test circuit à vérifier réponses fichier des
stimuli et
résultats
réponses
Cin
S
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
T3
X T1
entity add3bits is
port ( Y
Cin : in std_logic;
X : in std_logic; T2 Cout
Y : in std_logic;
Cout : out std_logic;
S : out std_logic
);
end add3bits;
signal T1 : std_logic;
signal T2 : std_logic;
signal T3 : std_logic;
Spécification:
begin
end flotDeDonnees;
library ieee;
pas de ports d’entrée use ieee.std_logic_1164.all;
ni de sortie entity add3bitsTB is
end add3bitsTB;
begin
-- instanciation du module à vérifier le module à vérifier est ici
UUT : add3bits port map (Cin, X, Y, Cout, S);
begin
application de tous
-- instanciation du module à vérifier
les vecteurs UUT : add3bits port map (Cin, X, Y, Cout, S);
le nombre d’éléments de cette type nom_de_mois is (janvier, février, mars, avril, mai, juin, juillet, aout,
septembre, octobre, novembre, décembre);
constante est déterminé par sa
définition type date is record
jour : integer range 1 to 31;
mois : nom_de_mois;
année : positive range 1 to 3000;
end record;
Vérification exhaustive
• Pour un circuit combinatoire, il est parfois possible de faire une vérification
exhaustive. Au lieu d’un tableau, on peut utiliser une boucle.
library ieee; Package ieee.numeric_std.all pour:
use ieee.numeric_std.all;
• type unsigned
architecture arch3 of add3bitsTB is
• fonction to_unsigned()
component add3bits -- déclaration du module à vérifier
port (Cin, X, Y : in std_logic; Cout, S : out std_logic);
end component;
Vérification pseudo-aléatoire
• Un test pseudo-aléatoire peut venir compléter un test plus dirigé.
library ieee;
use ieee.numeric_std.all; Package ieee.math_real.all pour les procédures
use ieee.math_real.all;
• uniform()
architecture arch4 of add3bitstb is • floor()
… -- comme précédemment
begin
-- instanciation du module à vérifier uniform() est une procédure: elle modifie les
UUT : add3bits port map (Cin, X, Y, Cout, S);
paramètres qui lui sont passés.
process -- génération aléatoire de vecteurs de test
variable seed1 : positive := 1; L’appel d’une procédure est un énoncé concurrent.
variable seed2 : positive := 2;
variable aleatoire : real;
variable t : integer := -1;
begin
floor() est une fonction: elle ne modifie pas
uniform(seed1, seed2, aleatoire); -- 0.0 < aleatoire < 1.0 les paramètres qui lui sont passés.
aleatoire := floor(aleatoire * 8.0); -- 0.0 <= aleatoire <= 7.0
t := integer(aleatoire); -- 0 <= t <= 7 L’appel d’une fonction est une expression.
(Cin, Y, X) <= to_unsigned(t, 3);
wait for 10 ns;
end arch1a;
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.all;
entity detecteurPremier is
port (
Spécification:
I : in unsigned(5 downto 0);
F : out std_logic La sortie F doit être ‘1’ si le nombre
);
end detecteurPremier; entier non signé représenté sur 6 bits I
architecture flotdonnees of detecteurPremier is est premier, et ‘0’ sinon.
begin
with to_integer(I) select
F <=
'1' when 2 | 3 | 5 | 7 | 11 | 13 | 17 |
19 | 23 | 29 | 31 | 37 | 41 | 43 |
47 | 53 | 59 | 61 | 63, -- erreur!
'0' when others;
end flotdonnees;
Parenthèse:
Quatre niveaux de severity pour une assertion
• Définis dans le package standard, disponible dans le manuel de référence du
langage VHDL, norme 1076-2002 (section 14.2)
http://www.ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=1003477
• type SEVERITY_LEVEL is (NOTE, WARNING, ERROR, FAILURE);
• On peut spécifier au simulateur à quel niveau terminer la simulation.
A. Stodghill, Tip o’day: ask for a a refill, Green Options, 2007/06/18. Consulté le 4 septembre 2009, tiré
INF3500 : Conception et implémentation de systèmes numériques de http://greenoptions.com/tag/ink-cartridge
37
Exemple: conversion de couleurs de RGB à CMYK
• Bien qu’il soit possible d’imprimer du noir en combinant des quantités
suffisantes d’encres C, M et Y, on utilise plutôt une cartouche spéciale d’encre
noire, d’où le système CMYK (avec K pour noir).
• On économise ainsi l’encre de couleur qui est plus chère, et le noir est plus noir.
• On réduit les valeurs (C, M, Y) de façon à utiliser le plus d’encre noire possible.
• Par exemple, on pourrait remplacer CMY = (250, 200, 200) par (50, 0, 0) + (200,
200, 200), où la dernière quantité correspond à du gris, obtenu de l’encre noire.
• On a donc les équations suivantes pour la conversion de RGB à CMYK:
Ct 255 R Tâche:
Mt 255 G
Yt 255 B Proposez un circuit combinatoires pour effectuer
la conversion de l’espace RGB à CMYK.
K min(Ct , Mt , Yt )
C Ct K Donnez son diagramme, son code VHDL
M Mt K synthétisable, et un banc d’essai pour en vérifier le
Y Yt K fonctionnement.
INF3500 : Conception et implémentation de systèmes numériques 38
Analyse du problème:
conversion de couleurs de RGB à CMYK
• Besoin de représenter des valeurs numériques, quel type choisir?
– real: non! trop précis et pas synthétisable
– integer, natural: peut-être; positive: non (min: 1)
• Bien supportés par les synthétiseurs pour les opérations arithmétiques.
• Permet de faire abstraction de la représentation de quantités par un tableau de bits.
• Important de spécifier la gamme de valeurs possibles de façon à contraindre les ressources
matérielles utilisées pour les représenter.
– signed, unsigned: peut-être
• Définis dans le package normalisé numeric_std, comme des tableaux de std_logic.
• Bien supportés par les outils de synthèse.
• Le package numeric_std redéfinit les opérateurs de VHDL pour ces deux types.
– std_logic_vector: non, trop bas niveau
• Défini dans le package std_logic_1164 comme un tableau de std_logic.
• Des packages populaires incluent des définitions pour les opérations arithmétiques, mais
ils ne sont pas normalisés et leur utilisation n’est pas recommandée.
• Besoin de l’opération de soustraction
• Besoin de l’opération minimum
INF3500 : Conception et implémentation de systèmes numériques 39
(notes, section 2.5)
entity convRGB2CMYK is
port (
rouge, vert, bleu : in unsigned(7 downto 0);
cyan, magenta, jaune, noir : out unsigned(7 downto 0)
);
end convRGB2CMYK;
begin
if cyant < magentat then noirt1 := cyant; else noirt1 := magentat; end if;
if noirt1 < jaunet then noirt2 := noirt1; else noirt2 := jaunet; end if;
end process;
end arch2;
entity convrgb2cmyk_tb is
end convrgb2cmyk_tb;
signal rouge, vert, bleu, cyan, magenta, jaune, noir : UNSIGNED(7 downto 0);
process
begin
end loop;
end process;
end TB_ARCHITECTURE;
INF3500 : Conception et implémentation de systèmes numériques 44
(notes, section 5.5.1)
valeur
b7 b6 b5 b4 b3 b2 b1 b0 signée en valeur non
comp. à signée
m 1 deux
0 0 0 0 0 0 0 1 1 1
i 0
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 -1 255
1 1 1 1 1 1 1 0 -2 254
1 0 0 0 0 0 0 1 -127 129
1 0 0 0 0 0 0 0 -128 128
entity democode2 is
port (
A8, B8 : in signed(7 downto 0);
R8 : out signed(7 downto 0);
R9, S9, T9 : out signed(8 downto 0);
R7 : out signed(6 downto 0)
);
end;
begin
end arch;
-- vers unsigned
-- vers real vusigned := to_unsigned(integer(vreal), vusigned'length);
vreal := real(vint); vusigned := to_unsigned(vint, vusigned'length);
vreal := real(to_integer(vsigned)); vusigned := unsigned(vsigned);
vreal := real(to_integer(vusigned)); vusigned := unsigned(vslv);
vreal := real(to_integer(signed(vslv)));
-- vers std_logic_vector
-- vers integer vslv := std_logic_vector(to_signed(integer(vreal), vslv'length));
vint := integer(vreal); vslv := std_logic_vector(to_signed(vint, vslv'length));
vint := to_integer(vsigned); vslv := std_logic_vector(vusigned);
vint := to_integer(vusigned); vslv := std_logic_vector(vsigned);
vint := to_integer(signed(vslv));