天行健,君子以自强不息
分类:
2009-10-16 16:15:29
对组合逻辑输出变量,可以直接用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;
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线网型数据需要持续的驱动。