1. Hdibits: lo "básico" de la sintaxis de Verilog
Enlace al sitio web: Hdibits .
primera pregunta:
Define un cable dirigido.
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.
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.
module top_module( input in, output out );
not(out, in);
endmodule
Cuarta pregunta:
Cree un bloque que implemente una puerta AND.
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).
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).
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.
`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.
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.
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
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
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:
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;
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