Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

Verilog bloque toujours

Un always bloc est l'un des procédural blocs dans Verilog. Les instructions à l'intérieur d'un bloc always sont exécutées séquentiellement.

Syntaxe

  
  
always @ (event)
	[statement]
	
always @ (event) begin
	[multiple statements]
end

  

Le always bloc est exécuté à un événement particulier. L'événement est défini par une liste de sensibilité.

Quelle est la liste de sensibilité ?

Une sensibilité list est l'expression qui définit quand le bloc always doit être exécuté et est spécifié après le @ opérateur entre parenthèses ( ) . Cette liste peut contenir un ou un groupe de signaux dont le changement de valeur exécutera le bloc toujours.

Dans le code ci-dessous, toutes les instructions à l'intérieur du always bloc est exécuté chaque fois que la valeur des signaux a ou b change.

  
  
// Execute always block whenever value of "a" or "b" change
always @ (a or b) begin
	[statements]
end

  

À quoi sert le bloc toujours ?

Un always block peut être utilisé pour réaliser des éléments combinatoires ou séquentiels. Un élément séquentiel comme une bascule devient actif lorsqu'il est muni d'une horloge et d'une réinitialisation. De même, un bloc combinatoire devient actif lorsque l'une de ses valeurs d'entrée change. Ces blocs matériels fonctionnent tous simultanément indépendamment les uns des autres. La connexion entre chacun est ce qui détermine le flux de données. Pour modéliser ce comportement, un always le blocage est créé comme un processus continu qui se déclenche et exécute une action lorsqu'un signal dans la liste de sensibilité devient actif.

Dans l'exemple suivant, toutes les instructions du bloc always sont exécutées à chaque front positif du signal clk.

  
  
// Execute always block at positive edge of signal "clk"
always @ (posedge clk) begin
	[statements]
end

  

Que se passe-t-il s'il n'y a pas de liste de sensibilité ?

Le always bloc se répète en continu pendant toute la durée d'une simulation. La liste de sensibilité apporte un certain sens de la synchronisation, c'est-à-dire que chaque fois qu'un signal dans la liste de sensibilité change, le bloc toujours est déclenché. S'il n'y a pas d'instructions de contrôle de synchronisation dans un bloc toujours, la simulation se bloquera à cause d'une boucle infinie sans retard !

Exemple

L'exemple ci-dessous est un bloc always qui tente d'inverser la valeur du signal clk. L'instruction est exécutée toutes les 0 unités de temps. Par conséquent, il s'exécute indéfiniment en raison de l'absence de retard dans l'instruction.

  
  
// always block is started at time 0 units
// But when is it supposed to be repeated ?
// There is no time control, and hence it will stay and
// be repeated at 0 time units only. This continues
// in a loop and simulation will hang !
always clk = ~clk;

  

Même si la liste de sensibilité est vide, il devrait y avoir une autre forme de temporisation. Le temps de simulation est avancé par une instruction de retard dans le always construire comme indiqué ci-dessous. Désormais, l'inversion de l'horloge se fait toutes les 10 unités de temps.

  
  
	always #10 clk = ~clk;

  

Remarque : Les retards explicites ne sont pas synthétisables en portes logiques !

Par conséquent, le véritable code de conception Verilog nécessite toujours une liste de sensibilité.

Exemple de conception d'éléments séquentiels

Le code ci-dessous définit un module appelé tff qui accepte une entrée de données, une horloge et une réinitialisation active-basse. La sortie est inversée chaque fois que d est trouvé égal à 1 sur le front positif de l'horloge. Ici, le always le bloc est déclenché soit sur le front positif de clk, soit sur le front négatif de rstn.

Que se passe-t-il au front positif de l'horloge ?

Les événements suivants se produisent sur le front positif de l'horloge et se répètent pour tous les fronts positifs de l'horloge.

  1. Premier if le bloc vérifie la valeur de la réinitialisation active-basse rstn
    1. Si rstn est égal à zéro, la sortie q doit être réinitialisée à la valeur par défaut de 0
    2. Si rstn est un, cela signifie que la réinitialisation n'est pas appliquée et doit suivre le comportement par défaut
  2. Si l'étape précédente est fausse :
    1. Vérifier la valeur de d et s'il s'avère qu'il s'agit d'un, alors inverser la valeur de q
    2. Si d vaut 0, alors conserver la valeur de q

  
  
module tff (input  		d,
						clk,
						rstn,
			output reg 	q);
			
	always @ (posedge clk or negedge rstn) begin
		if (!rstn)
			q <= 0;
		else
			if (d)
				q <= ~q;
			else
				q <= q;
	end
endmodule

  

Que se passe-t-il au front négatif de la réinitialisation ?

Les événements suivants se produisent au bord négatif de rstn et se produisent à toutes ces occurrences.

  1. Premier if le bloc vérifie la valeur de rstn de réinitialisation actif-bas. Au front négatif du signal, sa valeur est 0.
    1. Si la valeur de rstn est 0, cela signifie que la réinitialisation est appliquée et que la sortie doit être réinitialisée à la valeur par défaut de 0
    2. Le cas où la valeur de rstn est 1 n'est pas pris en compte car l'événement actuel est front négatif du premier

Exemple de conception d'éléments combinés

Un always bloc peut également être utilisé dans la conception de blocs combinatoires. Par exemple, le circuit numérique suivant représente une combinaison de trois portes logiques différentes qui fournissent une certaine sortie au signal o.

Le code ci-dessous est un module avec quatre ports d'entrée et un seul port de sortie appelé o. Le always Le bloc est déclenché chaque fois que l'un des signaux de la liste de sensibilité change de valeur. Le signal de sortie est déclaré de type reg dans la liste des ports du module car il est utilisé dans un bloc procédural. Tous les signaux utilisés dans un bloc procédural doivent être déclarés de type reg .

  
  
module combo (	input 	a,
      			input	b,
              	input	c,
              	input	d,
  	            output reg o);
  
  always @ (a or b or c or d) begin
    o <= ~((a & b) | (c^d));
  end
  
endmodule

  

Voir que le signal o devient 1 chaque fois que l'expression combinatoire sur le RHS devient vraie. De même, o devient 0 lorsque RHS est faux.

Sortie de simulation

Cliquez ici pour un diaporama avec exemple de simulation !


Verilog

  1. Tutoriel Verilog
  2. Concaténation Verilog
  3. Verilog - Dans une coquille de noix
  4. Affectations Verilog
  5. Verilog bloquant et non bloquant
  6. Fonctions Verilog
  7. Tâche Verilog
  8. Générateur d'horloge Verilog
  9. Fonctions mathématiques Verilog