VHDL信号与变量的区别

文章首发于我的个人博客

变量(VARIABLE)

在VHDL中,变量只能在进程(PROCESS)子程序(SUBPROGRAM)中使用。变量不能将信息带出它所被定义的设计单元。变量的赋值是一种理想的数据传输,是立即发生的,没有延时的。

定义变量的语句

VARIABLE 变量名 : 数据类型;

变量赋值(:=)

变量名 := 表达式;

其中表达式可以为运算表达式或者数值。

信号(SIGNAL)

在VHDL中,信号的定义和使用范围是实体(ENTITY)结构体(ARCHITECTURE)程序包(PACKAGE)。在进程和子程序中不允许定义变量。信号是描述硬件系统的基本数据对象,它类似于连线。信号的传输过程存在延时。注意,在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的是最后一个赋值源的值,之前的赋值不起作用。

定义信号的语句

SIGNAL 信号名 := 数据类型;

信号赋值(<=)

信号名 <= 表达式;

信号与变量的区别

(1)在进程中只能将信号加入信号敏感表,而不能将变量加入信号敏感表。因为只有信号才能将进程外的信息带入进程内部。

从以下代码中体会信号和变量的区别。

SIGNAL s1 ,s2 : STD_LOGIC; 

SIGNAL svec : STD_LOGIC_VECTOR (0 TO 7);

 ... 

PROCESS ( s1 ,s2 ) 

VARIABLE v1 ,v2 : STD_LOGIC;

BEGIN

​	v1 := '1' ;            			-- 立即将 v1 置位为 1     

​	v2 := '1' ;            			-- 立即将 v2 置位为 1     

​	s1 <= '1' ;            			-- s1 被赋值为 1     

​	s2 <= '1' ;           			 -- 由于在本进程中这里的 s2 不是最后一个,因此此处赋值不起作用

​	svec(0) <= v1;          	   -- 将 v1 在上面的赋值 1 赋给svec(0)

​	svec(1) <= v2;            	 -- 将 v2 在上面的赋值 1 赋给svec(1)	

​	svec(2) <= s1;           	  -- 将 s1 在上面的赋值 1 赋给svec(2)

​	svec(3) <= s2;                  -- 将最下面的赋予 s2 的值'0' 赋给svec(3)

​	v1 := '0' ;            				-- 将 v1 置入新值 0     

​	v2 := '0' ;         				   -- 将 v2 置入新值 0    

​	s2 <= '0' ;          				  -- 由于这是 s2 最后一次赋值 赋值有效,此'0'将上面准备赋入的'1'覆盖掉 	 	svec(4) <= v1;             		 -- 将 v1 在上面的赋值 0 赋给svec(4) 

​	svec(5) <= v2;              		-- 将 v2 在上面的赋值 0 赋给svec(5)

​	svec(6) <= s1;            		   -- 将 s1 在上面的赋值 1 赋给svec(6)  

​	svec(7) <= s2;          -- 将 s2 在上面的赋值 0 赋给svec(7)

 END PROCESS ;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章