注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
yang_swust的个人空间 https://home.eeworld.com.cn/space-uid-60928.html [收藏] [复制] [分享] [RSS]
日志

verilog中wire和reg的区别

已有 4133 次阅读2009-9-20 19:19 |

verilog-2001的标准,标准中对wire和reg的讲述如下:

wire:

A wire net can be used for nets that are driven by a single gate or continuous assignment.

reg:

Assignments to a reg are made by procedural assignments (see 6.2 and 9.2). Since the reg holds a value

between assignments, it can be used to model hardware registers. Edge-sensitive (i.e., flip-flops) and level

sensitive (i.e., RS and transparent latches) storage elements can be modeled. A reg needs not represent a

hardware storage element since it can also be used to represent combinatorial logic.

对组合逻辑输出变量,可以直接用assign。即如果不指定为reg类型,那么就默认为1位wire类型,故无需指定1位wire类型的变量。

当然专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。

比如:

module lddata(clk,rst,cs,din,dout,tmpdata);

input clk, rst,cs;

input din;

output dout,tmpdata;

reg tmpdata;

always@(posedge clk or negedge rst)

if(!rst)

tmpdata <=0;

else

tmpdata<= din;

assign dout = tmpdata|cs;

endmodule

其实他们是不同的抽象级别,wire 如同vhdl中的signal类型,是和实际的物理连接对应的,而reg属于算法描述层次用的类型,和实际电路没有直接的对应关系,也就是说它相当于c语言中的变量(int,float等),vhdl中的variable。reg不和实际的电路如寄存器对应,高层次的描述时用。而always其实算是算法级描述的语句,所以其中的变量必须声明为reg

比如:一个简单的组合逻辑的例子,用了reg类型

module mux(a,b,c,sel);

input a,b,sel;

output c;reg c;

always @(sel or a or b)

if(sel ==1'b0) c=a;

else c=b;

endmodule;

这个综合出来就是一个简单的二选一选择器,组合逻辑电路

看它描述的方式,是不是就是把电路的行为(功能)描述出来了,这种就是算法级描述

wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接)。reg表示一定要有触发,没有输入的时候可以保持原来的值,但不直接实际的硬件电路对应(并非不能生成实际电路)。

 

线网型数据包括wire,wand,wor等几种类型,需要在被一个或一个以上驱动源驱动时,才能各自决定其不同线网型数据的最终值。

两者的区别是:reg存器型数据保持最后一次的赋值,而wire线网型数据需要持续的驱动。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章