(1) Utiliser une affectation non bloquante pour écrire un code logique séquentiel
- Toutes les variables doivent attendre l'arrivée du front de déclenchement avant d'affecter
- Lors du calcul du signal à droite du numéro d'affectation, toutes les variables sont les valeurs avant le front de déclenchement.
- Les instructions du bloc procédure sont exécutées en parallèle
(2) Écrire un code de bloc logique combinatoire avec toujours bloquer pour utiliser l'affectation de blocage
- La liste sensible dans le bloc Always doit être déclenchée par niveau
(3) Vous ne pouvez pas utiliser à la fois l'affectation bloquante et l'affectation non bloquante dans le même bloc toujours
(4) Une seule variable peut être affectée dans un bloc toujours
- les blocs sont toujours exécutés en parallèle
- L'affectation à la même variable dans plusieurs blocs toujours est strictement interdite
- L'affectation à plusieurs variables dans un bloc toujours n'est pas recommandée
(5) Dans le programme de réinitialisation asynchrone, si l'instruction if apparaît dans l'instruction always, le signal de contrôle sensible autre que le signal d'horloge (généralement le signal de réinitialisation) doit être jugé dans la première instruction if, et s'il est placé dans la suite à l'erreur de compilation de l'instruction if
- Erreur courante : impossible de faire correspondre les opérandes dans la condition aux arêtes correspondantes dans le contrôle d'événement englobant de la construction toujours. Le bloc de code correspondant est :
always @(posedge sys_clk or negedge sys_rst_n) begin
if (count == COUNT_MAX) //
led_out <= ~led_out; // 时序逻辑块中用非阻塞赋值
else if(sys_rst_n == 1'b0)
led_out <= 1'b0;
else
led_out <= led_out;
end
De toute évidence, le signal de réinitialisation n'est pas jugé dans la première instruction if, il y a donc une erreur !
- Méthode de modification : mettre des signaux de contrôle sensibles autres que le signal d'horloge dans la première instruction if
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0) //
led_out <= 1'b0;
else if(count == COUNT_MAX)
led_out <= ~led_out; // 时序逻辑块中用非阻塞赋值
else
led_out <= led_out;
end
(6) Le nom du paramètre paramètre est en majuscule pour distinguer les autres variables
parameter COUNT_MAX = 25'd24_999_999
(7) Lorsque vous écrivez des nombres plus longs, séparez-les par _ (trait de soulignement) pour améliorer la lisibilité
parameter MIN = 25'd10_999_999,
parameter MAX = 25'd24_999_999