完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
VHDL语言的程序结构与数据类型
第2节 VHDL语言的程序结构与数据类型 [学习要求] 掌握VHDL硬件描述语言的基本语法和源文件的结构,学会用VHDL硬件描述语言设计典型数字逻辑电路。 [重点与难点] 重点:VHDL语言的程序结构;VHDL语言的数据类型及数据对象。 难点:VHDL的数据对象中的变量和信号的区别。 [理论内容] 一、VHDL的程序结构 图1 VHDL的程序结构图 图1中是VHDL的全部结构,但实际上并不需要全部的结构,就像在许多设计项目中,大部分工程师只用到VHDL其中的30%的语法。通常图2的结构才是基本和必需的。 USE定义区 ENtiTY定义区 ARCHITECTURE定义区 图2 VHDL程序的基本结构 由于VHDL已是IEEE规定的标准,所以只是CPLD、FPGA等芯片公司,它们都会提供这个标准的定义库(Library IEEE),而且由于这里面写了许多的定义和参数,初学者一时之间也不容易全部了解,所以全部写上以减轻负担,后面的章节的程序默认也这么写。 程序如: USE IEEE.STD_LOGIC_1164.ALL; 代表本程序引用IEEE标准定义库的STD_LOGIC_1164全部定义。 VHDL语言编写是属于自由格式,所以在一个完整命令叙述写完时,必须为它加上“;”,作为前后命令的分界,如上述的Use定义命令。程序的注释采用“--” Entity部分是用来定义电路的输入和输出所用。定义区的命令格式为: Architecture部分是描述这个电路的功能部分,其书写的语法因具体电路的功能而定,下一节将详细介绍。_ 以下是一个简单的例子: library ieee; --采用ieee标准库 use ieee.std_logic_1164.all; --使用其中的定义包,以后照着写即可 use IEEE.STD_LOGIC_UNSIGNED.all; --同上 use IEEE.STD_LOGIC_ARITH.all; --同上 entity test is --定义实体名 port( --以下是定义输入输出端口 pin1 : in std_logic; --pin1为输入端口,数据类型为std_logic pin2 : in std_logic; --同上 pin3 : out std_logic --pin3为输出端口,数据类型为std_logic ); --端口定义完成 end test; --实体描述完成 architecture behavior of test is --定义结构体 begin --结构体开始 pin3<=pin1 and pin2; --该语法表示将pin1和pin2相与送至pin3 end behavior; --结构体描述完成 其实VHDL语言在书写上和高级语言的描述十分相似(风格更似于Ada语言),与C语言的比较如图3所示,大家不要把它看得很神秘。VHDL语言本质上区别于高级语言是,作为硬件的描述语言其语句具有一定的硬件特性,但描述过程却像软件的方式。 VHDL语言的编写、编译和调试方式与前面所介绍的图形方式基本类似,这里不再介绍,相信大家会很快熟悉。 #include int sample(int foo) { int bar; bar=0; while(bar return(bar); } library ieee; use ieee.std_logic_1164.all; entity sample is port( foo: in integer range 0 to 3; ret: out integer ranger 0 to 3 ); end sample architecture behavior of sample is begin process(foo) variable bar : integer range 0 to 3; begin bar:=0; label1: while bar end loop label1; ret:=bar; end process; end behavior; 图3 C语言与VHDL语言的比较 二、VHDL语言的基本数据类型 在数字电路里的信号大致可分成逻辑信号和数值信号,而针对VHDL所提供的基本数据类型而言,可进行如下分类。 1、逻辑信号 ⑴ 布尔代数(Boolean) VHDL的布尔代数信号定义是:Type BOOLEAN is (FALSE,TRUE); 也就是说它的信号形式包含两种:FALSE,TRUE。在应用上可以资助这种信号来代表某种动作是否完成,即代表某种情况的标志信号。 ⑵ 位(Bit) VHDL的位信号定义是:Type Bit is (‘0’,’1’); 也就是说它的信号形式包含两种:0,1类型。 这种信号类型0可视为数字电路里所谓的低电位,而1代表高电位。 ⑶ 标准逻辑(Std_Logic) 在VHDL的“标准逻辑”信号形式定义是: ⑷ 逻辑序列信号 以数字电路而言,有许多时侯是将几个信号全成一组代表特定功能的骗子列信号,例如:数据总线(Data Bus)、地址总线(Address Bus)等。实际上从电路的观点上,图4里的CE信号看成一条信号,而Data信号是由8条线合的排线信号。 图4 序列信号在电路上的表示意义 VHDL针对这种序列信号的表示,提供了以下功能: Bit_Vector : 位序列 Std_Logic_Vector : 标准逻辑序列 两种逻辑序列,以方便在程序设计上的处理。例如针对图4的信号定义,则可写成以下的程序: Signal Data : std_logic_vector(7 downto 0); --数据输出 Signal Address : std_logic_vector(0 to 3); --地址 Signal CE : std_logic; --电路使能 由上述表示可知,Data信号共由8条线组俣而成(因为是7至0),而且依照它的定义,第1条线应是Data(7),第2条线应是Data(6),然后依序第8条线是Data(0)。而对于Address序列信号的定义是“0 TO 3”,所以第1条是Address(0),第2条是Address(1),然后最后是Address(3)。在序列信号的表示时,除了序列的范围大小须注意外,还须特别留意序列的编号须序。 ⑸ 序列信号的分解与合并 在序列信号的处理上,VHDL的语法是接爱分解与合并,以图5而言,它们在处理的命令语句上,可以写成下面的程序,其中“&”符号代表执行信号合并动作。 图5序列信号的分解与合并 ⑹ 逻辑信号的运算 配合逻辑信号的基本运算符,通常包含有两种:逻辑运算与关系运算。具体的运算如下表中所示。 2、数值信号 一般来说,在VHDL的程序里,将信号定义成数值,这是为了方便作数值方面的运算,比如说“模6计数器”、“10分频器”等。所以有了这样的数值信号,后续作加减等运算就盯对容易许多。 ⑴ 整数(Integer) VHDL的整数信号形式定义为: type Integer is ragne -2147483648 to 2147483647。 实际上一个整数是由32位的BIT_VECTOR构成,所以数值围也可以看成是从-231~231-1。 不过通常不会用到这么大的数值,这时若不考虑适当调整其范围,将造成硬件的不必要的浪费。数值范围的限制方法,是以range…to…命令来达成。例如,下面A、B、C信号的定义,原本都是32位的整数,但经range…to…命令的限制结果,将有效控制B,C的位长 度。 数据类型讨论,接着来说明 VHDL 所提供的几种数据对象。 常数,是希望该常数所代表的数据部分不会被改变,如此一业, 三、VHDL 的数据对象 有了上一部分的基本 不这这里所谓的数据,是依该数据对象被定义成何种数据类型来区分。这样的数据对象共分成三种:常数(Constant)、信号(Signal)和变量(Variable)。下面开始讨论,如何定义这些数据对象与它们的使用范围。 1、常数(Constant) 将数据对象定义为 程序的可读性和维护性就会相对提高。 定义语法: Constant 常数名称: 数据类型:=设置值 e)长的常数,可分别烈军 stant Zero_4 : std_logic_vector(3 downto 0) :=”0000”; ”; 2、信号( 数据对象,是为了指定电路内部某一节点。而这种 “信号”的数据对 nal 信号名称:数据类型:=设置值; --设置值可省略不写。 管脚, F 对象。 图 6 “信号”数据对象 D 和 E 信号的定义一般在架构 A 出现在方块(BLOCK)或过 ( 用于过程(Process)里,它的使用通常只是为了程序运算的方便, 比如定义一个4位(Nibble)长的常数和一个8位(Byt 属成: Con Constant Zero_8: std_logic_vector(7 downto 0):=”00000000 Signal) 定义“信号”的 象的定义方式是: 定义语法: Sig 比如图6的方块来表示一个CPLD或FPGA,这时A、B、C是视为电路的输入 而是输出管脚。这时的D、E就是所谓的电路内部节眯,也就是这里定义的“信号”数据 RCHITECTURE处,当然也可以 程PROCESS)等中。 3、变量(Variable) 这种数据对象仅限 而且它和信号(Signal)对象在电路上的最大不同点是,它并不代表实际电路的某一组件值却是一条信号线的物理意义,所以它在运算处理上,会有立即的结果。而信号对象却是代表电路的寄存器效果。这一点请大家仔细体会。
k6tg90f4.pdf
(260.93 KB, 下载次数: 22
)
|
|
相关推荐
2 个讨论
|
|
1421 浏览 1 评论
1215 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1426 浏览 0 评论
913 浏览 0 评论
2229 浏览 0 评论
1429 浏览 34 评论
5615 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 12:47 , Processed in 0.856095 second(s), Total 45, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号