第3章1 VHDL语言基本结构和语言要素_第1页
第3章1 VHDL语言基本结构和语言要素_第2页
第3章1 VHDL语言基本结构和语言要素_第3页
第3章1 VHDL语言基本结构和语言要素_第4页
第3章1 VHDL语言基本结构和语言要素_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第三章 硬件描述语言(VHDL) 第一部分 基本结构和语言要素,2,掌握VHDL程序设计约定 掌握VHDL程序基本结构 库、程序包、实 体和结构体 掌握VHDL语言要素文字规则、数据对象、 数据类型和操作符, 本章教学目的与要求,3,VHDL程序基本结构 VHDL语言要素, 本章教学重点, 本章教学难点,VHDL程序基本结构 VHDL语言要素数据对象和数据类型,4, 本章教学方法, 本章学时,4学时,本章采用讲授为主,自学为辅的教学方法。对重点内容,课堂上要讲解透彻,课下布置一定的作业,使学生加深对内 容的理解并牢固掌握;对难点内容,通过举例加以分析,深入浅出,举一反三,理论联系实际,使学

2、生能学会学懂,为以后进一步学习打下基础。,5,VHDL: VHSIC (Very High Speed Integrated Circuit) Hardware Description Language,3.1 概述,一、什么是VHDL?,6,80年代初由美国国防部在实施超高速集成电 路(VHSIC)项目时开发的。 1987年由 IEEE 协会批准为 IEEE 工业标准, 称为 IEEE1076-1987。 各EDA公司相继推出支持VHDL的设计环境。 1993年被更新为 93 标准,即IEEE1076-1993。 进一步提高抽象描述层次,扩展系统描述能力。,二、VHDL的历史,7,1、VHD

3、L打破软、硬件的界限 传统的数字系统设计分为: 硬件设计(硬件设计人员) 软件设计(软件设计人员) VHDL是电子系统设计者和 EDA工具之间的界面。,三、VHDL的作用,EDA工具及 HDL的流行,使电子系统向集 成化、大规模和高速度等方向发展。 美国硅谷约有80%的 ASIC和 FPGA/CPLD 已采用 HDL进行设计。,8,2、VHDL与C、C+的比较: C、C+ 代替汇编等语言 VHDL 代替原理图、逻辑状态图等,3、VHDL与电原理图描述的比较: VHDL具有较强的抽象描述能力,可进行系统 行为级别的描述。描述简洁,效率高。 VHDL描述与实现工艺无关。 电原理图描述需给出完整、具

4、体的电路结构 图,不能进行抽象描述。描述繁杂,效率低。 电原理图描述与实现工艺有关。,9,1、VHDL具有强大的语言结构,系统硬件描述能 力强、设计效率高;具有较高的抽象描述能力。 如:一个可置数的16位计数器的电原理图:,四、VHDL语言特点,10,用VHDL描述的可置数16位计数器:,11,2、VHDL语言可读性强,易于修改和发现错误。 3、VHDL具有丰富的仿真语句和库函数,可对 VHDL源代码进行早期功能仿真,有利于大 系统的设计与验证。 4、VHDL设计与硬件电路关系不大。 5、VHDL设计不依赖于器件,与工艺无关 。 6、移植性好。 7、VHDL体系符合TOP-DOWN和CE(并行

5、工程)设计 思想。 8、VHDL设计效率高,产品上市时间快,成本低。 9、易于ASIC实现。,12,五、VHDL与其它硬件描述语言的比较,VHDL: 具有较强的系统级抽象描述能力,适合行为级和 RTL级的描述。设计者可不必了解电路细节,所作工作较少,效率高。但对综合器的要求高,不易控制底层电路的生成。IEEE标准,支持广泛。,行为级,RTL级,门电路级,RTL: Register Translate Level,13,Verilog HDL : 系统级抽象描述能力比VHDL稍差;门级开关电路描述方面比 VHDL 强。适合 RTL级和门电路级的描述。设计者需要了解电路细节,所作工作较多。IEEE

6、标准,支持广泛。,ABEL、PALASM、AHDL(Altera HDL):,系统级抽象描述能力差,一般作门级 电路描述。要求设计者对电路细节有详细的了解。对综合器的性能要求低,易于控制电路资源。支持少。,14,VHDL主要用于描述数字系统的结构、行 为、功能和接口。 VHDL将一个设计(元件、电路、系统) 分为: 外部(可视部分、端口) 内部(不可视部分、内部功能、算法),六、VHDL设计简述,15,外部与内部:,器件或 子系统,ARCHITECTURE Process Process,ENTITY,Sequential Process,Combinational Process,ports

7、,ports,component,ports,ports,16,2选1选择器的VHDL描述:,17, 一般,VHDL语言对字母大小写不敏感;例外 、“ ”所括的字符、字符串; 每条VHDL语句由一个分号(;)结束; VHDL语言对空格不敏感,增加可读性; 在“-”之后的是VHDL的注释语句,不参加编译和综合; 命名不能用保留关键字构成; 用户所定义的变量名和实体名必须以字母为开头; 在MAXPLUS中,存盘文件名必须与设计的实体名相同; 为了便于程序的阅读与调试,书写程序时,使用层次缩进格式,同一层次的对齐,低层次的,较高层次的缩进两个字符。,VHDL语言的一些相关约定:,18,基本结构包括:

8、 实体(Entity) 结构体(Architecture) 配置(Configuration) 库(Library)、程序包(Package),3.2 VHDL程序基本结构,19,库、程序包,实体(Entity),结构体 (Architecture),进程 或其它并行结构,配置(Configuration),20,一、实体(说明) 实体(说明): 定义系统的输入输出端口 语法:,ENTITY IS Generic Declarations Port Declarations END ; (1076-1987 version) END ENTITY ; ( 1076-1993 version),

9、21,1、类属说明 类属说明: 确定实体或组件中定义的局部常数。模 块化设计时多用于不同层次模块之间信息的 传递。可从外部改变内部电路结构和规模。 类属说明必须放在端口说明之前。,Generic ( 常数名称:类型 := 缺省值 常数名称:类型 := 缺省值 );,22,类属常用于定义: 实体端口的大小、 设计实体的物理特性、 总线宽度、 元件例化的数量等。 例: entity mck is generic(width: integer:=16); port(add_bus:out std_logic_vector (width-1 downto 0); ,23,例:2输入与门的实体描述 en

10、tity and2 is generic(risewidth: time:= 1 ns; fallwidth: time:= 1 ns); port(a1: in std_logic; a0: in std_logic; z0: out std_loigc); end entity and2; 注:数据类型 time 用于仿真模块的设计。 综合器仅支持数据类型为整数的类属值。,24,其中,端口模式: in: 输入型,此端口为只读型。 out: 输出型,只能在实体内部对其赋值。 inout:输入输出型,既可读也可赋值。 buffer: 缓冲型,与 out 相似,但可读。,Port ( 端口名称,

11、端口名称:端口模式 数据类型; 端口名称,端口名称:端口模式 数据类型 );,2、端口声明,端口声明:确定输入、输出端口的数目和类型。,25,out 和 buffer 的区别:,26,指端口上流动的数据的表达格式。为预先定 义好的数据类型。 如:bit、bit_vector、integer、 std_logic、std_logic_vector 等。 例: entity nand2 is entity m81 is port ( port( a,b:in bit; a:in bit_vector(7 downto 0); z: out bit sel:in bit_vector(2 downt

12、o 0); ) ; b:out bit); end entity nand2; end entity m81;,3、数据类型:,27,作用:定义系统(或模块)的行为、元件及内部 的连接关系,即描述其逻辑功能。 两个组成部分: 对数据类型、常数、信号、子程序、元件等 元素的说明部分。 以各种不同的描述风格描述的系统的逻辑功 能实现的部分。常用的描述风格有:行为描 述、数据流描述、 结构化描述。,二、结构体,28,29,实体与结构体的关系:,设计实体,结构体1,结构体2,结构体3,结构体n,。 。 。,一个设计实体可有多个结构体,代表实体的多种实现方式。各个结构体的地位相同。,30,注:同一实体的

13、结构体不能同名。定义语句中的 常数、信号不能与实体中的端口同名。,architecture 结构体名称 of 实体名称 is 说明语句内部信号、常数、 数据类型、子程序(函数、过程)、 元件等的说明; begin 并行处理(功能描述)语句; end architecture 结构体名称;,结构体的语法:,31,例:结构体中错误的信号声明,32,例:一个完整描述(3 bit 计数器),33,3bit计数器的等效描述(out与buffer的区别):,34,与Out 端口比,Buffer端口具有回读功能,也即内部反馈,但在设计时最好不要使用buffer,因为buffer类型的端口不能连接到其他类型的

14、端口上,无法把包含该类型端口的设计作为子模块元件例化,不利于大型设计和程序的可读性。若设计时需要实现某个输出的回读功能,可以通过增加中间信号作为缓冲,由该信号完成回读功能。,注:out与buffer的区别总结:,35,双向端口Inout是四种端口类型中最为特殊的一种,最难以学习和掌握,为此专门提供一个简单程序进行阐述,部分程序如下:control,in1为in,x为out,q为inout模式。,process(control,q,in1) begin if(control=0)then x=q; else q=in1;x=“ZZZZZZZZ”; end if; end process;,pro

15、cess(control,q,in1) begin if(control=0)then x=q;q=“ZZZZZZZZ”; else q=in1;x=“ZZZZZZZZ”; end if; end process;,关于双向端口INOUT的使用总结:,36,三、配置,设计实体,结构体1,结构体2,结构体3,结构体n,。 。 。,一个设计实体的多种实现方式,配置:从某个实体的多种结构体描述方式中选择 特定的一个。,37,configuration 配置名 of 实体名 is for 选配结构体名 end for ; end 配置名;,简单配置的语法:,38,library ieee; use i

16、eee.std_logic_1164.all; entity nand is port(a: in std_logic; b: in std_logic; c: out std_logic); end entity nand; architecture art1 of nand is begin c=not (a and b); end architecture art1;,例:一个与非门不同实现方式的配置如下:,39,architecture art2 of nand is begin c=1 when (a=0) and (b=0) else 1 when (a=0) and (b=1)

17、else 1 when (a=1) and (b=0) else 0 when (a=1) and (b=1) else 0; end architecture art2;,40,configuration first of nand is for art1; end for; end first; configuration second of nand is for art2 end for; end second;,41,例:一个对计数器实现多种形式的配置如下:,42,43,程序包: 已定义的常数、数据类型、元件调用说明、子程序的一个集合。 目的:方便公共信息、资源的访问和共享。 库:

18、多个程序包构成库。,四、 程序包、库,44,程序包说明的内容: 常量说明; VHDL数据类型说明; 元件说明; 子程序说明; 程序包的结构包括: 程序包说明(包首) 程序包主体(包体),45,包声明项可由以下语句组成: use 语句(用来包括其它程序包); 类型说明;子类型说明;常量说明; 信号说明;子程序说明;元件说明。,package 程序包名 is 包说明项 end 程序包名;,1、程序包说明(包首),语法:,46,例:程序包说明,47,包体说明项可含: use 语句;子程序说明;子程序主体;类型说明;子类型说明;常量说明。,package body 程序包名 is 包体说明项 end

19、程序包名;,2、程序包包体,程序包的内容:子程序的实现算法。 包体语法:,48,程序包首与程序包体的关系: 程序包体并非必须,只有在程序包中要说明 子程序时,程序包体才是必须的。 程序包首可以独立定义和使用。如下:,49,package seven is subtype segments is bit_vector(0 to 6); type bcd is range 0 to 9; end seven; library work; use work.seven.all; entity decoder is port(input: in bcd; drive: out segments); e

20、nd decoder; architecture art of decoder is begin,50,with input select drive=B“1111110” when 0, B“0110000” when 1, B“1101101” when 2, B“1111001” when 3, B“0110011” when 4, B“1011011” when 5, B“1011111” when 6, B“1110000” when 7, B“1111111” when 8, B“1111011” when 9, B“0000000” when others; end archit

21、ecture art;,a,b,c,d,e,f,g,51,3、库的种类 VHDL库可分为 5种: 1)IEEE 库 定义了四个常用的程序包: std_logic_1164 (std_logic types ,library 库名;,use 库名程序包名项目名 use 库名程序包名All;,57,2 选 1 选择器:,58,2选1的另一种描述,59,VHDL程序设计举例(1 位全加器的设计),1设计思路 全加器可以由两个1位的半加器构成,而1位半加器可以由如图所示的门电路构成。,60,2. VHDL源程序 1) 或门的逻辑描述 - IEEE库的使用说明 LIBRARY IEEE; USE IEE

22、E.STD_LOGIC_1164.ALL; -实体OR2的说明 ENTITY OR2 IS PORT(A,B:IN STD_LOGIC; C:OUT STD_LOGIC); END ENTITY OR2; -实体OR2的结构体ART1的说明 ARCHITECTURE ART1 OF OR2 IS BEGIN C=A OR B; END ARCHITECTURE ART1;,61,2) 半加器的逻辑描述 - IEEE库的使用说明 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -实体H_ADDER的说明 ENTITY H_ADDER IS PROT(A,B:

23、IN STD_LOGIC; CO,SO:OUT STD_LOGIC); END ENTITY H_ADDER; - 实体H_ADDER的结构体ART2的说明 ARCHITECTURE ART2 OF H_ADDER IS BEGIN SO=(A OR B) AND (A NAND B); CO=NOT (A NAND B); END ARCHITECTURE ART2;,62,3) 全加器的逻辑描述 - IEEE库的使用说明 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -实体F_ADDER的说明 ENTITY F_ADDER IS PORT(AIN,B

24、IN,CIN:IN STD_LOGIC; COUT,SUM: OUT STD_LOGIC); END ENTITY F_ADDER; -实体F_ADDER的结构体ART3的说明 ARCHITECTURE ART3 OF F_ADDER IS -元件调用声明 COMPONENT H_ADDER PORT(A,B:IN STD_LOGIC; CO,SO:OUT STD_LOGIC); END COMPONENT;,63,COMPONENT OR2 PORT(A,B:IN STD_LOGIC; C: OUT STD_LOGIC); END COMPONENT; SIGNAL S1,S2,S3:STD

25、_LOGIC; -元件连接说明 BEGIN U1:H_ADDER PORT MAP(A=AIN,B=BIN,CO=S1,SO=S2); U2:H_ADDER PORT MAP(A=S2,B=CIN,CO=S3,SO=SUM); U3:OR2 PORT MAP(A=S1,B=S3,C=COUT); END ARCHITECTURE ART3;,64,四类语言要素: 数据对象(Data Object) 数据类型(Data Type) 操作数(Operands) 操作符(Operator),3.3 VHDL语言要素,65,一、VHDL文字规则 1、数字型文字 1)整数文字:十进制整数 如:5,678

26、,156E2(=15600), 45_234_287 (=45234287) 2)实数文字:带小数的十进制数 如:23.34,2.0,44.99E-2(=0.4499) 8_867_551.23_909(8867551.23909),66,3)以数制基数表示的文字 格式: 如:10#170#(=170) 2#1111_1110#(=254) 16#E#E1(=2#1110_0000# =224) 或:(=1416=224) 16#F.01#E+2 (=(15+1/(1616)1616=3841.00),基数#数字文字#E指数,67,4)物理量文字 如:60 s、100 m、 177 mA 注:

27、整数可综合实现; 实数一般不可综合实现; 物理量不可综合实现;,68,2、字符串型文字(文字串和数字串) 按字符个数多少分为: 字符:用单引号引起来的ASCII字符,可以 是数值,也可以是符号或字母。 如:A,*,Z 字符串:用双引号引起来的一维字符数组,69,字符串分为: 1)文字字符串:“文字” 如:“ERROR”, “XXXXXXXX”, “ZZZZZZZZ”, “X”, “BOTH S AND Q EQUAL TO L”。,70,2)数位字符串: 称为位矢量,代表二进制、八进制、十六进 制的数组。其位矢量的长度为等值的二进制数的 位数。 格式: 其中基数符号有三种: B:二进制基数符号

28、。 O:八进制基数符号,每一个八进制数 代表一个3位的二进制数。,基数符号 “数值”,71,X:十六进制基数符号,每一个十六进制数代表 一个4位的二进制数。 如: B“1_1101_1110”:二进制数数组,长度为9 O“34” : 八进制数数组,长度为6 X“1AB”: 十六进制数数组,长度为12,72,基本标识符的要求(87标准): 以英文字母开头; 不连续使用下划线“_”; 不以下划线“_”结尾; 由26个大小写英文字母、数字0-9及 下划线“_”组成的字符串。,3、标识符 定义常数、变量、信号、端口、子程序或 参数的名字。,73,基本标识符中的英文字母不分大小写; VHDL的保留字不能

29、作为标识符使用。,合法标识符,_Decoder_1、 2FFT、 Sig_#N、 Not-Ack、 ALL_RST_、 data_BUS、 return、 entity,my_counter、 Decoder_1、 FFT、 Sig_N、 Not_Ack、 State0、 entity1,不合法标识符,74,扩展标识符(93标准): 以反斜杠来界定,免去了87标准中基本标 识符的一些限制。 可以以数字打头, 允许包含图形符号, 允许使用VHDL保留字, 区分字母大小写等。 如:74LS163、 Sig_#N、 entity、ENTITY,75,4、下标名及下标段名 下标名:用于指示数组型变量或

30、信号的某一个 元素。 格式: 下标段名:用于指示数组型变量或信号的某一 段元素。 格式: 如:a : std_logic_vector(7 downto 0) a(7), a(6) a(0) a(7downto0), a(7 downto 4), a(5 downto 3),标识符(表达式),标识符(表达式 to/downto 表达式),76,二、数据对象 三种对象:常量(Constant) 变量(Variable) 信号(Signal) 三种对象的物理含义: 常量代表数字电路中的电源、地、恒定逻 辑值等常数; 变量代表暂存某些值的载体,常用于描述 算法; 信号代表物理设计中的某一条硬件连接线

31、, 包括输入、输出端口。,77,三种对象的特点及说明场合: 信号:全局量, 用于architecture、 package、entitiy。 变量:局部量,用于process、function、 procedure。 常量:全局量,可用于上面两种场合。,78,1、常量说明 常量说明:对某一个常量名赋予一个固定的值。 格式: 例: constant data:bit_vector(3 downto 0):=“1010” constant width: integer: = 8; constant x: new_bit: = x; 常量数据类型必须与表达式的数据类型一致。,constant 常数名

32、:数据类型:= 表达式;,79,常量的可视性(作用范围):,库、程序包,实体(Entity),结构体1,进 程1,结构体2,进 程2,常量是全局量,其作用范围取决于常量被定义的位置。,80,2、变量说明 变量是一个局部量,只能在进程和子程序中 定义、使用。其作用范围仅限于定义了变量的进 程和子程序中。 格式: 例: variable a, b : bit; variable count:integer range 0 to 255:= 10; 变量的初值可用于仿真,但综合时被忽略。,variable 变量名:数据类型 约束条件:= 表达式;,81,3、信号说明 电子硬件系统运行的基本特性: 各

33、部分电路工作的并行特性; 信号传输过程中的延时特性; 多驱动源的总线特性; 时序电路中触发器的记忆特性等。 信号是电子系统内部硬件连接和硬件特性的抽象表示。用来描述硬件系统的基本特性。 格式:,signal 信号名:数据类型 约束条件: 表达式;,82,例: signal a, b : bit; signal init : integer := -1; signal s1: std_logic := 0; signal s2: std_logic_vector(15 downto 0); 注:a. 综合时初值被忽略。 b. 信号是全局量。可在结构体、实体、块中 说明和使用信号。 c. 在进程和

34、子程序中只能使用信号,不能说 明信号。,83,84,信号与变量的区别,architecture rtl of start is signal count : integer range 0 to 7; begin process(clk) begin if (clkevent and clk=1) then count = count + 1; if(count=0) then carryout = 1; else carryout = 0; end if; end if; end process; end rtl;,architecture rtl of start is begin pro

35、cess(clk) variable count : integer range 0 to 7; begin if (clkevent and clk=1) then count := count + 1; if(count=0) then carryout = 1; else carryout = 0; end if; end if; end process; end rtl;,85,例:进程中信号与变量的使用,entity ex is port(.); end ex; architecture arch_ex of ex is signal a, b :std_logic; begin p

36、rocess(a, b) variable c, d : std_logic; begin c:= a + b; d:= a - b; end process; end arch_ex;,86,信号与端口的区别: 除没有方向说明外,信号与 实体的“端口 (PORT)” 概念相似。端口是一种隐形的信号。 entity exam is port(signal a, b: in std_logic; signal c: out std_logic); end exam; 端口是一种有方向的信号。即输出端口不能 读出数据,只能写入数据;输入端口不能写入数 据,只能读出数据。 信号本身无方向,可读可写。

37、,87,常数、信号和变量是VHDL中最主要的对象,分别代表一定的物理意义。 常数对应于数字电路中的电源或地; 信号对应某条硬件连线; 变量通常指临时数据的局部存储。 信号和变量功能相近,用法上却有很大不同。,关于信号和变量的使用总结:,88,信号:赋值有延迟;具有全局性,可存在于多个进程中;信号不能给变量赋值; 变量:赋值无延迟,立即变化;只能在某个进程或子程序中有效;变量可以给信号赋值; 对于变量赋值操作无延迟,初学者认为这个特性对VHDL设计非常有利,但这只是理论上的。基于以下几点原因,建议编程时还是应以信号为主,尽量减少变量的使用。,89,1、变量赋值无延时是针对进程运行而言的,只是一个

38、理想值,对于变量的操作往往被综合成为组合逻辑的形式,而硬件上的组合逻辑必然存在输入到输出延时。当进程内关于变量的操作越多,其组合逻辑就会变得越大越复杂。假设在一个进程内,有关于变量的3个级连操作,其输出延时分别为5ns,6ns,7ns,则其最快的时钟只能达到18ns。相反,采用信号编程,在时钟控制下,往往综合成触发器的形式,特别是对于FPGA芯片而言,具有丰富的触发器结构,易形成流水作业,其时钟频率只受控于延时最大的那一级,而不会与变量一样层层累积。假设某个设计为3级流水作业,其每一级延时分别为10ns,11ns,12ns,则其最快时钟可达12ns。因此,采用信号反而更能提高设计的速度。,90

39、,2、由于变量不具备信息的相关性,只有当前值,因此也无法在仿真时观察其波形和状态改变情况,无法对设计的运行情况有效验证,而测试验证工作量往往会占到整个设计7080的工作量,采用信号则不会存在这类问题。 3、变量有效范围只能局限在单个进程或子程序中,要想将其值带出与其余进程、子模块之间相互作用,必须借助信号,这在一定程度上会造成代码不够简洁,可读性下降等缺点。,91,三、VHDL数据类型 VHDL是一种强数据类型语言。 要求设计实体中的每一个常数、信号、变量、 函数以及设定的各种参量都必须具有确定的数据类 型,并且相同数据类型的量才能互相传递和作用。 VHDL数据类型分为四大类: 标量类型(SC

40、ALAR TYPE); 复合类型(COMPOSITE TYPE); 存取类型(ACCESS TYPE); 文件类型(FILES TYPE),92,又分为: 预定义数据类型、 用户自定义数据类型 1、VHDL的预定义数据类型 1)布尔量(boolean) 布尔量具有两种状态:false 和 true 常用于逻辑函数,如相等(=)、比较() 等中作逻辑比较。 如,bit 值转化成boolean 值: boolean_var := (bit_var = 1);,93,2)位(bit) bit 表示一位的信号值。 放在单引号中,如 0 或 1。 3)位矢量 (bit_vector) bit_vecto

41、r 是用双引号括起来的一组位数据。 如: “001100” X“00B10B” 4)字符(character) 用单引号将字符括起来。 variable character_var : character; . . Character_var : = A;,94,5)整数(integer) integer 表示所有正的和负的整数。硬件实现时, 利用32位的位矢量来表示。可实现的整数范围为: -(231-1) to (231-1) VHDL综合器要求对具体的整数作出范围限定, 否则无法综合成硬件电路。 如:signal s : integer range 0 to 15; 信号 s 的取值范围是

42、0-15,可用4位二进制数表 示,因此 s 将被综合成由四条信号线构成的信号。,95,6)自然数(natural)和正整数(positive) natural是integer的子类型,表示非负整数。 positive是integer的子类型,表示正整数。 定义如下: subtype natural is integer range 0 to integerhigh; subtype positive is integer range 1 to integerhigh;,96,7)实数(REAL) 或称浮点数 取值范围:-1.0E38 - +1.0E38 实数类型仅能用于VHDL仿真器,一般综合

43、器 不支持。 8)字符串(string) string 是 character 类型的一个非限定 数组。用双引号将一串字符括起来。如: variable string_var : string(1 to 7); string_var := “Rosebud”;,97,9)时间(TIME) 由整数和物理单位组成 如:55 ms,20 ns 10)错误等级(SEVERITY_LEVEL) 仿真中用来指示系统的工作状态,共有四种: NOTE(注意)、 WARNING(警告)、 ERROR(出错)、 FAILURE(失败),98,2、IEEE预定义标准逻辑位与矢量 1)std_logic 类型 由 i

44、eee 库中的std_logic_1164 程序 包定义,为九值逻辑系统,如下: (U,X,0,1,Z,W,L,H,-) U:未初始化的, X:强未知的, 0:强0, 1:强1, Z:高阻态, W:弱未知的, L:弱0, H:弱1, -:忽略,99,由 std_logic 类型代替 bit 类型可以完成电 子系统的精确模拟,并可实现常见的三态总线电路。 2)std_logic_vector 类型 由 std_logic 构成的数组。定义如下: type std_logic_vector is array(natural range) of std_logic; 赋值的原则:相同位宽,相同数据类

45、型。,100,bit 或其矢量形式bit_vector只有0和1两种状态,数字电路中也只有0和1两种逻辑,因此会给初学者一个误区,认为采用位(矢量)则足够设计之用,而不必像std_logic那样出现X,U,W各种状态,增加编程难度。但实际情况却并非如此,以一个最简单D型触发器设计为例 process(clk) begin if clkevent and clk=1 then Q=D; end if; end process; 实际中clk对数据端D的输入有一定的时间限制,即在clk上升沿附近(建立时间和保持时间之内),D必须保持稳定,否则Q输出会出现亚稳态,如下图所示。,关于位(矢量)与逻辑(

46、矢量)的使用总结:,101,当clk和D时序关系不满足时,由于bit只有0或1,系统只能随机的从0和1中给Q输出,这样的结果显然是不可信的;而采用std_logic类型,则时序仿真时会输出为一个X,提醒用户建立保持时间存在问题,应重新安排D和clk之间时序关系。此外,对于双向总线设计(前面已提及)如果没有Z,X等状态,根本无法进行设计和有效验证。,102,3、用户自定义类型 用户自定义类型是VHDL语言的一大特色。 可由用户定义的数据类型有: 枚举类型、 整数和实数类型、 数组类型、 记录类型、 子类型,103,用类型定义语句TYPE和子类型定义语句 SUBTYPE实现用户自定义数据类型。 T

47、YPE语句格式: 例:type byte is array(7 downto 0) of bit; variable addend : byte; type week is (sun, mon, tue, wed, thu, fri, sat);,type 数据类型名 is 数据类型定义 of 基本数据类型;,104,SUBTYPE语句格式: 例: subtype digits is integer range 0 to 9; 由subtype 语句定义的数据类型称为子类型。,subtype 子类型名 is 基本数据类型 约束范围;,105,1)枚举类型 枚举该类型的所有可能的值。格式: 如:

48、type std_logic is(U,X,0,1, Z,W,L,H,-) 如:type color is(blue,green,yellow, red); type my_logic is (0, 1, U, Z); variable hue : color; signal sig : my_logic; hue := blue; sig = Z;,type 类型名称 is (枚举文字,枚举文字);,106,枚举类型的编码: 综合器自动实现枚举类型元素的编码,一 般将第一个枚举量(最左边)编码为0,以后的 依次加1。编码用位矢量表示 ,位矢量的长度 将取所需表达的所有枚举元素的最小值。 如:

49、type color is(blue,green,yellow,red); 编码为: blue=“00”; green=“01”; yellow=“10”; red=“11”;,107,2)整数类型 用户定义的整数类型是标准包中整数类型的子范围。格式: 例:type my_integer is integer range 0 to 9; 3)数组类型 数组:同类型元素的集合。VHDL支持多维数组。 多维数组的声明: type byte is array(7 downto 0) of bit; type vector is array(3 downto 0) of byte; 限定数组、非限定数

50、组、属性:,type 类型名称 is range 整数范围;,108,限定数组: 其索引范围有一定的限制。 格式: 非限定数组:数组索引范围被定义成一个类型范围。 格式: 例:type bit_vector is array(integer range ) of bit; variable my_vector:bit_vector (5 downto -5);,type 数组名 is array(数组范围) of 数据类型;,type 数组名 is array(类型名称 range ) of 数据类型;,109,属性: VHDL为多种类型定义了属性。 语法如下: 对象属性 VHDL为数组预先定

51、义的属性: left right high low length range reverse_range,110,对应变量: variable my_vector : bit_vector (5 downto -5); 各属性如下: my_vectorleft 5 my_vectorright -5 my_vectorhigh 5 my_vectorlow -5 my_vectorlength 11 my_vectorrange (5 downto -5) my_vectorreverse_range (-5 to 5),111,4)记录类型 记录是不同类型的名称域的集合。 格式如下: 访问记

52、录体元素的方式:记录体名.元素名,type 记录类型名 is record 元素名:数据类型名; 元素名:数据类型名; end record;,112,例: constant len:integer:= 8 ; subtype byte_vec is bit_vector(len-1 downto 0); type byte_and_ix is record byte : byte_vec; ix : integer range 0 to len; end record ; signal x, y, z : byte_and_ix ; signal data : byte_vec ; sign

53、al num : integer ; . x.byte = “11110000” ; x.ix = 2 ; data = y.byte ; num = y.ix ; z = x ;,113,5)子类型 子类型是已定义的类型或子类型的一个子集。 格式: 例: bit_vector 类型定义如下: type bit_vector is array (natural range ) of bit; 如设计中只用16bit;可定义子类型如下: subtype my_vector is bit_vector(0 to 15); 注:子类型与基(父)类型具有相同的操作符和子 程序。可以直接进行赋值操作。,

54、subtype 子类型名 is 数据类型名范围;,114,4、数据类型转换 VHDL是一种强类型语言,不同类型的数据 对象必须经过类型转换,才能相互操作。 1)类型转换函数方式 通过调用类型转换函数,使相互操作的数据对 象的类型一致,从而完成相互操作。,115,library ieee; library dataio; use ieee.std_logic_1164.all; use dataio.std_logic_ops.all; entity cnt4 is port(clk: in std_logic; p: inout std_logic_vector(3 downto 0); end cnt4; architecture behv of cnt4 is begin process(clk) begin if clkevent and clk=1 then p=to_vector(2, to_integer(p)+1); end if; end process; end behv;,116,2)直接类型转换方式 对相互间非常关联的数据类型(如整

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论