指出下面模块中Cin,Cout,C3,C5的类型 Verilog 详解(看了书依然不懂的绝望TT.....)

简介: 指出下面模块中Cin,Cout,C3,C5的类型 Verilog 详解(看了书依然不懂的绝望TT.....)

题目:

指出下面模块中Cin,Cout,C3,C5的类型。

module FADD(A,B,Cin,Sum,Cout);
 input A,B,Cin; 
output Sum,Cout;
endmodule  
module Test;
FADD M(C1,C2,C3,C4,C5);
endmodule 
Cin( ),Cout( ), C3( ),C5( ),C2( )

对于端口信号,输入端口只能是net类型。因而Cin为wire;

输入端口可以由wire/reg驱动,但输入端口只能是wire,因而C2,C3为wire/reg;

输出端口可以是wire/reg类型,因而Cout为wire/reg;

输出端口只能驱动wire,因而Cout驱动C5,C5为wire;

基础知识:

wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接)。

reg表示一定要有触发,输出才会反映输入的状态。

reg相当于存储单元,wire相当于物理连线。reg表示一定要有触发,没有输入的时候可以保持原来的值,但不直接实际的硬件电路对应。

     两者的区别是:寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动。wire使用在连续赋值语句中,而reg使用在过程赋值语句(initial ,always)中。wire若无驱动器连接,其值为z,reg默认初始值为不定值 x 。

     在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑

     对组合逻辑输出变量,可以直接用assign。即如果不指定为reg类型,那么就默认为1位wire类型,故无需指定1位wire类型的变量。当然专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。

     输入端口可以由wire/reg驱动,但输入端口只能是wire输出端口可以是wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型(wire/tri)。用关键词inout声明一个双向端口, inout端口不能声明为reg类型,只能是wire类型。

     默认信号是wire类型,reg类型要申明。这里所说的默认是指输出信号申明成output时为wire。如果是模块内部信号,必须申明成wire或者reg.

     对于always语句而言,赋值要申明成reg,连续赋值assign的时候要用wire。

模块调用时 信号类型确定方法总结如下:

信号可以分为端口信号内部信号。出现在端口列表中的信号是端口信号,其它的信号为内部信号。

对于端口信号,输入端口只能是net类型。输出端口可以是net类型,也可以是register类型。若输出端口在过程块中赋值则为register类型;若在过程块外赋值(包括实例化语句),则为net类型。

内部信号类型与输出端口相同,可以是netregister类型。判断方法也与输出端口相同。若在过程块中赋值,则为register类型;若在过程块外赋值,则为net类型。

若信号既需要在过程块中赋值,又需要在过程块外赋值。这种情况是有可能出现的,如决断信号。这时需要一个中间信号转换


AIEarth是一个由众多领域内专家博主共同打造的学术平台,旨在建设一个拥抱智慧未来的学术殿堂!【平台地址:https://devpress.csdn.net/aiearth】 很高兴认识你!加入我们共同进步!

目录
相关文章
|
11天前
|
算法 编译器 程序员
【C/C++ 解惑 】 std::move 将左值转换为右值的背后发生了什么?
【C/C++ 解惑 】 std::move 将左值转换为右值的背后发生了什么?
22 0
|
11天前
|
安全 算法 编译器
【C++ 基础知识】进一步了解 C++ 中 操纵符std::endl 的原理
【C++ 基础知识】进一步了解 C++ 中 操纵符std::endl 的原理
43 0
|
11天前
|
存储 安全 编译器
C++ std::move以及右值引用全面解析:从基础到实战,掌握现代C++高效编程
C++ std::move以及右值引用全面解析:从基础到实战,掌握现代C++高效编程
96 0
|
7月前
|
C语言
C 语言实例 - 输出九九乘法口诀表
使用嵌套 for 循环输出九九乘法口诀表。
54 2
蓝桥杯小技巧之巧用bit类型定义变量
蓝桥杯小技巧之巧用bit类型定义变量
61 0
PTA 1047 编程团体赛 (20 分)
编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。
145 0
PTA 1029 旧键盘 (20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。
76 0
创造函数,并用该函数打印1000-2000年之间的闰年
创造函数,并用该函数打印1000-2000年之间的闰年
43 0
创造函数,并用该函数打印1000-2000年之间的闰年
|
定位技术 人机交互 Go
还记得Magic Leap么,它最终证明AR消费级眼镜是个伪命题
现阶段直接面向消费者不是个明智的选择。
|
人工智能
1062. Talent and Virtue (25) 大量输入输出 scanf printf会比cin cout 省很多时间
#include #include #include using namespace std; struct node{ int id, v, t, g; }; vector v[4]; int cmp(node &a, node &b) { if (a.
1087 0