Menu Close

Verilog module 模块例化与简单层次电路设计

在上节课中我们介绍了在Verilog 中,逻辑电路的入口及行为描述。语法规则非常简单,说穿了就是数字电路的文字描述。也就在数字电路中的单一电路都可以用这种方法进行描述。但是在数字电路设计中,复杂电路往往是由多个子电路或器件实现的,在Verilog中是如何对应的呢?

在Verilog 结构中可以通过例化的方式实现设计的层次结构。本节课程中我们将以1位全加器的设计,例化(instance), 然后在4位全加器中引用为例介绍如何通过这种方式,实现层次电路的设计。 例化的目的是为了将已经完成的设计作为一个子设计或子模块使用,可以充分利用已设计的成果进行设计积累。

在verilog设计中,虽然有多个module存在,但只有一个module的端口负责整个设计架构的输入、输出。内部module端口如果有输入、输出通过例化后以端口映射的方式与外部电路打交道。

在正式设计之前先介绍几个逻辑运算符。

  1. 与运算 “and”, “&”A and B, 或 A& B ;可以直接使用 “and “,也可以使用 “&” 符号在多位运算中 & 是按对应位进行运算的。
  2. 或运算 “or” , “|”:   求或运算
  3. 异或运算 “xor”, “^”: 求异或运算
  4. 非运算 !:    逻辑运算,求非(不满足)         
  5. 取反运算符 ~: 取反
  6. 并位运算符 {}  :          将多个位合并级联形成新的变量。如 a ,b 为单变量 ,y[1:0] 为向量

            assign y={a,b}; 结果为 y[0]=b, y[1]=a;

 

这里引用的运算符主要目的是对用到的运算符的作基本了解,有助于较好的理解本节所涉及主要内容,运算符的详细内容请参照 verilog 运算符

  1.      1位全加器的设计

a, b ,ci为输入, 其中 ci是进位输入;输出为co,输入输出的真值表如下:

输入变量 输出变量
a b ci y co
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1

根据真值表经过化简及变换可以得到如下逻辑表达式:

y = a xor b xor ci;

co=(~a&b & ci) | (a &~b& ci) | ( a & b&~ci) | ( a & b & ci) = ci & (a xor b) | (a & b);

  • 图形输入法:

qadd1

图1

  • Verilog 输入法(文本)

一位全加器Verilog 描述。文件存储时,要以 .v为扩展名存储,如 fadder1.v,及存储的文件名要与 模块名(这里模块名为fadder1)一致。

module fadder1
(
    input  ci,
    input  a,
    input  b,
    output y,
    output co,
);
 
assign y = a xor b xor ci;
 
assign co = ci & (a ^ b) | (a & b);
 
endmodule

 

2.  四位全加器的设计

在一个新的文件中,利用1位全加器实现四位全加器的verilog代码如下:

module  fadder4
(
 
    input  ci,
    input  a[3:0],
    input  b[3:0],
    output y[3:0],
    output co
);
 
wire  co1,co2,co3;
 
// 例化 一位全加器,并重复使用4次
 
fadder1   fadder1_inst1
(
    .ci  (ci),
    .a   (a[0]),
    .b   (b[0]),
    .y   (y[0]),
    .co  (co1)
);
 
fadder1   fadder1_inst2
(
    .ci  (co1),
    .a   (a[1]),
    .b   (b[1]),
    .y   (y[1]),
    .co  (co2)
);
 
 
fadder1   fadder1_inst3
(
  .ci   (co2),
  .a    (a[2]),
  .b    (b[2]),
  .y    (y[2]),
  .co   (co3)
);
 
fadder1   fadder1_inst4
(
  .ci   (co3),
  .a    (a[3]),
  .b    (b[3]),
  .y    (y[3]),
  .co   (co)
);
 
endmodule

 

3. 模块例化的格式

上例利用1位全加器模块例化实现1位全加器设计,模块例化的格式如下:

模块名 例化名

(

);

如:fadder1 fadder1_inst4,其中fadder1_inst4为例化名。

例化名可以随意命名,不一定要和模块名一致,但在使用时往往给比较有意义的名称,增加代码的可读性。

( …);包含端口映射;如co3将fadder1_inst4 中ci连接到  fadder1_inst3 的 co,通过 .ci(co3)方式相关联,这种关联方式称为名称关联方式。也就是本设计模块与例化模块以名称的方式相关联。

fadder1   fadder1_inst4
(    .ci (c03), 
    .a  (a[3]),
    .b  (b[3]),
    .y  (y[3]),
    .co (co)
);

 

名称关联方式,在例化模块中的端口不要求按照例化模块的端口排列顺序一一对应。如:下面的例化用法和上面的例化效果是相同的。

fadder1    fadder1_inst4
(
    .ci (c03), 
    .b  (b[3]), 
    .a  (a[3]),
    .co (co),
    .y  (y[3])
);

 

还有一种例化方式是位置对应(位置关联),如fadder1_inst4也可以用下面的方式例化:

fadder1 fadder1_inst4
(
  c03,
  a[3],
  b[3],
  y[3],
  co
);

 

引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名。

一般在情况下,以名称关联的方式使用最多。

Posted in FPGA, FPGA, Verilog, Verilog, 文章
0 0 投票数
Article Rating
订阅评论
提醒
guest
4 评论
最新
最久 最赞
内联反馈
查看所有评论
秦世刚
秦世刚
3 月 前

全加器原理不太明白,

张洪泉
张洪泉
4 月 前

庄博好,请问端口位框的定义是不是有两种方式,我看到上文里的位框是定义在变量名后面,但我们一般是写在前面的,这两种写法有区别吗:
module fadder4
(

input ci,
input a[3:0],
input b[3:0],
output y[3:0],
output co
);

我们学的写法,如下:input [3:0] a;

相关链接