其实是不同的抽象级别,wire 如同 vhdl 中的 signal 类型,是和实际的物理连接对应的,而
reg 属于算法描述层次用的类型,和实际电路没有直接的对应关系,也就是说它相当于 c 语
言中的变量(int,oat 等),vhdl 中的 variable。记住这句就可以了,reg 不和实际的电路
如寄存器对应,高层次的描述时用。
always 其实算是算法级描述的语句,所以其中的变量必须声明为 reg,还有 inial,自己多
看一些例子,会更能加深理解
xblee (2005-10-04 18:40:04)
一个简单的组合逻辑的例子,用了 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 表
示一定要有触发,输出才会反映输入的状态。
assign 结构的组合逻辑定义为 wire, 用 “=” 赋值,
always 结构的组合逻辑好定义成 reg ,用 “<=” 赋值,
时序逻辑必须定义为 reg,用 “<=” 赋值。
wire 与 reg 之间最直接的区别在于:wire 使用在连续赋值语句中,而 reg 使用在过程赋值语
句中。 在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上 ,
相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于
wire。 在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中 ,
而这个变量可以声明成 reg 类型的。根据触发条件的不同,过程赋值语句可以建模不同的
硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;
如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这
个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
wire 和 reg 区别
从语法来解释:
1) .默认信号是 wire 类型,reg 类型要申明。这里所说的默认是指输出信号申明成
output 时为 wire,如果是输入信号,input 就行了,无需刻意申明成 wire,好像也没人这
么干,呵呵~如果是模块内部信号,必须申明成 wire 或者 reg.8 b# ~: R8 D# b
& V2 X! |( z) B2 r" r
2.) 对于 always 语句而言,赋值要申明成 reg,不然是语法错误。连续赋值 assign 的时