Menu Close

Verilog 模块与端口

模块(module)是verilog 语言中最基本的语法结构,在模块内不仅能够描述逻辑行为,也是verilog 行为结构描述的功能与外界其它电路的接口。 可以说在Verilog 可综合的开发中,其它结构或功能结构都是可选的,但module是唯一要求必须存在的。module 所描述的结构更像一个完整的数字电路,有名称,有输入、输出,也有逻辑行为。其结构框图如下图所示:

Verilog module

  1. module的语法结构

module 的语法结构 由关键字module 后跟一个模块名用于识别该模块,如:module and_gate,其中 and_gate 就是该module的名字,用于识别该module。 第二部分用于端口描述, 我们知道在学习数字电路时,对于一个器件,总要分清楚哪个管脚是输入,哪个管脚是输出。如( input a, input b, output c ); 可以写在一行中,也可以分多行进行书写。如:

( input a,

input b,

output c   //最后一个端口,没有逗号分隔符“,”

);

格式为: ( … );

2.端口 : 定义输入(input)、输出(output)或双向(inout)

input 定义其后的标识符为输入,如 :input a,定义a为输入管脚。

output定义输出口, 如:output c 定义c 为输出管脚。

inout定义双向口,如果端口是双向口,则用 inout定义。inout定义的端口既可以做输入,也可以做输出。

每个完整定义之间用逗号“,” 隔开。最后一个定义,没有逗号“,” ,如output c 就没有逗号。

第三个部分是行为描述部分,用于描述该数字逻辑的行为:如assign c =a & b;表示 c与a,b之间的关系为与逻辑关系。表示将a&b运算后的逻辑值付给c 。

这里的 assign 是表示后面跟着赋值语句。

最后以endmodule关键字结束本module的定义。


  module and_gate

  ( input a,

  input b,

  output c

  );


  assign c =a & b;

  endmodule

  

其等效的数字电路如下:

and

输入、输出端口可以采用向量的方式表示,例如:4输入端a0,a1,a2,a3,与4输入端b0,b1,b2,b3, 一一对应相与,其结果赋给对应的c0,c1,c2,3;

Verilog 的描述如下:


  module and4

  (

    input   a0,a1,a2,a3,

    input   b0,b1,b2,b3,

    output  c0,c1,c2,c3


  );

  assign  c0=a0 & b0;

  assign  c1=a1&b1;

  assign  c2=a2&b2;

  assign  c3=a3&b3;

  endmodule


  

可以采用向量的方式改写成如下代码:


  module and4

  (

    input   [3:0] a,

    input   [3:0] b,

    output  [3:0] c

  );


  assign  c[0]=a[0]&b[0];

  assign  c[1]=a[1]&b[1];

  assign  c[2]=a[2]&b[2];

  assign  c[3]=a[3]&b[3];

  endmodule


  

在上面的程序中以向量的方式定义了4位输入a,在使用时可以整体向量一起使用,也可以按位使用。在索引位时一般用中括号[]内的数字表示索引号,如a[0]表示使用数组中的第0个变量,a[3]表示第三个变量;也可以引用一部分变量,如a[2:1],就是使用数组中的a[2],a[1];如果向量整体使用,则为a[3:0],也可以直接使用数向量名a;由于向量可以按位操作与使用,这比计算机软件编程中定义的数组灵活方便许多。

由于&操作符具有按位相与的功能,因此也可以用下面的代码实现。


  module and4

  (

    input   [3:0] a,

    input   [3:0] b,

    output  [3:0] c

  );

  assign  c=a & b;//按照位的顺序,逐位相与

  endmodule

  

input, output定义的端口使用比较简单,在后续课程中,会继续深入介绍于FPGA,ASIC相关硬件方面的知识。如:电平等级,斜升率,上、下拉,以及DDR,LVDS 等接口方面的使用。
由于 inout定义的双向口,使用比较复杂,我们专门安排以节内容讨论。见 FPGA中双向端口的使用 。

可见:Verilog module给我们引入了另一种数字电路的设计方法。

 

 

对应视频:


		
Posted in FPGA, FPGA 教材教案, Verilog, Verilog, 教材与教案, 文章

3 Comments

  1. 匿名

    通过学习本篇文章有几点收获,1、module(模块)的组成结构;2、端口、行为逻辑的书写格式;3、向量的使用技巧。
    老师在讲解中附上了程序案例,采用层层递进的方式,由浅入深,阅读后很容易理解,谢谢老师!

  2. 8班王飞飞

    老师好,在学习中遇到一个问题,请老师解答:
    1、在输出端口中为信号赋值的形式,例如 output reg c =0; ,如果这样赋值的话,c的输出值是否永远为0呢?如果在module内部 在always块内 为c重新赋值的话(例如:c=1),那么c的输出值会变为1吗?

发表回复

相关链接