Verilog学习之:Hdlbits网站的刷题之旅

1、 Hdibits:Verilog语法的“基本”

网站链接:Hdibits.

第一题:

定义一根有方向的导线。

图片:

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

第二题:

创建一个具有 3 个输入和 4 个输出的模块,对应关系如下图。

在这里插入图片描述

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

第三题:

创建一个实现 NOT 门的模块。

在这里插入图片描述

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

第四题:

创建实现 AND 门的模块。

在这里插入图片描述

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

第五题:

创建实现 NOR (或非) 门的模块。

在这里插入图片描述

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

第六题:

创建实现 XNOR (同或) 门的模块。

在这里插入图片描述

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

第七题:

实现以下电路。创建两根中间导线(命名为您想要的任何名称)以将 AND 和 OR 门连接在一起。请注意,馈送 NOT 栅极的导线实际上是导线,因此您不一定需要在此处声明第三根导线。请注意,导线只有一个源(门的输出),但可以有多个输入供电。

如果遵循图中的电路结构,则最终应得到四个赋值语句,因为有四个信号需要赋值。

在这里插入图片描述

`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

第八题:

创建具有与 7458 芯片相同功能的模块。它有 10 个输入和 2 个输出。您可以选择使用语句来驱动每根输出导线,也可以选择声明(四根)导线用作中间信号,其中每根内部导线由其中一个AND门的输出驱动。要进行额外的练习,请尝试两种方式。

在这里插入图片描述
第一种方法:

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

第二种方法:

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:Verilog语法的“向量”

第一题:

构建一个具有一个3位输入的电路,然后输出相同的矢量,并将其拆分为三个单独的1位输出。将输出连接到输入矢量的位置 0、位置 1 等。
在图中,旁边带有数字的刻度线表示矢量(或“总线”)的宽度,而不是为矢量中的每个位绘制单独的线。

在这里插入图片描述

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

第二题:

构建一个组合电路,将输入半字(16 位,[15:0])拆分为下部 [7:0] 和上部 [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

第三题:

32 位向量可以被视为包含 4 个字节(位 [31:24]、[23:16]等)。构建一个电路,该电路将反转 4 字节字的字节顺序。
AaaaaaaaBbbbbbbbCcccccccDddddddd => DdddddddCcccccccBbbbbbbbAaaaaaaa
当需要交换一段数据的字节序时,例如在小端 x86 系统和许多 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

第四题:

构建一个具有两个 3 位输入的电路,用于计算两个向量的按位 OR、两个向量的逻辑 OR 以及两个向量的反 (NOT)。将 的逆数放在 的上半部分(即位 [5:3]),将 的逆数放在下半部分。bout_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

第五题:

构建一个具有两个 3 位输入的电路,用于计算两个向量的按位 OR、两个向量的逻辑 OR 以及两个向量的反 (NOT)。将 的逆数放在 的上半部分(即位 [5:3]),将 的逆数放在下半部分。bout_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

第六题:

给定多个输入向量,将它们连接在一起,然后将它们拆分为多个输出向量。有六个 5 位输入向量:a、b、c、d、e 和 f,总共 30 位输入。有四个 8 位输出向量:w、x、y 和 z,用于 32 位输出。输出应该是输入向量的串联,后跟两个 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

第七题:

给定一个 8 位输入向量 [7:0],反转其位排序。

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

第八题:

构建一个将 8 位数字符号扩展到 32 位的电路。这需要符号位的24个副本(即复制位[7]24次)的串联,后跟8位数字本身。

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

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

第九题:

给定五个 1 位信号(a、b、c、d 和 e),计算 25 位输出向量中的所有 25 个成对一位比较。如果要比较的两位相等,则输出应为 1。
out[24] = ~a ^ a; // a == a, so out[24] is always 1.
out[23] = ~a ^ b;
out[22] = ~a ^ c;

out[ 1] = ~e ^ d;
out[ 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

猜你喜欢

转载自blog.csdn.net/m0_56883893/article/details/126649142