硬件描述语言与数字系统开发(第4章)-10.ppt

上传人:大张伟 文档编号:8880353 上传时间:2021-01-23 格式:PPT 页数:53 大小:334KB
返回 下载 相关 举报
硬件描述语言与数字系统开发(第4章)-10.ppt_第1页
第1页 / 共53页
硬件描述语言与数字系统开发(第4章)-10.ppt_第2页
第2页 / 共53页
硬件描述语言与数字系统开发(第4章)-10.ppt_第3页
第3页 / 共53页
硬件描述语言与数字系统开发(第4章)-10.ppt_第4页
第4页 / 共53页
硬件描述语言与数字系统开发(第4章)-10.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《硬件描述语言与数字系统开发(第4章)-10.ppt》由会员分享,可在线阅读,更多相关《硬件描述语言与数字系统开发(第4章)-10.ppt(53页珍藏版)》请在三一文库上搜索。

1、硬件描述语言与数字系统开发,第4章 VHDL语言要素,VHDL 的标识符 VHDL 的数据对象 VHDL 的数据类型 VHDL 的运算操作符 VHDL 的关键字 EDA技术常用术语,标识符(identifiers): 可用来为设计实体、构造体、端口及内部信号、变量、常量等参数命名,由英文字母、数字、下划线组成。 书写规则: 标识符中首字母必须是英文字母。 标识符中末字母不能是下划线。 标识符中不允许出现两个连续的下划线。 标识符中不区分字母、数字的大小写。 VHDL语言中的关键保留字不能用作标识符。 VHDL语言中的分隔符由分号“;”构成。 VHDL语言中的注释符由双横线“-”构成。,4.1

2、标识符,_Decoder_1- 起始为非英文字母 2FFT, 74HC245- 起始为数字 Sig_#N, CLR/RST- 符号“#” “/”不能成为标识符的构成 Not-Ack, D10% - 符号“-” “%”不能成为标识符的构成 RyY_RST_- 标识符的最后不能是下划线“_” data_ _BUS - 标识符中不能有双下划线 return , BLOCK - 标识符不能为关键字,Decoder_1 , FFT3 , Sig_N_8 , State0 , I2d_8le6,合法标识符:,非法标识符:,library ieee; use ieee.std_logic_1164.all;

3、 use ieee.std_logic_unsigned.all; entity rglight_cotrl is port(clk1,clk2:in std_logic; timh,timl:out std_logic_vector(3 downto 0); r,g,y:out std_logic); end rglight_cotrl; architecture rtl of rglight_cotrl is signal yy: std_logic; type rgy is (red,green,yellow); begin process(clk1) variable a:std_lo

4、gic; variable state:rgy; variable th,tl:std_logic_vector(3 downto 0);,数据对象(Data Objects): VHDL语言中的数据对象是一个可以赋值的客体,类似于一种容器,可以接受各种数据类型的赋值。 常用的数据对象有常量、变量、信号三大类。 顾名思义,常量用来存放仿真/综合过程中的不变值。 变量位于进程和子程序内部,主要用来暂时存放中间数据,即对中间计算结果或临时数据进行局部贮存。变量只在进程内部是可视的。 信号是VHDL中最具硬件特色语言要素,是内部硬件相互连接的主要机制,它表示把元件的装配端口连在一起的互连线,信号在整

5、个实体内部存放数据、传递信息。,4.2 数据对象,数据对象-常量,常量(关键字constant) 常量在设计描述中保持某一规定类型的特定值不变 常量必须在实体、构造体或进程的说明区域加以说明 常量在定义时赋初值,赋值符号为“:=” 常量说明、赋值语句的一般格式: constant name : : = value;,例: constant allis1: std_logic_vector(2 downto 0):=“111”; constant buswidth: integer:=8;,变量(关键字variable) 仅用于进程和子程序 变量的赋值符号为“:=” 必须在进程和子程序的说明性区

6、域说明 不能表达连线和存储元件 变量说明、赋值语句的一般格式: variable name : ; name : = value;,例: variable va, vb: std_logic_vector(7 downto 0); va:=“00101110”; vb(7 downto 4):= va(3 downto 0);,数据对象-变量,变量的赋值,VARIABLE temp : STD_LOGIC_VECTOR (7 downto 0); 整体赋值:temp := “10101010”;temp := x”AA” ; (1076-1993) 逐位赋值:temp(7) := 1; 多位赋

7、值temp (7 downto 4) := “1010”;,信号(关键字signal) 信号用于声明内部信号,而非外部信号(in, out, inout, buffer) 信号在元件之间起互联作用,可代表连线。 信号赋值符号为“ signal name : ; name value;,例: signal x, y: integer range 0 to 100; signal halfsum: std_logic_vector(7 downto 0); X=15; Y= x+10; Halfsum =“00001111”;,数据对象-信号,信号的赋值,SIGNAL temp : STD_LOG

8、IC_VECTOR (7 downto 0); 整体赋值:temp = “10101010”;temp = x”AA” ; 逐位赋值:temp(7) = 1; 多位赋值: temp (7 downto 4) = “1010”;,注意: 信号与变量的赋值符号是不同的。 信号与变量的作用范围是不同的。 信号与变量的综合效果是不同的。,数据对象中的信号与变量,例: variable v_abc: std_logic_vector(2 downto 0); signal s_abc: std_logic_vector(2 downto 0); v_abc := “000”; s_abc = “000”

9、;,ARCHITECTURE,SIGNAL 描述,label1: PROCESS1,VARIABLE 描述,label2: PROCESS2,VARIABLE 描述,信号与变量的作用范围,library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity rglight_cotrl is port(clk1,clk2:in std_logic; timh,timl:out std_logic_vector(3 downto 0); r,g,y:out std_logic); end rglight

10、_cotrl; architecture rtl of rglight_cotrl is signal yy: std_logic; type rgy is (red,green,yellow); begin process(clk1) variable a:std_logic; variable state:rgy; variable th,tl:std_logic_vector(3 downto 0);,LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF3 IS PORT ( CLK,D1 : IN STD_LOGIC ; Q1

11、: OUT STD_LOGIC ) ; END ; ARCHITECTURE bhv OF DFF3 IS SIGNAL A,B : STD_LOGIC ; BEGIN PROCESS (CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN A = D1 ; B = A ; Q1 = B ; END IF; END PROCESS ; END ;,B,A,LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF3 IS PORT ( CLK,D1 : IN STD_LOGIC ; Q1 : OUT STD_LOGI

12、C ) ; END ; ARCHITECTURE bhv OF DFF3 IS BEGIN PROCESS (CLK) VARIABLE A,B : STD_LOGIC ; BEGIN IF CLKEVENT AND CLK = 1 THEN A := D1 ; B := A ; Q1 = B ; END IF; END PROCESS ; END ;,信号与变量的区别,数据类型(Data Types): 规定数据对象的特征和取值 范围,用它们可建立简单的或者复杂的数据对象。,4.3 数据类型,常用数据类型,标准数据类型(10种)整数类型、实数类型、位、位矢量等 用户定义类型枚举类型、数组类型

13、等,VHDL是与类型高度相关的语言,不允许将一种数据类型赋予另一种数据类型,若对不同类型的信号进行赋值需使用类型转换函数。 VHDL含有很宽范围的数据类型,常用数据类型分为:,标准-整数类型,关键字:INTEGER 范围为:-214783647到214783647(231-1) 需要综合时,要对范围加以限制例如:VARIABLE Tmp : Integer := 255,SIGNAL count :integer range 0 to 255 count = count + 1,标准-实数类型,关键字:REAL 范围为:-1.0E38到1.0E38 很多综合器不支持该类型,标准-自然数类型,关

14、键字:NATURAL 范围为:0到到214783647(231-1) 大于等于0的正整数,是整数的一个子集,标准-位类型,关键字:BIT 范围为:只有2种取值:0和1,表示2种状态 与整数类型中的0、1不同 与布尔类型中的0、1不同,标准-位矢量类型,关键字:BIT_VECTOR 位矢量是用双引号括起来的一组位数据,可用来表示总线状态 位矢量需后跟范围说明指定矢量长度 (TO、DOWNTO) 位矢量前可加符号标记进制(B、O、X) 位矢量可分段操作,标准-布尔类型,关键字:BOOLEAN 范围为:只有2种状态:0和1,表示 “真”和“假” ,用于关系运算和逻辑判断(IF) 与整数类型中的0、1

15、不同,没有数值的含义 与位类型中的0、1也不同,标准-字符类型,关键字:CHARACTER 字符是用单引号括起来的一个字母、数字、 空格或特殊符号 字符区分大小写,B与b不同 字符1与整数1不同,没有数值的含义 字符1与位类型中的1也不同,关键字:STRING 字符串是用双引号括起来的一个字符序列,用于程序提示或结果说明 字符串区分大小,写“RANGE”与 “range”不同,标准-字符串类型,关键字:TIME 范围为:-214783647到214783647(231-1) 时间类型可用来指定延时时间和标定仿真时刻 一个完整的时间类型包含整数和单位两部分,且整数和单位间应留有一个空格位 时间是

16、一物理量数据,单位为: fs,ps,ns,us,ms,sec,min,hr,标准-时间类型,标准-错误等级,关键字:SEVERITY LEVEL 范围为:NOTE(注意),WARNING(警告),ERROR(出错),FAILURE(失败) 错误等级用于提示系统当前的工作状态及严重等级,自定义-枚举类型,关键字:TYPE 一般格式: TYPE 数据类型名 IS (元素1,元素2.); 枚举类型常用于定义状态机的状态,例如: TYPE States IS (S1,S2,S3,S4); type traffic is (red,green,blue); signal present_state, n

17、ext_state: traffic;,例如: TYPE Std_logic IS (U,X,0,1,Z,W,L,H,_); 而 Std_logic_Vector 是 std_logic的组合,属工业标准的逻辑类型 如: data: in std_logic_vector(7 downto 0); 则data表示8根数据线。 如给data赋值5AH可写为: data=“01011010”;或data=X “ 5A”(X表示16进制)。,自定义-枚举类型,初值,不定,高阻,弱不定,弱低,弱高,不可能,STD_LOGIC_VECTOR类型定义如下: TYPE STD_LOGIC_VECTOR IS

18、 ARRAY ( NATURAL RANGE ) OF STD_LOGIC ;,自定义-物理类型,关键字:TYPE 一般格式: TYPE 数据类型名 IS 范围; 例如: TYPE T IS RANGE 1E18 TO 1E18;UNITS fs;ps=1000fs;ns=1000ps;us=1000ns;ms=1000us;sec=1000ms;min=60sec;hr=60min;END UNITS;,不同数据类型间的转换,VHDL语言对数据类型有着极为严格的分类和定义,不同类型的数据、对象不能随意赋值、代入,必要时,应进行类型转换。 常用的数据类型转换方法有二: 类型标记法与函数转换法,

19、如:a=real(b) - 将integer转换为real; 如:to bit(a) / bit_vector(a) - 将std_logic(矢量)转换为bit(矢量); 如:to std_logic(a) / std_logic_vector(a) - 将bit(矢量)转换为 std_logic(矢量); 如:conv std_logic_vector(a,位长) -将integer,unsigned转换为std_logic_vector; 如:conv integer - 将std_logic_vector,unsigned转换为integer。 前3个转换函数在ieee库的std_lo

20、gic_1164程序包中; 后2个转换函数在ieee库的std_logic_arith及std_logic_unsigned程序包中。,std库/ieee库中的程序包,library ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; ENTITY add_arith_4 IS PORT (A, B : IN std_logic_vector (3 downto 0); cin: IN std_logic; S : OUT std_logic_vect

21、or (3 downto 0); cout : OUT std_logic); END add_arith_4; ARCHITECTURE behave OF add_arith_4 IS begin,process(a,b,cin) variable a_v,b_v: integer range 0 to 15; variable s_v: integer range 0 to 31; variable cin_v: integer range 0 to 1; begin if (cin=1) then cin_v:=1; else cin_v:=0; end if; a_v:=conv_i

22、nteger(a); b_v:=conv_integer(b); s_v:=a_v+b_v+cin_v; if (s_v=16) then s_v:=s_v-16; cout=1; else cout=0; end if; s=conv_std_logic_vector(s_v,4); end process; END behave;,4.4 运算操作符,VHDL为构造计算数值的表达式提供的预定义算符。预定义算符可分为四种类型: 算术运算符 关系运算符 逻辑运算符 连接运算符,算术运算符,关系运算符,逻辑运算符,其他运算符,VHDL操作符列表1,VHDL操作符列表2,VHDL操作符列表3,运算

23、优先级,*ABSNOT */MODREM +正-负 +- -b、c 相与后向a赋值,a、b、c的数据类型同属4位长的位矢量 d=e OR f OR g ; - 两个操作符OR相同,不需括号 h=(i NAND j)NAND k ; - NAND不属上述三种算符中的一种,必须加括号 l=(m XOR n)AND(o XOR p); - 操作符不同,必须加括号 h=i AND j AND k ; - 两个操作符都是AND,不必加括号 h=i AND j OR k ; - 两个操作符不同,未加括号,表达错误 a=b AND e ; - 操作数b 与 e的位矢长度不一致,表达错误 h=i OR l ;

24、 - i 的数据类型是位STD_LOGIC,而l的数据类型是 . - 布尔量BOOLEAN,因而不能相互作用,表达错误,逻辑运算举例,连接运算符举例,连接符 entity 3_8ymq is port(a,b,c,g1,g2,g3:in std_logic; y:out std_logic_vector(7 downto 0); end 3_8ymq; architecture rtl of 3_8ymq is signal cba: std-logic-vector(2 to 0); begin cbayyyyyyyyy=XXXXXXXX“ ; end case; else y=“11111111” end if; end process; end ;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1