HDLBits答案(3)_Verilog模块的例化与调用
HDLBits_Verilog模块的例化与调用
模块
只要使用的所有模块都属于同一个项目,就可以通过在模块内部实例化一个模块来创建模块的层次结构。一个模块的代码不能在另一个模块的主体中编写(不同模块的代码不是嵌套的)。
有两种常见的方式将wire信号连接到端口上,分别是按位置和按名称连接。
按位置:mod_a instance1 ( wa, wb, wc );
按名称:mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );
- By position:
mod_a instance1 ( wa, wb, wc );
题目描述:完成mod_a模块的调用
Solution:
1 | module top_module ( input a, input b, output out ); |
tips:模块调用两种方式:按位置调(简洁但不稳,顺序不可乱),按名称调(繁琐但很稳,顺序可变)
按位置连接端口
题目描述:
已有一个名为mod_a的模块,它有2个输出和4个输入。您必须按位置将这6个端口连接到顶层模块的端口out1、out2、a、b、c和d,并按顺序进行连接。
给定如下的模块:
1 | module mod_a ( output, output, input, input, input, input ); |
Solution:
1 | module top_module ( |
按名称连接端口
题目描述:按名称调模块mod_a
1 | module top_module ( |
三个模块的调用
题目描述:
已有一个模块my_dff,其中有两个输入和一个输出(D触发器)。实例化三个D触发器然后将它们连接在一起,实现一个长度为3的移位寄存器。clk端口需要连接到所有my_dff实例。
已有模块: module my_dff ( input clk, input d, output q );
Solution:
1 | module top_module ( input clk, input d, output q ); |
tips:内部调用多个模块时,定义合理的wire信号连接内部的模块。
模块输入为向量
题目描述:
已有一个模块my_dff8,它具有两个输入和一个输出(实现一组8位的D触发器)。实例化其中的三个,然后将它们连接在一起,实现一个长度为3的8位宽移位寄存器。另外,构造一个4-1多路选择器,根据sel[1:0]选择输出值。本质上,sel选择的是延迟输入的周期。
已有模块: module my_dff8 ( input clk, input [7:0] d, output [7:0] q );
Solution:
1 | module top_module ( |
tips:组合逻辑用非阻塞赋值连接即可。
加法器模块1
题目描述:用两个带进位的16bit加法器组成一个32bit加法器。
module add16 (input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout);
Solution:
1 | module top_module( |
tips:注意采用流拼接简化代码,无用信号接口作为输出也可以不进行管脚信号的定义。
加法器模块2
题目描述:
自定义一个1bit的全加器,构成一个16bit全加器,然后用两个16bit全加器完成32bit加法模块的搭建,忽略进位。
1、定义一个1bit全加器。2、在顶层完成两个16bit全加器的调用。
Solution:
1 | module top_module ( |
进位选择加法器
题目描述:
在这个练习中,已有和上一个练习相同的模块add16,本题将两个带进位的16位数字相加,并生成一个输出进位和16位的和。需构造一个16位2-1多路选择器。
module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
tips:提前计算加法器的进位,用资源换速度。
Solution:
1 | module top_module( |
加法器→减法器
题目描述:利用sub信号和两个16bit的全加器,实现32bit的加减法运算。
对输入的sub信号进行判断,如果sub=0,则输出(a + b + 0);如果sub=1,则输出(a + ~b + 1)。
已有模块:
module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0]sum, output cout );
tip: Use a 32-bit wide XOR gate to invert the b
input whenever sub
is 1.
Solution:
1 | module top_module( |
tips:巧用sub信号对输入b处理,妙!
总结:
学习了模块的例化与调用,深刻理解了对着电路图写HDL这句话。