Apprentissage Verilog : parcours de questions de brossage sur le site Web Hdlbits

1. Hdibits : le « basique » de la syntaxe Verilog

Lien vers le site : Hdibits .

première question:

Définit un fil dirigé.

image:

module top_module( input in, output out );
   assign out = in;
endmodule

Deuxième question:

Créez un module avec 3 entrées et 4 sorties, comme indiqué dans la figure ci-dessous.

insérez la description de l'image ici

module top_module( 
   input a,b,c,
   output w,x,y,z );
   assign w = a ;
   assign x = b ;
   assign y = b ;
   assign z = c ;
endmodule

La troisième question :

Créez un module qui implémente la porte NOT.

insérez la description de l'image ici

module top_module( input in, output out );
   not(out, in);
endmodule

Quatrième question :

Créez un bloc qui implémente une porte ET.

insérez la description de l'image ici

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

Cinquième question :

Créez un bloc qui implémente une porte NOR (ou non).

insérez la description de l'image ici

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

Sixième question :

Créez un module qui implémente une porte XNOR (OU exclusif).

insérez la description de l'image ici

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

Septième question :

Implémentez le circuit suivant. Créez deux fils du milieu (nommez-les comme vous le souhaitez) pour connecter les portes ET et OU ensemble. Notez que le fil alimentant la porte NOT est en fait un fil, vous n'avez donc pas nécessairement besoin de déclarer un troisième fil ici. Notez que le fil n'a qu'une seule source (la sortie de la porte), mais peut avoir plusieurs entrées alimentées.

Si vous suivez la structure du circuit illustrée dans la figure, vous devriez vous retrouver avec quatre instructions d'affectation car quatre signaux doivent être attribués.

insérez la description de l'image ici

`default_nettype none  //禁用隐式网络
module top_module(
   input a,
   input b,
   input c,
   input d,
   output out,
   output out_n   ); 
   
   wire net_1 ,net_2;
   
   assign net_1 = a & b;
   assign net_2 = c & d;
   assign out = net_1 | net_2;
   assign out_n = ~out;
   
endmodule

Huitième question :

Créez un module avec les mêmes fonctionnalités que la puce 7458. Il dispose de 10 entrées et 2 sorties. Vous pouvez choisir d'utiliser des instructions pour piloter chaque fil de sortie, ou vous pouvez choisir de déclarer (quatre) fils à utiliser comme signaux intermédiaires, où chaque fil interne est piloté par la sortie de l'une des portes ET. Pour plus de pratique, essayez dans les deux sens.

insérez la description de l'image ici
la première méthode :

module top_module ( 
   input p1a, p1b, p1c, p1d, p1e, p1f,
   output p1y,
   input p2a, p2b, p2c, p2d,
   output p2y );

   wire left_1 ,left_2 ,right_1 , right_2;
   
   assign left_1 = p2a & p2b;
   assign left_2 = p2c & p2d;
   assign p2y = left_1 | left_2;
   
   assign right_1 = p1a & p1c & p1b;
   assign right_2 = p1f & p1e & p1d;
   assign p1y = right_1 | right_2;

endmodule

La deuxième méthode :

module top_module ( 
   input p1a, p1b, p1c, p1d, p1e, p1f,
   output p1y,
   input p2a, p2b, p2c, p2d,
   output p2y );
   
   wire left_1 ,left_2 ,right_1 , right_2;
   
   and (left_1, p2a, p2b);
   and (left_2, p2c, p2d);
   or (p2y, left_1, left_2);
   
   and (right_1, p1a, p1c, p1b);
   and (right_2, p1f, p1e, p1d);
   or (p1y, right_1, right_2);  

endmodule

2. Hdibits : "Vecteur" de la syntaxe Verilog

première question:

Construisez un circuit qui prend une entrée de 3 bits, puis génère le même vecteur et le divise en trois sorties distinctes de 1 bit. Connectez la sortie à la position 0, à la position 1, etc. du vecteur d'entrée.
Dans un diagramme, les graduations accompagnées de chiffres indiquent la largeur du vecteur (ou « bus »), plutôt que de tracer des lignes distinctes pour chaque bit du vecteur.

insérez la description de l'image ici

module top_module ( 
    input wire [2:0] vec,
    output wire [2:0] outv,
    output wire o2,
    output wire o1,
    output wire o0  ); // Module body starts after module declaration
	
    assign outv = vec[2:0];
    assign o2 = vec[2];
    assign o1 = vec[1];
    assign o0 = vec[0];
endmodule

Deuxième question:

Créez un circuit combinatoire qui divise un demi-mot d'entrée (16 bits, [15:0]) en octets inférieurs[7:0] et supérieurs[15:8].

`default_nettype none     // Disable implicit nets. Reduces some types of bugs.
module top_module( 
    input wire [15:0] in,
    output wire [7:0] out_hi,
    output wire [7:0] out_lo );

    assign out_lo = in[7:0];
    assign out_hi = in[15:8];
endmodule

La troisième question :

Un vecteur de 32 bits peut être considéré comme contenant 4 octets (bits [31:24], [23:16], etc.). Construisez un circuit qui inversera le caractère boutien d'un mot de 4 octets.
AaaaaaaaBbbbbbbbbCccccccDddddddd => DdddddddCcccccccBbbbbbbbAaaaaaaa
Cette opération est généralement utilisée lorsque le caractère boutien d'une donnée doit être échangé, comme entre les systèmes x86 petit-boutien et le format gros-boutiste utilisé dans de nombreux protocoles Internet.

`default_nettype none     // Disable implicit nets. Reduces some types of bugs.
module top_module( 
    input wire [15:0] in,
    output wire [7:0] out_hi,
    output wire [7:0] out_lo );

    assign out_lo = in[7:0];
    assign out_hi = in[15:8];
endmodule

Quatrième question :

Construisez un circuit avec deux entrées 3 bits qui calcule le OU au niveau du bit de deux vecteurs, le OU logique de deux vecteurs et l'inverse (NON) de deux vecteurs. Mettez l'inverse de dans la moitié supérieure de (c'est-à-dire bits[5:3]) et l'inverse de dans la moitié inférieure. bout_nota

insérez la description de l'image ici

module top_module( 
    input [2:0] a,
    input [2:0] b,
    output [2:0] out_or_bitwise,
    output out_or_logical,
    output [5:0] out_not
);
    assign out_or_bitwise[2:0] = a[2:0] | b[2:0];
    assign out_or_logical = a || b; //向量计算如果只有一个输出,则用双重逻辑符
    assign out_not[5:3] = ~b[2:0]; 
    assign out_not[2:0] = ~a[2:0]; 
    
endmodule

Cinquième question :

Construisez un circuit avec deux entrées 3 bits qui calcule le OU au niveau du bit de deux vecteurs, le OU logique de deux vecteurs et l'inverse (NON) de deux vecteurs. Mettez l'inverse de dans la moitié supérieure de (c'est-à-dire bits[5:3]) et l'inverse de dans la moitié inférieure. bout_nota

insérez la description de l'image ici

module top_module( 
    input [2:0] a,
    input [2:0] b,
    output [2:0] out_or_bitwise,
    output out_or_logical,
    output [5:0] out_not
);
    assign out_or_bitwise[2:0] = a[2:0] | b[2:0];
    assign out_or_logical = a || b; //向量计算如果只有一个输出,则用双重逻辑符
    assign out_not[5:3] = ~b[2:0]; 
    assign out_not[2:0] = ~a[2:0]; 
    
endmodule

Sixième question :

Étant donné plusieurs vecteurs d’entrée, concaténez-les ensemble et divisez-les en plusieurs vecteurs de sortie. Il existe six vecteurs d'entrée de 5 bits : a, b, c, d, e et f, pour un total d'entrées de 30 bits. Il existe quatre vecteurs de sortie 8 bits : w, x, y et z, pour une sortie 32 bits. La sortie doit être la concaténation des vecteurs d’entrée suivie de deux bits 1 :

insérez la description de l'image ici

module top_module (
    input [4:0] a, b, c, d, e, f,
    output [7:0] w, x, y, z );
    //二种方法
    wire [31:0] sum;
    assign sum[31:0]={
    
    a[4:0], b[4:0], c[4:0], d[4:0], e[4:0], f[4:0],2'b11};
    assign {
    
    w[7:0], x[7:0], y[7:0], z[7:0]} = sum[31:0];  
    
//    assign {w[7:0], x[7:0], y[7:0], z[7:0]} = {a[4:0], b[4:0], c[4:0], d[4:0], e[4:0], f[4:0],2'b11};

endmodule

Septième question :

Étant donné un vecteur d'entrée de 8 bits [7: 0], inversez son ordre de bits.

module top_module( 
    input [7:0] in,
    output [7:0] out
);
    //高位为最左边第一位
    assign out = {
    
    in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7]};
endmodule

Huitième question :

Construisez un circuit pour signer et étendre un nombre de 8 bits à 32 bits. Cela nécessite la concaténation de 24 copies du bit de signe (c'est-à-dire copier le bit[7] 24 fois), suivies du nombre de 8 bits lui-même.

module top_module (
    input [7:0] in,
    output [31:0] out );//双层花括号可以让同样的向量成倍拼接

    assign out = {
    
    {
    
    24{
    
    in[7]}},in};
	
endmodule

Neuvième question :

Étant donné cinq signaux de 1 bit (a, b, c, d et e), calculez les 25 comparaisons d'un bit par paire dans un vecteur de sortie de 25 bits. La sortie doit être 1 si les deux bits comparés sont égaux.
out[24] = ~a ^ a; // a == a, donc out[24] vaut toujours 1.
out[23] = ~a ^ b;
out[22] = ~a ^ c;
...
out [ 1 ] = ~e ^ d;
out[ 0] = ~e ^ e;

insérez la description de l'image ici

module top_module (
    input a, b, c, d, e,
    output [24:0] out );//
    
    assign out = ~ {
    
    {
    
    5{
    
    a}} ,{
    
    5{
    
    b}} ,{
    
    5{
    
    c}} ,{
    
    5{
    
    d}} ,{
    
    5{
    
    e}}} ^ {
    
    5{
    
    a,b,c,d,e}};

endmodule

Je suppose que tu aimes

Origine blog.csdn.net/m0_56883893/article/details/126649142
conseillé
Classement