HDLBits答案(5)_Generate实例化模块
Generate实例化模块
三目运算符(形式:condition ? if_true : if_false)
verilog中有跟c语言类似的三目运算符,这可以用于在一行中根据条件选择两个值中的一个,而不用在组合always块中使用if-then。下面给出一些示例:
1 | (0 ? 3 : 5) // This is 5 because the condition is false. |
题目描述:
给定4个无符号数,求最小值。无符号数可以用比较运算符(a <b)进行比较。
Solution:
1 | module top_module ( |
缩位运算符
缩位运算符可以对向量的各个位进行和、或和异或操作,产生1位的输出:
1 | & a[3:0] // AND: a[3]&a[2]&a[1]&a[0]. Equivalent to (a[3:0] == 4'hf) |
我们可以通过翻转上述缩位运算的输出来获得NAND、NOR和XNOR缩位运算的输出。
题目描述1:奇偶校验经常被用作传输数据时检测错误的简单方法。创建一个电路,为一个8位字节计算一个奇偶校验位(它将在1个字节的基础上增加1位)。我们将使用“偶数”奇偶校验,其中奇偶校验位只是所有8位数据位的异或。
Solution1:
1 | module top_module ( |
题目描述2:构建一个组合电路,包括100个输入,in[99:0];
3个输出:
- out_and:100个与门的输出
- out_or:100个或门的输出
- out_xor:100个异或门的输出
Solution2:
1 | module top_module( |
for循环的组合逻辑:向量顺序翻转
题目描述:
给定一个100位的输入向量,翻转它的位顺序。
Solution:
1 | module top_module( |
for循环的组合逻辑:255bit的数1操作
题目描述:
“计数”电路对输入向量中的1进行计数。为一个255位输入向量建立一个“计数”电路。
Solution:
1 | module top_module( |
锁存器会对电路产生哪些影响呢?
- 锁存器对毛刺敏感,无异步复位端,不能让芯片在上电时处在确定的状态;
- 锁存器会使静态时序分析变得很复杂,不利于设计的可重用。
所以,在ASIC设计中,除了CPU高速电路,或者RAM这种对面积很敏感的电路,一般不提倡用锁存器。
循环生成语句
tips:Verilog中的generate语句常用于编写可配置的、可综合的RTL的设计结构。它可用于创建模块的多个实例化,或者有条件的实例化代码块。
generate循环的语法与for循环语句的语法很相似。但是在使用时必须先在genvar声明中声明循环中使用的索引变量名,然后才能使用它。genvar声明的索引变量被用作整数用来判断generate循环。genvar声明可以是generate结构的内部或外部区域,并且相同的循环索引变量可以在多个generate循环中,只要这些环不嵌套。genvar只有在建模的时候才会出现,在仿真时就已经消失了。
Verilog中generate循环中的generate块可以命名也可以不命名。如果已命名,则会创建一个generate块实例数组。如果未命名,则有些仿真工具会出现警告,因此,最好始终对它们进行命名。
题目描述1:
通过实例化100个全加法器,创建一个100位行波进位加法器。
Solution1:
1 | module top_module( |
题目描述2:
为您提供了一个名为bcd_fadd的BCD一位加法器,它的输入为两个BCD数字和进位输入信号,并生成求和输出和进位输出信号。
1 | module bcd_fadd { |
实例化bcd_fadd的100个副本,以创建一个100位的BCD行波进位加法器。
Solution2:
1 | module top_module( |
总结
本节设计大量的设计技巧,如for循环的巧用,批量进行例程的例化,这些可以在设计过程中简化工作量。