VHDL数字电路设计教程第7讲 信号和变量

合集下载

VHDL设计中信号与变量的使用研究

VHDL设计中信号与变量的使用研究

VHDL设计中信号与变量的使用研究VHDL语言是现代电子设计的重要工具。

数据对象是其中的重要语言要素,通常由常量、变量与信号等组成,一般情况下,这些要素在经过综合后可以引入寄存器,这样就能够产生相同的逻辑电路,与初始值的功效基本相同。

语言要素中的常量和变量可以从计算机语言中找到与其对应的数据类型,并且这类常量和变量的语言行为与高级中的变量和常量基本相同。

比较特殊的要素是信号,它的数据对象包含更多的硬件特征,这也是VHDL中最有特色的语言要素之一。

本论文讲述的是常量和变量的相似之处,还有变量和信号的相同与不同之处,主要表现为定义位置、适用范围、延时行为特性等,并以实例加以验证。

标签:VHDL 变量信号0 引言电子电路技术更新换代的周期很快,新技术的发明与应用所需时间很短,集成电路技术也在发生着日新月异的变化,在这样的背景下,传统的芯片设计技术和系统集成技术已经不能适应新的标准要求。

因此,必须要尽快提高设计效率,要想提高设计效率必须要降低设计难度,VHDL设计方法能够在很大程度上降低芯片和系统集成的设计难度。

电子设计自动化技术是现代电子设计的重要技术,高速集成电路硬件描述语言是EDA的重要工具。

1 关于数据对象的简介在VHDL语言要素中,数据对象是比较重要的内容,一般都包含如下三类:常量、变量和信号。

常量是一个全局量,它的定义和设置主要是为了使程序更容易阅读和修改,在程序中,常量作为一个固定不变的稳定值,不可以被改变。

变量相对于常量来说,算是一个局部量,变量主要是在局部程序的某个进程或子程序中使用。

变量一般不可以超出自身所在的程序结构,其信息的传输也离不开程序结构对其所做的定义和赋值,在实际工作过程中,不会出现延时暂停的状况,工作具有即发性。

信号是一种比较特殊的数据对象,作为在VHDL中的一个全局量,通常是在程序包说明、实体说明和结构体描述中使用。

信号与连接线比较类似,通过基本数据来描述硬件系统,信号可以充当并行语句模块间的信息交流通道。

vhdl简答

vhdl简答

1、简述信号与变量的区别。

a.信号延时赋值,变量立即赋值b.信号的代入使用<=,变量的代入使用:=;c.信号在实际的硬件当中有对应的连线,变量没有2、简述可编程逻辑器件的优点。

a.集成度高,可以替代多至几千块通用IC芯片.极大减小电路的面积,降低功耗,提高可靠性b.具有完善先进的开发工具.提供语言、图形等设计方法,十分灵活.通过仿真工具来验证设计的正确性c.可以反复地擦除、编程,方便设计的修改和升级d.灵活地定义管脚功能,减轻设计工作量,缩短系统开发时间f.保密性好3、试比较moore状态机与mealy状态机的异同。

Moore输出只是状态机当前状态的函数. Mealy输出为有限状态机当前值和输入值的函数3、简述VHDL语言与计算机语言的差别。

a. 运行的基础。

计算机语言是在CPU+RAM构建的平台上运行。

VHDL设计的结果是由具体的逻辑、触发器组成的数字电路b.执行方式.计算机语言基本上以串行的方式执行.VHDL在总体上是以并行方式工作c.验证方式.计算机语言主要关注于变量值的变化.VHDL要实现严格的时序逻辑关系6、VHDL与计算机语言的区别?VHDL语言可以并行执行,计算机语言只能顺序执行。

3.1比较常用硬件描述语言VHDL、Verilog和ABEL语言的优劣。

1.VHDL:描述语言层次较高,不易控制底层电路,因而对综合器的性能要求较高。

有多种EDA工具选择,已成为IEEE标准。

应用VHDL进行工程设计的优点是多方面的,具体如下:(1) 与其他的硬件描述语言相比,VHDL具有更强的行为描述能力。

(2) VHDL具有丰富的仿真语句和库函数,使得在任何大系统的设计早期,就能查验设计系统的功能可行性,随时可对系统进行仿真模拟,使设计者对整个工程的结构和功能可行性做出判断。

(3) VHDL语句的行为描述能力和程序结构,决定了它具有支持大规模设计的分解和已有设计的再利用功能。

(4) 用VHDL完成一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动把VHDL描述设计转变成门级网表(根据不同的实现芯片)。

VHDL中信号与变量的教学体会

VHDL中信号与变量的教学体会

很难发现其 中的错误。所以, 如何使学生分清两者 , 并 正 确的使 用 , 成为 影 响 VHDL语 言教 学 的关键 问 题 之 一 。本 文 主要 介 绍 了如 何 分 辨 VHD L语 言 的
d sg i g u i g VH DL r o n e .Ba e n o r e p re p r h s p stv e i n n sn a ep itd s d o u x e i n e h t o i e n t i a e a o ii e e f c n V HDL t a h n n e i n n . fe to e c i g a d d sg i g
维普资讯
第2 8卷 第 3期 20 0 6年 6月
电气 电子 教 学 学 报 J OURNAL 0F EEE
V o . 8 NO 3 12 .
J r 0 6 uL2 0
VHDL 中信 号 与 变 量 的教 学体 会
杨 丹 , 树 林 张
d s nn u igtahn ei ig d r ec igVHDL poet ai c n e t a o t aao jcsi VHDL ae ie rt h n g n rjc.B sc o cps b u t bet d n r v nf s;te g i tep p r o u e nt e to e n taetedf rn eb t e o fs beVHDLo jcs s — h a e c ss h dt d mo srt h i ee c ewent c nu a l f o h me o f wo b t , i e g
分 清变 量与 信号 的 区别 , 采用 何 种 数 据 对 象 往 往 随
心所 至 , 虽然 有 时候 系 统也 能正 常运 转 , 但是 在 系统

vhdl中信号与变量的教学体会

vhdl中信号与变量的教学体会

vhdl中信号与变量的教学体会VHDL(电子设备自动化设计语言)是一种针对高端、复杂电子系统设计的硬件定义语言,它利用模块化的设计结构,使得电子设计师能够更轻松地创建、调试和管理复杂电子硬件系统。

而在VHDL中,信号和变量的概念被广泛使用。

它们是VHDL中的基本概念,无论在设计硬件系统时或者执行系统时,这些概念都起着至关重要的作用。

首先,在VHDL中,信号是一种可以携带信息的变量,它可以在不同的模块之间传递。

通常,VHDL中的信号用于实现硬件中的“计算”或“处理”操作,如硬件加法器、乘法器、移位器等。

此外,信号除了可以携带“数据”信息,还可以携带“控制”信息,如信号被测试或修改,VHDL中的控制结构就可以控制信号的传递和变换。

另一方面,VHDL中的变量概念更多的是属于软件程序的概念,它更多的用来表示硬件系统中的状态变量,如存储数据或状态信息,以及可以被访问的变量。

简单地说,在VHDL中,变量的主要功能是存储电路的内部状态,如存储数据,以及保存可以被其它模块调用的信息。

总而言之,不可否认,信号和变量在VHDL中具有重要作用。

除了信号可以传输信息,变量在可以存储数据和调用信息。

这两类概念应用于VHDL硬件系统的设计上,可以达到更精确、更有效的系统设计效果,从而实现高性能的硬件系统。

因此,在VHDL教学过程中,教师应该把这两类概念融入到教学之中,让学生充分理解和掌握VHDL 中信号与变量的作用,这样有助于培养学生的硬件系统设计能力,提高学生在VHDL设计上的熟练度。

另外,为了更好地让学生理解和掌握VHDL中信号与变量的概念,教师还可以给学生安排一些设计和编码的实践课。

学生通过参加实验课,可以更好地理解和掌握VHDL中信号与变量的概念,能够熟练地把硬件系统设计中的信号和变量应用到实际的设计中。

综上所述,信号和变量的概念在VHDL中扮演着重要的角色,它们不仅是VHDL教学过程中的基本概念,在VHDL设计硬件系统中也具有重要意义。

VHDL中信号与变量的区别

VHDL中信号与变量的区别

由图所示,由于变量的赋值是即使的,相当于直接把d的值赋给q,所以它有一个D触发器构成.初学VHDL,对于信号和变量这两个对象非常模糊,故整理下。

VHDL提供了SIGNAL和VARIABLE这两种对象来处理非静态数据,同时提供了CONSTANT、GENERIC来处理静态数据。

信号可以在PACKAGE、ENTITY和ARCHITECTURE中声明,而变量只能在一段顺序描述代码的内部声明。

因此,信号是全局的,而变量通常是局部的。

变量的值通常是无法直接传递到PROCESS外部的。

如果需要进行变量值的传递,则必须把这个值赋给一个信号,然后由信号将变量值传递到PROCESS外部。

另一方面,赋予变量的值使即刻生效的,在此后的代码中,此变量将使用新的变量值。

这个一点和PROCESS中使用的信号不同,新的信号值通常只有在整个PROCESS运行完毕后才开始生效。

VHDL中的信号代表的是逻辑电路中的“硬”连线,既可以用于电路单元的输入/输出端口,也可以用于电路内部各单元之间的连接。

实体的所有端口都默认为信号。

信号定义的格式如下:SIGNAL name:type [range] [:= nitial_value];有关信号的最重要一点是,当信号用在顺序描述语句(如PROCESS内部)中时,它并不是立即更新的,信号值是在相应的进程、函数或过程完成后才进行更新的。

当对信号进行赋初始值的操作是不可综合的,只能用来进行仿真。

变量仅用于局部的电路描述。

它只能在PROCESS,FUNCTION和PROCEDURE内部使用,而且对它的赋值是立刻生效的,所以新的值可以再下一行中立即使用。

仅用于顺序描述代码中。

3.总结在一个进程中,如果对一个信号多次赋值,那么,只有最后一个值才是有效的.如果对变量多次赋值,那么每次赋值都是有效的,并且,变量的值在再次赋值之前一直保持不变.信号跟硬件有点类似,并且是在进程结束的时候才更新;变量是立即更新的,因此可以影响程序的功能,但变量的好处是仿真速度更快.因此,通常情况下,推荐使用信号,可以保证程序的正确性.3.信号的三个重要的行为特性:(1).信号的赋值需要经过一个δ延时,如执行赋值语句A<=D1时,只是启动一个延时为δ的模拟定时器,只有在延时为δ后,A 才能被更新,获得D1的赋值。

vhdl中对变量和信号的理解

vhdl中对变量和信号的理解

vhdl中对变量和信号的理解
在VHDL(VHSIC Hardware Description Language)中,变量(Variable)和信号(Signal)是两种不同的对象,用于在硬件描述中存储和传递数据。

变量(Variable)是一种临时存储数据的对象,用于在过程(Process)或函数(Function)内部进行计算和操作。

变量在创建时分配存储空间,并且其值可以在过程或函数的执行过程中改变。

变量的作用范围限定在所属的过程或函数内部,无法跨过程或函数直接访问。

信号(Signal)是一种用于在不同过程之间传递数据的对象,用于描述组合逻辑电路或时序电路中的信号传输和状态变化。

信号是通过驱动(Driver)和感知(Sensitive)来实现数据的传输和触发。

信号的值可以在不同过程之间传递,并且在下一个时钟周期开始时更新。

信号可以跨过程访问,允许不同过程之间的数据交互。

区分变量和信号的主要区别如下:
- 生命周期:变量的生命周期仅限于所属的过程或函数
内部,而信号的生命周期可以跨过程,并且在每个时钟周期开始时更新。

- 并发访问:信号可以被多个过程同时访问,实现并发
的数据交互;而变量只能在所属的过程或函数内部使用。

- 延迟:由于信号的传播延迟,信号的值在下一个时钟
周期开始时更新;而变量的值可以立即改变。

在VHDL中,根据实际需求,可以选择使用变量或信号来描述和处理数据。

一般来说,变量适用于临时计算和内部操作,而信号适用于在不同过程之间进行数据传输和状态变化。

在设计硬件描述时,需要根据具体的应用场景和设计要求来选择使用变量或信号。

《VHDL电路设计》课件

《VHDL电路设计》课件

VHDL在通信系统中 的应用
介绍VHDL在通信系统中的应用, 如协议解析和信道编码。
VHDL在嵌入式系统 中的应用
了解VHDL在嵌入式系统中的应 用,如控制逻辑和外设接口。
第八章:VHDL工具介绍
1 VHDL设计工具
介绍常用的VHDL设计工具,如Xilinx ISE和 Altera Quartus。
第五章:VHDL综合
1 VHDL综合的基本原理
了解VHDL综合的基本原理,以及综合对电路
介绍VHDL综合的流程和常用的综合技术,帮助优化电路设计。
3 综合后的回路分析和测试
学习如何分析和测试经过综合的电路,确保其功能和性能的正确性。
第六章:VHDL实现
VHDL实现的方法和流程
实体和体系结构
学习VHDL中的实体和体系结构的概念,理解电 路建模的核心原理。
信号和变量
了解VHDL中信号和变量的概念,以及它们在电 路设计中的不同作用。
第三章:VHDL建模
VHDL建模方法
介绍VHDL建模的不同方法,并 提供适用于不同场景的建模技 巧。
单元建模
学习如何使用VHDL进行单元级 建模,以便复用和模块化电路 设计。
《VHDL电路设计》PPT课件
# VHDL电路设计 PPT课件 ## 第一章:简介 - 什么是VHDL电路设计 - 为什么需要学习VHDL - VHDL的起源和发展历程
第二章:基础语法
VHDL的语法结构
了解VHDL的语法结构和基本元素,为电路设计 打下坚实的基础。
数据类型和常量
掌握VHDL中的数据类型和常量的使用,以及它 们在电路设计中的应用。
总结
1 VHDL电路设计的关键技术和应用
总结VHDL电路设计中的关键技术和应用,以 帮助学习者加深理解。

VHDL变量与信号的差异分析及实例

VHDL变量与信号的差异分析及实例

VHDL变量与信号的差异分析及实例1. 变量与信号的比较1.1 赋值方式的不同变量:= 表达式;信号<= 表达式;1.2硬件实现的功能不同信号代表电路单元,功能模块间的互联,代表实际的硬件连线变量代表电路单元内部的操作,代表暂存的临时数据1.3有效范围不同信号(全局量):程序包,实体,结构体变量(局部量):进程,子程序注:在进程和子程序中,信号只能被使用,不能被定义说明1.4赋值行为的不同信号赋值延时更新数值,一般生成时序电路变量赋值立即更新数值,一般生成组合电路1.5信号的多次赋值a, 一个进程中:仅最后一次赋值有效b, 多个进程中:称为多源驱动(如总线结构)能综合成硬件电路的多源驱动有三种:线与,线或,三态2. 变量与信号的比较实例2.1 信号的仿真ARCHITECTURE rtl OF sig ISSIGNAL a,b : STD_LOGIC; --定义信号BEGINPROCESS(a,b)BEGINa <= b;b <= a;END PROCESS;END rtl ;由于信号赋值的延时性(赋新值发生在进程结束时),所以结果是a,b 的值互换------------------------testbench--------------------LIBRARY ieee;USE ieee.std_logic_1164.all;--------------------------------------------ENTITY testbench ISEND testbench;architecture mtest of testbench iscomponent sig ISPORT (clk,rst: IN std_logic;din1,din2: in std_logic_vector(3 downto 0);dout1,dout2: out std_logic_vector(3 downto 0));END component;signal clk: std_logic:='0';signal rst: std_logic;signal din1,din2: std_logic_vector(3 downto 0);signal dout1,dout2:std_logic_vector(3 downto 0);constant clkpd: time:= 20 ns;beginclk<=not clk after clkpd/2;processbeginrst<='1';din1<="0111";din2<="1010";wait for 40 ns;rst<='0';wait;end process;sig_0:sigPORT map(clk=>clk,rst=>rst,din1=>din1,din2=>din2,dout1=>dout1,dout2=>dout2); end mtest;-------------------------------------------signal------------------------------------------ LIBRARY ieee;USE ieee.std_logic_1164.all;--------------------------------------------ENTITY sig ISPORT (clk,rst: IN std_logic;din1,din2: in std_logic_vector(3 downto 0);dout1,dout2: out std_logic_vector(3 downto 0));END sig;ARCHITECTURE rtl OF sig ISSIGNAL a,b : std_logic_vector(3 downto 0); --定义信号BEGINPROCESS(clk,rst)BEGINif(rst='1')thena<=din1;b<=din2;elsif(clk'event and clk='1')thena <= b;b <= a;end if;END PROCESS;dout1<=a;dout2<=b;END rtl ;--------------------------------------------------------------simulation results-------------------------------------------------------------------synthesis results---------------------------A和B都综合出寄存器;A寄存器的输出接至B寄存器的输入;B寄存器的输出接至A寄存器的输入;2.2 变量的仿真ARCHITECTURE rtl OF var ISBEGINPROCESSVARIABLE a,b : STD_LOGIC;--定义变量BEGINa := b;b := a;END PROCESS;END rtl ;由于变量赋值的立即更新,所以结果是a和b的值均为b------------------------------------------variable------------------------------ LIBRARY ieee;USE ieee.std_logic_1164.all;--------------------------------------------ENTITY sig ISPORT (clk,rst: IN std_logic;din1,din2: in std_logic_vector(3 downto 0);dout1,dout2: out std_logic_vector(3 downto 0));END sig;ARCHITECTURE rtl OF sig ISBEGINPROCESS(clk,rst)variable a,b : std_logic_vector(3 downto 0); --????BEGINif(rst='1')thena:=din1;b:=din2;elsif(clk'event and clk='1')thena := b;b := a;end if;dout1<=a;dout2<=b;END PROCESS;END rtl ;------------------------------------simulation results-------------------------------------------------------------------synthesis results---------------------------A综合出寄存器,B没有被综合出寄存器;3. 状态机中的变量和信号3.1 状态机中的赋值采用信号来进行--------------------------------------------LIBRARY ieee;USE ieee.std_logic_1164.all;--------------------------------------------ENTITY string_detector ISPORT ( d,d2, clk, rst: IN std_logic;q: OUT std_logic);END string_detector;--------------------------------------------ARCHITECTURE my_arch OF string_detector ISTYPE state IS (zero, one, two, three);SIGNAL pr_state, nx_state: state;signal t1,t2: std_logic;BEGIN----- Lower section: --------------------PROCESS (rst, clk)BEGINIF (rst='1') THENpr_state <= zero;ELSIF (clk'EVENT AND clk='1') THENpr_state <= nx_state;END IF;END PROCESS;---------- Upper section: --------------- PROCESS (d, pr_state)--variable temp: std_logic_vector(3 downto 0);BEGINt1<=d;CASE pr_state ISWHEN zero =>IF (d='1') THEN nx_state <= one;ELSE nx_state <= zero;END IF;WHEN one =>t1<=d xor d2;IF (d='1') THEN nx_state <= two;ELSE nx_state <= zero;END IF;WHEN two =>t1<=d and d2;IF (d='1') THEN nx_state <= three;ELSE nx_state <= zero;END IF;WHEN three =>t1<='0';IF (d='0') THEN nx_state <= zero;ELSE nx_state <= three;END IF;END CASE;END PROCESS;q <= t1;END my_arch;-----------------------------synthesis results---------------由图可见,由于状态机会综合出寄存器,所以t1这个寄存器被状态机中的寄存器代替了;如果在状态机中采用信号来赋值,那么结果应该是一样的;3.2 状态机中的赋值采用信号来进行--------------------------------------------LIBRARY ieee;USE ieee.std_logic_1164.all;--------------------------------------------ENTITY string_detector ISPORT ( d,d2, clk, rst: IN std_logic;q: OUT std_logic);END string_detector;--------------------------------------------ARCHITECTURE my_arch OF string_detector ISTYPE state IS (zero, one, two, three);SIGNAL pr_state, nx_state: state;BEGIN----- Lower section: --------------------PROCESS (rst, clk)BEGINIF (rst='1') THENpr_state <= zero;ELSIF (clk'EVENT AND clk='1') THENpr_state <= nx_state;END IF;END PROCESS;---------- Upper section: ---------------PROCESS (d, pr_state)--variable temp: std_logic_vector(3 downto 0);variable t1,t2: std_logic;BEGINt1:=d;CASE pr_state ISWHEN zero =>IF (d='1') THEN nx_state <= one;ELSE nx_state <= zero;END IF;WHEN one =>t1:=d xor d2;IF (d='1') THEN nx_state <= two;ELSE nx_state <= zero;END IF;WHEN two =>t1:=d and d2;IF (d='1') THEN nx_state <= three;ELSE nx_state <= zero;END IF;WHEN three =>t1:='0';IF (d='0') THEN nx_state <= zero;ELSE nx_state <= three;END IF;END CASE;q <= t1;END PROCESS;END my_arch;----------------------------------------------------------------------------------3.3 在状态机之外通过增加rst_clk进程来增加寄存器;--------------------------------------------LIBRARY ieee;USE ieee.std_logic_1164.all;--------------------------------------------ENTITY string_detector ISPORT ( d,d2, clk, rst: IN std_logic;q: OUT std_logic);END string_detector;--------------------------------------------ARCHITECTURE my_arch OF string_detector ISTYPE state IS (zero, one, two, three);SIGNAL pr_state, nx_state: state;signal t1,t2: std_logic;BEGIN----- Lower section: --------------------PROCESS (rst, clk)BEGINIF (rst='1') THENpr_state <= zero;ELSIF (clk'EVENT AND clk='1') THENpr_state <= nx_state;END IF;END PROCESS;---------- Upper section: ---------------PROCESS (d, pr_state)--variable temp: std_logic_vector(3 downto 0);BEGINt1<=d;CASE pr_state ISWHEN zero =>IF (d='1') THEN nx_state <= one;ELSE nx_state <= zero;END IF;WHEN one =>t1<=d xor d2;IF (d='1') THEN nx_state <= two;ELSE nx_state <= zero;END IF;WHEN two =>t1<=d and d2;IF (d='1') THEN nx_state <= three;ELSE nx_state <= zero;END IF;WHEN three =>t1<='0';IF (d='0') THEN nx_state <= zero;ELSE nx_state <= three;END IF;END CASE;END PROCESS;-- q <= t1;process(rst,clk)beginif(rst='1')thenq<='0';elsif(clk'event and clk='1')thenq<=t1;end if;end process;END my_arch;-------------------------synthesis results-------------------由上图可见,通过在状态机的process之外增加process(rst,clk)达到了增加寄存器的目的;也就是说,在状态机内部,不能通过改变信号和变量来使一个值被寄存或不被寄存。

数字逻辑第7章 VHDL语言基础

数字逻辑第7章 VHDL语言基础
ENTITY my_design IS IN (d:IN 输入 PORT(d: std_logic_vector(15 PORT(d:IN std_logic_vector(15 DOWNTO 0); 值 ; OUT 不 能 作 为 clk,reset,oe:IN std_logic; OUT clk,reset,oe:IN std_logic; 输出 q:OUT std_logic_vector(15 q:OUT std_logic_vector(15 DOWNTO赋 值 内 容 ; INOUT 0); INOUT INOUT std_logic_vector(15 DOWNTO 0); 不受限制 双向std_logic_vector(15 和BUFFER不受限制 ad:INOUT ad: BUFFERBUFFER std_logic; int:BUFFER std_logic; int: 输出缓冲 as:OUT std_logic); as:OUT std_logic); my_design; END my_design;
主要用于描述数字逻辑电路的结构、行为、功
能和接口
前言
举例二路选择器 VHDL描述 库的调用 传统描述方式 VHDL描述
LIBRARY IEEE;
用与门、非门、 ENTITY MUX2 底 层 或 门 等 具 体 IS 器件来组成
结构体描述
ARCHITECTURE behav OF MUX2 IS
程序包调用 BEGIN
ARCHITECTURE 结构体名 OF 实体号名 IS 定义语句] 信号(signal); [定义语句] 信号(signal); 常数(constant); 常数(constant); 并行处理是 并行处理是 数据类型(type); 数据类型(type VHDL的特点 ); 的特点 函数(function); 函数(function); 元件(component) 元件(component)等; BEGIN 并行处理语句] [并行处理语句]; 结构体名; END 结构体名;

VHDL中的信号与变量

VHDL中的信号与变量

1 常量、 信号与变量的基本概念
常量是全局 , 在结构体描述 、 程序包说明 、 实体 说明、 过程说明、 函数调用说 明和进程说明中使用。常 量在没计描述中保持某一规定类型的特定位不变 , 例 如用来设 汁不同模值 的计数器, 模值存于一常量中, 对
不 同 的设 计 , 改变模 值 仪需 改 变 此 常 景 即 可。应 用 于
维普资讯
第3 2卷第 1 期 1
20 0 6年 1 1月
电 字 工 暖 师
EL C RONI NGI E E T CE NE R
V( . 2 N . l ) 3 0 1 1 NV o6 O .2 0
V L 中的信 号 与变 量 HD
vco( o n ) etr3dw t 0 ; o
r s l :u t lgc e u t o ts o i d
— —
vc r3dw t 0 ) et ( o no ) ; o
e d mi x n n h;

a c i c u e b h v fmi x s r h t t r e a e o n h i e
{r s l < =” 0 0”: e ut 00
在程序 中多次用剑的某个固定值。 信号是一个令局量 , 常在结 构体 中声 明, 明为 声
收 稿 日期 : 0 60 —5; 回 日期 : 0 60 - 。 20 -21 修 20 - 0 4 9
tmp<=” 0 0 ; e 00 ” ②
2 信号与变量区别
如上所述 , 信号与变量在定义 卜 差别不大 , 使用上 有时可以互换而有时却不能。下面依次给H 4 { 个数据
求最小值的 V D H L源程序 , 中将可 以看 出信 号、 从 变 量 的定义和使用方法之不同以及它们对系统的影响。 程序为 :

从仿真语义的角度看VHDL中的信号与变量

从仿真语义的角度看VHDL中的信号与变量

从仿真语义的角度看VHDL中的信号与变量摘要变量和信号是VHDL语言中最为经常使用和最重要的两种数据对象,但是二者在实际的应用中却常常难以区分。

把握二者的特点和区别,并在电路设计中正确应用是成功完成电路设计的重要因素。

本文先是系统地对二者的相似的地方和区别加以论述,然后那么重从仿真语义的角度分析、归纳二者的区别,并通过假设干相似实例程序的仿真波形图、RTL电路显示这一区别。

关键词:VHDL 变量信号赋值延时1VHDL中变量、信号的语法规那么概述在VHDL中,数据对象有三类:变量(VARIABLE)、常量(CONSTANT)和信号(SIGNAL)。

数据对象类似于一种容器,它同意不同数据类型的赋值。

其中的变量、常量和高级程序设计语言如C语言中的变量、常量相类似。

而信号的表现较为特殊,它具有更多的硬件特性,是硬件描述语言所特有的数据对象。

但是,在VHDL的编程中,变量、信号在某些方面既有相同或相似的地方,又有着质的区别,在实际应用中很容易混淆。

从硬件电路系统来看,“变量”和“信号”相当于电路系统中的门与门间的连线和连线上的信号值;从行为仿真和VHDL语句功能上看,“变量”和“信号”具有明显的区别,其不同要紧表此刻同意和维持保证的方式及信息维持和传递的区域大小上。

例如,信号能够设置传输延迟量,而变量那么不能;变量只能作为局部的信息载体。

变量的设置有时只是一种过渡,最后的信息传输和界面间的通信都要靠信号来完成。

1.1变量在VHDL语法规那么中,变量是一个局部变量,只能在进程和子程序中利用。

变量的赋值是一种理想化的数据传输,是当即发生的,不存在任何的延时行为。

其要紧作用是在进程中作为临时的数据存储单元,即用于数据的暂存。

变量概念的一样表述如下:VARIABLE 变量名 : 数据类型 :=初始值 ;例如,要想概念一个名称为A的变量,其数据类型为标准逻辑位类型,初始值为1,其概念表述如下:VARIABLE A : STD_LOGIC :=’1’;尽管变量概念时能够概念初始值,可是综合器并非支持设置初始值。

vhdl 7

vhdl 7

三、数组属性函数(1) 功能:数组属性函数的具体功能是用来返回数组 的边界。 属性种类: ’left(n):得到索引号为n的区间的左端位置号。 ’right(n):得到索引号为n的区间的右端位置号。 ’high(n):得到索引号为n的区间的高端位置号。 ’low(n):得到索引号为n的区间的低端位置号。
三、数组的值类属性(1) 功能: 用来返回一个限定性数组的长度值,该属 性可以用于一维数组和多维数组。 属性种类: ’length:返回限定性数组的长度值,即数组中 元素的个数。
三、数组的值类属性(2) 具体小例子:
TYPE number IS integer RANGE 0 TO 9; TYPE word IS ARRAY (15 0) OF std_logic; TYPE week IS (monday,tuesday,wednesday,thursday, friday,saturday,sunday); number’length = 10 word’length = 16 week’length = 7
二、数据类型属性函数(2) ’succ(数据值):返回数据类型定义中该数据值的 下一个值。 ’pred(数据值):返回数据类型定义中该数据值的 前一个值。 ’leftof(数据值):返回数据类型定义中该数据值 左边的一个值。 ’rightof(数据值):返回数据类型定义中该数据值 右边的一个值。
二、数据类型属性函数(3) 一些常用规律: 1、对于递增区间的同一数据值来说,属性’succ 的值和属性’rightof的值相同,属性’pred的值 和属性’leftof的值相同; 2、对于递减区间的同一数据值来说,属性’succ 的值和属性’leftof的值相同,属性’pred的值和 属性’rightof的值相同。

VHDL设计中变量和信号探讨

VHDL设计中变量和信号探讨

VHDL设计中变量和信号探讨
刘琳;吴维林
【期刊名称】《电脑知识与技术》
【年(卷),期】2014(000)001
【摘要】随着航天产品中越来越广泛使用FPGA器件,熟练掌握VHDL硬件语言对于电路设计显得至关重要。

变量和信号是VHDL语言中最为常用和最重要的两
种数据对象,该文针对变量和信号的重要区别和使用技巧展开了探讨,并结合实际FPGA测试中的实例进行了详细的阐述和仿真验证。

【总页数】4页(P219-222)
【作者】刘琳;吴维林
【作者单位】上海航天电子技术研究所,上海201109;上海航天电子技术研究所,上海201109
【正文语种】中文
【中图分类】TP31
【相关文献】
1.VHDL中的信号与变量比较 [J], 张文
2.VHDL设计中信号与变量问题的探讨 [J], 冯艳娜
3.VHDL设计中信号与变量的使用研究 [J], 黄茜;胡龙
4.数字系统设计中VHDL语言设计问题探讨 [J], 谢正光
5.VHDL中的信号与变量 [J], 杨丹
因版权原因,仅展示原文概要,查看原文内容请购买。

VHDL程序设计中的变量与信号

VHDL程序设计中的变量与信号

V HDL程序设计中的变量与信号张 霞(华中科技大学汉口分校 武汉:430012)α摘 要 针对V HDL教学中有关信号和变量的使用问题进行了分析,说明了在程序设计中正确掌握信号和变量的重要性。

关键词 V HDL 信号 变量 模拟 在V HDL中,数据对象有变量(variab le)、常量(con stan t)和信号(signal)三类。

前两类可以从传统的计算机语言中找到对应的数据类型,其语言行为与高级语言中的变量和常量十分相似;但第三类信号这一数据对象比较特殊,它具有更多的硬件特征是V HDL中最有特色的语言要素之一。

从硬件电路系统来看,“变量”和“信号”相当于电路系统中的门与门间的连线以及连线上的信号值;从行为仿真和V HDL语句功能上看,“信号”与“变量”具有明显的区别,其差异主要表现在接受和保持保证的方式及信息保持和传递的区域大小上。

例如信号可以设置传输延迟量,而变量则不能;“变量”只能作为局部的信息载体,而信号则可以作为模块间的信息载体。

变量的设置有时只是一种过渡,最后的信息传输和界面间的通信都靠“信号”来完成。

在文献[1]《V HDL实用教程》中的第96页,有一个8位奇偶校验逻辑电路的V HDL现象,见p check.vhd源程序。

该程序的结构体中定义了信号tm p,该tm p在进程的循环语句中被多次赋值,尽管该程序能成功地通过编译,但出现警告提示见如图1,因此不能得到正确的模拟波形,其模拟波形见图2。

但如果我们不是在结构体中定义信号tm p,而是在进程中定义一个变量tm p,重新改写8位奇偶校验逻辑电路的V HDL程序为p check.vhd,则可以完全成功地通过编译,并得到正确的模拟波形见图3。

这是因为在V HDL语法规则中,“变量”是一个局部量,其适用范围仅限于定义了“变量”的进程和子程序中,“变量”的值将随“变量”赋值语句的运算图1 p check.vhd的编译结果图2 p check.vhd的模拟波形图3 p check1.vhd的模拟波形而改变,“变量”不能将信息带出对它作出定义的当前设计单元。

第7章节 信号跟变量(2014)

第7章节 信号跟变量(2014)
第7章 信号(Signal)和变量(Variable)
VHDL处理静态数据的两种对象:const和 generic。 VHDL处理非静态数据的两种对象:信号和变量。 常量和信号是全局的,既可以用于顺序代码, 也可用于并发代码; 变量只能在顺序代码中使用,相对于信号而言, 变量只能是局部的,所以变量值不能传递到 process、function和procedure外部。 但是,在有些情况下,选择信号还是变量却是 比较难以抉择的。
8
例:“1”计数器的实现代码:
LIBRARY ieee; USE ieee.std_logic_1164.all; entity count_ones is port ( din: IN std_logic_vector(7 downto 0); ones: OUT integer range 0 to 8); end count_ones; architecture ok of count_ones is variable temp: integer range 0 to 8; begin process (din) begin temp:=0; FOR i IN 0 TO 7 LOOP IF (din(i) =‘1’) then temp:=temp+1; END if; END LOOP; ones<=temp; end process; end ok;
9
7.4 信号和变量的比较 (补充)
1)赋值方式的不同: 变量:= 表达式; 信号 < = 表达式; 2)硬件实现的功能不同: 信号代表电路单元、功能模块间的互联, 代表实际的硬件连线; 变量代表电路单元内部的ຫໍສະໝຸດ 作,代表暂 存的临时数据。10
3)有效范围的不同: 信号:程序包、实体、结构体;全局量。 变量:进程、子程序;局部量。

VHDL中的signal和variable探讨

VHDL中的signal和variable探讨

VHDL中的signal和variable探讨本文通过一个实际的例子来对比和的不同。

HDL代码实现功能:对clk进行计数,当计数值等于4时,输出flag=‘1’;注:利用的综合工具为Synplify Pro V8.1一、采用variable的HDL代码综合后的图点击看原图仿真波形点击看原图二、采用Signal的综合后的RTL图点击看原图仿真波形点击看原图3、试探总结很多书上对变量都有如此的解释:对变量的赋值是当即生效的,不存在延时,而任何信号赋值是存在延时的。

以前就老是想不通,将vhdl语言映射到实际的硬件电路上,怎么可能不存在延时。

从以上的仿真波形图1中,可观察到num=4时,确实当即给出了flag=‘1’,不存在任何延时,与设计用意完全一致。

而仿真波形2中,则可看到必需在clk的rising_edge检测到num=4且通过一小段延时后取得flag=‘1’。

若是仅如此去理解变量的零延迟,就会造成以上的疑惑。

实际上咱们仅需关注的是cnt_num何时为4,在1中,当num=3后,cnt_num+1当即取得执行,只需在第4个clk的上升沿将结果通过寄放器锁存至flag即可。

而在2中,当num=3时,需要1个clk完成加1操作,且需要另一个clk锁存flag至输出,故在第5个clk的rising_edge后才会取得flag=‘1’。

从以上的分析可知,vhdl代码1中的cnt_num <= cnt_num + "0001"的结果能够当即在判断语句IF(cnt_num = "0100")THEN中利用,而vhdl代码2中的cnt_num <= cnt_num + "0001"的结果由于延时的存在在下一个clk的上升沿才能利用。

从而造成了“对变量的赋值是当即生效的,不存在延时”的说法,实际上这只是系统行为上的理解,实际上的延时仍是存在的。

VHDL笔记

VHDL笔记

VHDL笔记1.Error: Run Generate Functional Simulation Netlist (quartus_map newadd --generate_functional_sim_netlist) to generate fun这个是因为运行了功能仿真,默认是时序仿真。

在进行功能仿真前,要生成功能仿真网表的。

在processing菜单下,有个Generate Functional Simulation Netlist 选项,运行下这个之后,在点击开始仿真的按钮就不会报错了2.Error: Can't simulate mismatched node types是由于在两个vhdl文件之间发生重名,而且修改后要重新建立波形文件。

因为原来的变量并未随着程序中修改而改变。

3.在quartus中一个工程包含多个文件时,要仿真一个文件时,把该文件设置成顶层文件!(project中)4.vhdl中变量(variable)和信号(signal)的区别信号(signal)变量(variable)赋值: <= :=定义:在结构体中在进程中适用范围:全局某个进程中延迟:有无赋值:在进程结束时立即赋值注意几点:1、变量是在进程结束的时候赋值,所以你在进程中多次赋值只取最后一次2、因为fpga是个process并行处理,所以一个变量只能在一个进程中赋值,否则会出错。

3、: = 是变量的赋值方式,<=是信号的赋值方式5.VHDL语言怎么生成原理图quartus ii中,当你编写好某一元件的代码后(譬如是一个2选1选择器)按如下操作:①file→New,选block diagram/schematic创建原理图文件,用save as保存一下②回到编写的代码(譬如一个2选1选择器的VHDL代码)页面,选file→create/update→create symbol files for current file,把你编写的代码封装成一个元件。

VHDL语言及程序设计

VHDL语言及程序设计

建议:VHDL比较严谨,Verilog比较自由,初学 还是用VHDL比较好,初学用Verilog会比较容易 出错
hwadee 2014-7-2 2
VHDL中的注意事项
在VHDL语言中,大小写不加区分,但 在代码中巧妙应用大小写,可以使代码 变得易于阅读和规范 实体名必须与VHDL文件名相同,否则 编译会出错 信号与变量,过程与函数的区分
hwadee
2014-7-2
3
VHDL语言程序的基本构成
库、包集合:用于存放预先编译好的程序包 (PACKAGE)和数据集合体,以便不同 的VHDL设计使用 实体说明:规定设计单元的输入输出接口 信号和引脚 构造体:定义设计单元的具体构造和操作
hwadee
2014-7-2
4
VHDL语言程序的基本构成示例
hwadee
2014-7-2
17
IEEE预定义的标准逻辑位与矢量
STD_LOGIC:工业标准的逻辑类型,取值 为‘0’、‘1’、‘Z’、‘X’(强未知)、‘W’ (弱未知)、‘L’(弱0)、‘H’(弱1)、 ‘—’(忽略)、‘U’(未初始化),只有前 四种具有实际物理意义,其他的是为了与模 拟环境相容才保留的 STD_LOGIC_VECTOR:工业标准的逻辑类 型集,STD_LOGIC的组合
hwadee
2014-7-2
11
ARCHITECTURE的PROCESS子结构
PROCESS中的语句是顺序执行的,一个结构体中可以有多个 PROCESS,它们之间可以通过信号进行通信 PROCESS的启动受敏感信号控制,敏感信号的变化会直接导致 PROCESS的启动
hwadee
2014-7-2

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15
例:变量赋值实现循环语句功能 (补充) process(indicator, sig) variable temp : std_logic; begin temp := ‘0’ ; for i in 0 to 3 loop
temp:=temp xor (sig(i) and indicator(i));
end loop ; output <= temp; end process;
16
以上语句等效为: process(indicator, sig) variable temp : std_logic ; begin temp := ‘0’ ; temp :=temp xor (sig(0) and indicator(0)); temp :=temp xor (sig(1) and indicator(1)); temp :=temp xor (sig(2) and indicator(2)); temp :=temp xor (sig(3) and indicator(3)); output <= temp ; end process ;
17
如改为信号,则无法实现原功能: …… signal temp : std_logic; …… process(indicator, sig, temp) begin temp<= ‘0’ ; temp<=temp xor (sig(0) and temp<=temp xor (sig(1) and temp<=temp xor (sig(2) and temp<=temp xor (sig(3) and output <= temp ; end process ;
•包集中:全局; •实体中:对该实体内的所有结构体而言是全局的; •结构体中:结构体内是全局的。
2
7.2 信号
VHDL中‘信号’代表电路单元、功能模块间的硬件连线, 也可表示电路单元的IN/OUT端口;
实体的所有端口都默认为信号,语法结构:
Signal 信号名:type [range][:=初始值]; 注意:当信号用于顺序描述语句如process中时, 其值不是立刻更新的;只有当其所在的process、 函数或过程完成之后才进行更新。
第7章 信号(Signal)和变量(Variable)
VHDL处理静态数据的两种对象:const和 generic。 VHDL处理非静态数据的两种对象:信号和变量。 常量和信号是全局的,既可以用于顺序代码, 也可用于并发代码; 变量只能在顺序代码中使用,相对于信号而言, 变量只能是局部的,所以变量值不能传递到 process、function和procedure外部。 但是,在有些情况下,选择信号还是变量却是 比较难以抉择的。
值不能立即更新,不能在 process的其它代码中继续使用
不能进行同一信号的多次赋值, 要么出错,要么‚线与‛,要 么只考虑最后一次赋值,取决 于编译器 19
例7.3: 方案二:使用变量(OK)
LIBRARY ieee; USE ieee.std_logic_1164.all; entity mux is port ( a, b, c, d, s0, s1: IN std_logic; y: OUT std_logic); end mux; architecture ok of mux is begin process (a, b, c, d, s0, s1) variable sel: integer range 0 to 3; begin sel:=0; if (s0=‘1’) then sel:=sel+1; end if; if (s1=‘1’) then sel:=sel+2; end if; case sel is when 0=>y<=a; when 1=>y<=b; when 2=>y<=c; when 3=>y<=d; end case; end process; end ok;
a. 一个进程:最后一次赋值有效 b. 多个进程:多源驱动 线与、线或、三态
12
例:信号的多次赋值 (补充) architecture rtl of ex is architecture rtl of ex is signal a : std_logic; signal a : std_logic; begin process(…) begin begin process(…) a <= b; begin … end process; a <= b; … process(…) a <= c; begin end process; a <= c; end rtl; ... end process; end ex; 13
7
7.3 变量(variable)
•变量代表电路单元内部的操作,代表暂存的临时数 据。与信号和常量相比,变量仅用于局部的电路描 述,只能用于进程、函数和过程内部。 •注意:对变量的赋值是立即生效的,无需等待进程 结束。新的值可以在下一行代码中立即使用。 •变量的赋值符号‚:=‛,语法结构: variable 变量名:type [range][:=初始值];
值可以立即更新,能够在 pro的DFF
功能描述: D触发器
d DFF clk qbar q
qbar为q的反相输出端。
21
方案1: not_ok
--------------------------------------------------library ieee; use ieee.std_logic_1164.all; -------------------------------------------------entity dff is port( d, clk: IN std_logic; q: BUFFER std_logic; qbar: OUT std_logic ); end dff; ----------------------------------------------architecture not_ok of dff is begin q不能立即更新,导致qbar值 process (clk) 将延后一个时钟周期 begin if (clk’event AND clk=‘1’) then q<=d; qbar<=NOT q; end if; end process; end not_ok; buffer类型输出信号可 ------------------------------------供内部电路使用
例:信号赋值与变量赋值的比较 (补充) 信号赋值: architecture rtl of sig is signal a,b : std_logic; -- 定义信号 begin process(a, b) begin a <= b ; b <= a ; end process ; end rtl ; -- 结果是 a 和 b 的值互换
control<=control+1;
......
--error! 或最后一次有效!
4
例7.1 ‚1‛计数器
•功能描述:计算一个二进制矢量中‘1’的个数
5
实现代码:---错误使用信号的例子
LIBRARY ieee; USE ieee.std_logic_1164.all; entity count_ones is port ( din: IN std_logic_vector(7 downto 0); ones: OUT integer range 0 to 8); end count_ones; architecture not_ok of count_ones is signal temp: integer range 0 to 8; 进程结束后才更新 begin process (din) begin temp<=0; FOR i IN 0 TO 7 LOOP IF (din(i) =‘1’) then temp<=temp+1; END if; END LOOP; ones<=temp; end process; 6 end not_ok;
9
7.4 信号和变量的比较 (补充)
1)赋值方式的不同: 变量:= 表达式; 信号 < = 表达式; 2)硬件实现的功能不同: 信号代表电路单元、功能模块间的互联, 代表实际的硬件连线; 变量代表电路单元内部的操作,代表暂 存的临时数据。
10
3)有效范围的不同: 信号:程序包、实体、结构体;全局量。 变量:进程、子程序;局部量。
14
变量赋值: (补充) architecture rtl of var is begin process variable a,b:std_logic; -- 定义变量 begin a := b ; b := a ; end process ; end rtl; -- 结果是a和b的值都等于b的初值
注意:对变量赋初值的操作也是不可综合的,通常只用于仿真。
8
例:“1”计数器的实现代码:
LIBRARY ieee; USE ieee.std_logic_1164.all; entity count_ones is port ( din: IN std_logic_vector(7 downto 0); ones: OUT integer range 0 to 8); end count_ones; architecture ok of count_ones is variable temp: integer range 0 to 8; begin process (din) begin temp:=0; FOR i IN 0 TO 7 LOOP IF (din(i) =‘1’) then temp:=temp+1; END if; END LOOP; ones<=temp; end process; end ok;
相关文档
最新文档