VHDL-2008: 主要增强功能
VHDL VHDL 2008 引入的更改的大部分是有用和重要,但相对较小。不过,下面给出了该语言的主要增强功能。
· 客运营业证集成到 vhdl 语言
· 包和子程序的泛型
· 泛型类型,子程序和包
· 新可固定和浮点算术包
客运营业证集成到 vhdl 语言
Vhdl 语言已经包含断言语句,用于添加简单的跳棋 vhdl 语言模型。您断言表达式的计算结果为TRUE,也就是说,希望这会是这样,只要计算断言。如果表达式是事实上虚假模拟器写出一条错误消息。
客运营业证 (属性说明语言) 扩展了这一想法提供语法描述电路的预期的行为,随着时间的推移,检查 vhdl 语言代码实现的行为。
到目前为止,可能只客运营业证语句添加到 vhdl 语言模型作为元注释 ("评议",编译器可能实际上将解释为扩展语法) 或在单独的文件 (vunits)。例如:
--psl assert always req -> next[2] (grant);
VHDL 2008 现在包括简单子集的客运营业证作为
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
的 vhdl 语言语法的一部分。Vhdl 现在保留所有客运营业证关键字。(使用 PSL 的简单子集,意味着模拟器可以处理的方式使用 PSL。)VHDL-2008 年,在上面的例子可以写成这样的并发语句:
assert always req -> next[2] (grant);
同样,PSL
声明
无利益冲突声明中华医学会杂志社职业健康检查不够规范教育部留学服务中心亲友住房声明
— — 例如,钟、 属性和序列 — — 可能列入 VHDL 声明性地区。
如果以 VHDL断言语句或客运营业证指令,可以解释并发语句,则使用 vhdl 语言解释:
assert not (a and b);
被解释为不 PSL vhdl 语言。
一些客运营业证关键字现 vhdl 语言的保留关键字。例如,属性和序列.
其他的客运营业证关键字只有 PSL 声明和指令中的特殊意义。例如之前,是在客运营业证,但不是在 vhdl 语言的关键字。
若要了解有关客运营业证的详细信息,请参阅客运营业证设计器的指南.
包和子程序的泛型。
Vhdl,泛型总是被允许在实体上。这使您可以写入
参数
转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应
化的设计的实体,如 N 位计数器。VHDL 2008 太允许对包和子程序的泛型。这使得更便于编写灵活、 可重用的代码。有关示例,请参阅可固定和浮动点包。
泛型类型,子程序和包。
Vhdl 泛型是常数。VHDL 2008 年他们也可能是类型、 子程序或包。
这里是有一个类型泛型 (data_type) 和通用的子程序 (函数增量) 的实体。我们不能使用"+"运算符在结构中,因为"+"不支持的任意数据类型。
library ieee;
use ieee.std_logic_1164.all;
entity incrementer is
generic (type data_type;
function increment (x: data_type) return data_type);
port (I : in data_type;
O : out data_type;
inc : in std_logic);
end entity mux;
architecture RTL of mux is
begin
O <= increment(I) when inc = '1';
end architecture RTL;
这显示我们可能会如何实例此实体:
incr_inst : entity work.incrementer
generic map ( data_type => std_logic_vector(7 downto 0),
increment => add_one )
port map ( I => I, O => O, inc => ena );
新可固定和浮点算术的软件包。
一个应用程序中的这些扩展泛型是发现新的固定和浮点算术包 VHDL 2008 的一部分。
这里是声明的 fixed_generic_pkg 的一部分:
package fixed_generic_pkg is
generic (fixed_round_style : fixed_round_style_type := fixed_round;
fixed_overflow_style : fixed_overflow_style_type := fixed_saturate;
-- ...
和在这里是 fixed_pkg 的声明的一部分:
package fixed_pkg is new IEEE.fixed_generic_pkg
generic map (
fixed_round_style => IEEE.fixed_float_types.fixed_round,
fixed_overflow_style_type => -- ...
VHDL-2008: 易于使用
许多 VHDL 2008 年的增强功能旨在使 VHDL 更易于使用。这些语言的所有相当轻微增补或更改语法。不过,他们将使日常 vhdl 语言设计中的实际差异。
· 新的条件运算符,??
· 增强的位字符串文字
· 层次结构的名称
· 集料中矢量
· 有条件和所选的顺序语句
· 生成的扩展
· 简化的敏感性列表
· Std_logic_vector算法
新的条件运算符,??
多少次你有想写点东西像这样:
if A and B then
...
其中 A 和 B 是STD_LOGIC呢?你没能,因为 vhdl 语言的if语句需要布尔表达式,不 STD_LOGIC 之一。你要写这相反:
if A = '1' and B = '1' then
...
VHDL 2008 引入了一个新的运算符,?。它被称为条件运算符,它将STD_LOGIC表达式转换为布尔值之一:'1'和'H'被认为是真实的和一切其他虚假。(它也转换位布尔。)所以,您现在可以写这:
if ?? A and B then
...
或者,甚至更好...
在某些情况下,?隐式应用。If语句的条件表达式是其中之一。所以事实上现在可以编写:
if A and B then
...
增强的位字符串文字。
字符串用作STD_LOGIC_VECTOR类型的文本值或类似。例如,
signal Count : unsigned(7 downto 0);
...
Count <= "00000000";
VHDL-1987 年,字符串文字效果,提供一种方式表达载体为二进制数。VHDL 1993 介绍二进制、 八进制、 十六进制位字符串文字:
Count <= B"0000_0000"; -- "_" is for readability only
Count <= X"00"; -- Hex; O"..." is octal
VHDL 1993 年的一个限制是十六进制位字符串文字总是包含多 4 位和八进制的 3 位的倍数。你不能有 10 位十六进制位字符串文字,或一个例如包含 0、 1 或 _,以外的其它值。
VHDL-2008 年,被增强位字符串:
· 他们可能会有明确的宽度,
· 他们可能会将其声明为符号或无符号,
· 他们可能包括元值 ('U'、 'X' 等)
下面是一些示例:
variable S : std_logic_vector(5 downto 0);
begin
S := 6x"0f"; -- specify width 6
S := 6x"XF"; -- means "XX1111"
S := 6SX"F"; -- "111111" (sign extension)
S := 6Ux"f"; -- "001111" (zero extension)
S := 6sb"11"; -- "111111" (binary format)
S := 6uO"7"; -- "000111" (octal format)
请注意在位字符串文本中这允许使用大写或小写字母,即 F 或 f 要么。
层次结构的名称。
一些 VHDL 2008 年的新功能不是设计用于只,核查。验证的工程师们常常想写自检测试环境。Vhdl 这可能很难有没有简单的方法来访问信号或埋在验证环境的最高水平的设计层次结构内的变量。
VHDL 2008 地址这通过引入外部名称。外部名称可能引用 (共享) 变量、 信号或这是另一个部件的设计层次结构中的常数。双尖括号中嵌入的外部名称 << >>
^层次结构中向上移动,并在包@路径的根,可使用特殊字符。一些例子:
<< signal .tb.uut.o_n : std_logic >> -- hierarchical signal name
<< signal ^.^.a : std_logic >> -- signal a two levels above
<< variable @lib.pack.v : bit >> -- variable in a package pack
其他用途的外部名称包括注入误差从测试环境,并迫使和释放值 (见后)。
集料中矢量
VHDL 聚合允许从集合的单个数组或
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
的元素组成的值。对于数组,向上 VHDL 至 1076年-2002年允许这样的语法:
variable V : std_logic_vector(7 downto 0);
begin
V := (others => '0'); -- "00000000"
V := ('1', '0', others => '0'); -- "10000000"
V := (4 => '1', others => '0'); -- "00010000"
V := (3 downto 0 => '0', others => '1'); -- "11110000"
-- V := ("0000", others => '1'); -- illegal!
VHDL 2008 阵列聚合中允许使用的切片。因此,举例来说,可以写上面的例子中:
V := (others => '0'); -- "00000000"
V := ("10", others => '0'); -- "10000000"
V := (4 => '1', others => '0'); -- "00010000"
V := (3 downto 0 => '0', others => '1'); -- "11110000"
V := ("0000", others => '1'); -- "00001111"
也可以使用聚合作为赋值,像这样的目标:
( S(3 downto 0), S(7 downto 4)) <= S; -- swap nibbles
( 3 downto 0 => S, 7 downto 4 => S) <= S; -- using named association
有条件和所选的顺序语句。
历史上有两种样式的 vhdl-并发和顺序编写"决定"语句。你必须要正确 — — 您可以不使用条件信号分配,如...
z <= x when x > y else y;
在过程中。VHDL 2008 放松这并允许触发器,仿照像这样:
process(clock)
begin
if rising_edge(clock) then
q <= '0' when reset else d; -- not allowed in VHDL 2002
end if;
end process;
它还允许在进程中使用所选的信号分配:
process(clock)
begin
if rising_edge(clock) then
with s select -- equivalent to a case statement
q <= a when "00",
b when "01",
c when "10",
d when "11";
end if;
end process;
生成的扩展.
VHDL 2008 使生成的语句更灵活。它现在允许使用其他和elsif。也有的生成的情况下版本.
这使生成更易于使用。而不是写作的
g1: if mode = 0 generate
c1 : use entity work.comp(rtl1)
port map (a => a, b=>b);
end generate;
g2: if mode = 1 generate
c1 : use entity work.comp(rtl2)
port map (a => a, b=>b);
end generate;
g3: if mode = 2 generate
c1 : use entity work.comp(rtl3)
port map (a => a, b=>b);
end generate;
您可以编写:
g1: case mode generate
when 0 =>
c1 : use entity work.comp(rtl1)
port map (a => a, b=>b);
when 1 =>
c1 : use entity work.comp(rtl2)
port map (a => a, b=>b);
when 2 =>
c1 : use entity work.comp(rtl3)
port map (a => a, b=>b);
end generate;
请注意在每个分支,仍可以声明名称 (如标签c1以上) 的其他分支中的本地名称,不会发生冲突。它是仍有可能声明中使用开始结束的分支的本地对象.
列出了简化的敏感性。
关键字所有可用于敏感性列表中,在意味着所有的信号读取过程中应加入敏感性列表中,例如:
process(all)
begin
case state is
when idle =>
if in1 then
nextState <= Go1;
end if;
when Go1 =>
nextState <= Go2;
when Go2 =>
nextState <= Idle;
end case;
end process;
这样可以避免常见的问题,作者修改组合过程,然后忘记更新敏感性列表中,导致模拟合成错配。
Std_logic_vector算法
Vhdl 语言有一个设计良好的包IEEE。Numeric_Std,创建两个新的数据类型无符号和签署。但是它有时会方便直接-做std_logic_vector算法视为任何两个补充或无符号。
在过去这主要取得了通过使用非标准std_logic_unsigned和std_logic_signed 的包。VHDL 2008 通过添加两个新标准算术包,IEEE 解决此问题。Numeric_Std_Unsigned和IEEE。Numeric_Std_Signed.
VHDL-2008: 纳入现有的标准
VHDL 2008 包括过去单独的标准。这些标准只是分开的主要的 vhdl 语言标准,因为它们本身的 VHDL 后制定。这导致了一些"怪癖";即使没有其他函数和运算符在numeric_std中的工作类型std_logic_vectornumeric_std包-中定义的std_match功能,std_logic_vectors的"不在乎"比较不会是为例!
标准包添加了额外的功能。
虽然这些标准的一些软件包,VHDL 2008 还包含 PSL 和 VHDL 编程接口 (VHPI)。客运营业证讨论在这里.
· VHPI 是包含
· 套餐标准包括
· 扩展std_logic_1164
· 扩展textio
· 包括包的上下文使得更容易
VHPI 是包含
1076 2007C VHDL 编程接口是相对较新的标准,它定义基于 vhdl 的接口。标准是复杂,并允许操作的过程仿真、 静态数据和动态数据。从 VHDL 2008 所有我们需要知道,现在已经列入 VHDL !
Vhdl 语言中包含标准文件包
原始的 vhdl 语言定义包括只包std.standard中定义的类型。多年来已上班 VHDL 下列软件包:
· IEEE。Numeric_Std
· IEEE。Numeric_Bit
· IEEE。Math_Real
· IEEE。Math_Complex
· IEEE。Std_logic_1164
所有这些软件包如今已纳入主要的 vhdl 语言标准。
另外的包的数量已是非常普遍使用即使他们不是官方的标准。这些都是:
· std_logic_unsigned
· std_logic_signed
· std_logic_textio
作为上述以前的替换为std_logic_unsigned和std_logic_signed是新包numeric_std_unsigned和numeric_std_signed.
Std_logic_textio的功能现在包括在IEEE.std_logic_1164中。用户可能还包括std_logic_textio,但包是现在只是一个"與"— — 其实在IEEE.std_logic_1164中提供了功能.
扩展std_logic_1164
不只是std_logic_1164纳入 VHDL 2008,它已得到改进。主要的改动是
· std_logic_vector现在是std_ulogic_vector,这使得同时使用这两种类型的子类型要容易得多
· 有新的运算符和函数,包括减少营办商,匹配营办商、 最小和最大的功能、 移位运算符,字符串转换函数
这里是新的营办商的一些示例:
signal o : std_logic;
signal x,y,v : std_logic_vector(2 downto 0);
o <= i1 when ?? sel else i2; -- intepret sel as boolean
o <= and v; -- reduction operator, returns std_ulogic
o <= x ?= y; -- ?= and ?/= work on std_(u)logic_vector
-- ?= ?/= ?< ?<= ?> ?>= on std_(u)logic
匹配的运算符返回适当的操作数类型,而不是作为布尔.
扩展textio
当然textio以来原来的标准,在 1987 年的 vhdl 语言的一部分,因此,或许不真正属于本部分中。但是它已扩展结合了有时其他非标准的软件包 (例如导师 SDK) 所提供的功能的方式。所以这一节概述什么是新。
VHDL 2008 包括读取和写入 std_logic 和 std_logic_vector (历史上人民使用非标准的 std_logic_textio 提供这些功能) 的额外功能。
为了简化写作是现在功能辞典字符串。下面是一个示例:
write(L, string'("-- start of file")); -- type qualification required
swrite(L, "-- start of file"); -- no type qualification required
如果你想要这两个文件和标准输出中写入文本,很不容易做 VHDL 2002 及更早版本-最简单的解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
是只需调用writeline过程两次,一次为每个目标。VHDL 2008 添加要执行此操作,您的程序三通:
tee(F, L); -- writes to file F *and* to standard output
如果要显式刷新文件,而无需关闭它,为了这一目标有一个过程:
flush(F); -- flushes F to disk
以前在std_logic_textio为十六进制和八进制格式写入程序包含在textio中。此外,有许多不同的数据类型为to_string的重载的实现。还有调用的函数证明格式的数据,而无需使用标准的读取和写入功能的理由和字段宽度参数。这里是一个略有预谋的例子,显示其中的部分功能:
write(L, justify(to_string(now,ns), field => 10) &
justify(to_hstring(sel) , field => 2 ) );
请注意to_hstring以及介绍。
包括包更容易的情况下使
现在所有这些软件包都是可用的它可以是有点乏味,添加您的验证平台或设计的前面的所有适当的包上下文子句。VHDL 2008 提供的一组到命名上下文的图书馆和使用语句进行分组的方式。一旦声明上下文,则可以重复使用。
为了方便为共同目的 (例如,编写 synthesisable 代码有一些内置的上下文。
下面是一个示例,您可以声明网站和项目的上下文:
context site_context is -- compiled into library sitelib
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use sitelib.sitepack.all;
end context;
context proj1_context is -- compiled into library proj1lib
library sitelib;
context sitelib.site_context;
use proj1lib.proj1pack.all;
end context;
现在 proj1 项目的任何人都可以说
library proj1lib;
context proj1lib.proj1_context;
和他们在两行项目的标准安装 !
VHDL 2008 标准定义两个内置的上下文,如下所示:
context IEEE_BIT_CONTEXT is
library IEEE;
use IEEE.numeric_bit.all;
ene context IEEE_BIT_CONTEXT;
context IEEE_STD_CONTEXT is
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.Numeric_Std.all;
end context IEEE_STD_CONTEXT;
VHDL-2008: 小变化
本页概述了一些其他的变化,其中大部分都相当小。其中一些已经通过在其他页上所述,以及概述在这里。这些更改包括:
· 新标准功能: 为标量定义了最小、 最大和to_string和数组类型 ;to_bstring、 to_binarystring、 to_ostring、 to_octalstring、 to_hstring和to_hexstring的数组。
· 函数rising_edge定义为类型布尔.
· 数组和记录可能包含无约束的元素。
· 添加这些新的数组类型:boolean_vector、 integer_vector、 real_vector和time_vector.
· "匹配"case 语句,案?
· 强制和释放的信号。
· /* */块注释。
· ' 实例等扩展包和子程序的实例化。
· 新标准环境包ENV 包含程序停止和完成和函数resolution_limit.
· 添加 IP 加密指令 (保护)。
下面你会发现一些更详细地介绍了以下更改:
· 新建和更改的标准功能
· 数组和记录类型
· 匹配的case语句
· 强迫和释放信号
· 块注释
· 更改为' 实例
· 标准环境包
· IP 加密
新建和更改的标准功能
VHDL 2008 定义了两个新功能最小和最大。这些定义的标量或数组类型。
minimum(10,11) -- returns 10
-- bv1 contains "0111" bv2 contains "1000"
maximum(bv1, bv2) -- returns "1000"
请注意,除非您包括算术包没有数值做载体的比较-算术包过载算术操作的上述功能。
VHDL-2008 年之前, 强度减少功能未定义一致签署、无符号,和std_ (u) logic_vector。VHDL 2008 年以下函数现在一直上定义这些类型:
is_X
to_X01
to_X01Z
to_UX01
to_01
数组和记录类型
复合类型 (数组和记录类型) 的主要变化之一是,现在您可以使用无约束的数组和记录的元素。例如下面的声明现在是合法的:
type myArrayT is array (natural range <>) of std_logic_vector;
type myRecordT is
record
a : std_logic_vector;
b : std_logic_vector;
end record;
语言也向允许完全或部分约束的对象和类型的声明。例如上述的记录类型可用于声明完全约束的变量,如下所示:
variable R : myRecordT( a(7 downto 0), b(15 downto 0) );
在某些情况下 (实例时使用跌宕端口或过程参数) 它是可能使用打开的关键字表示跌宕应保持的维度。
VHDL 2008 添加一些新的预定义的数组类型,如下所示:
type boolean_vector is array (natural range <>) of boolean
type integer_vector is array (natural range <>) of integer
type real_vector is array (natural range <>) of real
type time_vector is array (natural range <>) of time
匹配的case语句
有新版本的情况下允许不在乎行为,案件吗?。下面是一个示例:
case? sel is
when "1---" =>
o <= "11";
when "01--" =>
o <= "10";
when "001-" =>
o <= "01";
when "0001" =>
o <= "00";
when others =>
null;
end case;
比较使用进行匹配的相等运算符的? =这意味着不在乎字符'-'真正视为不照顾,和'H'(例如) 匹配'1'。至于定期的 case 语句,在顶部表达的每个值必须表示一次之间的选择一组: 在使用模式匹配时,你必须小心该模式,其中包括'-'不重叠。
强迫和释放信号
核查,有时是方便能够"覆盖"的值的一个信号。这可用于注射错误,例如。当然这是总是可能使用通常编写的 Tcl 的特定于供应商的命令。但 VHDL 2008 允许这纯 vhdl 语言中。
它也是可以删除使用释放关键字的重写的值。
最后有可能使 (有限制端口取决于其模式) 的信号的有效驾驶价值之间的区别。
<< tb.uut.s >> <= force '1'; -- inject error
<< tb.uut.s >> <= release; -- stop overriding
v <= force in '1'; -- force effective value
v <= force out '0'; -- force driving value
v <= release in; -- release effective value
v <= release out; -- release driving value
块注释
用 VHDL 2008 是现在实现相同的混乱错误,您可以像 C 和注释掉一大块代码的语言与偶然情况下,以分隔 (块) 注释。(你能告诉我不是一个大的风扇吗?)。
/*
s <= 1;
r <= 2;
*/
更改为' 实例
两个' 实例和' PATH_NAME已得到纠正,使他们应付的受保护的类型 (VHDL 2000 中引入),共享变量和重载运算符。以前的路径和生产的这些属性的实例字符串不包含运算符名称和共享变量。
标准环境包
添加了一个额外的环境包。此程序包可以控制模拟器,并找出模拟器时间分辨率的 vhdl 语言代码。包是std.env.
procedure stop(status:integer);
prodedure stop;
procedure finish(status:integer);
procedure finish;
function resolution_limit return delay_length;
停止导致模拟停止,而不是退出。完成导致退出的模拟。Resolution_limit功能使用户可以找出模拟器分辨率极限 — — 例如,您可以等待最小时间步骤使用
wait for env.resolution_limit;
IP 加密
VHDL 2008 已指定加密的数据块的一种手段。这使用附加功能-工具指令。工具指令是前面加引号字符'的任意文字。工具解释它们,它们不具有任何意义 vhdl 语言编译器工具指令的想法。
IP 加密,为一组预定义的工具指令的定义如下:
`protect begin
`protect end
`protect begin_protected
`protect end_protected
`protect author
`protect author_info
`protect encrypt_agent
`protect encrypt_agent_info
`protect key_keyowner
`protect key_keyname
`protect key_method
`protect key_block
`protect data_keyowner
`protect data_keyname
`portect data_methdo
`protect data_block
`protect digest_keyowner
`protect digest_keyname
`protect digest_key_method
`protect digest_method
`protect digest_block
`protect encoding
`protect viewport
`protect decrypt_license
`protect runtime_license
`protect comment
很多这些工具指令有额外的参数值。
这里是一些 vhdl 语言代码可能类似使用 IP 加密的简短的示例:
entity e is
-- ports omitted
end entity;
architecture RTL of e is
`protect data_keyowner = "Doulos User"
`protect data_keyname = "Doulos Key"
`protect data_method = "rsa"
`protect encoding = (enctype= "quoted-printable")
`protect begin
-- code omitted
begin
-- code omitted
`protect end
end architecture RTL;