LOGIQUE PROGRAMMABLE EN VERILOG
Chapitre 1. Introduction
Chapitre 2. Traitement combinatoire et syntaxe du langage
Chapitre 3. L'usage de l'outil QUARTUS II
Chapitre 4. Description comportementale
4.1. Le bloc always et le type reg
4.2. Les opérateurs conditionnels
4.3. La mémoire élémentaire
4.4. L'alternative multiple
4.5. Exemple de description par table de vérité
4.6. Traitement séquentiel par l'exemple
4.7. Exercices
4.8. Solutions des exercices
Chapitre 5. Projets : énoncés
Chapitre 6. Projets : vers la solution
Page d'accueil Table des matières Niveau supérieur Page précédente Bas de la page Page suivante

4.1. Le bloc always et le type reg

Chaque fois qu’un comportement devra être décrit, ceci se fera sous la forme de conditions. Les conditions pourront être vraies ou fausses et les traitements seront effectués ou non. Tout état doit être défini par une équation. Les alternatives ou aiguillages multiples pouvant être incomplets, la notion de variable à mémoire est obligatoire. Conséquence : une variable conservera son état tant que l'on ne le changera pas. On ne pourra pas avoir de variables du type wire ou output affectés dans un bloc always qui ne peut pas être exécuté à chaque fois.

Les déclarations sur les comportements devront être effectuées dans des bloc always.

Il est interdit d'imbriquer des blocs always.

Cette variable mémoire capable de mémoriser un état est un registre (register en anglais) et sera déclarée avec le mot clé reg.

Elle pourra être déclarée sur un bit, un bus (tableau à 1 dimension) ou encore sous la forme d’une mémoire (tableau à 2 dimensions).

Une variable en registre ne peut être l’objet d’une assignation continue (assign).

Une grandeur de sortie homonyme d’un registre est automatiquement et implicitement affectée par le contenu de ce registre.

Toute variable affectée dans un bloc always doit être déclarée en registre (reg).

Une variable en registre ne peut être affectée que dans un seul bloc always.

 

Dans un bloc always, les instructions sont délimitées par les mots-clés begin et end

Soit sur un exemple :

module memoire1 (a, b, c, Q1, Q2);

input a, b, c;

output Q1, Q2;

reg Q1;

always

begin

Q1 = ...

end

assign Q2 = ...

endmodule

 

Avec la fonction mémoire apparaît la notion de temps et la nécessité de synchronisation des tâches par une ou plusieurs horloges. Le langage a prévu que le bloc « always » puisse être événementiel.

Les événements seront précisés à la suite du mot « always » par une condition exprimée entre parenthèses :


@ (condition)

La condition peut être liée à un changement de niveau ou à un front :

  • front montant --> posedge
  • front descendant --> negedge

Exemples :

always // bloc toujours traité

......

 

always @ ( f) // traité seulement au changement d'état de f

.........

 

always @ ( f or g) // traité à chaque changement d'état de f ou g

.....


always @ (posedge clock) // traité au front montant de clock

........

Remarque : le langage ne permet pas de gérer 2 fronts différents dans une condition.

always @ (posedge clock or negedge clk2) // n'est pas compilable

........

 

 
Page d'accueil Table des matières Niveau supérieur Page précédente Haut de la page Page suivante