第8章 属性(Attribute)与配置(Configuration)
在VHDL中有一些事先定义好的属性,这些属性的使用有的是程序中必要的,有的会增强程序的可读性,有的会使程序的设计更为方便,在此我们会将属性分门别类地进行说明。这里将其分为三大部分,分别是:
返回信号状态的属性
返回单一数值的属性
返回数值范围的属性
接下来所要介绍的是configuration。Configuration主要用于在一些component与entity间做连接的动作。在一个设计中,同样的一个entity可以做许多不同的architecture设计,但是一次只能有一个architecture被选做这个设计的架构,configuration就是连接被选定的architecture与entity之间的桥梁。当simulator利用configuration连接entity与architecture后,设计的架构即已确定并可供仿真了。
8-1返回信号状态的属性
这一类的属性其返回值都是表示信号的状态,比如说信号改变的瞬间,或是信号改变之前的逻辑值。我们来看看这一类的属性有哪些。
1.s’event:返回值为一boo1ean值,当一个事件发生的瞬间其返回值为true,否则返回值为fal.
2.s’active:返回值为一boolean值,当一个事件或是转换事件(transaction)发生的瞬间其返
回值为true,否则返回值为fal。这里的转换事件与一般所称的事件(event)略有不同, 我们将在后面对其进行说明。
吃什么补心脏供血不足
3. s’1ast_event:返回值为一时间量,表示信号转换逻辑值事件发生后至目前德育处
为止的时间
4.s’1ast value:返回值为一逻辑值,表示信号改变的事件发生前,信号s最后的逻辑值。
5.s’1ast_active:返回值为一时间量,表示信号发生转换事件后至目前为止的时间量。现在
我们分别讨论以上五种属性所代表的意义及使用方法。
土豆营养8-1-1Event属性
Event属性可以说是使用最广泛的属性了。当一个事件发生的瞬间其返回值为true,对一个信号而言,其逻辑值的改变即是事件的发生。一般而言最在乎逻辑值改变的信号就是clock了,因为flip-flop输出信
号的改变都是在clock逻辑值改变的瞬间发生的(异步ret的flip-flop还会受ret信号所影响)。Event 这个属性一般与clock的逻辑条件搭配使用,比如下面的例子即是一个上升沿触发的D_type flip_flop。
library ieee;
u ieee.std_logic_1164.all;
entity V8_0 is
port(D : in std_logic;
Q : out std_logic;
Clk : in std_logic);
end V8_0;
architecture A_DFF of V8_0 is
begin
process(Clk)
begin
if Clk = '1' and Clk'event then
Q <= D;
end if;
end process;
end A_DFF;
8-1-2Active属性
Active属性发生的机率比event属性来得更高,因为它是在一个事件或是转换事件发生的瞬间就会返回true。什么是转换事件呢?对一个逻辑器件的输出信号而言,当其输入信号改变时,输出信号并不会因此而改变,我们称之为转换事件。比如说一个or gate,当一个输入为逻辑’1’时,其输出端一定为逻辑’1’。这时输出端受此输入信号的影响,即使另一个输入端的信号有了改变,其输出端的逻辑状态仍不会改变。这时没有事件event的发生,但却有转换事件transaction 的发生。我们来看看图8-l就会明白转换事件的意义。
然而转换事件的发生对实际的电路却没有什么影响,所以在使用上也不容易举出较实用的例子。读者们可自己体会。
8-1-3Last_event属性
Last_event属性所要返回的数值是一个时间量,而这个时间量是自检验点起往回推,—直到信号最后改变状态的时间。Last_event属性的作用在于检验信号的设定时间是否足够。我们来看看下面的例子。
library ieee;
u ieee.std_logic_1164.all;
entity V8_1 is
generic(tup_time : time := 5 ns);
port(D : in std_logic;
Q : out std_logic;
Clk : in std_logic);
begin教育文摘
process(Clk)
begin
if Clk = '1' and Clk'event then
asrt (D'last_event < tup_time)
report "tup violation"
verity error;
end if;
end process;
end V8_1;
architecture A_DFF of V8_1 is
signal Dtime : time;
begin
process(Clk)
begin
if Clk = '1' and Clk'event then
if (D'last_event < tup_time) then
Q <= 'X';
el
Q <= D;
end if;
Dtime <= D'last_event;
end if;
end process;
end A_DFF;
骚狐狸在这个例子中,entity的下一行是一个由generic所声明的时间量,其默认值为5 ns。在begin之后有一个process,是用来检验信号D的1ast_event时间量。若在信号Clk的上升沿之前,信号D的稳定时间量要大于generic中设定的tup_time值。若是在这个时间点上,待检验的信号其设定时间不足,就会送出一个ERROR信息显示在ModelSim的主窗口上。在architecture中也会检验信号D的tup time是否
足够,若是不足时会令信号Q的输出值为unknown。图8-2即是以之前的例子所做仿真的结果,其中的dtime为信号D的last_event属性的返回值。
8-1-4Last_value及Last_active属性
在之前就曾经讲过:last_value属性的返回值为一逻辑值,也就是说在检查点上,若检查的信号没有改变,则其返回值也不会改变。一定要等到受检查的信号改变其逻辑状态,信号的last_value属性返回值才会改变。我们延续之前的例子,只是在其中加入了信号D的last_value及1ast_active属性。
library ieee;
u ieee.std_logic_1164.all;
entity V8_2 is
generic(tup_time : time := 5 ns);
port(D : in std_logic;
Q : out std_logic := '0';
Clk : in std_logic);
begin
process(Clk)
begin
if Clk = '1' and Clk'event then
asrt (D'last_event < tup_time)
report "tup violation"
verity error;
end if;
end process;
end V8_2;
architecture A_DFF of V8_2 is
signal Dtime : time;
signal DValue : std_logic;
signal DATime : time;
begin
process(Clk)
variable DValueV : std_logic;
begin
if Clk = '1' and Clk'event then
if (D'last_event < tup_time) then
Q <= 'X';
el
Q <= D;
end if;
Dtime <= D'last_event;
DValue <= D'last_value;
DATime <= D'last_active;
end if;
end process;
end A_DFF;
图8-3是前一节的输入信号所仿真的结果,在第一个clock信号上升沿(25 ns)之前,输入信号D(检查信号)的逻辑值并未改变,所以信号D的last_value属性(Dvalue)返回值仍与之前的值(unknown)相同。在第二个clock信号上升沿(75 ns)前,信号D已改变其逻辑值,因此D的last_value属性变为逻辑’0’。一直到172 ns处信号D又改变其逻辑值,因此Dvalue会在175 ns处再改变其逻辑值。至于信号D的’last_active的返回值是与last_event的返回值一样的。
椒盐蘑菇
8-2返回单一数值的属性
这一类属性的返回值只是一个数值而已,而返回的数值是一个type或subtype的边界值。既然是边界值,表示这一定是个向量型的数据类型。让我们看看属于这一类的属性有哪些。
s’left 返回值为type或subtype最左边的位数
s’right 返回值为type或subtype最右边的位数
s’high 返回值为type或subtype最高的位数
s’low 返回值为type或subtype最低的位数
我们先举个例子声明,假设有个向量信号为:
我有一个想法作文a_vector(7 downto 0)
则以下信号四种属性的返回值分别为:
a_vector’left 的返回值为 7
娃娃简笔画a_vector’right 的返回值为 0
a_vector’high 的返回值为 7
a_vector’low 的返回值为 0
但若是a wctor这个向量改为:
a_vector(0 to 7)
那么a_vector’high及a_vector’low两属性的返回值仍与上一个例子相同,但是a_vector’left及a_vector’high两属性的返回值可就不同了,其返回值正好相反。在上面的例子中,可以很明显地看出,’high及’low两属性的返回值只与向量范围的大小有关,’high的返回值是向量范围的最大值,’low的返回值是向量范围的最小值。而’left及’right两属性的返回值只与向量排列的方式有关,’left的返回值是向量的最左边边界值,’right的返回值是向量的最右边边界值。
这一类属性的返回值主要的用途是使程序的设计更有弹性,比如说在设计中有些向量信号的范围并不固定,有可能会从32-bit升级到64-bit。那么在设计中直接将信号范围固定成31 downto 0或63 downto 0就比较没有弹性了,这时使用generic的声明会是一个好方法。以generic声明后,设计内部的范围就不宜再使用固定的数值了,这时除了使用generic声明的数值外,使用以上介绍的属性也可以达到目的。让我们看看以下的例子。
library ieee;
u ieee.std_logic_1164.all;
entity V8_3 is
generic(DRange : integer := 8);