Aprendizaje de Verilog: el viaje del sitio web Hdlbits sobre las preguntas de cepillado

1. Hdibits: lo "básico" de la sintaxis de Verilog

Enlace al sitio web: Hdibits .

primera pregunta:

Define un cable dirigido.

imagen:

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

Segunda pregunta:

Cree un módulo con 3 entradas y 4 salidas, como se muestra en la siguiente figura.

inserte la descripción de la imagen aquí

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 tercera pregunta:

Cree un módulo que implemente la puerta NOT.

inserte la descripción de la imagen aquí

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

Cuarta pregunta:

Cree un bloque que implemente una puerta AND.

inserte la descripción de la imagen aquí

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

Quinta pregunta:

Cree un bloque que implemente una puerta NOR (o no).

inserte la descripción de la imagen aquí

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

Sexta pregunta:

Cree un módulo que implemente una puerta XNOR (OR exclusiva).

inserte la descripción de la imagen aquí

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

Séptima pregunta:

Implemente el siguiente circuito. Crea dos cables intermedios (nómbralos como quieras) para conectar las puertas Y y O juntas. Tenga en cuenta que el cable que alimenta la puerta NOT es en realidad un cable, por lo que no es necesario declarar un tercer cable aquí. Tenga en cuenta que el cable tiene una sola fuente (la salida de la puerta), pero puede tener múltiples entradas alimentadas.

Si sigue la estructura del circuito en la figura, debería terminar con cuatro declaraciones de asignación porque hay cuatro señales que deben asignarse.

inserte la descripción de la imagen aquí

`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

Octava pregunta:

Cree un módulo con la misma funcionalidad que el chip 7458. Tiene 10 entradas y 2 salidas. Puede optar por utilizar declaraciones para controlar cada cable de salida, o puede optar por declarar (cuatro) cables para usarlos como señales intermedias, donde cada cable interno es controlado por la salida de una de las puertas AND. Para practicar más, pruébalo en ambos sentidos.

inserte la descripción de la imagen aquí
el primer método:

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

El segundo método:

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: "Vector" de la sintaxis de Verilog

primera pregunta:

Construya un circuito que tome una entrada de 3 bits, luego genere el mismo vector y lo divida en tres salidas separadas de 1 bit. Conecte la salida a la posición 0, posición 1, etc. del vector de entrada.
En un diagrama, las marcas con números al lado indican el ancho del vector (o "bus"), en lugar de dibujar líneas separadas para cada bit del vector.

inserte la descripción de la imagen aquí

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

Segunda pregunta:

Construya un circuito combinacional que divida una media palabra de entrada (16 bits, [15:0]) en bytes inferiores [7:0] y superiores [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 tercera pregunta:

Se puede considerar que un vector de 32 bits contiene 4 bytes (bits [31:24], [23:16], etc.). Construya un circuito que invierta el endianismo de una palabra de 4 bytes.
AaaaaaaaBbbbbbbbCcccccccDdddddd => DdddddddCccccccccBbbbbbbbAaaaaaaa
Esta operación se utiliza normalmente cuando es necesario intercambiar el endianidad de un dato, como entre sistemas x86 little-endian y el formato big-endian utilizado en muchos protocolos de 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

Cuarta pregunta:

Construya un circuito con dos entradas de 3 bits que calcule el OR bit a bit de dos vectores, el OR lógico de dos vectores y el inverso (NO) de dos vectores. Coloque el inverso de en la mitad superior de (es decir, bits [5:3]) y el inverso de en la mitad inferior. combate_nota

inserte la descripción de la imagen aquí

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

Quinta pregunta:

Construya un circuito con dos entradas de 3 bits que calcule el OR bit a bit de dos vectores, el OR lógico de dos vectores y el inverso (NO) de dos vectores. Coloque el inverso de en la mitad superior de (es decir, bits [5:3]) y el inverso de en la mitad inferior. combate_nota

inserte la descripción de la imagen aquí

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

Sexta pregunta:

Dados múltiples vectores de entrada, concatenarlos y dividirlos en múltiples vectores de salida. Hay seis vectores de entrada de 5 bits: a, b, c, d, e y f, para un total de entradas de 30 bits. Hay cuatro vectores de salida de 8 bits: w, x, y y z, para salida de 32 bits. La salida debe ser la concatenación de los vectores de entrada seguida de dos bits 1:

inserte la descripción de la imagen aquí

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

Séptima pregunta:

Dado un vector de entrada de 8 bits [7:0], invierta el orden de los 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

Octava pregunta:

Construya un circuito para firmar y extender un número de 8 bits a 32 bits. Esto requiere la concatenación de 24 copias del bit de signo (es decir, copiar el bit [7] 24 veces), seguido del propio número de 8 bits.

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

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

Novena pregunta:

Dadas cinco señales de 1 bit (a, b, c, d y e), calcule las 25 comparaciones de un bit por pares en un vector de salida de 25 bits. La salida debe ser 1 si los dos bits que se comparan son iguales.
out[24] = ~a ^ a; // a == a, por lo que out[24] siempre es 1.
out[23] = ~a ^ b;
out[22] = ~a ^ c;
...
out [ 1 ] = ~e ^ d;
fuera[ 0] = ~e ^ e;

inserte la descripción de la imagen aquí

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

Supongo que te gusta

Origin blog.csdn.net/m0_56883893/article/details/126649142
Recomendado
Clasificación