阿扣的Verilog HDL学习笔记④

第4章 模块和端口

模块定义(模块名、端口列表、参数、变量声明、数据流描述语句、行为语句、调用(实例引用)其他模块及任务、函数……;定义和声明端口列表;端口连接规则;用有序列表和名字将端口与外部信号相连;层次引用

4.1模块

  • 模块:模块定义↓  。Verilog源文件中可定义多个模块,不考虑排列顺序。
  • 内部含变量声明、数据流语句、低层模块实例、行为语句快、任务和函数;顺序和出现位置任意
  • 必须部分:module、模块名、endmodule

  • SR锁存器:激励模块中包括模块名、线网/寄存器/变量声明、低层模块实例、行为语句块和endmodule。没有端口列表、端口声明和数据流(assign)语句

//测试激励信号模块

module Top;

 

//声明wire、reg和其他类型变量

wire q, qbar;

reg set, reset;

 

//调用(实例引用)较低层次模块(SR_latch)

SR_latch m1(q, qbar, -set, -reset);

 

//行为模块,初始化

initial

begin

   $monitor($time, " set = %b, reset = %b, q = %b\n", set, reest, q);

set = 0; reset = 0;

   #5  reset = 1;

   #5  reset = 0;

   #5  set = 1;

end

endmodule

 

//模块名和端口列表

module SR_latch(Q, Qbar, Sbar, Rbar);

 

//端口声明

output Q, Qbar;

input Sbar, Rbar;

 

//调用较低层次模块;注意交叉连接情况

nand n1(Q, Sbar, Qbar);

nand n2(Qbar, Rbar, Q);

 

//模块语句结束

endmodule

 

4.2端口

  • 端口/终端terminal:模块与环境交互的接口
  • 实例 一个在顶层模块Top中被调用的四位加法器。其顶层模块的I/O端口如下:

  • Top作为仿真中的顶层模块,调用设计模块。无需和环境交换信息,没有端口列表。

module Top; //没有端口列表的顶层模块。端口列表

module fulladd4(sum, c_out, a, b, c_in); //有端口列表的模块。端口列表

 

//端口声明

output [3:0]  sum;

output  c_cout;

 

input [3:0] a, b,;

input  c_in;

 

//...

//<模块内容>

//...

endmodule

Verilog关键字

端口类型

input

输入端口

output

输出端口

inout

双向端口

  • 所有端口默认为wire类型。若端口需要保存数值,必须声明为reg类型。
  • input和inout类型的端口声明不能为reg,因其只反映与其相连的外部信号变化。
  • 实例 DFF触发器输出端口q,在下一个时钟边沿到来前要保持值。端口声明↓

module DFF(q, d, clk, reset);

output q;

reg q; //

input d, clk, reset;

//...

endmodule

  • ANSI C风格的端口声明。默认为wire类型。避免端口名在端口列表端口声明中的重复。

module fulladd4(output  reg[3:0] sum, output  reg c_out, input  [3:0] a, b, input  c_in); //两个input默认为wire

...

endmodule

  • 端口连接规则:

  • 输入端口:模块内部为net,外部为reg或net
  • 输出端口:模块内部为reg或net,外部为net
  • 输入/输出端口:模块内部为net,外部为net
  • 位宽匹配:调用模块时,端口内外两部分可有不同位宽
  • 未连接端口:允许端口未连接(如用于调试的output)如下:

fulladd4  fa0(SUM, , A, B, C_IN);

  • 非法连接:SUM变量声明为wire则可。

module  Top;

//声明连接变量

reg  [3:0] A, B;

reg  C_IN;

reg  [3:0] SUM;

wire  C_OUT;

//调用fulladd4,命名为fa0

fulladd4  fa0(SUM, C_OUT, A, B, C_IN);

//fulladd4模块中输出端口被连接到投票模块的寄存器变量SUM上。

...//激励测试代码

endmodule

  • 端口与外部信号的连接:按顺序连接按名字连接(不可混用)
  • 顺序端口连接:连接到模块实例的信号必须与模块声明时对目标模块在端口列表中的位置保持一致。

    module Top;

 //连续声明变量

 reg  [3:0] A, B;

 reg  C_IN;

 wire  [3:0]  SUM;

 wire  C_OUT;

     //

 fulladd4  fa_ordered (SUM, C_OUT, A, B, C_IN);

 ...//<测试激励>

     endmodule

   

    module  dulladd4(sum, c_out, a, b, c_in);

     output  [3:0]  sum;

     output  c_cout;

     input  [3:0] a, b;

     input  c_in;

    //<模块内容>

     endmodule        

  • 命令端口连接:端口和对应外部信号按名字连接。顺序任意,但端口和外部信号要匹配。
  • 需要与外部信号连接的端口必须用名字说明,不需要连接的直接忽略。

//调用以fa_byname命名的全加器fulladd4,通过端口名与外部信号连接。

 fulladd4  fa_byname(.c_out(C_OUT), .sum(SUM),  .b(B), .c_IN(C_IN), .a(A),);

 //调用以fa_byname命名的全加器fulladd4,通过端口名与外部信号连接。c_out悬空

 fulladd4  fa_byname(.sum(SUM),  .b(B),  .c-in(C_IN),  .a(A);

4.3层次命名

  • 每个实例模块、信号或变量都使用一个(惟一)标识符来定义。
  • 层次名用一连串“.”分隔的标识符组成,一个标识符代表一个层次。
  • 顶层模块(根模块)不能被其他模块调用,是设计层次的起点。
  • 实例 SR锁存器的仿真(4.1) 设计层次↓

  • stimulus是顶层模块,不能被调用。定义标识符:q,qbar,set,reset,并调用模块SR_latch(实例名为m1)。
  • 层次名引用对每个标识符赋予惟一名字,有根模块名和模块实例名次序组成。
  • 所有标识符的层次名如下:

stimulus 

stimulus.q

stimulus.qbar

stimulus.set

stimulus.reset

stimulus.m1

stimulus.m1.Q

stimulus.m1.Qbar

stimulus.m1.S

stimulus.m1.R

stimulus.n1

stimulus.n2

  • 用层次路径名可以惟一指明每个标识符。
  • $display中使用%m可以显示层次(见3.4)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值