原创 小结 wire 和 reg 区别 (转帖)

2009-12-30 20:22 2739 11 11 分类: FPGA/CPLD

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表示一定要有触发,没有输入的时候可以保持原来的值,但不直接实际的硬件电路对应(并非不能生成实际电路)。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条