当前位置:   article > 正文

1、verilog语法——模块的结构_verilog模块实例化中的u0,u1

verilog模块实例化中的u0,u1


前言

本次的学习内容是verilog的基本设计单元:模块(module)


一、什么是模块

模块(module)是verilog设计基本单元。一共由两部分组成:一部分是描述接口,另一部分描述逻辑功能。下面将举个例子说明模块的基本构成:

  1. module mux2_1(a,b,sel,mux_out);
  2. input a,b; //****************//
  3. input sel; //****端口描述****//
  4. output mux_out; //***************//
  5. assign mux_out = (sel==1)?a:b; //**逻辑功能描述**//
  6. endmodule

例1.1

这段代码实现的功能是二选一多路选择器,其中

●a,b,sel作为输入端口,mux_out作为输出端口,第2-4行的代码就完成了端口的描述。

●通过三目运算符的操作,第5行代码完成逻辑功能的描述。

●mux2_1为用户自定义模块名,整个模块以module开头endmodule结尾

二、模块的内容

1.I/O声明的格式

module 模块名(端口名1,...,端口名m+n+k);

        input [信号位宽-1:0] 端口名1;

                         .

                         .               //**i个输入**//

                         . 

        input [信号位宽-1:0] 端口名m;

        output [信号位宽-1:0] 端口名m+1;

                         .

                         .             //**n个输出**//

                         . 

        output [信号位宽-1:0] 端口名m+n;

        inout [信号位宽-1:0] 端口名m+n+1;

                          .

                          .              //**k个双向口**//

                          . 

        inout [信号位宽-1:0] 端口名m+n+k;

也可以定义成如下格式:

module 模块名(

        input [信号位宽-1:0] 端口名1,

                             .

                             .            //**i个输入**//

                             . 

        input [信号位宽-1:0] 端口名m,

        

        output [信号位宽-1:0] 端口名1,

                              .

                              .           //**n个输出**//

                              . 

        output [信号位宽-1:0] 端口名n,

        inout [信号位宽-1:0] 端口名,

                               .

                               .         //**k个双向口**//

                               . 

        inout [信号位宽-1:0] 端口名k

);

注意两种定义的区别:

第一种是在括号结束后进行定义,因此每个语句用分号 结束。

第二种是在括号内部进行的定义,因此每个语句用逗号 连接。

2.内部信号的声明

当某些信号不是作为输入或输出信号,而是作为中间信号被我们所用到,那么就需要声明。

格式如下:

wire [信号位宽-1:0] W变量1;

reg [信号位宽-1:0] R变量1;

                .

                .

                . 

这里的wire与reg是数据类型,下一节展开讲。

3.功能定义

模块中最重要的部分就是逻辑功能定义部分,由以下三种方法来产生逻辑:

(1)用assign语句,如例1.1中:assign mux_out = (sel==1)?a:b;

        assign只适用于组合逻辑,且描述只需assign后面接一个方程式即可。

(2)用实例元件,如:and U0(out, a, b);

        该方法就是调用库原件,键入元件名和相应的引脚即可。其中and就是元件名与门,U1是用户定义模块名,a,b为输入,out为输出。

        注:要求模块名必须是唯一的,目的是区分调用的多个相同元件

(3)用always块,如:

  1. always@(posedge clk or posedge rst) 
  2.         begin
  3.                  if(rst)
  4.                         out <= 0;
  5.                 else
  6.                        out <= out + 1;
  7.         end

always块既可描述组合逻辑,又可描述时序逻辑。

三、模块的调用(例化)

模块调用语句格式如下:

module_name instance_name(port_associations);

其中module_name是被调用模块的模块名,instance_name是用户定义的引用名,port_associations是现模块与原模块之间信号端口的关联方式。而关联方式的格式有如下两种:

(1)在引用时用“.”符号表明是原模块定义的端口名,()里表示的是现模块的端口,如:

mux2_1 M0(

        .a(A),

        .b(B),

        .sel(Sel),

        .out(Out),

);

相当于把这2选1多路选择器调用到现在这个模块,现在这个模块有A,B,Sel,Out这些信号端口,将A与原模块中的a对应,B与原模块中的b对应,Sel与原模块中的sel对应,Out与原模块中的out对应。意义就是把现模块的A,B,Sel分接入到二选一多路选择器的输入端,那么Out输出的就是Sel选择A,B的结果。

(2)引用时,严格按照原模块端口顺序连接,无需标注原模块端口名称,如:

mux2_1 M0(A,B,Sel,Out);

表3.1 端口关联关系

模块调用注意事项:

        (1)两种关联格式不能混用,即不可这样写:mux2_1 M0(A,.b(B),Sel,Out);

        (2)不能以循环方式嵌套模块,即不能在always语句里调用模块。


要点注意

       1. 如果assign、例化元件、always三者在同一模块中,这三种逻辑功能描述是同时进行的。也就是说,无论这三个描述代码先后顺序如何,他们都是并行的。

        2.但是对于always块来说,逻辑是按照指定顺序执行的,因此always也称为过程块。

        总的来说,verilog中的所有过程块、连续赋值语句(assign)、实例引用都是并行的.

参考资料:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/915686
推荐阅读
相关标签
  

闽ICP备14008679号