﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-binghuo-随笔分类-FPGA—CPLD</title><link>http://www.cppblog.com/binghuo/category/9762.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 10 Mar 2009 00:24:37 GMT</lastBuildDate><pubDate>Tue, 10 Mar 2009 00:24:37 GMT</pubDate><ttl>60</ttl><item><title>VHDL设计中信号与变量问题的探讨</title><link>http://www.cppblog.com/binghuo/archive/2009/03/10/76064.html</link><dc:creator>冰火</dc:creator><author>冰火</author><pubDate>Mon, 09 Mar 2009 23:46:00 GMT</pubDate><guid>http://www.cppblog.com/binghuo/archive/2009/03/10/76064.html</guid><wfw:comment>http://www.cppblog.com/binghuo/comments/76064.html</wfw:comment><comments>http://www.cppblog.com/binghuo/archive/2009/03/10/76064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/binghuo/comments/commentRss/76064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/binghuo/services/trackbacks/76064.html</trackback:ping><description><![CDATA[<div align=center>
<div style="FONT-SIZE: 14px; WIDTH: 90%; TEXT-ALIGN: left"><span class=style17>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<div style="FONT-WEIGHT: 600; FONT-SIZE: 16px; MARGIN: 20px 0px 10px" align=center>VHDL设计中信号与变量问题的探讨 </div>
<p>　　</span></p>
<p><span class=style17><strong>摘 要：</strong>本文从应用的角度举例说明了VHDL设计中信号与变量的区别，以及正确的使用方法，并介绍了为信号或变量赋予初始值的技巧。<br><br>　　<strong>关键词：</strong>VHDL；信号；变量<br><br>　　</span><span class=style17><strong>概述<br></strong><br>　　随着集成电路技术的发展，用传统的方法进行芯片或系统设计已不能满足要求，迫切需要提高设计效率，因此能大大降低设计难度的VHDL设计方法被越来越广泛地采用。用VHDL语言设计系统的主要方法是：设计者根据VHDL的语法规则，对系统目标的逻辑行为进行描述，然后通过综合工具进行电路结构的综合、编译、优化，通过仿真工具进行逻辑功能仿真和系统时延的仿真，最后把设计的程序下载到芯片中，成功地实现系统功能。<br><br>　　在VHDL设计中，最常用的数据对象主要有三种：信号(signal)、变量(variable)和常数(constant)。信号是电子电路内部硬件连接的抽象。它除了没有数据流动方向说明以外，其他性质几乎和&#8220;端口&#8221;一样；信号是一个全局量，它可以用来进行进程之间的通信。变量只能在进程语句、函数语句和过程语句结构中使用，是一个局部量。<br><br>　　在VHDL语言中，对信号赋值是按仿真时间进行的，到了规定的仿真时间才进行赋值，而变量的赋值是立即发生的。下面的例子是从赋初值的角度说明信号与变量的这种区别的。<br><br>　　例如用VHDL语言实现初值为A的十六进制的16个数的循环显示。<br><br>　　对于如此的设计要求，如果用变量实现，则VHDL程序如下。<br><br>　　library ieee;<br>　　use ieee.std_logic_1164.all;<br>　　use ieee.std_logic_unsigned.all;<br>　　entity sevenauto is<br>　　port(clk:in std_logic;<br>　　y:out std_logic_vector(6 downto 0));<br>　　end sevenauto;<br>　　architecture behave of sevenauto is<br>　　begin<br>　　process(clk)<br>　　variable count:std_logic_vector(3 downto 0);<br>　　variable init:std_logic;<br>　　begin<br>　　if (clk'event) and (clk='1') then<br>　　if (init = '0') then<br>　　count:= "1001";<br>　　init:='1';<br>　　end if;<br>　　count:=count+1;<br>　　case count is<br>　　when "0000"=&gt;y&lt;="1111110";<br>　　when "0001"=&gt;y&lt;="0110000";<br>　　when X"2"=&gt;y&lt;="1101101";<br>　　when X"3"=&gt;y&lt;="1111001";<br>　　when X"4"=&gt;y&lt;="0110011";<br>　　when X"5"=&gt;y&lt;="1011011";<br>　　when X"6"=&gt;y&lt;="1011111";<br>　　when X"7"=&gt;y&lt;="1110000";<br>　　when X"8"=&gt;y&lt;="1111111";<br>　　when X"9"=&gt;y&lt;="1111011";<br>　　when X"A"=&gt;y&lt;="1110111";<br>　　when X"B"=&gt;y&lt;="0011111";<br>　　when X"C"=&gt;y&lt;="1001110";<br>　　when "1101"=&gt;y&lt;="0111101";<br>　　when "1110"=&gt;y&lt;="1001111";<br>　　when "1111"=&gt;y&lt;="1000111";<br>　　when others=&gt;y&lt;="XXXXXXX";<br>　　end case;<br>　　end if;<br>　　end process;<br>　　end behave;<br><br>　　在程序中，定义了变量count，希望初始值为&#8220;1010&#8221;。通过实验发现，在定义变量或信号时直接赋予初始值不能生效(如variable count:std_logic_vector(3 downto 0) :=&#8220;1010&#8221;)，它的初始值仍然是系统默认值(如count为&#8220;0000&#8221;)。正是利用这一点，通过init(初始值为'0')来给count赋初值A即&#8220;1010&#8221;，具体方法见程序中斜体部分。这样，在第一个脉冲来时执行斜体部分if语句，而第二个脉冲来时由于init不为'0'而是'1'，因此不执行该部分语句，从而实现为count赋初值的功能，这样程序从A开始进行数字的循环显示。<br><br>　　如果把count类型改为signal，则结果将大不一样。<br><br>　　signal count: std_logic_vector(3 downto 0);<br>　　process(clk)<br>　　variable init :std_logic;<br>　　begin<br>　　if (clk'event) and (clk='1') then<br>　　if (init = '0') then<br>　　count&lt;= "1001"; --(1)<br>　　init := '1';<br>　　end if;<br>　　count&lt;=count+1; --(2)<br><br>　　由于信号的赋值不是立即发生的，在语句(1)后面还存在对信号count的赋值操作(2)，因此，语句(1)在此不起作用，count的最后值是语句(2)的值。因此如果将count设为signal的话，程序实现的是从0开始的16个十六进制数的循环。在这里，对信号赋初值的语句是不可行的。 <br></span><span class=style17><br>　　<strong>仿真结果</strong><br><br>　　将设计好的VHDL程序在Altera公司提供的软件maxplusⅡ10.1环境下进行编译仿真，得到的仿真结果如图1、图2所示，其中图1是count为变量的结果，图2是count为信号的结果，其中输出y[6...0]分别与七段数码管的abcdefg七段相连。</span></p>
<span class=style17></span>
<p align=center><span class=style17><img height=71 alt="" src="http://www.gd-emb.org/NewsFiles/26837/Image/1(40).jpg" width=264></span></p>
<p align=center><span class=style17>图1 </span></p>
<p align=center><span class=style17><img alt="" src="http://www.gd-emb.org/NewsFiles/26837/Image/2(40).jpg"></span></p>
<p align=center><span class=style17>图2</span></p>
<p><span class=style17>　　从图1可以看出，在第一个时钟脉冲上升沿，结果是&#8220;1110111&#8221;，数码管显示即为A，然后依次为b,C,d, E,F,0,1...9,A...循环下去，此处用小写的b和d，主要是与数字8进行区别。<br><br>　　从图中可以看出，在第一个时钟脉冲上升沿，结果是&#8220;1111110&#8221;，数码管显示即为0，然后依次示1...9,A, b,C,d,E,F,0,...循环下去。</span></p>
<p><span class=style17>　　<strong>结论</strong><br><br>　　在设计过程中，如果信号和变量的定义不合适的话，设计结果完全不一样，因此在设计过程中需要谨慎使用信号和变量。在VHDL程序设计中，可以充分利用信号或变量的系统默认值，来灵活实现设计目标。</span></p>
<p><span class=style17>　　<strong>参考文献：</strong><br><br>　　1 CPLD系统设计技术入门与应用.黄正谨,徐坚等编著. 电子工业出版社<br>　　2 电子设计硬件描述语言VHDL. DouglasL. Perry编著. 学苑出版社<br>　　3 硬件描述语言与数字逻辑电路设计. 侯伯亨,顾新编著. 西安电子科技大学出版社</span></p>
</div>
</div>
<img src ="http://www.cppblog.com/binghuo/aggbug/76064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/binghuo/" target="_blank">冰火</a> 2009-03-10 07:46 <a href="http://www.cppblog.com/binghuo/archive/2009/03/10/76064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>