第三章 VHDL的描述风格
3.1 行为描述方式
3.2 数据流描述方式(RTL描述方式)
3.3 结构化描述方式
3.4 混合描述风格
VHDL语言是通过结构体具体描述整个设计实体的逻辑功能。通常结构体有四种不同的描述方式:行为描述方式(behavior)、数据流描述方式(dataflow)或寄存器RTL描述方式、结构化描述方式(structural)以及混合描述方式。VHDL通过这四种不同的描述方式从不同的侧面描述结构体的功能。前三种是最基本的描述方式,他们组合起来就成为混合描述方式。
下面结合一个全加器来说明这四种描述风格,全加器的端口示意图如图所示,其输入输出关系如表所示。
全加器框图
全加器的输入输出关系
输入 输出
c_in x y c_out sum
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1
3.1 行为描述方式
行为描述输入与输出间转换的行为,不需包含任何结构信息,它对设计实体按算法的路径来描述。行为描述在EDA工程中通常被称为高层次描述,设计工程师只需要注意正确的实体行为、准确的函数模型和精确的输出结果就可以了,无需关注实体的电路组织和门级实现。
例:基于全加器真值表采用行为描述方式设计的全加器(1位二进制数全加)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY full_adder IS
GENERIC(tpd : TIME := 10 ns);
PORT(x,y,c_in : IN STD_LOGIC;
Sum, c_out : OUT STD_LOGIC);
END full_adder;
ARCHITECTURE behav OF full_adder IS
BEGIN
PROCESS (x, y, c_in)
VARIABLE n: INTEGER;
CONSTANT sum_vector: STD_LOGIC_VECTOR (0 TO 3) := “0101”;
CONSTANT carry_vector: STD_LOGIC_VECTOR (0 TO 3) := “0011”;
BEGIN --对照真值表解释程序
n := 0;
IF x = ’1’ THEN
n := n+1;
END IF;
IF y = ’1’ THEN
n:=n+1;
END IF;
IF c_in = ’1’ THEN
n:=n+1;
END IF; -- (0 TO 3)
sum <= sum_vector (n) AFTER 2*tpd; - - sum_vector初值为“0101”
c_out <= carry_vector (n) AFTER 3*tpd; - - carry_vector初值为“0011”
END PROCESS; END behav;
3.2 数据流描述方式
数据流描述方式表示行为,也隐含表示结构,它描述了数据流的运动路线、运动方向和运动结果。
对于全加器,用布尔方程描述其逻辑功能如下:
s = x XOR y
sum = s XOR c_in
c_out = (x AND y) OR( s AND c_in)
下面是基于上述布尔方程的数据流风格的描述:
例:采用数据流描述方式的全加器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY full_adder IS
GENERIC(tpd : TIME := 10 ns);
PORT(x,y,c_in : IN STD_LOGIC;
Sum, c_out : OUT STD_LOGIC);
END full_adder;
ARCHITECTURE dataflow OF full_adder IS
BEGIN
s <= x XOR y AFTER tpd;
sum <= s XOR c_in AFTER tpd;
c_out <= (x AND y) OR( s AND c_in) AFTER 2* tpd;
END dataflow;
3.23 结构描述方式
结构化描述方式就是在多层次的设计中,高层次的设计可以调用低层次的设计模块,或直接用门电路设计单元来构成一个复杂逻辑电路的方法。利用结构化描述方法将已有的设计成果方便地用于新的设计中,能大大提高设计效率。在结构化描述中,建模的焦点是端口及其互连关系。
结构化描述的建模步骤如下:
(1)元件说明
(2)元件例化
(3)元件配置
元件说明用于描述局部接口;元件例化是要相对于其他元件来放置该元件;元件配置用于指定元件所用的设计实体。
对于上图给出的全加器端口结构,可以认为它是由两个半加器和一个或门组成的 。
基于上图所示的结构,可以写出全加器的结构化描述设计程序如下。
例:全加器的结构化描述
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY half_adder IS
GENERIC(tpd:TIME:=10 ns);
PORT(in1, in2: IN STD_LOGIC;
sum, carry: OUT STD_LOGIC);
END half_adder;
ARCHITECTURE behavioral OF half_adder IS
BEGIN
PROSESS (in1, in2)
BEGIN
sum <= in1 XOR in2 AFTER tpd;
carry <= in1 AND in2 AFTER tpd;
END PROCESS;
END behavioral; - -半加器设计完毕
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY or_gate IS
GENERIC(tpd:TIME:=10 ns);
PORT(in1, in2: IN STD_LOGIC;
out1: OUT STD_LOGIC);
END or_gate;
ARCHITECTURE structural OF or_gate IS
BEGIN
out1 <= in1 OR in2 AFTER tpd;
END structural; - - 或门设计完毕
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY full_adder IS
GENERIC(tpd:TIME:=10 ns);
PORT(x,y,c_in: IN STD_LOGIC;
Sum, c_out: OUT STD_LOGIC);
END full_adder;
ARCHITECTURE structural OF full_adder IS
COMPONENT half_adder
PORT(in1, in2: IN STD_LOGIC;
sum, carry: OUT STD_LOGIC);
END COMPONENT; --元件说明
COMPONENT or_gate
PORT(in1, in2: IN STD_LOGIC;
out1: OUT STD_LOGIC);
END COMPONENT;
SIGNAL a, b, c:STD_LOGIC;
FOR u1,u2 : half_adder USE ENTITY WORK.half_adder (behavioral); --元件例化
FOR u3: or_gate USE ENTITY WORK. or_gate (structural);
BEGIN
u1: half_adder PORT MAP (x, y, b, a); --元件配置
u2: half_adder PORT MAP (c_in, b, sum, c);
u3: or_gate PORT MAP (c, a, c_out);
END structural;
由上例可见,对于一个复杂的电子系统,可以将其分解为若干个子系统,每个子系统再分解成模块,形成多层次设计。这样,可以使更多的设计者同时进行合作。在多层次设计中,每个层次都可以作为一个元件,再构成一个模块或系统,可以先分别仿真每个元件,然后再整体调试。所以说结构化描述不仅是一种设计方法,而且是一种设计思想,是大型电子系统高层次设计的重要手段。
3.4 混合描述风格
在实际设计工作中,可以采用上述三种描述方式的任意组合,这就是混合描述。同样还是图所给出端口结构的全加器模型,其混合描述方式如下。
例:全加器的混合描述
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY xor_gate IS
GENERIC(tpd:TIME:=10 ns);
PORT(in1,in2: IN STD_LOGIC;
out1: OUT STD_LOGIC);
END xor_gate;
ARCHITECTURE behavioral OF xor_gate IS
BEGIN
out1 <= in1 XOR in2 AFTER tpd;
END behavioral;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY full_adder IS
GENERIC(tpd:TIME:=10 ns);
PORT(x,y,c_in: IN STD_LOGIC;
Sum, c_out: OUT STD_LOGIC);
END full_adder;
ARCHITECTURE mix OF full_adder IS
COMPONENT xor_gate
PORT(in1, in2: IN STD_LOGIC;
out1: OUT STD_LOGIC);
END COMPONENT;
SIGNAL s :STD_LOGIC;
FOR ALL: xor_gate USE ENTITY WORK. xor_gate (behavioral);
BEGIN
u1: xor_gate PORT MAP (x, y, s);
u2: xor_gate PORT MAP (s, c_in, sum);
c_out <= (x AND y) OR (s AND c_in) AFTER 2*tpd;
END mix;