Dossier d'apprentissage HDLBits-Verilog | Modules linguistiques Verilog (1)

20.Module

pratique : vous pouvez connecter des signaux au module par nom de port ou par position de port. Pour plus de pratique, essayez les deux méthodes.
Insérer la description de l'image ici
两种方法:
1、Vous pouvez connecter des signaux au module par nom de port

module top_module ( input a, input b, output out );
    mod_a instance1 (a, b, out);
endmodule

Remarque : Les ports de mod_a sont dans le même ordre que les ports d'entrée et de sortie de top_module, et sont adaptés de gauche à droite selon la position

2.Position du port

module top_module ( input a, input b, output out );
    mod_a instance2 (.out(out), .in1(a), .in2(b));
endmodule

Remarque : les deux sont directement liés ici.

21.Connexion des ports par position | Position du module

pratique:
Ce problème est similaire au précédent (module). Vous recevez un module nommé mod_a qui possède 2 sorties et 4 entrées, dans cet ordre. Vous devez connecter les 6 ports par position aux ports out1, out2, a, b, c et d de votre module de niveau supérieur, dans cet ordre.

Vous disposez du module suivant :

module mod_a ( sortie, sortie, entrée, entrée, entrée, entrée );

Insérer la description de l'image ici

module top_module ( 
    input a, 
    input b, 
    input c,
    input d,
    output out1,
    output out2
);
    mod_a instance1 ( out1, out2, a, b, c, d );
endmodule

Remarque : Il s'agit d'un simple exercice de correspondance de position, mais vérifiez soigneusement quel port est écrit en premier dans l'ordre de mod_a dans le titre, voici la sortie devant.

22.Connexion des ports par nom | Nom du module

pratique :
ce problème est similaire au module. Vous recevez un module nommé mod_a qui possède 2 sorties et 4 entrées, dans un certain ordre. Vous devez connecter les 6 ports par nom aux ports de votre module de niveau supérieur :

Port in mod_a Port in top_module
sortie out1 out1
sortie out2 out2
entrée in1 a
entrée in2 b
entrée in3 c
entrée in4 d
Vous obtenez le module suivant :

module mod_a ( sortie out1, sortie out2, entrée in1, entrée in2, entrée in3, entrée in4) ;
Insérer la description de l'image ici

module top_module ( 
    input a, 
    input b, 
    input c,
    input d,
    output out1,
    output out2
);
    mod_a ins_mod_a ( .out1(out1), .out2(out2), .in1(a), .in2(b), .in3(c), .in4(d) );
endmodule

Remarque :
si vous appuyez sur le nom, vous n'avez pas à vous soucier de l'emplacement, il suffit de le lier directement et l'ordre à l'intérieur peut être modifié à volonté.
Format entre parenthèses : .Nom du port (signal externe),
ne pas oublier de pointer.

23.Trois modules | Changement de module

pratique: Vous recevez un module my_dff avec deux entrées et une sortie (qui implémente une bascule D). Instanciez-en trois, puis chaînez-les ensemble pour créer un registre à décalage de longueur 3. Le port clk doit être connecté à toutes les instances.

Le module qui vous est fourni est : module my_dff ( input clk, input d, output q ) ;

Notez que pour réaliser les connexions internes, vous devrez déclarer certains fils. Attention au nom de vos fils et instances de module : les noms doivent être uniques. Traduction
réseau : Vous obtiendrez un module my_dff avec deux entrées et une sortie ( Implémenter D tongues). Instanciez-en trois et enchaînez-les ensemble pour former un registre à décalage de longueur 3. Le port clk doit être connecté à toutes les instances.
Les modules qui vous sont fournis sont : module my_dff(input clk, input d, output q) ;

Insérer la description de l'image ici
1. Instancier par nom

module top_module ( input clk, input d, output q );
    wire out_q1, out_q2;
    my_dff ins_dff1 ( .clk(clk), .d(d), .q(out_q1));
    my_dff ins_dff2 ( .clk(clk), .d(out_q1), .q(out_q2));
    my_dff ins_dff3 ( .clk(clk), .d(out_q2), .q(q));
endmodule

Remarque : Il s'agit essentiellement de déclarer la valeur de processus à utiliser (pendant le processus de transmission), puis de la coupler selon la logique lorsque le module est affiché plus tard. Au début, je pensais qu'il serait plus pratique d'intégrer les modules selon le nom, et je sentais que ce n'était pas faisable selon le lieu.


2. Il ne devrait pas être possible d' instancier en fonction de la position , mais il se peut aussi que je ne sois pas assez bon.

24.Modules et vecteurs | Changement de module8

pratique : Cet exercice est une extension de module_shift. Au lieu que les ports de module ne soient que des broches uniques, nous avons maintenant des modules avec des vecteurs comme ports, auxquels vous attacherez des vecteurs filaires au lieu de fils simples. Comme partout ailleurs dans Verilog, la longueur du vecteur de le port n'a pas besoin de correspondre au fil qui s'y connecte, mais cela entraînera un remplissage nul ou une trucation du vecteur. Cet exercice n'utilise pas de connexions avec des longueurs de vecteur incompatibles. Cet exercice est une extension de module_shift
. Au lieu de ports de module n'ayant qu'une seule broche, nous avons désormais des modules avec des vecteurs comme ports, auxquels vous attachez des vecteurs filaires au lieu de fils normaux. Comme ailleurs dans Verilog, la longueur du vecteur d'un port ne doit pas nécessairement correspondre au fil qui y est connecté, mais cela peut entraîner un remplissage nul ou une troncature du vecteur. Cet exercice n'utilise pas de jointures avec des longueurs de vecteurs incompatibles.

Vous recevez un module my_dff8 avec deux entrées et une sortie (qui implémente un ensemble de 8 bascules D). Instanciez-en trois, puis chaînez-les ensemble pour créer un registre à décalage de 8 bits de longueur 3. De plus, créer un multiplexeur 4-en-1 (non fourni) qui choisit ce qu'il faut sortir en fonction de sel[1:0] : la valeur à l'entrée d, après la première, après la deuxième ou après la troisième bascule D. (Essentiellement, sel sélectionne le nombre de cycles pour retarder l'entrée, de zéro à trois cycles d'horloge.)
Vous obtiendrez un module my_dff8 avec deux entrées et une sortie (implémentant un ensemble de 8 bascules D). Instanciez-en trois et chaînez-les ensemble pour former un registre à décalage de 8 bits de largeur et de longueur 3. De plus, crée un multiplexeur 4 vers 1 (non fourni) basé sur sel[1:0] : la valeur à l'entrée d, après le premier d, après le deuxième ou après le troisième La valeur après une bascule D . (Essentiellement, sel sélectionne le nombre de cycles pour retarder l'entrée, de zéro à trois cycles d'horloge.

Le module qui vous est fourni est : module my_dff8 ( entrée clk, entrée [7:0] d, sortie [7:0] q ) ;

Le multiplexeur n'est pas fourni. Une façon possible d'en écrire un est à l'intérieur d'un bloc always avec une instruction case à l'intérieur
. Une façon possible de l'écrire est dans un bloc toujours, qui contient des instructions case.
Insérer la description de l'image ici

module top_module ( 
    input clk, 
    input [7:0] d, 
    input [1:0] sel, 
    output [7:0] q 
);
    wire [7:0] out_my1, out_my2, out_my3;
    
    my_dff8 ins_my1 ( .clk(clk), .d(d), .q(out_my1));
    my_dff8 ins_my2 ( .clk(clk), .d(out_my1), .q(out_my2));
    my_dff8 ins_my3 ( .clk(clk), .d(out_my2), .q(out_my3));
    
    reg [7:0] q_t;
    always @(*)
        case(sel)
            2'b00:	q_t = d;
            2'b01:	q_t = out_my1;
            2'b10:	q_t = out_my2;
    		2'b11:	q_t = out_my3;
        endcase
    assign q = q_t;
endmodule

Remarque : permettez-moi de parler du processus de réflexion de cette question
1. Tout d'abord, cette question ressemble à une question globale dès qu'elle se pose.
2. J'ai d'abord instancié trois modules, car j'ai traité de cela dans les questions précédentes et c'est facile à écrire. Ici, je dois déclarer quelques fils au début. J'ai d'abord
utilisé l'affectation continue et je l'ai écrit directement comme ceci.

câble out_my1,out_my2,out_my3 ;

3. Les questions suivantes mentionnaient la nécessité d'utiliser toujours et la casse. Lorsque j'écoutais la conférence précédente, j'ai entendu ce point de connaissance, mais je ne l'ai pas très bien compris. Ensuite, je suis allé en ligne et j'ai recherché des livres pour voir comment pour utiliser ces deux-là.
Source : https://www.runoob.com/w3cnote/verilog-process-structure.html
Source de l'image : https://www.runoob.com/w3cnote/verilog-process-structure.html
Mais je n'ai pas très bien compris cela.
Finalement j'ai regardé le cas, et il m'est arrivé d'utiliser toujours dans l'exemple, et puis je l'ai imité selon l'exemple.Source
Insérer la description de l'image ici
de l'image : https://www.runoob.com/w3cnote/verilog-case.html
et j'ai vérifié l'utilisation de toujours@ (*)
Insérer la description de l'image ici
4. Ensuite, j'ai essayé de l'exécuter, mais le la compilation a réussi et les résultats n'étaient pas tous corrects. Lorsque le cas est Le résultat de 00 est correct et les suivants sont tous faux. Ensuite, j'ai réfléchi à la question de savoir si la largeur de out_my n'était pas définie, puis je l'ai modifiée en

wire [7:0] out_my1,out_my2,out_my3;

5. Résumé des questions : J'ai trouvé que le moyen le plus rapide d'apprendre est de répondre aux questions. Ce que je n'ai pas compris en écoutant les cours sera beaucoup plus facile à comprendre maintenant. Vous pouvez trouver un moyen de poser les questions en fonction des questions, et ce sera plus efficace.Pendant cette période, j'ai hésité à lire les réponses sur Internet.

Je suppose que tu aimes

Origine blog.csdn.net/qq_43374681/article/details/132465942
conseillé
Classement