2.48k likes | 2.76k Views
第三章 硬件描述语言 VHDL. 3.1 概述 3.2 VHDL 语言设计单元的基本结构 3.3 VHDL 语言的语言要素 3.4 VHDL 语言的描述语句 3.5 VHDL 语言的库、程序包及配置 3.6 有限状态机设计技术. 3.1 硬件描述语言与 VHDL. HDL: Hardware Description Language VHDL── VHSIC Hardware Description Language ┖─Very High Speed Integrated Circuit
E N D
第三章 硬件描述语言VHDL 3.1概述 3.2VHDL语言设计单元的基本结构 3.3 VHDL语言的语言要素 3.4VHDL语言的描述语句 3.5VHDL语言的库、程序包及配置 3.6 有限状态机设计技术
3.1 硬件描述语言与VHDL • HDL: Hardware Description Language • VHDL── VHSIC Hardware Description Language ┖─Very High Speed Integrated Circuit • IEEE国际标准:IEEE std 1076-1987, 1076-1993, 2个版本 • 包括模拟电路的扩充版本 VHDL-AMS ( AMS -- Analog and Mixed Signal )
VHDL描述范围 • 系统级: C 或C的扩展:SystemC, SpecC • 行为算法级 • 寄存器传输级RTL: AHPL, DDL, CDL • 逻辑级LDL: GFHL, ndl, … • 开关级: Splice • 电路级: Spice • 版图级:制版语言 CIF, LEF, DEF VHDL-AMS VERILOG VHDL EDIF
3.2 VHDL语言设计单元的基本结构3.2.11个实体+ 若干个结构体 • 设计单元的概念 • 设计单元的构成 • 实体Entity; 结构体Architecture 模块接口 Entity Architectures 行为 描述 1 行为 描述 2 结构 描述 1 数据流 描述
X SUM CARRY Y 例 3.1:半加器 1. 实体(entity) entity Half_Adder is port ( X: in bit ; Y: in Bit ; Sum : out bit ; Carry : Out bit) ; end Half_adder;
2. 结构体 A1 Architecture A1 of Half_Adder is Begin Process(x,y) begin if x=‘0’ and y=‘0’ then sum<=‘0’;carry<=‘0’; Elsif x=‘1’ and y=‘1’ then sum<=‘0’;carry<=‘1’; Else sum<=‘1’;carry<=‘0’; End if; End process; End A1;
3. 结构体 A2 Architecture A2 of Half_Adder is component XOR2 port ( I1, I2: in BIT; Out1: out BIT); end component; component AND2 port ( I1, I2: BIT; Out1: out BIT); end component; begin A: XOR2 port map (X, Y, Sum); B: AND2 port map (X, Y, Carry); end A2;
4. 结构体 A3 Architecture A3 of Half_Adder is begin Sum <= X xor Y after 5 ns; Carry <= X and Y after 5 ns; end A3;
3.2.2 完整的VHDL设计结构 1. 一个完整的VHDL设计单元(设计文件),通常包括: ■实体说明(Entity) ■结构体(Architecture) ■配置(Configuration) ■库(Library)和程序包(Package)
2. VHDL设计单元的结构 组成 库、程序包 实体说明 结构体 进程 或其他并行结构 设计单元 配置
3.设计实体举例 【例 3.2】试用VHDL语言设计一个四选一数据选择器。 数据输入:D3 D2 D1 D0 数据输出:Y 选择控制:S1 S0
VHDL程序如下: 库 LIBRARY IEEE; --IEEE库 USE IEEE.STD_LOGIC_1164.ALL; ---程序包 USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY mux41 IS---定义实体名 PORT ( S1, S0: IN STD_LOGIC; ---定义输入信号 D3, D2, D1, D0: IN STD_LOGIC; Y: OUT STD_LOGIC ---定义输出信号 ); END mux41; ARCHITECTURE behaveior OF mux41 IS---定义结构体名 BEGIN ---逻辑功能描述 Y<=D0 WHEN S1=‘0’ AND S0=‘0’ ELSE D1 WHEN S1=‘0’ AND S0=‘1’ ELSE D2 WHEN S1=‘1’ AND S0=‘0’ ELSE D3; END behaveior; 程序包 实体说明 结构体
4. VHDL设计单元中各结构 的作用 库:是用来存放已设计好的程序包、数据集合体、元件的仓库,供用户进行VHDL设计时调用。 程序包:用VHDL语言编写的共享文件,定义了将要使用的常数、数据类型、子程序和设计好的电路单元等。 实体说明:定义电路单元的输入、输出引脚信号。以标识符ENTITY开始,以END结束。 结构体:用来描述电路内部结构和逻辑功能。并以标识符ARCHITECTURE开头,以END结尾。
3.2.3 实体说明 1. 实体说明格式 entity实体名is [端口说明]; [类属参数说明]; end实体名;
2. 实体名标识符命名规则 • 由字母、数字、下划线字符组成 • 第一个字符必须是字母 • 不能有相邻的下划线字符,最后一个字符不能是下划线 • 不区分大小写 • VHDL程序保存文件名必须与实体名相同
端口说明格式 Port (端口名{,端口名}:方式 数据类型名; 端口名{,端口名}:方式 数据类型名); 类属参数说明 generic (名称:数据类型:=参数值);
端口模式的符号: IN端口模式: INOUT端口模式: BUFFER端口模式: OUT端口模式:
类属(generic)声明 • 指定一些参数,例如时间参数,尺寸参数等。 • 该模块被调用时从外部传入参数值。 • 参数值为本实体所属的所有结构体使用。 • 传入的类属参数作为常量使用,在使用时不能修改。
entity mux is port(in1,in2,sel: in bit ; output : out bit ); generic (delay : time:=5 ns); end mux ;
3.2.4 VHDL语言的结构体 结构体是设计实体的核心,它具体指明了设计实体的行为、元件及内部连接关系。 结构体所承担的任务: ① 定义结构体内部所使用的各项元素; ② 通过VHDL提供的语句来描述设计实体所要求的具体行为和功能; ③ 描述各元件之间的连接。
常数说明 结 构 体 说 明 数据类型说明 信号说明 结 构 体 例化元件说明 子程序说明 块语句 结 构 体 功 能 描 述 进程语句 信号赋值语句 子程序调用语句 元件例化语句 3.2.4 VHDL语言的结构体 结构体内部构造的描述层次和描述内容:
3.2.4 VHDL语言的结构体 结构体由两个基本部分组成: ①结构体说明,用来对数据类型、常数、信号、子程序和元件等进行说明。 ② 结构体功能描述,用来描述设计实体的逻辑行为,可以用不同的描述风格来表达设计实体的逻辑功能。
3.2.4 VHDL语言的结构体 1. 结构体的基本格式 ARCHITECTURE结构体名 OF实体名 IS [结构体说明语句;] BEGIN [功能描述语句;] END [ARCHITECTURE] [结构体名];
3.2.4 VHDL语言的结构体 2. 结构体说明语句 用于定义结构体中所用的数据对象和子程序,并对所引用的元件加以说明,如: ●信号(SIGNAL) ●类型(TYPE) ●常数(CONSTANT) ● 元件(COMPONENT) ●函数(FUNCTION) ●过程(PROCEDURE)
3.2.4 VHDL语言的结构体 块语句 结 构 体 功 能 描 述 进程语句 信号赋值语句 子程序调用语句 元件例化语句 3. 功能描述语句 用于描述实体的逻辑功能。 功能描述语句结构可以含有五种不同类型。
3.2.4 VHDL语言的结构体 3. 功能描述语句 ① 块语句(BLOCK) 块语句结构是由若干个并行执行语句构成的组合体,其功能是将结构体中的并行语句包装在一起,组成一个或多个模块(即子模块)。 ② 进程语句(PROCESS) 定义顺序语句模块,其内部为顺序语句,将从外部获得的信号值,或内部的运算数据向其他信号进行赋值。 ③ 信号赋值语句(SIGNAL) 用来将设计实体内的处理结果向所定义的信号或界面端口进行赋值。
3.2.4 VHDL语言的结构体 3. 功能描述语句 ④ 子程序调用语句 由过程(PROCEDURE)和函数(FUNCTION)组成,其内部是顺序语句。用来调用过程和函数,并将结果赋值给信号。 ⑤ 元件例化语句(COMPONENT) 元件例化语句用来调用另一个设计实体所描述的电路。调用时,元件例化语句对其他的设计实体做元件调用说明,并将元件的端口与其他元件、信号或高层设计实体的界面端口进行连接。
结构体说明 例:architecture behaviour of mux is begin if sel=‘1’then output<=in1 after delay; else output<=in2 after delay; end behaviour;
3.3 VHDL语言要素 3.3.1 VHDL语言数据类型 3.3.2 VHDL运算符 3.3.3 数据对象
3.3.1 VHDL语言的数据类型 • 标量类型:整数类型,浮点类型,物理类型 枚举类型 • 数值型数据说明的一般形式: type 数据名称 is <数据类型定义> <约束范围> • 例: • type byte is range –127 to 127; • type num is integer range 0 to 9; • type resistance is range 1 to 10e8 units ohm; kohm=1000 ohm; end units;
文 字 类 型 整数:2,10E6 , 16#D2# 浮点:357.6, 8#43.2#e+5 字符:‘a’ 字符串:“sd89” 位串:B“110111” , O“712” , X”8BD” 物理: 1 kohm , 5 ns
枚举类型 • 枚举类型的定义格式 type 数据名称 is (元素,元素,......); 元素由标识符或文字组成 例:type boolean is (false,true); type two_level_logic is (‘0’,’1’);
复合类型 • 记录:异构复合类型,记录的元素可以是 不同类型 • 数组:同构复合结构,记录的元素具有 同一类型
记 录 • 记录的定义格式: type记录名称 is record 元素名:数据类型名; 元素名:数据类型名; ........ end record; 例:type pctbus is record adder : std_logic_vector(31 downto 0); data : std_logic_vector (0 to 31); end record;
数 组 • 限定性数组:确定每维的数据类型与范围 type 数组名 is array 范围 of 原数据类型 type word is array (15 downto 1) of bit • 非限定性数组:只确定数据类型不确定范围 type 数组名 is array(下标类型 range<>)of 原数据类型 type bit_vector is array (natural range<>) of bit; type string is array (positive range<>) of character;
子 类 型 • 通过对某个类型说明加以限制,定义该类型值域的一个子集。 格式:subtype 子类型名称 is 子类型说明 范围限制: subtype lower_letter is character range ‘a’ to ’z’; 下标限制: subtype register is bit_vector (0 to 7); 不加限制: subtype ascii is character;
2. VHDL的预定义数据类型 在标准程序包(STANDARD)中预先定义的数据类型,在实际使用中能自动包含在VHDL的源文件中。 (使用这些类型的数据时不用打开及调用对应的程序包) 分为:布尔数据类型 位数据类型 位矢量数据类型 字符数据类型 整数数据类型 自然数数据类型 正整数数据类型 实数数据类型 字符串数据类型 时间数据类型 错误等级数据类型
2. VHDL的预定义数据类型 (1)布尔(BOOLEAN)数据类型 二值枚举型数据类型,常用于关系运算和逻辑判断。 布尔数据量包括逻辑“假(FALSE)”和逻辑“真(TRUE)”两种取值。 TYPE BOOLEAN IS (FALSE,TRUE); 例如,在IF A>B语句中,若A>B成立,则布尔数据量为TRUE,否则布尔数据量为FALSE。 若某个信号或变量被定义为布尔数据,则在仿真中将自动对其赋值进行核查。 布尔数据没有数值的含义,不能进行算术运算,只能用于关系运算和逻辑判断。
2. VHDL的预定义数据类型 (2)位(BIT)数据类型 位数据类型也属于二值枚举型,通常用来表示信号的取值。 它的取值只有“0”和“1”。 定义格式: TYPE BIT IS (‘0’,‘1’); 位数据类型的数据对象为信号和变量,可以进行逻辑运算,其结果仍为位数据类型。
2. VHDL的预定义数据类型 (3)位矢量(BIT_VECTOR)数据类型 位矢量是基于位数据类型的数组,常用来表示总线的状态。 位矢量是用双引号括起来的数字序列,如“1011”,X“00EA”。 其中,“<>”表示数据范围未定界。 定义格式: TYPE BITVECTOR IS ARRAY (NATURAL RANGE < >) OF BIT; 规则:使用位矢量必须注明位宽,即数组中的元素个数和排列。 例如:SIGNAL b: BITVECTOR(0 TO 7); 定义b由b(0)~b(7)构成的矢量,左为b(0),右为b(7);
2. VHDL的预定义数据类型 (4)字符(CHARACTER)数据类型 字符数据类型是用单引号括起来的ASCII码字符,如‘X’、‘y’、‘6’、‘3’等。 定义格式: TYPE CHARACTER IS(ASCII码字符表中的全部字符); 规则:①字符型数据用单引号括起来; ②字符型数据的字母有大小写之分; ③字符型数据仅包括ASCII码字符表中的全部字符。
2. VHDL的预定义数据类型 (5)字符串(STRING)数据类型 字符串数据类型是用双引号括起来的字符序列,是由字符型数据组成的数组,也称字符矢量或字符串数组。 常用于程序的提示和说明。 定义格式: TYPESTRINGISARRAY(POSITIVERANGE < >)OFCHARACTER; 例如:“A BOY.”,“10101011”。
2. VHDL的预定义数据类型 (6)整数(INTEGER)数据类型 整数数据类型与数学中的整数定义相同。 包括:正整数、负整数和零。 取值范围:32位带符号数原码,-(231-1)~+(231-1) 即 -2147483647 ~ +2147483647。 定义格式: TYPE INTEGER IS RANGE -2147483647 TO +2147483647; 规则:①整数不能作为矢量,不能单独对某一位进行操作; ②整数不能用于逻辑运算,只能用于算术运算。 整数可以用进制来表示。 整数可以用来抽象地表达总线的状态。 如:15,10E3,16#D5#,2#11011010#,8#653#。
2. VHDL的预定义数据类型 (7)正整数(POSITIVE)数据类型 正整数数据类型是整数数据类型的子类型,是不包括0的正整数。 取值范围:32位带符号数原码,1~(231-1), 即 1~2147483647 定义格式: SUBTYPE POSITIVE IS INTEGER RANGE 1 TO INTEGER’HIGH; 其中,INTEGER’HIGH是数值类属性, 表示整数的上限值231-1。
2. VHDL的预定义数据类型 (8)自然数(NATURAL)数据类型 是整数数据类型的子类型,即非负的整数。 包括:0和正整数。 定义格式: SUBTYPE NATURAL IS INTEGER RANGE 0 TO INTEGER’HIGH;
2. VHDL的预定义数据类型 (9)实数(REAL)数据类型 实数数据类型类似于数学中的实数,也称为浮点数数据类型,只能在仿真中使用。 取值范围:-1.0E+38 ~ +1.0E+38 由正号、负号、小数点和数字组成。 例如:-2.5、-1.0E8。 定义格式: TYPE REAL IS RANGE -1.0E38TO+1.0E38;
2. VHDL的预定义数据类型 (10)时间(TIME)数据类型 用来表示时间的数据类型,由整数数据和单位两部分组成,取值范围是整数所定义的范围,仅在系统仿真时,用来表示信号延时的时间,不能用于逻辑综合。 例如:55 ms,20 ns。 定义格式: TYPE TIME IS RANGE –2147483647 TO 2147483647
2. VHDL的预定义数据类型 (10)时间(TIME)数据类型 units fs; --飞秒(10-15S) ps=1000fs; --皮秒 ns=1000ps; --纳秒 us=1000ns; --微秒 ms=1000us; --毫秒 sec=1000ms;--秒 min=60sec; --分 hr=60min; --时 END units;
2. VHDL的预定义数据类型 (11)错误等级(SEVERITY_LEVEL) 错误等级数据用于表征系统的工作状态。 包括:NOTE(注意),WARNING(警告), ERROR(出错),FAILURE(失败)。 在仿真过程中,可输出这4种值来提示被仿真系统当前的工作状态。 定义格式: TYPEseverity_levelIS(note,warning,error,failure);