第八章VHDL可综合性(2011)
发布时间:2021-06-08
发布时间:2021-06-08
第八章 VHDL的可综合性主讲人:徐向民教授
1/99
本章目录 VHDL语言结构向硬件的映射 VHDL类型 VHDL对象运算符顺序语句并行语句
2/99
VHDL语言结构向硬件的映射 EDA工业界普遍认为,有效的VHDL建模风格是控制综合结果最为有力的手段。 为了建立有效的VHDL代码,设计师应了解VHDL语言结构与综合结果的关系。 应该指出的是,由于综合算法的不同,对于同样的硬件描述,不同的CAD综合工具可能会得到不同的综合结果。
VHDL语言在创立时,主要是为了满足仿真的需要。自从VHDL被用于综合以来,都是对VHDL的子集进行处理,这就是所谓的可综合的VHDL子集。不同综合工具支持的可综合子集不尽相同,通常有如下要求:
(1)延时描述(after语句、 wait for语句)等被忽略。现在的所有综合工具都忽略源代码中的延时语句,有些工具干脆把这些语句处理为语法错误。大部分工具忽略延时语句后,给出警告提示。而综合时间约束则在综合过程中通过综合命令输入。
(2)支持有限类型VHDL具有丰富的类型定义,但是有些类型不具备硬件对应物,不可能被综合,如文件类型。通常可综合类型包括位、位矢量、布尔量、整数、枚举类型、数组等。其余像浮点数类型、记录类型等只能得到有限支持,而时间类型等完全不能被综合。
(3)进程的书写要服从一定的限制。在仿真时,VHDL进程可以任意书写。而在综合时,通常要求一个进程内只能有一个有效时钟,有的工具还有进一步的限制。
(4)可综合代码应该是同步式的设计。现在的EDA综合工具普遍推荐使用同步设计风格,即整个芯片电路的状态只能在时钟信号有效时发生改变。当然设计师也可能尝试其他风格的设计,如异步设计,但这时综合工具产生的结果往往还需要设计师进一步优化或调整。
VHDL类型VHDL语言中的对象有常量(constant)、信号 (signal)、和变量(variable)三种,它们都必须定义为如下某种类型。类型定义说明了对象可以使用的数值,并隐含表示了可以对其进行的操作。1、可综合数据类型 2、可综合子集
VHDL类型1、可综合数据类型面向综合的建模都支持这样一些类型:枚举类型、整数、一维数组。比较先进的综合工具现在一般也可以处理二维数组和简单的记录类型。 (1)枚举类型枚举类型通过列出所有可能的取值来定义,例如: type Boolean is (FALSE, TRUE); type State_type is (HALT,READY,RUN,ERROR); type Std_ulogic is ( U , X , 0 , 1 , Z , - );以上Std_ulogic的定义实际是对‘0’‘1’等字符进行了重载,由于这个定义已经成为IEEE标准,因此综合时
不会产生额外硬件。而对于抽象层次更高的Boolean和 State_type则需要进行状态编码。一般来说,状态编码是把状态值编码为位矢量(如bit_vector),矢量长度是能够表示所有状态的最短位宽。例如,State_type的4个状态值可以分别校编码为 00 , 01 , 10 和 11 。
VHDL类型(2)整数类型可综合的整数类型定义总是有界的,例如: type My_integer is Integer range 0 to 255; subtype Byte_int is Integer range -128 to 127;对整数类型进行综合时,综合工具首先将其翻译为位矢量,矢量长度仍取能够满足需要的最短位宽。建议类型定义时明确指出整数的范围,以便于综合工具进行优化。否则大部分综合工具按32位处理。综合后的电路中,整数以矢量形式出现,但通常只能以整个矢量为单位访问,即不能单独访问每一位。
VHDL类型(3)数组类型现在的综合工具都能够处理一维数组,例如: type Word is arry (31 downto 0) of Bit; type My_RAM is array (1023 downto 0 ) of Word;对于Word类型,综合工具通常将其综合为总线。 My_RAM类型实际是二维的,这种用两个一维数组代替一个两维数组是常用的综合建模技巧。现在先进的综合工具如synospys DC可以将其综合为RAM,一般的综合工具至少可以把它综合为寄存器。
VHDL类型(4)记录类型记录类型在定义复杂数据类型时非常方便,能够把不同数据类型的数据组织在一起统一访问。但是,EDA工业界对综合工具是否应该支持记录类型还没有统一意见,因此大多数综合工具不提供这种能力或只能把组合了简单数据类型的记录进行综合。
VHDL类型2、可综合子集VHDL在1989年首次公布时,就提供了两个程序包: Standard和 TextIO其中定义了各种预定义数据类型。 1992年,IEEE颁布了标准程序包Std_logic_1164,其中定义了9值数据类型Std_ulogic,即相应的决断类型Std_logic。 2004年,IEEE批准了一种修订标准IEEE 1076.6-2004,该标准提供了VHDL RTL综合子集的重要扩展。新改进版包括VHDL几乎每一个特性,能被用于在RTL级进行建模并综合。此处还包括触发器和锁存器建模的扩展语义导引。用户将能够以多种不同风格编写一个RTL模型,每一种都符合标准。这项标准化将最终帮助RTL确认。
VHDL类型该项标准主要支持以下类型的综合: a) bit, boolean, bit_vector b) character, string c) integer d) std_ulogic, std_ulogic_vector, std_logic, std_logic_vector e) signed, unsignd
VHDL对象VHDL语言中有三类对象,常量(constant),变量(variable),信号 (signal),它们是VHDL代码中的数据的载体。
1、常量常量仅被计算一次。在很多情况下,可以通过使用常量引导综合器获得优化的结果。在综合过程中
,常量被处理的方式很多,主要有下述情况: 1)用于描述真值表、ROM等,或被用于信号赋值,常量在综合时会形成对应的硬件。 2)作为算术运算的一个操作数出现时,综合工具常会对这一算术运算实施特定的优化措施。当然,这样一来常量与综合结果中的硬件就不是一一对应了。例如:优化综合工具用左移一位实现乘2操作,右移一位实现除法操作。
VHDL对象3)常量在作为条件表达式的一部分时综合工具会对整个语法结构进行布尔优化。 4)常量传播。在下面的VHDL代码中,由于数组ROM和ROM(5)的索引都是常量,因此WORD4实际上也成为常数,在进一步优化中, WORD4将作为常量被处理。这就是常量传播。 constant ROM: ROM_TYPE:= Read(“Rom_file.dat”); signal WORD4: Bit_vector (3 downto 0); begin WORD4<= ROM(5);
VHDL对象1、变量和信号变量和信号有着不同的仿真行为,同样在综合过程中,它们也会产生不同的结果。1)一般来说,尽量使用变量能够获得比较好的综合结果,因为这样做使得优化的余地较大。但要注意,并不是所有的综合工具都支持变量的综合。 2)使用信号可以较好地保持综合前后在I/O上的一致性(这时把进程内对信号的读写统称为I/O),而且在需要锁存中间结果的时候,经常有必要使用信号。下面用一个例子来说明变量与信号的不同综合结果:
VHDL对象--结构体A,用变量实现算法 entity var_sig is port(data: in bit_vector (1 downto 0); clk: in bit; z: out bit); constant k1: bit_vector:=“01”; constant k2: bit_vector:=“10”; end var_sig; architecture A of var_sig is begin var: process variable a1, a2:bit_vector (1 downto 0); variable a3: bit; begin wait until clk= 1 and clk event; a1:= data and k1; a2:= data and k2; a3:= a1(0) or a2(1); z<= a3; end process var; end A
VHDL对象--结构体B,用信号实现算法 architecture B of var_sig is signal a1, a2: bit_vector (1 downto 0); signal a3: bit; begin a1<= data and k1; a2<= data and k2; sig: process begin wait until clk= 1 and clk event; a3<= a1(0) or a2(1); z<= a3; end process sig; end B
初值VHDL中有三种初值:由类型或子类型定义可以得到的默认初值,定义对象时明确指定的初值和进程入口处显示地赋予对象的初值。 --设置初值的三种情况 --type states is(rst, fi, id, ie); signal state: states; --信号STATE的默认初值是RST;….. signal z: bit_vector (3 downto 0):=“0000”; --明确指定的初值…… P1: process (A, B) variable v1, v2: std_logic; begin v1:= 0 ; v2:= 1 ; --赋初值…… end process P1;
初值 以上三种初值的前两种只在仿真时有意义,在综合时将被忽略。 第三种形式将被综合器处理,形成对应电路。
在集成电路设计中,复位时赋予各个信号初值是很有必要的,否则很有可能出现在不定态。因此无论在仿真还是在综合时,都建议使用系统化的方式给信号和变量赋初值,即上述的在进程入口处显示地赋予对象的初值。
运算符VHDL提供了丰富的运算符,表中分类列出所有VHDL预定义运算符及相应的优先。优先级顺序运算操作符类型逻辑运算符
操作符AND OR NAND NOR XOR=/=<><=>=+&+ */ MOD REM ** ABS NOT
功能逻辑与逻辑或逻辑与非逻辑或非逻辑异或等号不等号小于大于小于等于大于等于加减并置正负乘除求模取余指数取绝对值取反
低
关系运算符
加、减、并置运算符
正负运算符
乘除运算符
高其他
运算符1、逻辑运算符逻辑运算符包括二元逻辑运算符以及NOT运算,操作数可以是bit和std_logic等类型的标量或同长度的矢量对象,也可以是 boolean类型的对象。这些运算符综合时直接调用逻辑门单元实现即可,但经过优化后,这些运算符可能被合并或改变。 --这段VHDL代码中逻辑运算符综合的结果如图 Signal x, a, b: bit_vector(3 downto 0); Signal y, c, d, e: std_logic; Signal z, f, g, h, I:boolean;…… Begin x<= a nand b; y<= c or d or e; z<= (f xnor g) xor (h xnor i);……
下一篇:网上商城购物系统毕业设计论文