VHDL设计中信号与变量问题的探讨

[复制链接]
 楼主| 莫雨 发表于 2007-5-9 17:02 | 显示全部楼层 |阅读模式
---随着集成电路技术的发展,用传统的方法进行芯片或系统设计已不能满足要求,迫切需要提高设计效率,因此能大大降低设计难度的VHDL设计方法被越来越广泛地采用。用VHDL语言设计系统的主要方法是:设计者根据VHDL的语法规则,对系统目标的逻辑行为进行描述,然后通过综合工具进行电路结构的综合、编译、优化,通过仿真工具进行逻辑功能仿真和系统时延的仿真,最后把设计的程序下载到芯片中,成功地实现系统功能。<br />---在VHDL设计中,最常用的数据对象主要有三种:信号(signal)、变量(variable)和常数(constant)。信号是电子电路内部硬件连接的抽象。它除了没有数据流动方向说明以外,其他性质几乎和“端口”一样;信号是一个全局量,它可以用来进行进程之间的通信。变量只能在进程语句、函数语句和过程语句结构中使用,是一个局部量。<br />---在VHDL语言中,对信号赋值是按仿真时间进行的,到了规定的仿真时间才进行赋值,而变量的赋值是立即发生的。下面的例子是从赋初值的角度说明信号与变量的这种区别的。<br />---例如用VHDL语言实现初值为A的十六进制的16个数的循环显示。<br />---对于如此的设计要求,如果用变量实现,则VHDL程序如下。<br />library&nbsp;ieee;<br />use&nbsp;ieee.std_logic_1164.all;<br />use&nbsp;ieee.std_logic_unsigned.all;<br />entity&nbsp;sevenauto&nbsp;is<br />port(clk:in&nbsp;std_logic;<br />y:out&nbsp;std_logic_vector(6&nbsp;downto&nbsp;0));<br />end&nbsp;sevenauto;<br />architecture&nbsp;behave&nbsp;of&nbsp;sevenauto&nbsp;is<br />begin<br />process(clk)<br />variable&nbsp;count:std_logic_vector(3&nbsp;downto&nbsp;0);<br />variable&nbsp;init:std_logic;<br />begin<br />if&nbsp;(clk'event)&nbsp;and&nbsp;(clk='1')&nbsp;then<br />if&nbsp;(init&nbsp;=&nbsp;'0')&nbsp;then<br />count:=&nbsp;&quot;1001&quot;;<br />init:='1';<br />end&nbsp;if;<br />count:=count+1;<br />case&nbsp;count&nbsp;is<br />when&nbsp;&quot;0000&quot;=&gty&lt=&quot;1111110&quot;;<br />when&nbsp;&quot;0001&quot;=&gty&lt=&quot;0110000&quot;;<br />when&nbsp;X&quot;2&quot;=&gty&lt=&quot;1101101&quot;;<br />when&nbsp;X&quot;3&quot;=&gty&lt=&quot;1111001&quot;;<br />when&nbsp;X&quot;4&quot;=&gty&lt=&quot;0110011&quot;;<br />when&nbsp;X&quot;5&quot;=&gty&lt=&quot;1011011&quot;;<br />when&nbsp;X&quot;6&quot;=&gty&lt=&quot;1011111&quot;;<br />when&nbsp;X&quot;7&quot;=&gty&lt=&quot;1110000&quot;;<br />when&nbsp;X&quot;8&quot;=&gty&lt=&quot;1111111&quot;;<br />when&nbsp;X&quot;9&quot;=&gty&lt=&quot;1111011&quot;;<br />when&nbsp;X&quot;A&quot;=&gty&lt=&quot;1110111&quot;;<br />when&nbsp;X&quot;B&quot;=&gty&lt=&quot;0011111&quot;;<br />when&nbsp;X&quot;C&quot;=&gty&lt=&quot;1001110&quot;;<br />when&nbsp;&quot;1101&quot;=&gty&lt=&quot;0111101&quot;;<br />when&nbsp;&quot;1110&quot;=&gty&lt=&quot;1001111&quot;;<br />when&nbsp;&quot;1111&quot;=&gty&lt=&quot;1000111&quot;;<br />when&nbsp;others=&gty&lt=&quot;XXXXXXX&quot;;<br />end&nbsp;case;<br />end&nbsp;if;<br />end&nbsp;process;<br />end&nbsp;behave;<br />---在程序中,定义了变量count,希望初始值为“1010”。通过实验发现,在定义变量或信号时直接赋予初始值不能生效(如variable&nbsp;count:std_logic_vector(3&nbsp;downto&nbsp;0)&nbsp;:=“1010”),它的初始值仍然是系统默认值(如count为“0000”)。正是利用这一点,通过init(初始值为'0')来给count赋初值A即“1010”,具体方法见程序中斜体部分。这样,在第一个脉冲来时执行斜体部分if语句,而第二个脉冲来时由于init不为'0'而是'1',因此不执行该部分语句,从而实现为count赋初值的功能,这样程序从A开始进行数字的循环显示。<br />---如果把count类型改为signal,则结果将大不一样。<br />signal&nbsp;count:&nbsp;std_logic_vector(3&nbsp;downto&nbsp;0);<br />process(clk)<br />variable&nbsp;init&nbsp;:std_logic;<br />begin<br />if&nbsp;(clk'event)&nbsp;and&nbsp;(clk='1')&nbsp;then<br />if&nbsp;(init&nbsp;=&nbsp;'0')&nbsp;then<br />count&lt=&nbsp;&quot;1001&quot;;&nbsp;--(1)<br />init&nbsp;:=&nbsp;'1';<br />end&nbsp;if;<br />count&lt=count+1;&nbsp;--(2)<br />---由于信号的赋值不是立即发生的,在语句(1)后面还存在对信号count的赋值操作(2),因此,语句(1)在此不起作用,count的最后值是语句(2)的值。因此如果将count设为signal的话,程序实现的是从0开始的16个十六进制数的循环。在这里,对信号赋初值的语句是不可行的。<br /><br />仿真结果<br />---将设计好的VHDL程序在Altera公司提供的软件maxplusⅡ10.1环境下进行编译仿真,得到的仿真结果如图1、图2所示,其中图1是count为变量的结果,图2是count为信号的结果,其中输出y[6...0]分别与七段数码管的abcdefg七段相连。<br />---从图1可以看出,在第一个时钟脉冲上升沿,结果是“1110111”,数码管显示即为A,然后依次为b,C,d,&nbsp;E,F,0,1...9,A...循环下去,此处用小写的b和d,主要是与数字8进行区别。<br />---从图中可以看出,在第一个时钟脉冲上升沿,结果是“1111110”,数码管显示即为0,然后依次示1...9,A,&nbsp;b,C,d,E,F,0,...循环下去。<br /><br />结论<br />---在设计过程中,如果信号和变量的定义不合适的话,设计结果完全不一样,因此在设计过程中需要谨慎使用信号和变量。在VHDL程序设计中,可以充分利用信号或变量的系统默认值,来灵活实现设计目标。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

12

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部