|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接)。% K3 A5 ^, b: ?" q. K+ N+ C
reg表示一定要有触发,输出才会反映输入的状态。
( R# \* p* h) J3 _0 y1 k" z6 i8 ~; j; h" s( g- ^; \
reg相当于存储单元,wire相当于物理连线。reg表示一定要有触发,没有输入的时候可以保持原来的值,但不直接实际的硬件电路对应。
' x( l. B% s* ]1 O+ h4 S
8 n u+ ^: c: u* M2 k6 Z
: m1 G3 e0 v# J" N两者的区别是:寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动。wire使用在连续赋值语句中,而reg使用在过程赋值语句(initial ,always)中。wire若无驱动器连接,其值为z,reg默认初始值为不定值 x 。( `+ N: l- A, x B
! a7 k$ V" b' S( I8 d在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
( d( Z5 c, t/ R( i1 L5 p4 L6 A
6 F8 T/ k- l+ q$ }4 S2 |对组合逻辑输出变量,可以直接用assign。即如果不指定为reg类型,那么就默认为1位wire类型,故无需指定1位wire类型的变量。当然专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。
( n( F7 U1 M7 |5 ?2 \2 a, {9 r# I3 z' I& Q: G* A
输入端口可以由wire/reg驱动,但输入端口只能是wire;输出端口可以是wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,
; R! G; d8 m9 ?, Z+ z' u5 K& C( F
' n7 A' |1 ~$ z0 O7 I" J4 \( K( v2 y7 \$ H! [* Y5 q+ f
若在过程块外赋值则为net型(wire/tri)。用关键词inout声明一个双向端口, inout端口不能声明为reg类型,只能是wire类型。
+ o1 R& X6 k# s5 Q, {7 c% o
* _# V0 l9 k1 h4 v3 S5 Y$ |9 \9 e: w0 i: z& ^5 W% Q3 s
默认信号是wire类型,reg类型要申明。这里所说的默认是指输出信号申明成output时为wire。如果是模块内部信号,必须申明成wire或者reg.7 u; W" c3 S4 D0 x5 i: e0 x
. E, ~& l/ p& C8 p- c! D% n! t: \1 y% b
对于always语句而言,赋值要申明成reg,连续赋值assign的时候要用wire
; P3 s( U2 N$ J# Z- V7 T# n$ ?! z j# m) d
( Q) D# V) I4 G1 m! C+ O. v& n! |) ]! N
|
|