1:不指定就默认为1位wire类型。专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。(“不指定就默认为1位wire类型”这个我深有感触啊 曾经让我花了好长时间查这个错 )
2.其实是不同的抽象级别,wire 如同vhdl中的signal类型,是和实际的物理连接对应的,而reg属于算法描述层次用的类型,和实际电路没有直接的对应关系,也就是说它相当于c语言中的变量(int,float等),vhdl中的variable。记住这句就可以了,reg不和实际的电路如寄存器对应,高层次的描述时用。
always其实算是算法级描述的语句,所以其中的变量必须声明为reg,还有initial,自己多看一些例子,会更能加深理解
3.一个简单的组合逻辑的例子,用了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";
elsec=b;
endmodule;
但是这个综合出来就是一个简单的二选一选择器,组合逻辑电路
看它描述的方式,是不是就是把电路的行为(功能)描述出来了,这种就是算法级描述
4.always里只有reg能被赋值
5.wire :表示硬件单元之间的连线, 像在实际电路中一样, 网线由其连接器件的输出端连续驱动, 就是物理线路.
reg :它表示保持原来的数值, 直到被改写, 它并不与实际电路中由边沿触发的触发器构成的硬件完全对应.
6.wire 实际上就是网线,负责连线,在连续赋值语句中可以用到;而且基本上只能在联续赋值语句中用到。连续赋值语句如assign=a&b;
reg 为寄存器类型,但不要被被他名字所迷惑,reg可以被综合成触发器,锁存器,或者紧紧是连线。reg不可以在连续赋值语句中使用。只能在always中应用。
触发器always @ (posedge clk) q<=din;
锁存器always@ (g,d) if(g) q<=d;
连线always @(a,b,sel) if(sel) q="a"; else q="b";
7.wire 如同vhdl中的signal类型,是和实际的物理连接对应的,而reg属于算法描述层次用的类型,和实际电路没有直接的对应关系,也就是说它相当于c语言中的变量(int,float等),vhdl中的variable。记住这句就可以了,reg不和实际的电路如寄存器对应,高层次的描述时用