今天一直在看语法看程序再看语法再看程序,调试
心里有时还挺激动的,呵呵
学新东西的感觉
下面把遇到的reg类型和wire类型的区别记下来,方便将来看
程序里从来没有指定过wire类型的变量,对组合逻辑输出变量,直接就assign了,
是不是如果不指定为reg类型,那么就默认为wire类型?
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";
else c=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不和实际的电路如寄存器对应,高层次的描述时用。
关于一些对话中学到的
永顺 21:38:04
你好
ひ特权 シ 21:38:20
好
永顺 21:38:20
我遇到个术语
连续赋值
ひ特权 シ 21:38:36
assign
永顺 21:38:44
说WIRE类型的只能在连续赋值语句中赋值
ひ特权 シ 21:38:50
比如assign a = b & c;
ひ特权 シ 21:38:53
对
ひ特权 シ 21:39:22
如果reg a;就不能用在上面的语句里,只能定义wire a;
永顺 21:39:44
也就是给WIRE类型的值赋值的话
必须是在ASSIGN后面赋值是吗?
ひ特权 シ 21:40:28
对
永顺 21:41:49
你看我这样理解对不对
我定义了
reg类型的
wire类型的
两类变量
如果我分别赋值的话
reg只能在always后面赋值
wire只能在Assign后边赋值
永顺 21:41:52
是吗?
ひ特权 シ 21:42:09
yes
永顺 21:42:19
还有
我看赋值有
=和《=
永顺 21:42:30
这两种赋值有什么区别吗?
ひ特权 シ 21:42:39
阻塞语句,和非阻塞语句
永顺 21:43:01
哦
这个我得再看看
还不懂呢
呵呵
ひ特权 シ 21:43:13
他们的区别是=是串行的,而<=号是并行的
ひ特权 シ 21:43:28
你看看资料,说的很明白
永顺 21:43:30
恩
永顺 21:45:12
既然wire和reg定义变量都可以
那我都用一种定义不就行了吗?
为什么定义这两中变量呢
看资料说
reg是算法级的更高一级
wire是跟实际电路对应的
就这个区别吗?
ひ特权 シ 21:49:21
硬件就是要 越明白越好,这样能够明确每一个寄存器的每一条连线
永顺 21:50:29
哦
有点明白了
呵呵
文章评论(0条评论)
登录后参与讨论