reg型和wire型信号有什么本质的区别?

reg型和wire型信号有什么本质的区别?,第1张

wire与reg型信号类型的区别:

wire型数据常用来表示以assign关键字指定的组合逻辑信号。模块的输入输出端口类型都默认为wire型。默认初始值是z。

reg型表示的寄存器类型。always模块内被赋值的信号,必须定义为reg型,代表触发器。

默认初始值是x:

reg相当于存储单元,wire相当于物理连线。

Verilog 中变量的物理数据分为线型和寄存器型。这两种类型的变量在定义时要设置位宽,缺省为1位。变量的每一位可以是0,1,X,Z。其中x代表一个未被预置初始状态的变量或者是由于由两个或多个驱动装置试图将之设定为不同的值而引起的冲突型线型变量。z代表高阻状态或浮空量。

线型数据包括wire,wand,wor等几种类型在被一个以上激励源驱动时,不同的线型数据有各自决定其最终值的分辨办法。

两者的区别是:

寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动,输入端口可以net/reg驱动,但输入端口只能是net,如a = b & c,输入端口a 只能是net型,但其驱动b,c可以是net/reg型;输出端口可以使net/reg类型,输出端口只能驱动net,如a = b & c,模块的输出端口b,c可以是net/reg型,但它们驱动的a必须是net型;若输出端口在过程块(always/initial)中赋值则为reg型,若在过程块外赋值则为net型。用关键词inout声明一个双向端口, inout端口不能声明为寄存器类型,只能是net类型。

wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。

不指定就默认为1位wire类型。专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句中,而reg使用在过程赋值语句中。

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

wire型的变量综合出来一般是一根导线。

reg变量在always块中有两种情况:    always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑   always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)

在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。

verilog里一般不声明输出类型的话 默认是wire型的
如果你想在输出处寄存一下:比如使用always语句,则必须声明为reg类型
wire是线网,就是相当于实际中的连接线,你想assign的话就是直接连接,就是用wire型,他的值是随时变化的。比如你想寄存一下,让他在时钟边沿才变化就需要reg类型了
你的问题应该是主要讨论下wire型和reg型的应用区别吧
另外,团IDC网上有许多产品团购,便宜有口碑

wire属于net型数据类型,相当于硬件电路中的各种物理连接,其特点是输出值紧跟输入值的变化而变化。例如,
wire cout=cin; //只要cin变化,cout就变化
reg属于variable型数据类型,必须放在过程语句中,通过过程赋值语句赋值;在过程块内被赋值的信号也必须定义成variable型。也就是说,要在always和initial中赋值的变量必须定义为variable型。

Verilog语言使用一个或多个模块对数字电路建模,通常可以用三种方式:1、结构描述方式:即调用其它已定义好的低层模块或直接调用Verilog内部基本门级元件描述电路结构和功能。2、数据流描述方式:连续使用赋值语句(assign)对电路的逻辑功能进行描述。3、行为描述方式:使用过程块语句结构(initial和always语句)和比较抽象的高级程序语句对电路的逻辑功能进行描述。你问的assign语句就属于第二种。连续赋值语句用于对wire型变量进行赋值,它由关键字assign开始,后面跟着由 *** 作数和运算符组成的逻辑表达式。例如:wireA,B,SEL,L;//声明4个线型变量assignL=(A&~SEL)|(B&SEL);//连续赋值在assign语句中,左边变量的数据类型必须是wire型。input和output如果不特别声明类型,默认是wire类型。举例2选1的数据选择器:modulemux2x1_df(A,B,SEL,L);inputA,B,SEL;outputL;assignL=SELA:B;endmodule

1、31:0D,这样设置是为了简洁易懂,比如总线有32位,即D0~D31,这样就把它们一次性赋值,但是可以一位一位地取出来用,比如a=D[0]。
2、所说的always必须用reg意思是你里面有赋值语句的被赋值的变量必须为reg型的,而不是说在always语句里面出现的变量都要为reg型。比如我这里写reg b,wire a,然后在always语句里面有b=a,即当always里面的敏感变量变化时把a的值赋值给b,这里面只有b是reg型,a不是被赋值的变量,所以a可以不为reg型的。
reg型为寄存器型,always语句里面被赋值的变量它的值要是寄存型的,因为要保持,只有当always里面的敏感变量有变化时,被赋值的变量的值才会改变。
希望你懂,不懂再追问哈。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13215442.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-21
下一篇 2023-06-21

发表评论

登录后才能评论

评论列表(0条)

保存