• HDLBits: 在线学习 SystemVerilog(五)-Problem 19-23


    HDLBits: 在线学习 SystemVerilog(五)-Problem 19-23

    594d9f069b166af4d049ffc87a7e6a88.jpeg

    HDLBits 是一组小型电路设计习题集,使用 Verilog/SystemVerilog 硬件描述语言 (HDL) 练习数字硬件设计~

    网址如下:

    https://hdlbits.01xz.net/

    关于HDLBits的Verilog实现可以查看下面专栏:

    https://www.zhihu.com/column/c_1131528588117385216

    缩略词索引:

    • SV:SystemVerilog

    Problem 19-Module

    从这题开始会接触到一个“熟悉的陌生人”-模块module

    截止目前,我们已经对 Verilog 中模块这一概念建立了初步的印象:模块是一个电路,通过输入输出端口和外部的电路联系。无论多大,多复杂的数字电路都是由一个个模块以及其他组成部分(比如 assign 赋值语句以及 always 过程块)互相连接所构成的。在一个模块中可以例化下一级的模块,这就形成了层级的概念(hierarchy)。

    模块例化的基本语法 :模块名 实例名(定义连接 port 的信号);

    比如 mod_a instance1 ( wa, wb, wc );

    模块信号连接的三种方式:

    在实例化模块时,使用Verilog时有两种常用的方式来进行模块端口的信号连接:按端口顺序以及按端口名称连接端口。

    按端口顺序,mod_a instance1 ( wa, wb, wc ); wa, wb, wc 分别连接到模块的 第一个端口(in1),第二个端口(in2)以及第三个端口(out)。这里所谓的端口顺序指的是模块端口的定义顺序。这种方式的弊端在于,一旦端口列表发生改变,所有模块实例化中的端口连接都需要改变。

    按端口名称,mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) ); 在这种方式中根据端口名称指定外部信号的连接。这样一来就和端口声明的顺序完全没有关系。一旦模块出现改动,只要修改相应的部分即可。实际上,一般都使用这种方式来进行模块实例化。

    这里建议初学者统一使用按端口名称进行模块例化,避免不必要的功能错误。

    题目说明

    在上面已经定义了一个模块mod_a,请例化该模块,下图时模块mod_a定义。

    7127e2fa1e14ecc7ac633791f1d9f79f.png图片来自 HDLBits

    这个题目的核心就是将上面的图片里的模块mod_a进行例化。

    模块端口声明

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

    题目解析

    这个题目重点是模块例化,可以使用上面介绍的任何一种方式(按端口顺序以及按端口名称连接端口)。

    1. module top_module ( input logic a, input logic b, output wire logic out );
    2.     
    3.     mod_a m1 (
    4.         .in1(a),
    5.         .in2(b),
    6.         .out(out)
    7.     );
    8. endmodule
    c05a3215d96e1c46fde66799a61b298b.png

    点击Submit,等待一会就能看到下图结果:

    ae2639059fba29e775e06ae4b5f75444.png

    注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

    这一题就结束了。

    Problem 20-Module_pos

    题目说明

    这道题也和上一题一样,给出了一个模块mod_a,该模块按顺序具有 2 个输出和 4 个输入。必须将6个端口按位置顺序与顶层的端口out1,out2,a,b,c和d相连接。

    模块端口声明

    1. module top_module ( 
    2.     input a, 
    3.     input b, 
    4.     input c,
    5.     input d,
    6.     output out1,
    7.     output out2
    8. );

    题目解析

    这道题难度不大,和上一题类似,加大对模块例化的理解。

    1. module top_module ( 
    2.     input logic a,b,c,d, 
    3.     output wire logic out1,out2
    4. );
    5.        mod_a m1 (
    6.         out1,
    7.         out2,
    8.         a,
    9.         b,
    10.         c,
    11.         d
    12.     );
    13. endmodule

    在本题中对于给出的模块来说,我们并不知道mod_a这个模块的端口名是什么,所以对于本题来说,只能按照位置的顺序来连接。

    dd6bc167db9c10c0ee8573812c602e4f.png

    点击Submit,等待一会就能看到下图结果:

    51cda834374aa9a5eede4d92fd44396f.png

    注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

    这一题就结束了。

    Problem 21-Module_name

    题目说明

    这道题和上一题一样,给出了一个名为mod_a的模块,该模块按某种顺序具有2个输出和4个输入。必须将6个端口通过按名字的方法与顶层的端口相连接。

    9860f6687931d9ce3cdf51b0b9ca1642.png图片来自 HDLBits

    mod_a的定义如下:

    module mod_a ( output out1, output out2, input in1, input in2, input in3, input in4);
    cf2f9a785477adf5c2dc0a8d58aaa40b.png图片来自 HDLBits

    模块端口声明

    1. module top_module ( 
    2.     input a, 
    3.     input b, 
    4.     input c,
    5.     input d,
    6.     output out1,
    7.     output out2
    8. );

    题目解析

    本题考查的和上一题一样,只不过上一题没有给出mod_a的端口定义,这一题给出了端口定义,所以我们需要使用按端口名称来例化模块。

    1. module top_module ( 
    2.     input logic a, 
    3.     input logic b, 
    4.     input logic c,
    5.     input logic d,
    6.     output wire logic out1,
    7.     output wire logic out2
    8. );
    9.   
    10.     mod_a m1 (
    11.         .out1(out1),
    12.         .out2(out2),
    13.         .in1(a),
    14.         .in2(b),
    15.         .in3(c),
    16.         .in4(d)
    17.     );
    18. endmodule

    这道题有人觉得和上一道题一样,也是同样使用上一道题进行解答,但是会报错,这是因为出题者考虑到了这种问题,所以题目给出的out1, out2, a, b, c, d不是mod_a正确的顺序,只能按照名称去例化。

    c80f101a10cd89baf0b63ba41d7bb63d.png

    点击Submit,等待一会就能看到下图结果:

    776783572c3ae3e10ff34962cf31d8af.png

    注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

    这一题就结束了。

    Problem 22-Module_shift

    题目说明

    给定一个名为my_dff(实现 D 触发器功能)模块,该模块具有两个输入和一个输出。实例化三次,将它们链接在一起制作一个长度为 3 的移位寄存器。clk端口需要连接到所有实例。

    提供的模块是:

    module my_dff ( input clk, input d, output q );

    请注意,要建立内部连接,需要声明一些wire。wire和模块例化时候命名要小心:名称必须是唯一的。

    9cd71258a5f503dd092c589e513e2712.png图片来自 HDLBits

    问题的核心就是上面的图片,例化和连线需要注意。

    模块端口声明

    module top_module ( input clk, input d, output q );

    题目解析

    这个题目还是模块例化,需要理解例化的概念。需要将第一个例化的输出,作为第二个例化模块的输入,以此类推。

    1. module top_module ( input logic clk, 
    2.                     input logic d, 
    3.                     output logic q 
    4.                   );
    5.     wire logic q0,q1;
    6.     
    7.     my_dff f1 (
    8.         .clk(clk),
    9.         .d(d),
    10.         .q(q0)
    11.     );
    12.     
    13.     my_dff f2 (
    14.         .clk(clk),
    15.         .d(q0),
    16.         .q(q1)
    17.     );
    18.     
    19.     my_dff f3 (
    20.         .clk(clk),
    21.         .d(q1),
    22.         .q(q)
    23.     );
    24.     
    25. endmodule
    77dc1b6cab1ed11fafc20cbae297f0e4.png

    点击Submit,等待一会就能看到下图结果:

    136d05913c4b63a02e66a4e09055956b.png

    注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

    这一题就结束了。

    Problem 23-Module shift8

    本题是上一题的扩展。使用向量作为端口的连线。正如Verilog的语法一样,端口的向量长度不必与连接到它的导线匹配,但这将导致向量的零填充或截断。在本练习中不使用具有不匹配的向量连接。

    题目说明

    给出了一个名为my_dff8的模块,包含两个输入和一个输出(实现一个8bit的D触发器)。请实例化三次,并将它们连接在一起,形成一个长度为3的8bit移位寄存器。此外,再写出一个4选1多路复用器(未提供模块模型),根据输入的sel[1:0]选择要输出的内容:输入D的值,在第一个D触发器之后的值,第二个或第三个D触发器之后的值。(可以说sel选择的是输入延迟的的周期数,0~3个时钟周期不等。)

    5618904eb8b2a4724be91870ca87edc4.png图片来自 HDLBits

    这个题目的核心就是将上面的图片里的模块my_dff8进行例化。

    模块端口声明

    1. module top_module ( 
    2.     input clk, 
    3.     input [7:0] d, 
    4.     input [1:0] sel, 
    5.     output [7:0] q 
    6. );

    题目解析

    这个题目重点是模块例化,和上一题差不多,注意一下向量定义及端口连接即可。

    1. module top_module ( 
    2.     input clk, 
    3.     input logic [7:0] d, 
    4.     input logic [1:0] sel, 
    5.     output logic [7:0] q 
    6. );
    7.     logic [7:0]q0,q1,q2;
    8.     
    9.     my_dff8 d0 (
    10.         .clk(clk),
    11.         .d(d),
    12.         .q(q0)
    13.     );
    14.     my_dff8 d1 (
    15.         .clk(clk),
    16.         .d(q0),
    17.         .q(q1)
    18.     );
    19.     my_dff8 d2 (
    20.         .clk(clk),
    21.         .d(q1),
    22.         .q(q2)
    23.     );
    24.     
    25.     always_comb begin
    26.         unique case(sel)
    27.       2'b00:
    28.                 q = d;
    29.             2'b01:
    30.                 q = q0;
    31.             2'b10:
    32.              q = q1;
    33.             2'b11:
    34.              q = q2;
    35.             default:
    36.                 q = 2'bzz;
    37.         endcase
    38.     end
    39.     
    40.     
    41. endmodule

    这题中,涉及到了SV的组合逻辑设计,基本语法和Verilog类似,主要涉及到了一个unique决策修饰符,使用unique会指示综合编译器可以并行计算case项。这部分内容会在SV的系列教程里继续展开描述。

    1e7249c501c632e0525868953f376fdb.png

    点击Submit,等待一会就能看到下图结果:

    400675439543d99c4358904a59daf663.png

    注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

    这一题就结束了。

    总结

    今天的几道题就结束了,主要考察模块例化问题~

    最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~

    代码链接:

    https://github.com/suisuisi/SystemVerilog/tree/main/SystemVerilogHDLBits

  • 相关阅读:
    Android系统恢复出场设置流程分析
    Ssm老年人社区服务平台的设计与实现毕业设计-附源码211711
    dsu on tree
    【LeetCode刷题】--39.组合总和
    RabbitMQ的安装和配置
    SVN项目,提交Git保留之前提交记录
    【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)
    【Javaweb 1】带你搞懂request,respond,servlet
    Vue 2 进入、离开和列表过渡
    win10环境下PCL安装和配置回顾(一)
  • 原文地址:https://blog.csdn.net/Pieces_thinking/article/details/126775282