Verilog module 模块例化与简单层次电路设计
在上节课中我们介绍了在Verilog 中,逻辑电路的入口及行为描述。语法规则非常简单,说穿了就是数字电路的文字描述。也就在数字电路中的单一电路都可以用这种方法进行描述。但是在数字电路设计中,复杂电路往往是由多个子电路或器件实现的,在Verilog中是如何对应的呢?
在Verilog 结构中可以通过例化的方式实现设计的层次结构。本节课程中我们将以1位全加器的设计,例化(instance), 然后在4位全加器中引用为例介绍如何通过这种方式,实现层次电路的设计。 例化的目的是为了将已经完成的设计作为一个子设计或子模块使用,可以充分利用已设计的成果进行设计积累。
在verilog设计中,虽然有多个module存在,但只有一个module的端口负责整个设计架构的输入、输出。内部module端口如果有输入、输出通过例化后以端口映射的方式与外部电路打交道。
在正式设计之前先介绍几个
逻辑运算符。
assign y={a,b}; 结果为 y[0]=b, y[1]=a;
这里引用的运算符主要目的是帮助本节设计中用到的运算符的理解,详细内容请参照 verilog 运算符
1位全加器的设计:
输入: a, b ,ci; 其中 ci是进位输入
输入变量 | 输出变量 | |||
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);
一位全加器Verilog 描述。文件存储时,要以 .v为扩展名存储,如 fadder1.v,及存储的文件名要与 模块名(这里模块名为fadder1)一致。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
2.四位全加器的设计:
在一个新的文件中,四位全加器的verilog代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
模块例化的格式如下:
模块名 例化名
(
…
);
例化名可以随意命名,不一定要和模块名一致,但在使用时往往给比较有意义的名称,增加代码的可读性。
( …);包含端口映射;如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 );
引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名。
一般在情况下,以名称关联的方式使用最多。