43
Deuxième partie
D. Gaillot
N. Bourzgui
Bât. P4 Bur. 209
1
2
1. Fonctions séquentielles
Dans les systèmes séquentiels, la mémorisation de l’état des sorties est réalisée par des bascules. Au front
actif d’une horloge de cadencement (un signal carré de fréquence généralement fixe et stable), l’état des
sorties change. Le nouvel état dépend de l’état précédent et des éventuelles entrées.
La bibliothèque IEEE est déclarée pour utiliser le type std_logic ainsi que la fonction rising_edge qui
permet de détecter un front montant sur un signal. En logique synchrone, seul le signal d'horloge va utiliser
cette fonction.
LIBRARY IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
ENTITY dff IS
PORT (
clk : IN std_logic;
d: IN std_logic;
q: OUT std_logic
);
END dff ;
Description de l’architecture
3
Le codage comportemental de la bascule fait appel à un processus (PROCESS). Un processus est un
enchaînement d'instructions décrivant un comportement. Il possède une liste de sensibilité spécifiant sur
quel signal le processus doit s'exécuter. Le processus en soit est une instruction concurrente mais son
contenu est une suite d'instructions séquentielles. Il peut être utilisé aussi bien pour la logique séquentielle
que pour la logique combinatoire.
Dans le cas de la logique synchrone faisant des calculs au rythme d'une horloge clk, la syntaxe est donc
PROCESS (clk)
Enfin, le corps du processus, codé entre BEGIN et END PROCES, contient les instructions à exécuter, Pour
une bascule D, cela consiste à recopier la valeur de l'entrée sur la sortie.
q <= d;
Il faut préalablement tester le front sur lequel l'exécution a lieu en utilisant l'instruction :
IF clk=’1’ AND CLK’EVENT THEN.
ou, si on utilise la bibliothèque IEEE: IF RISING_EDGE (clk) THEN
Faire une simulation fonctionnelle de la bascule D (l'horloge clk sera fixée à 20 ns de période par la grille,
Pour accéder à la grille lorsque le fichier de simulation .vwf est actif « edit Grid Size… » ), programmer et
tester la bascule D (utiliser le bouton poussoir pour l’horloge avec visualisation de l’état à l’aide d’une
LED).
Dans le cas où on boucle (/Q : not(Q)) sur l’entrée D, quel rapport existe t-il entre la fréquence du signal clk
et celle de la sortie Q?, écrire le code et faire la simulation avec un Reset (Clear) et un set (Preset), le reset
doit être prioritaire sur le set.
LIBRARY IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
ENTITY compteur4 IS
PORT (
clk : IN std_logic ;
resetn : IN std_logic ;
q: OUT unsigned (3 downto 0)
);
END compteur4 ;
Description de l’architecture
La déclaration du signal interne q_int est nécessaire car q est un port de sortie, il ne peut donc pas être
utilisé en entrée pour réaliser l'instruction de comptage :
q <= q + 1
C'est q_int qui va donc servir à cette fin. Une autre solution aurait été de déclarer le port q de type buffer à
la place de out, ce qui aurait évité l'utilisation de q_int.
La liste de sensibilité doit donc contenir ces 2 signaux: PROCESS (clk, resetn)
Conformément à l'utilisation du reset asynchrone sur les bascules, le signal resetn est prioritaire par rapport
au front d'horloge, il faut donc commencer le codage du processus par l'instruction : IF resetn = '0' THEN
Il aurait été possible de mettre à zéro q_int par l'instruction q_int <= « 0000 » ; mais l'instruction :
q_int <= (others => '0'); est plus générique. Il faut ensuite indiquer la condition sur le front montant de
l'horloge pour déclencher le comptage : ELSIF rising_edge (clk) THEN
Il faut noter que l'instruction de comptage s'effectue en additionnant un signal unsigned sur 4 bits avec un
entier : q_int <= q_int + 1 ; qui est une opération définie dans le paquetage numeric_std de IEEE.
L'addition entre un unsigned et un std_logic n'est pas définie (donc l'écriture q_int <= q_int + ‘1’ ; n'est
pas possible).
RESET Q[3..0]
CLOCK
LOAD
SENS
DATA[3..0]
inst4
On cherche à réaliser un registre à décalage sur 4 bits, possédant une sortie supplémentaire (match) active à
‘1’ si le contenu du registre à décalage vaut une valeur précise (vall).
Le port d'entrée d_in rentre dans un registre à décalage de 4 bits qui sort sur d_out. La sortie match est
activée à 1 lorsque l'entrée vall est égale au contenu du registre à décalage.
registre4
clk d_out
d_in match
v all[3..0]
inst1
LIBRARY IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
ENTITY registre4 IS
PORT (
clk : IN std_logic ;
d_in : IN std_logic ;
vall : IN UNSIGNED (3 downto 0) ;
d_out : OUT std_logic ;
match : OUT std_logic
);
END registre4 ;
Processus combinatoire :
La génération de la sortie match est un processus combinatoire, de même pour d_out qui est équivalent à
reg (3).
7
Mini-Projet : Synthèse numérique de Fréquence
1. Principe de base :
La synthèse numérique de fréquence est l’incrémentation à fréquence fixe par une horloge à
quartz, d’un compteur dont la sortie va lire une mémoire morte (adresse de la mémoire). Si dans
celle-ci, à chaque adresse associée à l’incrément de temps, se trouve l’amplitude du signal
souhaité, après conversion numérique analogique, on obtient le signal recherché.
Dans le cas d’un signal sinusoïdal, les données de la mémoire peuvent être vues comme
l’amplitude associée à chaque phase instantanée du signal, et les adresses comme la phase du
signal.
Le schéma ci-après représente un compteur 8 bits incrémentant une mémoire Rom.
Ts = Th * 28 = Th * 256
8
Avant d’implanter ce schéma dans un projet Quartus, il nous faut d’abord déterminer les données
(amplitude du signal) à placer dans la mémoire (lors de l’implantation d’une ROM, Quartus impose
de connaître ces données).
2. Initialisation de la mémoire
Pour générer le fichier « .mif », il est possible d’entrer les 256 valeurs une par une (Quartus
propose un éditeur de fichier .mif, mais n’importe quel éditeur de texte ferait l’affaire aussi), nous
allons les générer automatiquement à l’aide du logiciel Scilab.
Ouvrir le logiciel Scilab, faire le changement du répertoire courant vers le répertoire du projet
Quartus et entrer le script suivant :
Ouvrir ensuite le fichier mem.mif créé à l’aide de Scilab avec l’éditeur Notepad par exemple. Celui
de Quartus ne convient cependant pas car il cherchera pour un fichier .mif la syntaxe que nous
allons placer par la suite.
0 : 127 ;
1 : 130 ;
2 : 133 ;
…………………………………….
9
252 : 114 ;
253 : 117 ;
254 : 120 ;
255 : 123 ;
Modifier alors le fichier de manière à le rendre compatible avec un fichier « .mif » avec rajout
d’entête et end à la fin. On obtient finalement ceci :
DEPTH = 256;
WIDTH = 8;
ADDRESS_RADIX =DEC;
DATA_RADIX =DEC;
CONTENT
BEGIN
0 : 127 ;
1 : 130 ;
2 : 133 ;
3 : 136 ;
4 : 139 ;
………………………………………..
252 : 114 ;
253 : 117 ;
254 : 120 ;
255 : 123 ;
END;
Paramétrage de la mémoire :
11
Après c’est Next puis Next
Placer les ports d’entrées et de sortie, faire une compilation en vue de simulation fonctionnelle.
On notera lors de la simulation le temps de latence de deux coups d’horloge entre l’application
d’une adresse (sortie compteur) et la présence de la sortie correspondante en mémoire.
On vérifie bien que les données inscrites en mémoire se retrouvent en sortie lorsque leur adresse
est présente sur le bus (revoir les premières lignes du fichier d'initialisation).
12
Ce qui va nécessiter de réécrire sur le vecteur de simulation :
Puis en demandant de nouveau l’affichage sous forme analogique la fenêtre suivante apparait :
13
Schéma circuit du convertisseur numérique analogique
OUTPUT q[7..0]
lpm_counter0
up counter lpm_rom0
hor INPUT
VCC clock
q[7..0] address[7..0] OUTPUT sor[7..0]
PIN_B12 q[7..0]
inst1 clock
PIN_H12
LSB
inst PIN_H13
PIN_H14
OUTPUT hor_cna PIN_G15
PIN_E14
PIN_F12
PIN_E15
PIN_F15
PIN_G16
MSB
Créer un projet :
File > New Project Wizard
14
Créer une MegaFunction
Tool > MegaFunction Plug-in Manager
2. Compilation
Compiler :
Compilation > Start Compilation (compilation complète du projet)
Compilation > Analyse Current File (compilation du fichier courant)
3. Simulation
Insérer un signal
Clic droit dans la colone “Name” > Insert node or bus > node finder (filter > pin all) > List
Lancer la simulation
Processing > Start Simulation
4. Programmation du composant
Tool > Programmer > Start
15