ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:490.71KB ,
资源ID:5362234      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5362234.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VHDL中的信号与变量仿真.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VHDL中的信号与变量仿真.docx

1、VHDL中的信号与变量仿真从仿真语义的角度看VHDL中的信号与变量摘要变量和信号是VHDL语言中最为常用和最重要的两种数据对象,然而两者在实际的应用中却常常难以区分。把握二者的特点和区别,并在电路设计中正确应用是成功完成电路设计的重要因素。本文先是系统地对两者的相似之处和区别加以论述,然后则重从仿真语义的角度分析、概括两者的区别,并通过若干相似实例程序的仿真波形图、RTL电路显示这一区别。关键词:VHDL 变量 信号 赋值 延时1 VHDL中变量、信号的语法规则概述在VHDL中,数据对象有三类:变量(VARIABLE)、常量(CONSTANT)和信号(SIGNAL)。数据对象类似于一种容器,它

2、接受不同数据类型的赋值。其中的变量、常量和高级程序设计语言如C语言中的变量、常量相类似。而信号的表现较为特殊,它具有更多的硬件特性,是硬件描述语言所特有的数据对象。然而,在VHDL的编程中,变量、信号在某些方面既有相同或相似之处,又有着质的区别,在实际应用中很容易混淆。从硬件电路系统来看,“变量”和“信号”相当于电路系统中的门与门间的连线以及连线上的信号值;从行为仿真和VHDL语句功能上看,“变量”和“信号”具有明显的区别,其差异主要表现在接受和保持保证的方式及信息保持和传递的区域大小上。例如,信号可以设置传输延迟量,而变量则不能;变量只能作为局部的信息载体。变量的设置有时只是一种过渡,最后的

3、信息传输和界面间的通信都要靠信号来完成。1.1 变量在VHDL语法规则中,变量是一个局部变量,只能在进程和子程序中使用。变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何的延时行为。其主要作用是在进程中作为临时的数据存储单元,即用于数据的暂存。变量定义的一般表述如下:VARIABLE 变量名 : 数据类型 :=初始值 ;例如,要想定义一个名称为A的变量,其数据类型为标准逻辑位类型,初始值为1,其定义表述如下:VARIABLE A : STD_LOGIC :=1;虽然变量定义时可以定义初始值,但是综合器并不支持设置初始值。故定义变量时多从仿真的角度出发,定义表述如下:VARIABLE 变

4、量名 : 数据类型 ;然后,在需要的时候再对该变量进行赋值,变量赋值的表述如下:目标变量名 := 表达式;赋值语句右方的“表达式”必须是一个与“目标变量名”具有相同数据类型的数值,这个表达式可以是一个运算表达式,也可以是一个数值。而且,新的变量值的获得是立即发生的。1.2 信号信号是描述硬件系统的基本数据对象,它的性质类似于连接线。信号可以作为设计实体中并行语句模块间的信息交流通道。信号定义的语句格式如下:SIGNAL 信号名 : 数据类型 := 初始值 ;信号的赋值语句格式一般如下:目标信号名 = 表达式 AFTER 时间量;同变量一样,信号的初始值的设置也不是必需的,而且初始值仅在VHDL

5、的行为仿真中有效。而与变量相比,信号的硬件特征更为明显,它具有全局的特性。信号的使用、定义范围是实体、结构体和程序包,在进程和子程序的顺序语句中不允许定义信号。另外,在进程中只能将信号列入敏感表,而不能将变量列入敏感表。这里的“表达式”可以是一个运算表达式,也可以是数据对象(变量、信号或常量)。数据信息的传入可以设置延时量,如AFTER 3ns。因此,目标信号获得传入的数据并不是即时的。即使是零延时(不做任何显式的延时设置,即等效于AFTER 0ns),也要经历一个特定的延时,即延时。因此,符号“=”两边的数值并不总是一致的,这与实际器件的传播延迟特性是相吻合的,因此这与变量的赋值过程有很大的

6、差别。信号的赋值可以出现在一个进程中,也可以直接出现在结构体的并行语句结构中,但他们运行的含义不一样。前者属于顺序信号赋值,这时的信号赋值操作要视进程是否已经被启动,并且允许对同一目标信号进行多次赋值;后者属于并行信号赋值,其赋值操作是各自独立并行地发生的,且不允许对同一目标信号进行多次赋值。2 变量与信号的相同之处 初始值的功效相同。变量和信号定义的初始值都不是必需的,即使设置了,经综合后的硬件电路也不支持。 变量与信号都具有能够接受赋值这一重要的共性。在不完整的条件语句中,单独的变量赋值语句和信号赋值语句都能产生相同的时序电路,但此时变量已经不是简单的数据临时储存结构。下面分别用利用变量和

7、信号的VHDL描述构成一个D触发器。程序清单1 D触发器(变量)LIBRARY IEEE;Use IEEE.STD_LOGIC_1164.ALL;entity D_variable is port ( - Input ports CLK : in STD_LOGIC; D : in STD_LOGIC; - Output ports Q : out STD_LOGIC );end D_variable;architecture EXP of D_variable is BEGIN PROCESS(CLK) VARIABLE Temp_QV : STD_LOGIC; begin if CLKEV

8、ENT AND CLK=1 then Temp_QV :=D; end if; Q =Temp_QV; END PROCESS; -Q =Temp_Q; end EXP;此代码在QUARTUS II中综合的时间戳如图1:图1 变量的VHDL描述构成D触发器在quartus综合的时间戳工作时序如图2:图2 变量的VHDL描述构成D触发器的工作时序生成的RTL电路如图3:图3 变量的VHDL描述构成D触发器的RTL电路此代码在Synplify Pro 9.0.1中综合的报告信息、时间戳如图4:图4 变量的VHDL描述构成D触发器在Synplify综合的时间戳Synplify生成的RTL电路如图5:

9、图5 变量的VHDL描述构成D触发器在Synplify中产生的RTL电路程序清单2 D触发器(信号)LIBRARY IEEE;Use IEEE.STD_LOGIC_1164.ALL;entity D_signal is port ( - Input ports CLK : in STD_LOGIC; D : in STD_LOGIC; - Output ports Q : out STD_LOGIC );end D_signal;architecture EXP of D_signal is SIGNAL Temp_QS:STD_LOGIC;BEGIN PROCESS(CLK) begin i

10、f CLKEVENT AND CLK=1 then Temp_QS =D; end if; END PROCESS; Q =Temp_QS; end EXP;此代码在QUARTUS II中综合的时间戳如图6:图6 信号的VHDL描述构成D触发器在quartus综合的时间戳工作时序如图7:图7 变量的VHDL描述构成D触发器的工作时序图生成的RTL电路如图8:图8 变量的VHDL描述构成D触发器的RTL电路由以上两个实例可以看出,虽然分别使用了变量和信号进行D触发器的描述,但他们综合后的结果却是一样的,工作时序一样,RTL电路也一样。由此,可以说明,在不完整的条件语句中,单独的变量赋值语句和信号

11、赋值语句都能产生相同的时序电路,但此时变量已经不是简单的数据临时储存结构。3 变量与信号的区别3.1 变量与信号在语句功能上的不同从行为仿真和VHDL语句功能上看,信号和变量具有比较明显的区别,其主要差异表现在接受和保持信号的方式和信息保持与转递区域大小上。3.1.1 根本作用的区别也就是说从硬件电路上看两者的区别: 变量相当于进程中局部数据存储单元。 信号相当于电路中的信号连线。3.1.2 定义位置不同 变量声明在子程序、进程内部。 信号声明在子程序、进程等外部。3.1.3 适用范围不同 变量仅限于在定义了变量的进程和子程序中使用。 信号的使用和定义范围是实体、结构体和程序包。3.1.4 语

12、句功能区别小结表1 变量与信号赋值语句功能的比较变量(VARIABLE)信号(SIGNAL)基本用法用于作为进程中局部数据存储单元用于作为电路中的信号连线适用范围只能在其所定义的进程中使用在整个结构体内的任何地方都能适用行为特性立即赋值在进程的最后才对信号赋值3.2 变量与信号在仿真功能上的不同3.2.1 延时行为特性不同 变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何延时行为。 信号在VHDL 中可以设置延时量,对信号赋值是按仿真时间进行的,到了进程的最后才进行赋值,这与实际硬件的传播延迟特性十分吻合。下面通过两个实例仔细讨论一下变量与信号在延时行为特性上的不同。程序清单3 LI

13、BRARY IEEE;Use IEEE.STD_LOGIC_1164.ALL;entity D_3V is port ( - Input ports CLK : in STD_LOGIC; D : in STD_LOGIC; - Output ports Q : out STD_LOGIC );end D_3V;architecture EXP of D_3V is BEGIN PROCESS(CLK) VARIABLE A,B : STD_LOGIC; begin if CLKEVENT AND CLK=1 then A := D; B := A; Q = B; end if; END PR

14、OCESS;end EXP;在quartus ii 中综合时的时间戳如图9:图9工作时序如图10:图10生成的RTL电路如图11:图11程序清单4 LIBRARY IEEE;Use IEEE.STD_LOGIC_1164.ALL;entity D_3S is port ( - Input ports CLK : in STD_LOGIC; D : in STD_LOGIC; - Output ports Q : out STD_LOGIC );end D_3S;architecture EXP of D_3S is SIGNAL A,B:STD_LOGIC;BEGIN PROCESS(CLK)

15、 begin if CLKEVENT AND CLK=1 then A = D; B = A; Q = B; end if; END PROCESS;end EXP;在quartus ii 中综合时的时间戳如图12:图12工作时序如图13:图13生成的RTL电路如图14:图14通过比较以上两例可以看出,变量和信号在上述VHDL描述中出现的结果截然不同,不论是工作时序图还是生成的RTL电路。使用程序3仍然产生一个D触发器,而使用程序4却产生了三个串联的D触发器。对于程序3,由于A、B都是变量,他们都具有临时保存数据的特性,而且他们的赋值更新是立即发生的,因而有了明显的顺序性。当三条语句:A :=

16、 D; B := A; Q = B;顺序执行时,变量A和B便有了传递数据的功能。语句执行的时候,先把输入D的值传递给A,再通过A传递给B,最后,在一个时刻之后,再由B传递给Q。在上述语句执行的过程中,A和B只是作为输入D的数据的暂时存储单元。Q最终被更新的数值是上一个时钟周期的输入D。故,虽然程序3相比程序1而言,中间多了一个变量B,但是,他们的最终实现却是一样的,综合后产生单个的D触发器。通过前面对信号这种数据对象的分析,我们可以看到信号行为特性的三个主要特性: 信号的赋值需要有一个的延时。比如程序4中的表达式:A=D,当语句执行到此句时,D向A的赋值是在一个的延时之后发生的,此时的A并没有

17、立即得到更新,也就是说A并没有获得D的数值,而只是刚刚启动了一个延时为的模拟定时器,只有在延时为后,A才能被更新,获得D的赋值。 在进程中,所有的赋值操作,当然也包括变量赋值,都必须在一个延时中完成,但变量的赋值操作在延时前就已经按顺序完成。一方面,在进程中的所有信号赋值语句在进程启动的一瞬间就立即顺序起到那个各自的延时为的定时器,准备在定时器结束后分别执行赋值操作。但是,在另一方面,这种顺序启动的间隔几乎为0,而在顺序执行到END PROCESS语句时,延时才会结束。因此,这时在进程中的所有信号赋值操作几乎在同一时刻完成赋值。即在进程中的顺序赋值操作是以近乎并行的方式“同时”完成,并且是在执

18、行到END PROCESS语句的时候才会发生。因此也不难理解,执行赋值操作和完成赋值是两个不同的概念,而对于类似C语言这样的高级软件语言,执行一条语句的赋值和完成一条语句的赋值是没事什么区别的,但是对于VHDL这样的硬件描述语言其情况就大不相同了。“执行赋值操作”只是一个过程而已,它具有顺序的特征;而“完成赋值操作”则是一种结果,它的发生具有硬件描述语言最本质的并行特征。 当进程中存在同一个信号有多个赋值源,也就是对同一个信号进行多次赋值操作时,实际完成赋值,即赋值对象的数值发生更新的信号是最接近END PROCESS语句的信号。而对于程序4,由于三个赋值语句:A = D; B = A; Q

19、= B;都必须在遇到END PROCESS后的时刻内执行,所以他们具有了近乎并行执行的特性,即语句:A=D中的A和语句:B=A中的A并非是同一个时刻的数值,B=A与Q=B中的B也不是同一个时刻的B,他们都相差一个时间。故,在同一个时刻中,D不可能直接将数值传递到Q,是Q得到更新。在实际的应用中,A被更新的值是上一个时钟周期的D,也就是当前时钟上升沿以前的数值,B被更新的数值是上一个时钟周期的A,而Q被更新的数值也同样是上一个时钟周期的B。因此,本程序的综合结果将会是三个串联的D触发器。3.2.2 信息作用区域不同 变量只能作为局部的信息载体,如只能在定义的进程中传递。 信号则可作为模块间的信息

20、载体,如在结构体中进行信息传递。信号用于内部信号,而非外部信号(外部信号对应为IN,OUT,INOUT,BUFFER),其在元件之间起互联作用,可以赋值给外部信号。3.2.3 进程中的表现不同 在进程中不能将变量列入敏感表。 信号可以被列入敏感表。这是因为信号能把进程外的信息带入进程内部,或将进程内的信息带出进程。3.2.4 保持信息方式不同在一定程度上说变量的设置仅仅是一种过渡,是进程中的临时数据存储单元,最后的信息传输和界面间通信都需信号来完成。 变量是虚的,仅仅是为了书写方便而引入的一个名称。 信号是实际的,是外输入,或者是内部的一个存储元件。3.2.5 硬件特征不同信号比变量具有更多的

21、硬件特征,如实体中的信号,在其对应结构体中可视,具体体现在综合后的硬件电路结构上,信号比变量对应更多的硬件结构。例如,我们要用VHDL语言描述设计一个最大数输出电路,该电路的输入数据位四组四个二进制数,输出为最大的一组数据。现在,我们分别用变量和信号进行描述,看看他们分别都达到什么样的效果。利用变量进行描述的源程序如程序清单5:程序清单5 library ieee ;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity Max_V is port(Clk,reset:in std_logic; din0,din1,

22、din2,din3:in std_logic_vector(3 downto 0) ; result:out std_logic_vector(3 downto 0 ) );end Max_V;architecture EXP of Max_V is begin process(Clk) variable temp:std_logic_vector(3 downto 0 ) ; begin if(Clkevent and Clk=1) then if(reset=1) then result=0000; temp:=0000; else temp:=din0 ; if(tempdin1) th

23、en temp:=din1; end if; if(tempdin2) then temp:=din2; end if; if(tempdin3) then temp:=din3; end if; result=temp; end if; end if; end process;end EXP; 在quartus ii 中综合时的时间戳如图15:图15工作时序如图16:图16可见,利用变量进行描述,达到了预期的设计要求。生成的RTL电路如图17:图17利用变量进行描述的源程序如程序清单6:程序清单6 library ieee ;use ieee.std_logic_1164.all;use i

24、eee.std_logic_unsigned.all;entity Max_S is port(Clk,reset:in std_logic; din0,din1,din2,din3:in std_logic_vector(3 downto 0) ; result:out std_logic_vector(3 downto 0 ) );end Max_S;architecture EXP of Max_S is signal temp:std_logic_vector(3 downto 0 ) ;begin process(Clk) begin if(Clkevent and Clk=1) t

25、hen if(reset=1) then result=0000; temp=0000; else temp=din0 ; if(tempdin1) then temp=din1; end if; if(tempdin2) then temp=din2; end if; if(tempdin3) then temp=din3; end if; result=temp; end if; end if; end process;end EXP; 在quartus ii 中综合时的时间戳如图18:图18工作时序如图19:图19可见,利用信号进行描述,没有达到预期的设计要求。生成的RTL电路如图20:

26、图20通过这两个实例的综合仿真结果,我们进一步分析两者的区别。在程序6使用信号进行描述时,仿真波形出现了中间值temp的波形,而程序5则使用变量进行描述,仿真波形没有中间值temp的波形。图16中的波形,输出result在每个Clk时钟的上升沿(在reset为低电平时)都能找到当前最大的输入值并输出该最大值。而图19中的波形,总是最大值和中间值temp在有效的上升沿交替输出。最大值和中间值之所以会交替出现,是因为在进程中的信号的赋值是在进程结束的时候更新的。由于信号不能被立即更新,只能在延时后才能更新这一重要特性,使得上述工作时序混乱,最终也得不到预期的效果。而变量和信号在延时上的不同之处直接

27、导致了他们在硬件电路上的不同。从图17和图20的差别可以看出,变量在综合后对应的电路连线相对信号在综合后产生的电路连线而言较简洁。这也验证了变量的主要作用是在进程中作为临时的数据存储单元,即用于数据的暂存,信号的性质类似于连接线这一说法。4 总结通过以上若干实验可以发现,从行为仿真和VHDL语句功能上看,信号与变量有着明显的区别,主要体现为接受和保持保证的方式以及信息保持和传递的区域大小上。例如信号的有效域为整个结构体,可以存在于多个进程中,变量的使用范围只能在进程和子程序中使用;信号可以设置传输延迟量,而变量则不能;变量只能作为局部的信息载体,而信号可以作为模块间的信息载体;在进程中只能将信

28、号列人敏感信号表,而不能将变量列人敏感信号表;信号的赋值只有在进程挂起时才发生代人,也就是在进程中给同一个信号赋值多次,只有最后一个值生效,而变量的赋值则是立即发生的;从波形仿真的结果可以看出,信号可以形成波形,而变量没有波形,只有当前值。在实际的应用中,信号的行为更接近于硬件的实际情况,因此应更多地使用信号进行电路内部的数据传递,只有在描述一些用信号很难描述的算法时才会用到变量。5 参考资料1、 EDA技术实用教程(第三版),潘松、黄继业编著,科学出版社2、 VHDL 中的信号与变量比较,张文,内江师范学院物理学与电子信息工程系3、 VHDL 语言中信号与变量赋值语句的应用, 柳莹、蒋本珊,北京理工大学计算机系4、 VHDL程序设计中的变量与信号,张霞,华中科技大学5、

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1