1.28k likes | 1.46k Views
第三章. 硬件描述语言 VHDL. 3.1 引言. VHDL 的特点: 1.支持多种设计方法和技术。 2.与工艺技术独立。 3. 多层次描述能力。 4. 标准化,易于共享和复用。 VHDL 程序的构件 实体 结构体 程序包 配置 库 VHDL 的版本: IEEE STD 1076.1987[LRM87] IEEE STD 1076.1993[LRM93]. 实体 count. clk. count_out. ena. load. clear. data_in.
E N D
第三章 硬件描述语言VHDL
3.1 引言 • VHDL的特点: • 1.支持多种设计方法和技术。 • 2.与工艺技术独立。 • 3. 多层次描述能力。 • 4. 标准化,易于共享和复用。 • VHDL程序的构件 • 实体 结构体 程序包 配置 库 • VHDL的版本:IEEE STD 1076.1987[LRM87] • IEEE STD 1076.1993[LRM93]
实体 count clk count_out ena load clear data_in 3.2 VHDL的基础知识 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164 .ALL; USE IEEE.STD_LOGIC_ARITH .ALL; USE IEEE.STD_LOGIC _UNSIGNED.ALL; • 3.2.1 VHDL程序的结构 • 8位计数器 ENTITY counter IS PORT( data_in: IN INTEGER RANGE 0 TO 255; clk,ena,load,clear: IN STD_LOGIC; Count_out: OUT INTEGER RANGE 0 TO 255); END counter;
8位计数器的功能描述:ARCHITECTURE behav_count OF counter IS SIGNAL counter_data: INTEGER RANGE 0 TO 255; BEGIN PROCESS( clk,clear,load ) BEGIN IF ( clear =‘0’ ) THEN counter_data=0; ELSIF ( clk ‘EVENT AND clk=‘1’ ) THEN IF ( load=‘1’ ) THEN counter_data <=data_in; ELSE IF ( ena=‘1’) THEN IF counter_data=255 THEN counter_data<=0; ELSE counter_data<=counter_data+1; ENDIF; ELSE counter_data<=counter_data; ENDIF; ENDIF; ENDIF; END PROCESS; count_out<=counter_data; END behav_count; 结 构 体 进 程
1.实体( ENTITY) 说明 ENTITY 实体名 IS [GENERIC ( 类属表 ) ;] [PORT ( 端口表 ) ;] [实体说明部分 ;] [BEGIN 实体语句部分 ;] END 实体名 ; • 类属说明 • GENERIC ( 端口名{,端口名}:类型名[:=初始值] • {端口名{,端口名}:类型名[:=初始值]}); 例 GENERIC ( m :TIME :=3ns);
(2) 端口说明 PORT ( 端口名{,端口名} : 方向 数据类型; : : 端口名{,端口名} : 方向 数据类型 ); 端口方向 实 体 IN OUT INOUT BUFFER LINKAGE
= D Q clk 2 结构体 (ARCHITECTURE) • ARCHITECTURE 结构体名OF 实体名IS [定义语句] BEGIN [并行处理语句] END结构体名;
3 库 (LIBRARY) STANDARD(隐含说明) TEXTIO(用UES说明) STD库 预定义库 (隐含打开) WORK库 STD_LOGIC_1164 STD_LOGIC_ARITH STD_LOGIC_UNSIGNED NUMERIC_STD NUMERIC_BIT MATH_REAL MATH_COMPLEX VITAL_TIMING VITAL_PRIMITIVE 设 计 库 IEEE库 资 源 库 (用LIBRARY) 其它库
4. 程序包 (PACKAGE) • PACKAGE 程序包名 IS • [说明语句] • END [PACKAGE] [程序包名]; • PACKAGE BODY 程序包名 IS • [说明语句] • END [PACKAGE BODY] [程序包名]; 程序包 说 明 程 序 包 体
程序包设计举例1 • LIBRARY IEEE; • USE IEEE.STD_LOGIC_1164.ALL; • PACKAGE upac IS • CONSTANT k : INTEGER := 4; • TYPE instruction IS ( add, sub, adc, inc, srf, slf , mov ); • SUBTYPE cpu_bus IS STD_LOGIC_VECTOR ( k-1 DOWNTO 0 ); • END upac;
程序包体的应用 PACKAGE example IS CONSTANT pi : REAL := 3.1415926; CONSTANT defer : INTEGER; FUNCTION mean (a, b, c : REAL) RETURN REAL; COMPONENT and IS GENERIC ( tpd1, tpd2 : TIME := 3ns); PORT ( in1, in2 :IN BIT;y:OUT BIT ); END COMPONENT and; END example; PACKAGE BODY example IS CONSTANT defer : INTEGER := 5; FUNCTION mean ( a, b, c : REAL ) RETURN REAL IS BEGIN RETURN ( a+b+c)/3.0; END FUNCTION mean; END PACKAGE BODY example;
3.2.2 VHDL常用资源库中的程序包 STD • 1.STANDARDD程序包 • 2. TEXTIO程序包 • 3.STD_LOGIC_1164程序包 • 4.NUMERICSTD和NUMERIC_BIT程序包 • 5.VITAL_TIMING和VITAL_PRIMITIVE程序包 • 6.MATH_REAL和MATH_COMPLEX 程序包 I E E E
3.2.4 数据对象和类型 • 1.对象 常量( CONSTANT ) • 变量( VARIABLE ) • 信号( SIGNAL ) • 文件(FILE) • (1)常量 • CONSTANT 常量名:数据类型∶= 标达式; • 例如: CONSTANT Vcc : REAL ∶=5.0; • (2)变量 • VARIABLE 变量名:数据类型 约束条件∶= 表达式; • 例: VARIABLE x: STD_LOGIC ∶=’0’; • VARIABLE a, b : INTEGER ;
(3)信号 • SIGNAL 信号名:数据类型 约束条件∶= 表达式; 例如: SIGNAL clk : BIT∶= ‘0’ ; • 除了基本信号之外,信号也用于表示不同宽度的总线,例如: SIGNAL bus_a : STD_LOGIC_VECTOR ( 7 DOWNTO 0 ); SIGNAL bus_b : STD_LOGIC_VECTOR ( 0 DOWNTO 7 ); • 信号在说明语句中用赋值号“:= ”赋初始值 , • 信号量用代入语句赋值,并可延时, 信号量的代入: y <= a AND b; • 在VHDL语言中,信号是全局量。
2. VHDL语言的数据类型 • VHDL语言所定义的标准数据类型有10个: • 整型(INTEGER), • 实型(REAL), • 位(BIT), • 位矢量(BIT_VECTOR), • 布尔量(BOOLEAN), • 字符(CHARACTER), • 时间类型(TIME), • 错误等级(SEVERITY LEVEL), • 自然数(NATURAL)、正整数(POSITIVE), • 字符串(STRING)。
属于用户自定义的数据类型有: • 枚举类型(ENUMERATED), • 整型(INTEGER), • 实型(REAL), • 数组(ARRAY), • 存取类型(ACCESS), • 文件类型(FILE), • 记录类型(RECODE), • 时间类型(TIME)。
(1) 标准定义的数据类型 • 整数类型 1,-2 • 实数类型 1.2, 1.2E+3 • 位‘0’, ‘1’ • 位矢量 “001100”,X“00BE” • 布尔量 真(TRUE), 假(FALSE) • 字符字符是用单引号括起来的字母或符号,字符区分大小写,‘A’、’a’、‘B’、’b’都是不同的字符。 • 字符串 字符串是由双引号括起来的一个字符序列。例如:“COUNTER”、“8bit_bus”等。 • 时间类型55 sec;2 min 。 在STANDARD程序包中给出的时间预定义单位为: fs , ps, ns, μs, ms, sec, min, hr 。
错误等级 错误等级在仿真时用于表示系统工作的状态。错误等级分为四钟:NOTE(注意)、WARING(警告)、ERROR(错误)和FAILURE(失败)。 • 自然数(NATURAL)和正整数(POSITIVE) • (2)用户定义的数据类型 • TYPE 数据类型名{,数据类型名} 数据类型定义; • 枚举类型 TYPE 数据类型名 IS (元素,元素,……); 例如: TYPE instruction IS (add, sub, inc, srl, srf, mov,dec,);
整数类型和实数类型 TYPE digit IS INTEGER RANGE 0 TO 9; • 数组 TYPE 数组名 IS ARRAY [下标约束] OF 数组元素 的类型名; TYPE word8 IS ARRAY (1 TO 8 ) OF BIT; TYPE word8 IS ARRAY ( INTEGER RANGE 1 TO 8 ) OF BIT; TYPE word8 IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC; --无界数组 TYPE RAM IS ARRAY (1 TO 8, 1 TO 10 ) OF BIT ; --二维数组 TYPE instruction IS ( add, sub, inc, dec , srl, srf, mov, xfr ); TYPE insflag IS ARRAY (instruction add TO srf ) OF STD_LOGIC ; 多维数组仅用于仿真生成硬件的抽象模型,而不能用于逻辑综合。
时间类型 (物理类型) TYPE 数据类型名 IS 范围 UNITS 基本单位; 单位; • END UNITS; 例如: TYPE time IS RANGE –1E18 TO 1E18 UNITS fs ; ps =1000 fs ; ns =1000 ps ; us =1000 ns ; ms =1000 us ; sec =1000 ms ; min =60 sec ; hr =60 min ; END UNITS;
物理量的定义应用 TYPE capacitor IS RANGE 0 TO 1E18 UNITS fF ; pF =1000 fF ; nF =1000 pF ; uF =1000 nF ; mF =1000 uF ; F =1000 mF ; END UNITS;
记录 • 记录是由不同类型的数据集合在一起形成的数据类型, • TYPE 数据类型名 IS RECODE 元素名:数据类型; 元素名:数据类型; ∶ END RECODE; • 记录经常用于描述总线和通讯协议。例如: TYPE PCI_bus IS RECODE Addr : STD_LOGIC_VECTOR (31 DOWNTO 0 ) ; Data : STD_LOGIC_VECTOR ( 31 DOWNTO 0 ) ; R0 : INTEGER ; Inst : instruction ; END RECODE ;
文件类型 • 文件类型是在系统环境中定义为代表文件的一类客体。其说明格式为: • TYPE 文件类型名 IS FILE 限制; 例如: TYPE text IS FILE OF string ; • 在TEXTIO中有两个预定义的标准文本文件: • FILE input : text OPEN read_mode IS “STD_INPUT”; FILE output : text OPEN write_mode IS “STD_OUTPUT”;
存取类型 • 存取类型用于为客体之间建立联系,或者给新对象分配或释放存储空间。其说明格式为: • TYPE 数据类型名 IS ACCESS 限制; 例如,在TEXTIO程序包中定义了一个存取类型的量: TYPE line IS ACCESS string ;
(3) 用户定义的子类型 • 用户定义的子类型是用户对已定义的数据类型,作一些范围限制而形成的一种新的数据类型。子类型的名称通常采用用户容易理解的名字。子类型定义的一般格式为: • SUBTYPE 子类型名 IS 数据类型名[范围]; 例如,在“STD_LOGIC_VECTOR”基础上形成的子类: SUBTYPE iobus IS STD_LOGIC_VECTOR ( 7 DOWNTO 0 ); SUBTYPE digit IS INTEGER RANGE 0 TO 9 ; • 通常,用户定义的数据类型和子类型都放在程序包中定义,然后通过USE语句调用。
a b y (4) 数据类型的转换 (5) IEEE标准数据类型“STD_LOGIC”和 “STD_LOGIC_VECTOR” • 数字系统中的逻辑值有:‘0’ 、‘1’和‘X’; • 数字系统中的逻辑强度:强强度F、电阻强度R、弱电阻强度W、高阻强度Z。 y<=a; y<=b;
Vcc Vcc Vo Vo 逻辑强度 “IEEE.STD_LOGIC”九态数值模型如下: ‘U’——初始值; ‘X’—— 不定态; ‘1’—— 逻辑1; ‘0’—— 逻辑0; ‘Z’—— 高阻态; ‘W’—— 弱信号不定; ‘L’—— 弱信号0 ‘H’—— 弱信号1; ‘—’——不可能情况 。
3.3 VHDL结构体的描述方式 结构体的 描述方式 行为描述 RTL描述 结构化描述 结构体 结构体说明 信号说明,类型说明,元件说明,常量 说明和子程说明 BEGIN 并行语句 块语句 并行语句集合 元件例化 产生另一个实体的元件例化 信号赋值语句 过程调用语句 调用预定义的算法 进程语句 定义一个算法
8位比较器 a=b a b c 3.3.1 结构体的行为描述 • 所谓结构体的行为描述(Behavioral Descriptions),即对设计实体按算法的路径进行描述。行为描述往往不涉及设计实体的电路结构,是设计实体整体功能的一种抽象描述。在行为描述方式的程序中,往往大量采用算术运算、关系运算、惯性延时、传输延时等难以进行逻辑综合和不能进行逻辑综合的VHDL语句。采用行为描述的VHDL程序主要用于系统数学模型的仿真或系统工作原理的仿真,少数也可以用于综合。
8位比较器结构体的行为描述 • LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL; ENTITY comparator IS PORT ( a, b : IN STD_LOGIC_VECTOR ( 7 DOWNTO 0 ); c : OUT STD_LOGIC) ; END comparator ; ARCHITECTURE behavior OF comparator IS BEGIN PROCESS ( a, b ) BEGIN IF a = b THEN c<=’1’ ; ELSE c<=’0’; END IF; END PROCESS; END behavior ;
3.3.2 结构体的RTL描述 • RTL(Regesist Transform Leval)描述,即寄存器传输级描述,有的文献称为数据流描述。RTL描述是用于逻辑综合的实体描述方法,与行为描述不同,RTL描述中指定了各个寄存器的时钟,确定了存储单元的复用结构及总线,指定了电路元件之间的连接关系。RTL数据模型描述的语句与实际寄存器的结构模型之间存在直接的映射关系,程序的描述隐含了电路结构。在RTL描述中,信号代表了硬件中数据的实际移动方向以及电路的互连关系。由于RTL描述用于逻辑综合,故RTL描述对语句有严格限制,一些难以综合的语句(如信号代入中的延时等)、一些抽象的数据类型(如实数、记录、文件等)和一些难以综合或不可综合的运算符(如除法/、乘方**等),都不能在程序中使用。
8位比较器的布尔方程RTL描述。 • LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY comparator IS PORT ( a, b : IN STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ; c : OUT STD_LOGIC ) ; END comparator ; ARCHITECTURE rtl OF comparator IS BEGIN
a0 b0 a1 b1 a6 b6 a7 b7 x0 x1 c x6 x7 & = = = = 8位比较器的布尔方程RTL描述的逻辑电路
c<= NOT( a (0) XOR b(0)) AND NOT (a (1) XOR b (1)) AND NOT (a(2) XOR b(2)) AND NOT (a(3)XOR b(3)) AND NOT (a(4) XOR b(4)) AND NOT (a(5) XOR b(5)) AND NOT (a(6) XOR b(6)) AND NOT (a(7)XOR b(7)) ; END rtl ; • RTL描述的限制 • 1.为了保证逻电路的正确,应对不定态“X”状态有所限制; • 2. 禁止在一个进程中存在两个寄存器描述;寄存器描述中必须代入信号值; • 3. 关联性强的信号应放在一个进程中; • 4.避免使用WAIT FOR xx ns 或AFTER xx ns类语句;
3.3.3 结构体的结构化描述 • 结构化描述是常用的层次化设计方法。对于一个复杂的电子系统,可将其分解成若干个子系统,子系统再可以进一步分解成若干个模块。层次化设计便于多人协作,同时并行设计。在结构化设计中,每个设计层次可以作为一个元件,而无需考虑元件的复杂性。每个元件可以分别仿真,然后将各个元件组合起来构成系统,进行整体调试。 • 结构化描述的系统功能体现在所调用的元件功能及相互间的互连关系中。
8位比较器结构体的结构化描述 • LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY comparator IS PORT ( a,b: IN STD_LOGIC_VECTOR ( 7 DOWNTO 0 ); c: OUT STD_LOGIC ); END comparator; ARCHITECTURE structure OF comparator IS SIGNAL x: STD_LIGIC_VECTOR ( 7 DOWNTO 0 ) ; COMPONENT xnor2 PORT ( a,b: IN STD_LOGIC; c: OUT STD_LOGIC ); END COMPONENT;
BEGIIN U0:xnor2 PORT MAP ( a(0), b(0), x (0) ); U1:xnor2 PORT MAP ( a(1), b(1), x (1) ); U2:xnor2 PORT MAP ( a(2), b(2), x (2) ); U3:xnor2 PORT MAP ( a(2), b(2), x (2) ); U4:xnor2 PORT MAP ( a(4), b(4), x (4) ); U5:xnor2 PORT MAP ( a(5), b(5), x (5) ); U6:xnor2 PORT MAP ( a(6), b(6), x (6) ); U7:xnor2 PORT MAP (a(7),b(7),x (7)); c<= x(0) AND x(1) AND x(2) AND x (3) AND x(4) AND x(5) AND x(6) AND x(7); END structure;
底层元件二输入同或门的描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY xnor2 IS PORT ( a,b: IN STD_LOGIC; c: OUT STD_LOGIC ); END xnor2; ARCHITECTURE bool OF xnor2 IS BEGIN c<=NOT ( NOT a)AND b OR a AND( NOT b)); END bool; • 用户将自己设计的电路标准化后作为一个元件放在库中供调用的过程称为元件例化,或者称为标准化。 • 核(IP Core)软核固核 硬核
元件例化的主要语句 • COMPONENT语句 COMPONENT 元件名 [GENERIC 说明;] --参数说明,仅整型可综合, [PORT 说明;] END COMPONENT; • 映射语句 • 标号名:元件名 [GENERIC MAP (类属关联表);] [ PORT MAP(端口关联表); ] • 标号名在结构体中必须是唯一的。
映射方式 • 参数映射关系和端口映射关系有两种:位置映射和名称映射。 • 1.位置映射方法 PORT MAP (a(0) , b(0), x(0) ); PORT ( a , b: IN STD_LOGIC ; c: OUT STD_LOGIC ); --元件说明语句 2. 名称映射方法 U0:xnor2 PORT MAP (a=>a(0), c=> x(0), b=>b(0) );
3.4 结构体的子结构形式 结构体 进程(PROCESS) 块(BLOCK) 子程序(SUBPROGRAM)
3.4.1进程 • [进程名:] PROCESS [(敏感信号量表)] 说明语句 ∶ BEGIN 顺序执行语句 ∶ END PROCESS [进程名]; • 1.进程内部所有的语句都是顺序执行的, • 2. 进程和进程之间是并行执行的, • 3.进程的启动由PROCESS语句的敏感信号量表中的信号量触发,也可以由WAIT语句触发。
进程的应用 • 利用进程语句设计一位加法器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY half-adder IS PORT(a, b: IN STD_LOGIC; sum, carry: OUT STD_LOGIC); END half-adder; ARCHITECTURE behav OF half-adder IS BEGIN PROCESS (a, b) BEGIN sum<= a XOR b AFTER 5nS; carry<= a AND b AFTER 5nS; END PROCESS END behav;
D Q clk 用进程设计D触发器 clr • LIBRARY IEEE USE IEEE.STD_LOGIC_1164.ALL; ENTITY dff4 IS PORT (clk, d, clr, pset:IN STD_LOGIC; q:OUT STD_LOGIC ); END dff4; ARCHITECTURE rtl OF dff4 IS BEGIN PROCESS (clk, pset, clr) BEGIN IF (clr = '0' ) THEN q <= ‘0'; ELSIF (pset = '0') THEN q <= ‘1'; ELSIF (clk 'EVENT AND clk = '1') THEN q <= d; END IF; END PROCESS; END rtl; pset
进程启动的WAIT语句 • (1) 无限等待 WAIT; • (2) 敏感信号量变化等待 WAIT ON 信号名[,信号名]; • (3) 条件等待 WAIT UNTIL 表达式; • (4) 时间等待 WAIT FOR 时间表达式; 例如 :WAIT FOR 20nS;--同步点在延时20nS后, WAIT ON clk, interrupt FOR 5nS;--当信号clk或 interrupt变化5nS后启动进程。
P12 P2 P1 进程1 进程2 P14 P24 P31 P34 P4 P3 进程4 进程3 3.4.2 复杂结构体的多进程组织方法 • 硬件的行为描述中,构造算法模型实际上就是把描述系统功能的自然语言翻译成为一组进程,每个进程完成不同的功能。为了方便系统的行为描述,通常用进程模型图(PMG)表示系统的行为。如图所示的系统分解成四个进程,每个进程完成一定的功能,进程之间的关联由箭头线表示。
sa 进程A stb sta 进程B q 两个进程间的通信 • ENTITY pro_com IS PORT (sa: IN BIT, q: OUT BIT) END pro_com; ARCHITECTURE folow OF pro_com IS SINGAL sta, stb: BIT: =’0’; BEGIN A: PROCESS (sa, sta) BEGIN IF (sa‘EVENT AND sa=’1’) OR (sta’EVENT AND sta=’1’); THEN stb<=‘1’ AFTER 20nS ; ‘0’ AFTER 30nS; ENDIF; END PROCESS A;
0 10 20 30 40 50 60 70 80 sa stb sta • B: PROCESS (stb) BEGIN IF (stb’EVENT AND stb = ’1’) THEN sta<=’1’ AFTER 10nS; ‘0’ AFTER 20nS; ENDIF; END PROCESS B; END folow;
3.4.3 块 • 块(BLOCK)是VHDL程序中又一种常用的子结构形式。采用多模块组织方法描述一个复杂的结构体,是一种结构化描述方法。 • 块名:BLOCK[条件表达式] [类属子句 类属接口表;] [端口子句 端口接口表;] [块说明部分] BEGIN : 并发执行语句 : END BLOCK[块名];
块结构的特点 • 从块的结构可以知道块具有如下特点: • (1)块内的语句是并发执行的,运行结果与语句的书写顺序无关; • (2)在结构体内,可以有多个块结构,块在结构体内是并发运行的; • (3)块的运行有无条件运行和条件运行两种。条件运行的块结构称为卫式BLOCK(GUARDED BLOCK)。 • (4)构内可以再有块结构,形成块的嵌套,组成复杂系统的层次化结构。 • 综上所述,块的内部结构与结构体类似,是一种层次化结构设计方法。