34
第第 第第 VHDL VHDL 第第 第第 第第第第第第第第 第第第第第第第第 2006-4-17 2006-4-17

第一部分 VHDL 基础

Embed Size (px)

DESCRIPTION

第一部分 VHDL 基础. 电工电子实验中心 2006-4-17. 第一章 概述. - PowerPoint PPT Presentation

Citation preview

Page 1: 第一部分  VHDL 基础

第一部分 第一部分 VHDLVHDL 基础 基础 电工电子实验中心电工电子实验中心

2006-4-172006-4-17

Page 2: 第一部分  VHDL 基础

第一章 概述第一章 概述 • 随着集成电路制造技术的发展,使得出现了大规模、超大规模 PLD( Programmatic Logic Device ,可编程逻辑器件)的出现,对传统的数字系统的设计方法提出了巨大的挑战,同时也促成了 EDA ( Ele

ctronic Design Automation ,电子设计自动化)的技术诞生和发展。它主要是以 HDL ( Hardware Description Language ,硬件描述语言)来表达设计意图,以 CPLD ( Complex Programmable Logic Device )或 FPGA ( Field Programmable Gate Array )作为硬件实现载体,以计算机为设计开发工具,以 EDA 软件为开发环境的现代电子设计方法。

• 目前成为 IEEE ( The Institute of Electrical and Electronics Engineers ,美国电气与电子工程师学会) HDL 语言标准的有: ALTERA 公司的 VHDL 、 Candence 公司的从 C 语言发展来得 Verilog HDL 。

• VHDL 的英文全名是 VHSIC ( Very High Speed Integrated Circuits ) Hardware Description Language ,于 1983 年由美国国防部( The United States Department of Defense )提出,并由 IEEE 进一步发展,在 1987 年 12 月作为 IEEE - STD—1076 标准发布, 93 年被更新卫 IEEE - STD - 1164 标准,目前已经被广泛应用。

Page 3: 第一部分  VHDL 基础

第二章 第二章 VHDLVHDL 程序的基本结构程序的基本结构 • 例 1 一个 2 选 1 得选择器得逻辑描述• LIBRARY IEEE; -- 库说明语句• USE IEEE.STD_LOGIC_1164.ALL; -- 程序包说明语句• ENTITY MUX_21 IS• PORT(A,B,SEL : IN STD_LOGIC; ―― 实体部分• Y : OUT STD_LOGIC);• END;• ARCHITECTURE BEV OF MUX_21 IS• BEGIN• PROCESS(SEL,A,B)• BEGIN• IF (SEL = '0' ) THEN• Y <= A; ―― 结构体部分• ELSE• Y <= B;• END IF;• END PROCESS;• END;

Page 4: 第一部分  VHDL 基础

Y~0

0

1AB

SEL

Y

2.1 实体:集成电路的外部说明(如图黑色框外面得管脚说明);实体一般格式为: ENTITY 实体名 IS

PORT (端口名 { ,端口名 } :端口模式 数据类型; 端口名 { ,端口名 } :端口模式 数据类型); END ;

IEEE1076 标准包中定义了以下常用的端口模式: IN 输入,只可以读 OUT 输出,只可以写 BUFFER 输出(构造体内部可再使用) INOUT 双向,可以读或写

Page 5: 第一部分  VHDL 基础

• VHDL 语言中的数据类型有多种,但在数字电路的设计中经常用到的只有两种,即 BIT和 BIT_VECTOR (分别等同于 STD_LOGIC 和 STD_LOGIC_VECTOR )。当端口被说明为 BIT 时,该端口的信号取值只能是二进制数“ 1” 和“ 0” ,即位逻辑数据类型;而当端口被说明为 BIT_VECTOR 时,该端口的信号是一组二进制的位值,即多位二进制数。

Page 6: 第一部分  VHDL 基础

• 2.2 结构体:集成电路的内部实现(图示黑色框内部得具体电路)。 2.2.1 结构体一般格式:• ARCHITECTURE 结构体名 OF 实体名 IS• [ 结构体说明部分 ];• BEGIN• [ 并发处理语句 ] ;• END 结构体名; • 说明语句• 说明语句用于对结构体内部使用的信号、常数、数据类型和函数进行定义。• 并发处理语句• 语句同时被执行,没有位置先后之分。

Page 7: 第一部分  VHDL 基础

2.2.2 2.2.2 结构体的结构体的 33 种描述方法:种描述方法:行为行为描述、描述、数据流数据流描述和描述和结构化结构化描述 描述 2.2.3 结构体的子结构描述 在规模较大的电路设计中,全部电路都用唯一的一个模块来描述是非常不方便的。为此,电路设计者总希望将整个电路分成若干个相对比较大的模块来进行电路的描述。这样,一个构造体可以用几个子结构,既相对比较独立的几个模块来构成。 VHDL语言可以有以下三种形式的子结构描述语句:

Page 8: 第一部分  VHDL 基础

2.3.3.1 2.3.3.1 子程序子程序• VHDL 提供两种子程序:函数 (FUNCTIO

N) 和过程 (PROCEDURE)过程过程的定义形式如下:PROCEDURE< 过程名称 >< 接口表 > ISBEGIN< 过程语句部分 > ;END 过程名称;

Page 9: 第一部分  VHDL 基础

函数函数的定义形式如下:FUNCTION< 函数名称 >< 接口表 >RETURN< 数据类型 >IS[ 定义语句 ] ;BEGIN< 函数语句部分 > ;END 函数名称;下面是一个比较器的例子:FUNCTION max(a, b: INTEGER) RETURN INTEGER ISBEGINIF (a>=b)THEN RETURN a;ELSE RETURN b;END IF;END max;一个函数定义好后,可以在其它地方调用。

Page 10: 第一部分  VHDL 基础

2.3.3.2 BLOCK2.3.3.2 BLOCK 语句 语句 • 采用 BLOCK 语句描述局部电路的书写格式如下:• 块结构名:• BLOCK• BEGIN• …• …• …• END BLOCK 块结构名;

Page 11: 第一部分  VHDL 基础

2.3.3.32.3.3.3 进程语句(进程语句( PROCESPROCESSS ) )

• 采用 PROCESS 语句描述局部电路的书写格式如下:• [ 进程名 ] : PROCESS (信号 1 ,信号 2

… )• BEGIN• …• …• …• END PROCESS ;

Page 12: 第一部分  VHDL 基础

2.32.3 库(库( LIBRARYLIBRARY ))• 库是经编译后的数据的集合,用来存放程序包定义、实体定义、结构体定义和配置定义,使设计者可以共享已经编译过的设计结果。在 VHDL 语言中,库的说明总是放自在设计单元的最前面:• 库说明语句的语法形式为:• LIBRARY 库名; -- 说明使用什么库• USE 包集合名 ; -- 说明使用库中哪一个包集合

Page 13: 第一部分  VHDL 基础

• 这样一来,在设计单元内的语句就可以使用库中的数据。 VHDL 语言允许存在多个不同的库,但各个库之间是彼此独立的,不能互相嵌套。主要有: STD , WORK , IEEE ,用户自定义库。• 其中最常用的是 IEEE 库: IEEE 库中包含 IE

EE 标准的程序包,包括 STD_LOGIC_1164 、STD_LOGIC_UNSIGNED 、 NUMERIC_BIT 、 NUMERIC_STD 以及其他一些程序包。其中STD_LOGIC_1164 是最主要的程序包,大部分可用于可编程逻辑器件的程序包都以这个程序包为基础。

Page 14: 第一部分  VHDL 基础

第三章 第三章 VHDLVHDL 的数据类型和运算操的数据类型和运算操作符作符3.1 VHDL 语言的对象 • 1 )常量:一般格式:• CONSTANT 常数名:数据类型: = 表达式;• 例: CONSTANT Vcc: REAL: =5.0;

Page 15: 第一部分  VHDL 基础

2 )变量:• 一般格式:• VARIABLE 变量名 数据类型 约束条件:

= 表达式;• 例: VARIABLE count: INTEGER RANG

E 0 TO 255 := 10; • —定义计数变量范围

Page 16: 第一部分  VHDL 基础

3 )信号:用于连接线。• 一般格式: SIGNAL 信号名: 数据类型;• 信号除了没有方向的概念以外几乎和端口概念一致。• 例: SIGNAL q_out : STD_LOGIC :=’0’;• q_out <= q_out + 1 AFTER 5ns;

Page 17: 第一部分  VHDL 基础

信号与变量的区别:• 信号赋值可以有延迟时间,变量赋值无时间延迟;• 信号除当前值外还有许多相关值,如历史信息等,变量只有当前值;• 进程对信号敏感,对变量不敏感;• 信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见;• 信号可以看作硬件的一根连线,但变量无此对应关系。

Page 18: 第一部分  VHDL 基础

3.2 VHDL 语言的数据类型 在 VHDL 语言中,信号、变量、常数都是需要指定数据类型的, VHDL 提供的数据类型可归纳如下:

Page 19: 第一部分  VHDL 基础

• 3.3 VHDL 语言的运算操作符• 如同别的程序设计语言一样, VHDL 中的表达式是由运算符将基本元素连接起来的式子。 VHDL 的运算符可分为 4 组:• 算数运算符、关系运算符、逻辑运算符和其他运算符以及它们的优先级别如下表所示:

Page 20: 第一部分  VHDL 基础

优先级顺序 运算符类型 运 算 符 功 能 高 逻辑运算符

AND 与OR 或

NAND 与非NOR 或非XOR 异或

XNOR 异或非关系运算符

= 等于/= 不等于< 小于> 大于

<= 小于等于>= 大于等于+ 加― 减& 连接+ 正― 负* 乘/ 除

MOD 求模REM 取余* * 指数

ABS 取绝对值NOT 取反

Page 21: 第一部分  VHDL 基础

• 对常用的运算符进行说明:• 通常,在一个表达式中有两个以上的算符时,需要使用括号将这些操作分组。如果一串操作的算符相同,且是 AN

D 、 OR 、 XOR 这三个算符中的一种,则不需要使用括号,如果一串操作中的算符不同或有除这三种算符之外的算符,则必须使用括号。如:• a AND b AND c AND d• ( a OR b ) NAND c• 关系运算符 = 、 /= 、 < 、 <= 和 >= 的两边类型必须相同,因为只有相同的数据类型才能比较,其比较的结果为 BO

OLEAN 型。• 连接运算符用于一维数组,“ &”符号右边的内容连接之后形成一个新的数组,也可以在数组后面连接一个新的元素,或将两个单元素连接形成数组。连接操作常用于字符串。

Page 22: 第一部分  VHDL 基础

3.4 VHDL3.4 VHDL 语句。语句。• VHDL 语句是并发语言,大部分语句是并发执行的。但在进程、过程、块语句和子程序(包括函数)中,还有许多顺序执行语句,按出现的次序执行各条语句。下面介绍几种常用语句。

Page 23: 第一部分  VHDL 基础

• 1. IF 语句。 IF 语句是根据所制定的条件来确定执行那些语句。• 基本结构:• IF 条件 THEN• 顺序处理语句;• ELSE• IF 条件 THEN• 顺序处理语句;• ELSIF 条件 THEN• 顺序处理语句;• END IF ;• END IF ;

Page 24: 第一部分  VHDL 基础

2. CASE 语句。其书写格式为:• CASE 表达式 IS• WHEN 条件表达式 => 顺序处理语句;• END CASE;• 条件句中的“ =>” 不是操作符,只相当于“ THEN” 作用。

Page 25: 第一部分  VHDL 基础

• 例子:用两种语句实现 3 - 8 译码器。结构体是行为描述:按算法的路径来描述。所以行为描述在EDA 工程中称为高层次描述或高级描述。

• LIBRARY IEEE; -- 库文件声明• USE IEEE.STD_LOGIC_1164.ALL;• ENTITY IF_38 IS -- 实体• PORT(A,B,C,G1,G2A,G2B : IN STD_LOGIC; -- 端口说明• Q_OUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));• END;• ARCHITECTURE BEV OF IF_38 IS -- 结构体 ?• SIGNAL INPUT : STD_LOGIC_VECTOR(2 DOWNTO 0); -- 声明一个信号• BEGIN• INPUT <= C&B&A; -- 位信号连接成位向量• PROCESS(G1,G2A,G2B,INPUT) -- 进程开始,捕捉这四个信号变化。• BEGIN -- 进程是一个死循环,由敏感信号的变化来启动进程。• IF(G1='1' AND G2A = '0' AND G2B = '0') THEN -- 条件使能判断• CASE INPUT IS -- 译码开始• WHEN "000" => Q_OUT <= "11111110";-- 注意 IF 和 CASE 语句的结构。• WHEN "001" => Q_OUT <= "11111101";• WHEN "010" => Q_OUT <= "11111011";• WHEN "011" => Q_OUT <= "11110111";• WHEN "100" => Q_OUT <= "11101111";• WHEN "101" => Q_OUT <= "11011111";• WHEN "110" => Q_OUT <= "10111111";• WHEN "111" => Q_OUT <= "01111111";• WHEN OTHERS => Q_OUT <= "XXXXXXXX";• END CASE;• ELSE• Q_OUT <= "11111111";• END IF;• END PROCESS;• END;

Page 26: 第一部分  VHDL 基础

3. 通用模块、元件调用语句( COMPONENT ),端口映射语句( PORT MAP )。( 这个不是顺序语句,是并行语句 ) 。

• 例子:用半加器构成全加器。• 半加器的结构体是数据流描述:描述了数据流程的运动路径、运动方向和运动结果(布尔方程)。• 全加器的结构体是结构化描述,由子模块来搭建。

Page 27: 第一部分  VHDL 基础

半加器• LIBRARY IEEE;• USE IEEE.STD_LOGIC_1164.ALL;• ENTITY H_D IS --半加器• PORT(A,B : IN STD_LOGIC;• S,CO : OUT STD_LOGIC);• END;• ARCHITECTURE D_STREAM OF H_D IS• SIGNAL C,D : STD_LOGIC;• BEGIN -- 结构体为数据流描述• C <= A NAND B;• D <= A OR B;• CO <= NOT C;• S <= C AND D; • END;

Page 28: 第一部分  VHDL 基础

全加器• LIBRARY IEEE;• USE IEEE.STD_LOGIC_1164.ALL;• ENTITY H_D_F_D IS -- 全加器• PORT(A_F,B_F,CIN: IN STD_LOGIC;• S_F,CO_F : OUT STD_LOGIC);• END;• ARCHITECTURE STRCTURE OF H_D_F_D IS• COMPONENT H_D --半加器模块声明• PORT(A,B : IN STD_LOGIC;• S,CO : OUT STD_LOGIC);• END COMPONENT;• SIGNAL E,F,G: STD_LOGIC;• BEGIN -- 结构体为结构化描述• U1: H_D PORT MAP(A => A_F,B => B_F,S => E,CO => F); • -- 端口映射,元件例化。• U2: H_D PORT MAP(A => CIN,B => E,S => S_F,CO => G); • CO_F <= F OR G;• END;

Page 29: 第一部分  VHDL 基础

4. FOR , WHILE , NEXT , EXIT 语句。• Next , exit 语句类似于 C 中的 continue 和

break ;• FOR 语句一般格式:• [ LOOP 标号: ] FOR 循环变量 IN 起始值 TO 结束值 LOOP• 顺序语句;• NEXT [LOOP 标号 ] [WHEN 条件表达式 ] ;• EXIT [LOOP 标号 ] [WHEN 条件表达式 ] ;• END LOOP [LOOP 标号 ] ;

Page 30: 第一部分  VHDL 基础

• WHILE 语句的一般格式:• [ LOOP 标号: ]WHILE 条件表达式 LOOP• 顺序语句;• NEXT [LOOP 标号 ] [WHEN 条件表达式 ] ;• EXIT [LOOP 标号 ] [WHEN 条件表达式 ] ;• END LOOP [LOOP 标号 ] ;

Page 31: 第一部分  VHDL 基础

• 下面以 FOR 语句举例:• 两个 4 位矢量的比较程序。• LIBRARY IEEE;• USE IEEE.STD_LOGIC_1164.ALL;• ENTITY COMP IS• PORT(A,B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);• C_B,C_E,C_L : OUT STD_LOGIC);• END;• ARCHITECTURE BEV OF COMP IS• SIGNAL C_B_C,C_E_C,C_L_C:STD_LOGIC;• BEGIN• PROCESS(A,B)• BEGIN• JUDGE: FOR I IN 3 DOWNTO 0 LOOP• IF (A(I) > B(I) ) THEN -- 从高位开始比较,大于便退出。• C_B <= '1';• C_E <= '0';• C_L <= '0';• EXIT JUDGE;• ELSIF (A(I) < B(I)) THEN -- -- 从高位开始比较,葱小于便退出。• C_B <= '0';• C_E <= '0';• C_L <= '1';• EXIT JUDGE;• ELSE -- 只有在全相等的时候才输出。• C_B_C <= '0';• C_E_C <= '1';• C_L_C <= '0';• END IF; • END LOOP; • END PROCESS;• C_B <= C_B_C;• C_E <= C_E_C;• C_L <= C_L_C;• END;

Page 32: 第一部分  VHDL 基础

5. 时序电路设计中对时钟的处理。• 对于常见的触发方式的描述:• PROCESS ( clock )• BEGIN• 对触发方式的描述• • END PROCESS ;• 5.1 上升沿触发:• IF CLOCK’EVENT AND CLOCK = ‘1’ THEN• …….• END IF ;• 或• IF RISING_EDGE(CLOCK) THEN• …….• END IF;

Page 33: 第一部分  VHDL 基础

• 5.2 下降沿触发:• IF CLOCK’EVENT AND CLOCK = ‘0’

THEN• …….• END IF ;• 5.2 高电平触发:• WAIT UNTILL CLOCK = ‘1’;• 5.3 低电平触发:• WAIT UNTILL CLOCK = ‘0’ ;

Page 34: 第一部分  VHDL 基础

• 例子:带有使能端,以及异步清零端的 10 进制计数器。• LIBRARY IEEE;• USE IEEE.STD_LOGIC_1164.ALL;• USE IEEE.STD_LOGIC_UNSIGNED.ALL; ―― 为了实现向量的加法运算。• ENTITY COUNT_10 IS• PORT(CLK ,EA,RST : IN STD_LOGIC;• Q_OUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));• END;• ARCHITECTURE BEV OF COUNT_10 IS• SIGNAL C_COUNT : STD_LOGIC_VECTOR(3 DOWNTO 0); • BEGIN• PROCESS(CLK,EA,RST)• BEGIN• IF(RST = '1' ) THEN ――判断清零端• C_COUNT <= "0000";• ELSIF(EA = '1') THEN ―― 判断使能端• IF ( CLK'EVENT AND CLK = '1') THEN ――RST=’ 1’ , EA =’ 1’ 开始记数• IF (C_COUNT = "1001") THEN ―― 如记到 9 后,输出全零• C_COUNT <= "0000";• ELSE ―― 否则,继续累加。• C_COUNT <= C_COUNT + 1;• END IF;• END IF;• END IF;• END PROCESS;• Q_OUT <= C_COUNT;• END;