COMPONENT nor2
PORT (a, b : IN std_logic; C : OUT std_logic); END COMPONENT; COMPONENT xor2
PORT (a, b : IN std_logic; C : OUT std_logic); END COMPONENT; signal x : std_logic_vector(1 downto 0); BEGIN
U1: xor2 PORT MAP(a(0), b(0), x(0)); U2: xor2 PORT MAP(a(1), b(1), x(1)); U3: nor2 PORT MAP(x(0), x(1), equ);
END netlist;
--结构体二:用布尔方程来实现:
ARCHITECTURE equation of equ2 IS BEGIN
equ<=(a(0) XOR b(0)) NOR (a(1) XOR b(1)); END equation;
--结构体三:用行为描述来实现,采用并行语句: ARCHITECTURE con_behave of equ2 IS BEGIN
equ<=’1’ when a=b else ‘0’; END con_behave;
--结构体四:用行为描述来实现,采用顺序语句: ARCHITECTURE seq_behave of equ2 IS BEGIN
process(a,b) begin
if a=b then equ<=’1’; else equ<=0; end if; end process; END seq_behave;
140 — —
在上述的实例中,实体equ拥有四个结构体:netlist、equation、con_behave、seq_behave,若用其例化一个相等比较器aequb,那么实体究竟对应于哪个结构体呢?配置语句(CONFIGURATION)很灵活地解决了这个问题:
如选用结构体netlist,则用
CONFIGURATION aequb OF equ2 IS FOR netlist END FOR;
END CONFIGURATION;
如选用结构体con_behave, 则用
CONFIGURATION aequb OF equ2 IS FOR con_behave END FOR;
END CONFIGURATION;
注:以上四种结构体代表了三种描述方法:Netlist(网表)、Equation(方程)、Behavior(行为描述)。有时将它们称之为:Structural(结构描述)、Data flow(数据流描述)、Behavioral(行为描述)。 behavioral(行为描述)
反映一个设计的功能或算法,一般使用进程process,用顺序语句表达。 dataflow(数据流描述)
反映一个设计中数据从输入到输出的流向,使用并发语句描述。 structural(结构描述)
它最反映一个设计硬件方面特征,表达了内部元件间连接关系。使用元件例化来描述。
4.1.11 子程序
子程序由过程(PROCEDURE)和函数(FUNCTION)组成。函数只能用以计算数
值,而不能用以改变与函数形参相关的对象的值。因此,函数的参量只能是方式为IN的信号与常量,而过程的参量可以为IN, OUT, INOUT方式。过程能返回多个变量,函数只能有一个返回值。
函数和过程常见于面向逻辑综合的设计中,主要进行高层次的数值运算或类型转换、运
算符重载,也可用来元件例化。 语法如下: 函数:
FUNCTION
<代码区>
141 — —
END
procedure
(
begin --
<代码区>
end< procedure _name>;
函数举例:此函数返回两数中的较小数
FUNCTION Min(x, y : INTEGER) RETURN INTEGER IS BEGIN
IF x RETURN y; END IF; END Min; 过程举例:此过程将向量转换成整数类型 USE ieee. std_logic_1164. ALL PROCEDURE vetor_to_int (z : IN std_logic_vector; x-flag :OUT BOOLEAN; q :INOUT INTEGER) IS BEGIN q :=0; x-flag :=false; FOR I IN z’ RANGE LOOP q :=q*2; IF z (i) /=’0’ THEN q :=q+1; ELSIF z(i) /=’0’ THEN x-flag := TRUE; END IF; END LOOP; END vector_to_int; 函数/过程可以在结构体的说明域中定义,在这种方式下同时包含了函数/过程的说明和定义。另外,也可以在程序包的说明和包体中,分别输入函数的说明和定义,并将其编译到库中以便在其他设计使用他们。在函数和过程中,所有语句都必须是顺序语句,并且不能在他们中说明信号。 4.1.12 其他:属性、时钟的表示 属性指的是关于实体、结构体、类型、信号的一些特征。有些属性对综合(设计)非常有用,如:值类属性、信号类属性、范围类属性。以下简单列出这些属性的含义: 142 — — · 值类属性 值类属性分为’left, ‘right, ‘low, ‘high, ‘length。其中用符号“’”隔开对象名及其属性。left表示类型最左边的值;right表示类型最右边的值;low表示类型中最小的值;high表示类型中最大的值;length表示限定型数组中元素的个数。 例: sdown :in std_logic_vector(8 downto 0); sup :in std_logic_vector(0 to 8); 则这两个信号的各属性值如下: sdown’left=8; sdown’right=0; sdown’low=0; sdown’high=8; sdown’length=9; sup’left=0; sup’right=8; sup’low=0; sup’high=8; sup’length=9; · 信号类属性 这里仅介绍一个对综合及模拟均很有用的信号类属性:’event,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为Ture,否则为False。利用此属性可决定时钟边沿是否有效,即时钟是否发生。 例:时钟边沿表示 若有如下定义: signal clk :in std_logic; 则:clk=’1’ and clk’event 和 clk’event and clk=’1’表示时钟的上升沿。即时钟变化了,且其值为1,因此表示上升沿。 clk=’0’ and clk’event 和 clk’event and clk=’0’表示时钟的下降沿。即时钟变化了,且其值为1,因此表示下降沿。 此外,还可利用预定义好的两个函数来表示时钟的边沿。 rising_edge(clk) 表示时钟的上升沿 falling_edge(clk) 表示时钟的下降沿 · 范围类属性 ‘range属性,其生成一个限制性数据对象的范围。 例如:signal data_bus : std_logic_vector(15 downto 0); data_bus’range=15 downto 0; 4.1.13 VHDL的模板 至此,我们已知道VHDL的大致构成。下面以VHDL的两个模板回顾一下VHDL的结构,一个是基本结构,一个是详细结构。其中黑体字为关键字。<>中内容为对用户不同设计所需填写的内容。 --VHDL Model Template (Overview) 143 — — library use entity architectureof --声明结构体所用的内部信号及数据类型 --如果使用元件例化,则在此声明所用的元件 begin --以下开始结构体,用于描述设计的功能 --concurrent signal assignments并行语句信号赋值 --processes 进程(顺序语句描述设计) --component instantiations 元件例化 end; --VHDL Model Template (Detailed) --列出用户定义的库及程序包 library use --实体描述了用户设计的接口 entity generic (<此处定义接口常数,如总线宽度、预定标计数器的计数模值等>); port (<列出端口信息>); end < entity_name >; --结构体是描述/实现设计的部分 architectureof --声明结构体所用的信号及数据类型,及子程序 --如果使用元件例化,则在此声明所用的元件 --元件声明如下: component<元件实体名> port (<元件端口信息>); end component; 144 — —