第五章 VHDL设计基础 本章重点: 本章难点: VHDL程序结构 VHDL的基本数据类型 VHDL的基本描述语句 基本组合逻辑电路设计 EDA技术 第五章 VHDL设计基础 本章重点: VHDL程序结构 VHDL的基本数据类型 VHDL的基本描述语句 基本组合逻辑电路设计 本章难点: 时序逻辑电路设计 状态机的VHDL设计
EDA技术 第一节、VHDL概述 硬件描述语言是以高级语言为基础,能够以形式化方式描述电路的结构和行为并用于模拟和综合的高级描述方式。目的是用软件的方法实现硬件电路的设计,实现RTL级仿真,验证设计的正确性。 VHDL: VHSIC (Very High Speed Integrated Circuit) Hardware Description Language
VHDL的历史 EDA技术 80 年代初由美国国防部在实施超高速集成电路 (VHSIC)项目时开发的。 1987年:IEEE1076-1987标准 1993年:IEEE1076-1993标准 2001年:IEEE1076-2001标准 VHDL获得广泛支持
VHDL的作用 EDA技术 1)VHDL打破软、硬件的界限 传统的数字系统设计分为: 硬件设计(硬件设计人员) 软件设计(软件设计人员) EDA工具及 HDL的流行,促使电子系统向 集成化、大规模和高速度等方向发展。
EDA技术 2)VHDL与C、C++的比较: 美国硅谷约有80%的 ASIC和 FPGA/CPLD 采用 HDL进行设计。
EDA技术 3)VHDL与电原理图描述的比较: VHDL具有较强的抽象描述能力,可进行系统 行为级别的描述。描述更简洁,效率更高。 电原理图描述必须给出完整的、具体的电路 结构图,不能进行描象描述。描述繁杂,效率低。 电原理图描述与实现工艺有关。
EDA技术 VHDL语言特点 ①VHDL具有强大的语言结构,系统硬件抽象 描述能力强、设计效率高。 一个可置数的16位计数器
EDA技术 用VHDL描述的可置数16位计数器:
EDA技术 ②VHDL语言可读性强,易于修改和发现错误。 ③VHDL具有丰富的仿真语句和库函数,可进行 早期行为仿真,利于大系统的设计与验证。 ④VHDL设计与硬件电路关系不大。 ⑤VHDL设计不依赖于器件,与工艺无关 。 ⑥移植性好。 ⑦VHDL体系符合TOP-DOWN设计思想。 ⑧VHDL设计效率高,产品上市时间快,成本低。 ⑨易于ASIC实现。
VHDL与其它硬件描述语言的比较 EDA技术 行为级 RTL级 门电路级 VHDL: IEEE标准,支持广泛。 描述。涉及电路细节少,工作量少,效率高。 对综合器要求高,不易控制底层电路的生成。
EDA技术 Verilog HDL : IEEE标准,支持广泛。 系统级抽象描述能力比VHDL稍差;门级开关 电路描述方面比 VHDL 强。适合 RTL级和门电 路级的描述。需了解电路细节,工作量较多。 ABEL、PALASM、AHDL(Altera HDL): 系统级抽象描述能力差,一般作门级电路描 述。要求对电路细节有详细的了解。工作量大。 对综合器要求低,易于控制电路资源。支持少。
第二节、VHDL程序结构 EDA技术 VHDL主要用于描述数字系统的结构、行为、 功能和接口。 VHDL将一个设计(元件、电路、系统)分为: 外部(可视部分、端口) 内部(不可视部分、内部功能、算法)
EDA技术 VHDL设计划分: 器件或 子系统 ENTITY Combinational Process Sequential component ARCHITECTURE Process Process ports ports
EDA技术 2选1选择器的VHDL描述:
EDA技术 VHDL程序基本结构 库、程序包 实体(Entity) 结构体 (Architecture) 进程 或其它并行结构 进程 或其它并行结构 配置(Configuration)
一、实体(说明) EDA技术 实体(说明): 定义系统的输入输出端口 语法: ENTITY <entity_name> IS Generic Declarations Port Declarations END <entity_name>; (1076-1987 version)
EDA技术 1、类属说明 类属说明: 确定实体或组件中定义的局部常数。 必须放在端口说明之前。 Generic ( 常数名称:类型 [:= 缺省值] );
EDA技术 类属常用于定义: 实体端口的大小、 设计实体的物理特性、 总线宽度、 元件例化的数量等。 例: entity mck is generic(width: integer:=16); port(abus:out std_logic_vector (width-1 downto 0)); …
EDA技术 例:2输入与门的实体描述 entity and2 is generic(risewidth: time:= 1 ns; fallwidth: time:= 1 ns); port(a1: in std_logic; a0: in std_logic; z0: out std_loigc); end entity and2; 注:time:用于仿真 可综合的类属值:整数
EDA技术 2、端口声明 端口声明:确定输入输出端口的数目和类型。 其中,端口模式: in 输入型,此端口为只读型。 out 输出型,此端口只能在实体内部对其赋值。 inout 输入输出型,既可读也可赋值。 buffer 缓冲型,与 out 相似,但可读。 Port ( 端口名称:端口模式 数据类型; );
EDA技术 数据类型: 指端口上流动的数据的表达格式。为预先定义好 的数据类型。 如:bit、bit_vector、integer、real、 std_logic、std_logic_vector 等。 例: entity nand2 is port ( a, b : in bit; z : out bit ) ; end nand2;
二、结构体 EDA技术 作用:定义系统(或模块)的行为、元件及内部 的连接关系,即描述其逻辑功能。 两个组成部分: 说明部分 逻辑功能描述部分
EDA技术 结构体 结构体说明 结构体功能描述 常数说明 数据类型说明 信号说明 例化元件说明 子程序说明 块语句 进程语句 信号赋值语句 子程序调用语句 元件例化语句
EDA技术 实体与结构体的关系: 一个设计实体可有多个结构体,代表实体的多种实现方式。各个结构体的地位相同。 结构体1 结构体2 结构体3 结构体n
EDA技术 结构体的语法: architecture 结构体名称 of 实体名称 is [说明语句]内部信号、常数、 注:同一实体的结构体不能同名。定义语句中的常 数、信号不能与实体中的端口同名。 architecture 结构体名称 of 实体名称 is [说明语句]内部信号、常数、 数据类型、子程序(函数、过程)、 元件等的说明; begin [并行处理(功能描述)语句]; end 结构体名称;
EDA技术 一个完整描述(3 bit 计数器)
三、配置 EDA技术 结构体1 结构体2 结构体3 设计实体 一个设计实体的多种实现方式 结构体n 。 一个设计实体的多种实现方式 结构体n 配置:从某个实体的多种结构体描述方式中选择 特定的一个。
EDA技术 简单配置的语法: configuration 配置名 of 实体名 is for 选配结构体名 end for ; 例:一个与非门不同实现方式的配置如下: configuration 配置名 of 实体名 is for 选配结构体名 end for ; end 配置名;
EDA技术 library ieee; use ieee.std_logic_1164.all; entity nand is port(a: in std_logic; b: in std_logic; c: out std_logic); end entity nand; architecture art1 of nand is begin c<=not (a and b); end architecture art1;
EDA技术 architecture art2 of nand is begin c<=‘1’ when (a=‘0’) and (b=‘0’) else ‘1’ when (a=‘0’) and (b=‘1’) else ‘1’ when (a=‘1’) and (b=‘0’) else ‘0’ when (a=‘1’) and (b=‘1’) else ‘0’; end architecture art2;
EDA技术 configuration first of nand is for art1; end for; end first; configuration second of nand is for art2 end second;
四、程序包、库 EDA技术 程序包: 库: 已定义的常数、数据类型、元件调用说明、 子程序的一个集合。 目的:方便公共信息、资源的访问和共享。 库: 多个程序包构成库。
EDA技术 1、程序包说明(包首) 语法: {包说明项} 包说明项: end 程序包名; use 语句(用来包括其它程序包); 类型说明;子类型说明;常量说明; 信号说明;子程序说明;元件说明。 package 程序包名 is {包说明项} end 程序包名;
EDA技术 例:程序包说明
EDA技术 2、程序包包体 程序包的内容:子程序的实现算法。 包体语法: 包体说明项: {包体说明项} use 语句;常量说明;类型说明;子类型说明; 子程序说明;子程序主体; package body 程序包名 is {包体说明项} end 程序包名;
EDA技术 程序包首与程序包体的关系: 程序包体仅用于子程序的描述。 程序包首可以独立定义和使用。 例: package seven is subtype segments is bit_vector(0 to 6); type bcd is range 0 to 9; end seven;
EDA技术 3、库的种类 VHDL库可分为 5种: (1)IEEE 库 定义了四个常用的程序包: • std_logic_1164 (std_logic types & related functions) • std_logic_arith (arithmetic functions) • std_logic_signed (signed arithmetic functions) • std_logic_unsigned (unsigned arithmetic functions)
EDA技术 库中程序包为:standard 定义最基本的数据类型: Bit,bit_vector ,Boolean, (2)STD 库(默认库) 库中程序包为:standard 定义最基本的数据类型: Bit,bit_vector ,Boolean, Integer,Real,and Time (3)面向ASIC的库 (4)WORK库(默认库) (5)用户定义库
EDA技术 库的使用语法: 程序包的使用有两种常用格式: 例: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.conv_integer; library 库名; use 库名.程序包名.项目名 use 库名.程序包名.All;
VHDL语言的一些基本特点: EDA技术 VHDL语言由保留关键字组成; 一般,VHDL语言对字母大小写不敏感; 例外:‘ ’、“ ”所括的字符、字符串; 每条VHDL语句由一个分号(;)结束; VHDL语言对空格不敏感,增加可读性; 在“--”之后的是VHDL的注释语句; VHDL有以下描述风格: 行为描述; 数据流(寄存器传输RTL)描述; 结构化描述;
第三节、VHDL的基本数据类型 VHDL语言要素: EDA技术 数据对象(Data Object) 数据类型(Data Type) 操作数(Operands) 操作符(Operator)
一、标识符 EDA技术 定义常数、变量、信号、端口、子程序或参数的名字。 基本标识符的要求(87标准): 由26个大小写英文字母、数字0~9及 下划线“_”组成的字符串。 以英文字母开头; 不连续使用下划线“_”; 不以下划线“_”结尾;
EDA技术 基本标识符中的英文字母不分大小写; VHDL的保留字不能作为标识符使用。 合法标识符如下: my_counter、 Decoder_1、 FFT、 Sig_N、 Not_Ack、 State0
EDA技术 非法标识符如下: _Decoder_1、 2FFT、 Sig_#N、 Not-Ack、 ALL_RST_、 data__BUS、 return、 entity
EDA技术 下标名及下标段名 下标名: 用于指示数组型变量或信号的某一个元素。 下标段名: 用于指示数组型变量或信号的某一段元素。 如: a : std_logic_vector(7 downto 0) a(7), a(6)… a(0) a(7 downto 0), a(7 downto 4), a(5 downto 3)…
二、数据对象 EDA技术 三种对象:常量(Constant) 变量(Variable) 信号(Signal) 三种对象的物理含义: 常量:电源、地、恒定逻辑值等; 变量:暂存某些值的载体,常用于描述算法; 信号:硬件连接线,端口。
EDA技术 三种对象的特点及说明场合: 信号:全局量, 定义于architecture、package、entitiy。 变量:局部量, 定义于process、function、procedure。 常量:全局量,可定义于上面两种场合。
1、常量说明 EDA技术 常量说明:对某一个常量名赋予一个固定的值。 格式: 例: constant data: bit_vector(3 downto 0):=“1010” constant width: integer: = 8; constant x: new_bit: = ‘x’; 常量数据类型必须与表达式的数据类型一致。 constant 常数名:数据类型:= 表达式;
EDA技术 常量是全局量,其作用范围取决于常量被定义的位置。 常量的可视性(作用范围): 库、程序包 实体(Entity) 结构体1 进 程1_1 进 程1_2 结构体2 进 程2_1 进 程2_2
2、变量说明 EDA技术 局部量,只能在进程和子程序中定义、使用。 格式: 例: variable a, b : bit; variable count : integer range 0 to 255 := 10; 变量的初值可用于仿真,但综合时被忽略。 variable 变量名:数据类型 约束条件:= 表达式;
3、信号说明 EDA技术 信号是电子系统内部硬件连接和硬件特性的抽象表示。 格式: 电子硬件系统运行的基本特性: 各部分电路工作的并行特性; 信号传输过程中的延时特性; 多驱动源的总线特性; 时序电路中触发器的记忆特性等。 signal 信号名:数据类型 约束条件:= 表达式;
EDA技术 例: signal a, b : bit; signal init : integer := -1; signal s1 : std_logic := ‘0’; signal s2 : std_logic_vector(15 downto 0); 注: a. 综合时初值被忽略。 b. 信号是全局量。可在结构体、实体、块中 说明和使用信号。 c. 在进程和子程序中只能使用信号,不能说 明信号。
EDA技术 例:进程中信号与变量的使用 Entity ex is port(…..); end ex; architecture arch_ex of ex is signal a, b :std_logic; begin process(a, b) variable c, d : std_logic; c:= a + b; d:= a - b; …… end process; end arch_ex;
变量赋值与信号赋值 EDA技术 变量与信号的差异: 1)赋值标识符的不同 变量:= 表达式; 信号 < = 表达式; 2)硬件实现的功能不同 信号代表电路单元、功能模块间的互联, 代表实际的硬件连线; 变量代表电路单元内部的操作,代表暂 存的临时数据。
EDA技术 3)有效范围的不同 信号:程序包、实体、结构体;全局量。 变量:进程、子程序;局部量。 ARCHITECTURE {SIGNAL Declarations} label1: PROCESS {VARIABLE Declarations} ┇ label2: PROCESS {VARIABLE Declarations}
EDA技术 4)赋值行为的不同 信号赋值延迟更新数值、时序电路; 变量赋值立即更新数值、组合电路 5)信号的多次赋值 b:多个进程:多源驱动 线与、线或、三态
EDA技术 例:信号的多次赋值 architecture rtl of ex is signal a : std_logic; begin process(…) a <= b; … end process; a <= c; ... end ex; architecture rtl of ex is signal a : std_logic; begin process(…) a <= b; … a <= c; end process; end rtl;
EDA技术 例:信号赋值与变量赋值的比较 信号赋值: architecture rtl of sig is signal a, b : std_logic; -- 定义信号 begin process(a, b) a <= b ; b <= a ; end process ; end rtl ;
EDA技术 architecture rtl of var is begin process 变量赋值: architecture rtl of var is begin process variable a, b : std_logic ; -- 定义变量 a := b ; b := a ; end process ; end rtl ;
EDA技术 例:变量赋值实现循环语句功能 process(indicator, sig) variable temp : std_logic ; begin temp := ‘0’ ; for i in 0 to 3 loop temp := temp xor (sig(i) and indicator(i)) ; end loop ; output <= temp ; end process ;
EDA技术 以上语句等效为: process(indicator, sig) variable temp : std_logic ; begin temp := ‘0’ ; temp := temp xor (sig(0) and indicator(0)) ; temp := temp xor (sig(1) and indicator(1)) ; temp := temp xor (sig(2) and indicator(2)) ; temp := temp xor (sig(3) and indicator(3)) ; output <= temp ; end process ;
EDA技术 如改为信号,结果如何? …… signal temp : std_logic; process(indicator, sig, temp) begin temp <= ‘0’ ; temp <= temp xor (sig(0) and indicator(0)) ; temp <= temp xor (sig(1) and indicator(1)) ; temp <= temp xor (sig(2) and indicator(2)) ; temp <= temp xor (sig(3) and indicator(3)) ; output <= temp ; end process ;
EDA技术 信号与端口的区别: 信号本身无方向,可读可写。 端口是一种有方向的隐形信号。 entity exam is port([signal] a, b: in std_logic; [signal] c: out std_logic); end exam; 输出端口不能读出数据,只能写入数据; 输入端口不能写入数据,只能读出数据。
三、VHDL数据类型 EDA技术 VHDL是一种强数据类型语言: 数据类型必须事先说明; 同类型才能互相传递和作用。 标量类型(SCALAR TYPE)、 复合类型(COMPOSITE TYPE)、 存取类型(ACCESS TYPE)、 文件类型(FILES TYPE)
EDA技术 又分为: 预定义数据类型、 用户自定义数据类型 1、VHDL的预定义数据类型 1)布尔量(boolean) 两种状态:false 、true 常用于逻辑函数,如相等(=)、比较(<) 等中作逻辑比较。 如: bit 值转化成boolean 值: boolean_var := (bit_var = ‘1’);
EDA技术 2)位(bit) bit 表示一位的信号值。 放在单引号中,如 ‘0’ 或 ‘1’。 3)位矢量 (bit_vector) 放在单引号中,如 ‘0’ 或 ‘1’。 3)位矢量 (bit_vector) bit_vector 是用双引号括起来的一组位数据。 如: “001100” X“00B10B” 4)字符(character) 用单引号将字符括起来。 variable character_var : character; …... Character_var : = ‘A’; EDA技术
EDA技术 5)整数(integer) integer 表示所有正的和负的整数。硬件实现时, 利用32位的位矢量来表示。可实现的整数范围为 -(231-1) to (231-1) VHDL综合器要求对具体的整数作出范围限定, 否则无法综合成硬件电路,或造成资源浪费。 如:signal s : integer range 0 to 15; 信号 s 的取值范围是0~15,可用4位二进制数表示,因此 s 将被综合成由四条信号线构成的信号。
EDA技术 6)自然数(natural)和正整数(positive) natural 是 integer类型的子类型,表示非负整数。 positive 是 integer 类型的子类型,表示正整数。 定义如下: subtype natural is integer range 0 to integer’high; subtype positive is integer range 1 to integer’high;
EDA技术 7)实数(REAL)或称浮点数 8)字符串(string) string 是 character 类型的一个非限定数组。用双引号 取值范围:-1.0E38 ~ +1.0E38 实数类型仅能用于VHDL仿真器,一般综合器不支持。 8)字符串(string) string 是 character 类型的一个非限定数组。用双引号 将一串字符括起来。如: variable string_var : string(1 to 7); …… string_var := “Rosebud”;
EDA技术 9)时间(TIME) 由整数和物理单位组成 如:55 ms,20 ns 10)错误等级(SEVERITY_LEVEL) 仿真中用来指示系统的工作状态,共有四种: NOTE(注意) WARNING(警告) ERROR(出错) FAILURE(失败)
EDA技术 2、IEEE预定义标准逻辑位与矢量 在IEEE库的程序包STD_LOGIC_1164中,定义了两个非常 重要的数据类型,即: 标准逻辑位矢量STD_LOGIC_VECTOR 1) 标准逻辑位STD_LOGIC数据类型 在IEEE库程序包STD_LOGIC_1164中的数据类型 STD_LOGIC的定义如下所示: TYPE STD_LOGIC IS (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘-’);
EDA技术 “U” 未初始化 “X” 强不定 “0” 0 “1” 1 “Z” 高阻 “W” 弱信号不定 “L” 弱信号0 “H” 弱信号1 “0” 0 “1” 1 “Z” 高阻 “W” 弱信号不定 “L” 弱信号0 “H” 弱信号1 “-” 忽略(或不可能的情况) 注意在使用该类型数据时,在程序中必须写出库说明 语句和使用包集合的说明语句。 LIBARARY IEEE; USE IEEE.STD_LOGIC_1164.ALL
EDA技术 2) 标准逻辑矢量(STD_LOGIC_VECTOR) STD_LOGIC_VECTOR 类型定义如下: TYPE STD_LOGIC_VECTOR IS ARRAY (NATURAL RANGE<>) OF STD_LOGIC;
EDA技术 3、其它预定义标准数据类型 VHDL综合工具配带的扩展程序包中,定义了 一些有用的类型。 如Synopsys公司程序包STD_LOGIC_ARITH中: 1)无符号型(UNSIGNED) 定义如下: type unsigned is array(natural range<>) of std_logic; UNSIGNED数据类型代表一个无符号的数值,在综合器中,这个数值被解释为一个二进制数,这个二进制数的最左位是器最高位。 UNSIGNED(“1000”)= 8
EDA技术 2)有符号型(SIGNED) 定义如下: type signed is array(natural range<>) of std_logic; SIGNED数据类型表示一个有符号的数值 综合器将其解释为补码,此数的最高位是符号位。 SIGNED(“0101”)= 5, SIGNED(“1011”)= -5 variable var: signed(0 to 10); var(0)是符号位
EDA技术 4、 用户自定义类型 用户自定义类型是VHDL语言的一大特色。 可由用户定义的数据类型有: 枚举类型、 整数和实数类型、 4、 用户自定义类型 用户自定义类型是VHDL语言的一大特色。 可由用户定义的数据类型有: 枚举类型、 整数和实数类型、 数组类型、 记录类型、 子类型
EDA技术 TYPE语句格式: 用类型定义语句TYPE和子类型定义语句 SUBTYPE实现用户自定义数据类型。 例: type byte is array(7 downto 0) of bit; variable addend : byte; type week is (sun, mon, tue, wed, thu, fri, sat); type 数据类型名 is 数据类型定义 [of 基本数据类型];
EDA技术 SUBTYPE语句格式: 例: subtype 子类型名 is 基本数据类型 约束范围; subtype digits is integer range 0 to 9; 由subtype 语句定义的数据类型称为子类型。 subtype 子类型名 is 基本数据类型 约束范围;
EDA技术 枚举类型 枚举该类型的所有可能的值,用文字符号来表示 一组实际的二进制数的类型(若直接用数值来定 义,则必须使用单引号)。格式: 如:type color is (blue, green, yellow, red); type my_logic is (‘0’, ‘1’, ‘U’, ‘Z’); variable hue : color; signal sig : my_logic; hue := blue; sig <= ‘Z’; type 类型名称 is (枚举文字{,枚举文字});
EDA技术 枚举类型的编码: 综合器自动实现枚举类型元素的编码,一 般将第一个枚举量(最左边)编码为0,以后的 依次加1。编码用位矢量表示 ,位矢量的长度 将取所需表达的所有枚举元素的最小值。 如: type color is (blue, green, yellow, red); 编码为: blue=“00”; green=“01”; yellow=“10”; red=“11”;
EDA技术 整数类型 用户定义的整数类型是一种新类型。格式: 例: type my_integer is range 0 to 9; 数组类型 数组:同类型元素的集合。VHDL支持多维数组。 多维数组的声明: type byte is array(7 downto 0) of bit; type vector is array(3 downto 0) of byte; 限定数组、非限定数组、属性: type 类型名称 is range 整数范围;
EDA技术 限定数组: 其索引范围有一定的限制。格式: 例 type stb is array(7 downto 0) of std_logic; 非限定数组: 数组索引范围被定义成一个类型范围。格式: 例 type bit_vector is array(integer range <>) of bit; variable my_vector : bit_vector (5 downto -5); type 数组名 is array(数组范围) of 数据类型; type 数组名 is array(类型名称 range <>) of 数据类型;
EDA技术 属性: VHDL为多种类型定义了属性。 语法如下: 对象’属性 VHDL为数组预先定义的属性: left right high low length range reverse_range event
EDA技术 属性 ’event 对在当前的一个极小的时间段Δ内发生的事件 的情况进行检测。如发生事件,则返回 true,否则 返回 false。 发生事件:信号电平发生变化。 clock’event clock=‘0’ clock’event clock=‘1’ clock’event
EDA技术 时钟信号的上升沿描述: clock’event and clock = ‘1’ 时钟信号的下降沿描述: 上升沿触发器描述: process(clock) begin if clock’event and clock = ‘1’ then q <= data ; end if ; end process;
EDA技术 属性 ’stable 属性 ’stable 的测试功能与 ’event刚好相反, 信号在Δ时间段内无事件发生,则返回 true,否则 返回 false。 以下两语句的功能相同: clock’event and clock = ‘1’ not ( clock’stable ) and clock = ‘1’
EDA技术 对应变量: variable my_vector : bit_vector (5 downto -5); 各属性如下: my_vector’left 5 my_vector’right -5 my_vector’high 5 my_vector’low -5 my_vector’length 11 my_vector’range (5 downto -5) my_vector’reverse_range (-5 to 5)
EDA技术 数据类型转换 VHDL是一种强类型语言,不同类型的数据 对象必须经过类型转换,才能相互操作。 1)类型转换函数方式 通过调用类型转换函数,使相互操作的数据对 象的类型一致,从而完成相互操作。
EDA技术 use ieee.std_logic_1164.all; entity cnt4 is library ieee; use ieee.std_logic_1164.all; entity cnt4 is port(clk: in std_logic; p: inout std_logic_vector(3 downto 0)); end cnt4;
EDA技术 library dataio; use dataio.std_logic_ops.all; architecture behv of cnt4 is begin process(clk) if clk’event and clk=‘1’ then p<=to_vector(to_integer(p)+1, 4); end if; end process; end behv;
EDA技术 2)直接类型转换方式 对相互间非常关联的数据类型(如整型、 浮点型),可进行直接类型转换。格式: 数据类型标识符(表达式) 如:variable a, b : real; variable c, d : integer; …… a:= real(c); d:= integer(b);
EDA技术 VHDL中的表达式 逻辑运算。 1、操作符 VHDL操作符的分类: 逻辑操作符(Logical Operator) 表达式:由操作符和操作数构成,完成算术或 逻辑运算。 1、操作符 VHDL操作符的分类: 逻辑操作符(Logical Operator) 关系操作符(Relational Operator) 算术操作符(Arithmetic Operator) 重载操作符(Overloading Operator)
EDA技术 1) 逻辑操作符 6种:and、or、nand、nor、xor、not 要求: 操作数类型必须相同。可为如下类型: bit、bit_vector、std_logic、std_logic_vector、boolean 数组操作数的维数、大小必须相同。 注:当有两个以上的逻辑表达式时,左右没有优先 级差别,必须使用括号,如: x <= ( a and b ) or ( not c and d ); 例外:当逻辑表达式中只有“and”、“or”、“xor”运算 符时,可以省略括号。如:
EDA技术 a <= b or c or d or e; a <= b xor c xor d xor e; 2)关系操作符 a <= b and c and d and e; a <= b or c or d or e; a <= b xor c xor d xor e; 2)关系操作符 6 种:=、/=、<、<=、>、>= 用于比较相同父类的两个操作数,返回 boolean值。
EDA技术 3)加减操作符 加操作符“+”、减操作符“-”、 串联(并置)操作符“&” 串联操作符“&”通过连接操作数来建立新的数组。操作数可以是一个数组或数组中的一个元素。 例: signal a, d : bit_vector (3 downto ); signal b, c, g : bit_vector (1 downto 0); signal e : bit_vector(2 downto 0); signal f, h, i : bit; a <= not b & not c; -- array & array d <= not e & not f; -- array & element g <= not h & not i; -- element & element
EDA技术 一元操作符 仅有一个操作数的操作符。 包括:“+”、“-” 乘除操作符 用于整数类型: “ * ”、“/ ”、“ mod ”、“ rem ” 综合的限制: “/ ”、“ mod ”、“ rem ” 三种 操作符的右操作数必须为 2 的正整数次幂,即 2n。 实际电路用移位实现。
EDA技术 操作数 操作符进行运算时所需的数据。 操作数的种类: 标志符;集合;属性;表达式;函数 调用;索引名;文字;限定表达式; 操作数: 操作符进行运算时所需的数据。 操作数的种类: 标志符;集合;属性;表达式;函数 调用;索引名;文字;限定表达式; 记录和域;片段名;类型转换
EDA技术 重载操作符 VHDL是强类型语言,相同类型的操作数才能进行操作。VHDL自身定义的算术和布尔函数仅对内部数据类型(standard 程序包中的数据类型)有效。即: 算术运算符+, -, <, >, <=, >= 仅对integer类型有效。逻辑运算符AND, OR, NOT仅对 bit 类型有效。 如:variable a,b,c :integer; variable x,y,z :bit; c := a + b; z := x and y; 问题:a, b, c 与 x, y, z 之间,或与 std_logic 等其它数据类型之间能否相互操作?
EDA技术 重载操作符定义: 对已存在的操作符重新定义,使其能进行不 同类型操作数、或相同新类型操作数之间的运算, 称为重载操作符。 定义重载操作符的函数称为重载函数。 重载操作符由原操作符加双引号表示。如 “+” 重载操作符的定义见 IEEE 库的程序包: std_logic_arith、 std_logic_unsigned、 std_logic_signed
EDA技术
EDA技术 重载操作符的使用:
EDA技术 VHDL顺序语句(Sequential) 硬件执行:并发执行(VHDL本质) 仿真执行:顺序执行、并发执行 ENTITY ARCHITECTURE Process Process ports Sequential Process CombinationalProcess ports component 硬件执行:并发执行(VHDL本质) 仿真执行:顺序执行、并发执行 分为两大类:顺序(Sequential)描述语句 并发(Concurrent)描述语句
EDA技术 顺序描述语句: 执行顺序与书写顺序一致,与传统软件设计 语言的特点相似。 顺序语句只能用在进程与子程序中。 可描述组合逻辑、时序逻辑。 常用的顺序描述语句: 赋值语句; if语句;case语句;loop语句; next语句;exit语句;子程序;return语句; wait语句;null语句。
EDA技术 转向控制语句 转向控制语句通过条件控制开关决定是否执 行一条或几条语句,或重新执行一条或几条语句, 或跳过一条或几条语句。 分为五种: if 语句、case 语句、 loop 语句、next 语句、 exit 语句
EDA技术 1、 if 语句 if 条件 then 顺序处理语句; end if ; 或多个条件的值。 1)if 语句的门闩控制 例: if (ena = ‘1’) then q <= d; end if; 综合后生成锁存器(latch) if 条件 then 顺序处理语句; end if ;
EDA技术 条件改为时钟沿,则生成 D触发器:
EDA技术 2)if 语句的二选择控制 格式: if 条件 then 顺序处理语句; 用条件来选择两条不同程序执行的路径。 else end if ;
EDA技术 此描述的典型电路是二选一电路: architecture rtl of mux2 is begin process(a, b, sel) if (sel = ‘1’) then y <= a ; else y <= b ; end if ; end process ; end rtl ;
EDA技术 3)if 语句的多选择控制 if 语句的多选择控制又称为 if 语句的嵌套。 格式: if 条件 then 顺序处理语句; elsif 条件 then ┇ else end if;
EDA技术 典型电路是多选一电路(如:四选一)。
EDA技术 最先出现的条件优先级最高,可用于设计具有优 先级的电路。如8-3优先级编码器。 library ieee; if_then_elsif 语句中隐含了优先级别的判断, 最先出现的条件优先级最高,可用于设计具有优 先级的电路。如8-3优先级编码器。 library ieee; use ieee.std_logic_1164.all; entity coder is port(input: in std_logic_vector(7 downto 0); output: out std_logic_vector(2 downto 0)); end coder;
EDA技术 architecture art of coder is begin process(input) if input(7)=‘0’ then --最高优先级 output<=“000”; elsif input(6)=‘0’ then output<=“001”; elsif input(5)=‘0’ then output<=“010”; elsif input(4)=‘0’ then output<=“011”;
EDA技术 elsif input(3)=‘0’ then output<=“100”; else output<=“111”; end if; end process; end art;
EDA技术 2、 case 语句 case 语句常用来描述总线或编码、译码行为。 可读性比if 语句强。 格式如下: case 表达式 is when 分支条件 => 顺序处理语句; end case; ┇
EDA技术 其中的分支条件可有以下的形式: when 值 => 顺序处理语句; when 值 to 值 => 顺序处理语句; 以上三种方式的混合; when others => 顺序处理语句;
EDA技术 case 语句使用注意: 1)分支条件的值必须在表达式的取值范围内。 2)两个分支条件不能重叠。 个分支条件。 4)如果没有 others 分支条件存在,则分支条 件必须覆盖表达式所有可能的值。 对std_logc, std_logic_vector数据类型要特 别注意使用others分支条件。
EDA技术 例:用case 语句描述四选一电路
EDA技术 例:case 语句的误用 signal value : integer range 0 to 15 ; signal out_1 : bit ; case value is end case ; case value is when 0 => out_1 <= ‘1’ ; when 1 => out_1 <=‘0’ ; end case ; case value is when 0 to 10 => out_1 <= ‘1’ ; when 5 to 15 => out_1 <= ‘0’ ; end case ;
EDA技术 3、 Loop 语句 [loop_label]:LOOP --sequential statement VHDL重复执行 loop 循环内的语句,直至遇 到 exit 语句结束循环。 [loop_label]:LOOP --sequential statement EXIT loop_label ; END LOOP;
EDA技术 …… L2: loop a:=a+1; exit L2 when a >10; end loop L2;
EDA技术 [标号]:for 循环变量 in 离散范围 loop 顺序处理语句; end loop [标号]; 2)for … loop 语句 特点: ①循环变量是 loop 内部自动声明的局部量, 仅在 loop 内可见;不能指定其变化方式。 ②离散范围必须是可计算的整数范围: 整数表达式 to 整数表达式 整数表达式 downto 整数表达式 [标号]:for 循环变量 in 离散范围 loop 顺序处理语句; end loop [标号];
EDA技术 例:用 for … loop 语句描述的8位奇偶校验电路 --奇校验
EDA技术 8位奇校验电路仿真结果:
EDA技术 将变量tmp的初值改为‘0’,则为偶校验电路:
EDA技术 3)while … loop 语句 [标号]:while 循环条件 loop 顺序处理语句; 例: sum:=0; abcd: while (i<10) loop sum:=sum+i; i:=i+1; end loop abcd; 注:循环变量 i 需事先定义、赋初值、指定变化方 式。一般综合工具不支持 while … loop 语句。 [标号]:while 循环条件 loop 顺序处理语句; end loop [标号];
EDA技术 例:用 while … loop 语句描述的8位奇偶校验电路
4、wait 语句 EDA技术 进程在仿真时的两个状态: 执行、挂起 进程状态的变化受wait 语句或敏感信号量变化的 控制。 可设置 4种不同的条件: wait -- 无限等待 wait on -- 敏感信号量变化 wait until -- 条件满足(可综合) wait for -- 时间到
EDA技术 wait on 语句 格式: wait on 信号[,信号]; 例:以下两种描述是完全等价的 能同时使用。 wait on 信号[,信号]; process begin y<= a and b; wait on a, b; end process; process(a, b) begin y<= a and b; end process;
EDA技术 wait until 语句(可综合) 格式: 当表达式的值为“真”时,进程被启动,否则进程 wait until 表达式; 被挂起。 wait until 语句的三种表达方式: wait until 信号 = value; wait until 信号’event and 信号 = value; wait until not(信号’stable) and 信号 = value; wait until 表达式;
EDA技术 时钟信号 clk 的上升沿的描述: wait until clk = ‘1’; wait until rising_edge(clk); wait until clk’event and clk = ‘1’; wait until not(clk’stable) and clk = ‘1’; 由以上描述可实现相同的硬件电路结构。 时钟信号下降沿的描述:
EDA技术 例:用wait until 语句描述时钟沿,实现 D触发器 architecture rtl of d is begin process wait until clk'event and clk='1'; q <= d; end process; end rtl;
EDA技术 null 语句 null为空语句,不作任何操作。 格式: null;
EDA技术 VHDL并发语句(Concurrent) Architecture 信号 并发语句 并发语句 信号 信号 并发语句
EDA技术 常用的并发描述语句有: 进程(process)语句、 块(block)语句、 顺序描述语句的并行版本、 并行过程调用语句、 元件例化语句、 生成语句。
EDA技术 进程(process)语句 进程(process)语句最具VHDL语言特色。提 供了一种用算法描述硬件行为的方法。 特点: 1、进程与进程,或其它并发语句之间的并发性; 2、进程内部的顺序性; 3、进程的启动与挂起; 4、进程与进程,或其它并发语句之间的通信。
EDA技术 [标记:] process [( 敏感信号表)] { 进程说明项} begin { 顺序描述语句} end process [标记]; 敏感信号表:进程内要读取的所有敏感信号(包括端口)的列表。每一个敏感信号的变化,都将启动进程。 格式: 信号名称 {,信号名称 }
EDA技术 敏感信号表的特点: 1、同步进程的敏感信号表中只有时钟信号。 如: process(clk) begin if (clk’event and clk = ‘1’) then if reset = ‘1’ then data <= “00”; else data <= in_data; end if; end process;
EDA技术 2、异步进程敏感信号表中除时钟信号外,还有其 它信号。 例: process(clk,reset) begin if reset = ‘1’ then data <= “00”; elsif (clk’event and clk = ‘1’) then data <= in_data; end if; end process;
EDA技术 3、如果有 wait 语句,则不允许有敏感信号表。 BEGIN --sequential statements PROCESS (a,b) BEGIN --sequential statements END PROCESS; PROCESS BEGIN -- sequential statements WAIT ON (a,b) ; END PROCESS;
EDA技术 三态缓冲器总线结构与多驱动信号 定义:给一个信号赋值,即为该信号创建一个驱动 器(驱动信号)。多个进程或并发语句给同一个信 号赋值,则该信号为多信号源驱动。 例: a_out <= a when enable_a else ‘Z’ ; b_out <= b when enable_b else ‘Z’ ; process ( a_out) begin sig <= a_out ; end process ; process ( b_out ) sig <= b_out ; end process ;
EDA技术 块语句 块语句将一系列并行描述语句进行组合,目 的是改善并行语句及其结构的可读性。可使结构 体层次鲜明,结构清晰。 语法如下: 标记:block [( 块保护表达式 )] { 块说明项 } begin { 并行语句 } end block [ 标记 ];
EDA技术 1、块语句的使用不影响逻辑功能 以下两种描述结果相同: 描述一: a1: out1<=‘1’ after 2 ns; 描述二: blk1: block begin end block blk1;
EDA技术 2、嵌套块 子块声明与父块声明的对象同名时,子块声明 将忽略掉父块声明。 两个相互独立的2输入与门
并行信号赋值语句 EDA技术 包括三种: 简单并行信号赋值; 条件信号赋值; 选择信号赋值。 共同特点: 1、赋值目标必须是信号,与其它并行语句同 时执行,与书写顺序及是否在块语句中无关。 2、每一信号赋值语句等效于一个进程语句。 所有输入信号的变化都将启动该语句的执行。
EDA技术 1、 简单并行信号赋值语句 即:信号 <= 表达式 例:以下两种描述等价 一个简单并行信号赋值语句是一个进程的缩写。 architecture behav of a_var is begin process(a) output<=a; end process; end behav; architecture behav of a_var is begin output<=a; end behav;
EDA技术 等效: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ex2 IS PORT(a,b : IN STD_LOGIC; y : OUT STD_LOGIC); END ex2; ARCHITECTURE rtl OF ex2 IS SIGNAL c : STD_LOGIC; BEGIN process1: PROCESS(a, b) c <= a and b; END PROCESS process1; process2: PROCESS(c) y <= c; END PROCESS process2; END rtl; 等效: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ex1 IS PORT(a, b : IN STD_LOGIC; y : OUT STD_LOGIC); END ex1; ARCHITECTURE rtl OF ex1 IS SIGNAL c : STD_LOGIC; BEGIN c <= a and b; y <= c; END rtl;
EDA技术 等效否? LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY ieee; ENTITY ex2 IS PORT(a,b : IN STD_LOGIC; y : OUT STD_LOGIC); END ex2; ARCHITECTURE rtl OF ex2 IS SIGNAL c : STD_LOGIC; BEGIN PROCESS(a, b, c) c <= a and b; y <= c; END PROCESS; END rtl; LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ex1 IS PORT(a, b : IN STD_LOGIC; y : OUT STD_LOGIC); END ex1; ARCHITECTURE rtl OF ex1 IS SIGNAL c : STD_LOGIC; BEGIN c <= a and b; y <= c; END rtl;
EDA技术 2、条件信号赋值语句 格式: 目的信号量 <= 表达式1 when 条件1 else 表达式2 when 条件2 else ┆ 表达式n;
EDA技术 例:用条件信号赋值语句描述四选一电路 entity mux4 is port(i0, i1, i2, i3, a, b : in std_logic; q : out std_logic); end mux4; architecture rtl of mux4 is signal sel : std_logic_vector (1 downto 0); begin sel<=b & a; q<=i0 when sel = “00” else i1 when sel = “01” else i2 when sel = “10” else i3 ; end rtl;
EDA技术 条件信号赋值语句与进程中的多选择 if 语句等价: PROCESS(sela, selb, a, b, c) BEGIN IF sela=‘1’ THEN q <= a; ELSIF selb=‘1’ THEN q <= b; ELSE q <= c; END IF; END PROCESS; q <= a WHEN sela = ‘1’ ELSE b WHEN selb = ‘1’ ELSE c;
EDA技术 with 表达式 select 目的信号量 <= 表达式1 when 条件1, 表达式2 when 条件2, ┆ 3、选择信号赋值语句 格式: 注:1)不能有重叠的条件分支。 2)最后条件可为 others。否则,其它条件必 须能包含表达式的所有可能值。 3)选择信号赋值语句与进程中的 case 语句 等价。 with 表达式 select 目的信号量 <= 表达式1 when 条件1, 表达式2 when 条件2, ┆ 表达式n when 条件n;
EDA技术 例:用选择信号赋值语句描述四选一电路 entity mux4 is port(i0, i1, i2, i3, a, b : in std_logic; q : out std_logic); end mux4; architecture rtl of mux4 is signal sel : std_logic_vector (1 downto 0); begin sel<=b & a; with sel select q<=i0 when sel = “00” , i1 when sel = “01” , i2 when sel = “10” , i3 when sel = “11” , ‘X’ when others; end rtl;
EDA技术 选择信号赋值语句与进程中的 case 语句等价: PROCESS(sel, a, b, c, d) BEGIN CASE sel IS WHEN “00” => q <= a; WHEN “01” => q <= b; WHEN “10” => q <= c; WHEN OTHERS => q <= d; END CASE; END PROCESS; WITH sel SELECT q <= a WHEN “00”, b WHEN “01”, c WHEN “10”, d WHEN OTHERS;
EDA技术 VHDL的层次化设计与元件声明 (component) 及元件例化(instantial)语句 1、层次化设计
EDA技术 2. 元件声明 定义:对所调用的较低层次的实体模块(元件) 的名称、类属参数、端口类型、数据类 型的声明。 语法: 2. 元件声明 定义:对所调用的较低层次的实体模块(元件) 的名称、类属参数、端口类型、数据类 型的声明。 语法: 元件声明类似实体声明(entity) component 元件名 [is] [generic (类属声明);] [port (端口声明);] end component [元件名] ;
EDA技术 例:元件声明
EDA技术 可在以下部分声明元件: 结构体(Architecture) 程序包(Package) 块(Block) 可作为元件声明: VHDL设计实体; 其它HDL设计实体; 另外一种标准格式的文件,如EDIF或XNF; 厂商提供的工艺库中的元件、IP核。
EDA技术 3. 元件的例化 定义:把低层元件安装(调用)到当前层次设 计实体内部的过程。 包括:类属参数传递、元件端口映射。 3. 元件的例化 定义:把低层元件安装(调用)到当前层次设 计实体内部的过程。 包括:类属参数传递、元件端口映射。 例: u1:ADD generic map (N => 4) port map (x,y,z,carry); 例化名称:元件名称 [ generic map ( [类属名称 => ]表达式 {,[类属名称 => ]表达式 } )] port map ([ 端口名称 => ] 表达式 {,[ 端口名称 => ] 表达式 });
EDA技术 映射方式: 名称关联方式: 低层次端口名 =>当前层次端口名、信号名 例:or2 port map(o => n6, i1 => n3, i2 => n1) 位置关联方式: (当前层次端口名,当前层次端口名,┈) 例:or2 port map( n3, n1,n6 ) 注:位置关联方式中,例化的端口表达式(信号) 必须与元件声明语句中的端口顺序一致。
EDA技术 一个低层次设计在被例化前必须有一个元件声明。 ENTITY exam is PORT( ea, eb :IN STD_LOGIC_VECTOR(3 DOWNTO 0); ey : OUT STD_LOGIC); END exam ; ARCHITECTURE exam_arch OF exam IS COMPONENT compare PORT( a : IN STD_LOGIC_VECTOR(3 DOWNTO 0); b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); y : OUT STD_LOGIC ); END COMPONENT; --元件声明 BEGIN u1 : compare PORT MAP ( ea, eb, ey) ; --元件例化 END exam_arch ;
EDA技术 例:3 bit 计数器的电路组成:
EDA技术 此电路由 9个元件组成:3个D触发器、1个非门、1个 2 输入或门、3个2输入与非门、1个2输入异或非门。对应的元件例化(结构化)描述如下:
EDA技术
EDA技术
EDA技术 在一个设计组中,各个设计者可独立地以不 同的设计文件设计不同的模块元件。 各个模块可以被其他设计者共享,或备以后 使用。 层次化设计的优点: 在一个设计组中,各个设计者可独立地以不 同的设计文件设计不同的模块元件。 各个模块可以被其他设计者共享,或备以后 使用。 层次设计可使系统设计模块化,便于移植, 复用。 层次设计可使系统设计周期更短,更易实现。
EDA技术 生成语句 生成语句的作用:复制 建立 0 个或多个备份。(并行结构) 分为两类: for ┅ generate:采用一个离散的范围决 定备份的数目。 If ┅ generate:有条件地生成 0 个或 1 个备份。
EDA技术 1、for ┅ generate 语句 语法: 标号:for 循环变量 in 范围 generate { 并行语句 } 范围:整数表达式 to 整数表达式 整数表达式 downto 整数表达式 for --- loop 语句与 for ┅ generate 的比较: 标号:for 循环变量 in 范围 generate { 并行语句 } end generate [标号];
EDA技术 例:用生成语句创建多个备份 component comp port (x : in bit ; y : out bit) ; end component ; ┉ signal a , b : bit_vector (0 to 7) ; gen : for I in a’range generate u : comp port map (x => a( I ), y => b( I )) ; end generate gen ;
EDA技术 2、If ┅ generate 语句 语法: 标号:if 条件表达式 generate { 并行语句 } if ┅ then语句与 If ┅ generate 的区别: 1、if ┅ then语句是顺序结构, If ┅ generate 则为并行结构。 2、If ┅ generate 没有类似于 if ┅ then语句的 else 或 elsif 分支语句。 标号:if 条件表达式 generate { 并行语句 } end generate [标号];
EDA技术 例:N bit 串并转换器 7 6 5 4 3 2 1 0
EDA技术 N bit 串并转换器
EDA技术 子程序(SUBPROGRAM) 子程序定义的区域: Architecture Process 子程序与进程语句的区别: Package Architecture Process 子程序与进程语句的区别: 进程可以直接读写结构体内的其它信号。 子程序不能从结构体的其余部分直接读写信号。 所有通信都是通过子程序的接口来完成的。
EDA技术 与普通软件中子程序调用的区别: 普通软件子程序调用增加处理时间; VHDL中每调用一次子程序,其综合后都将 子程序与硬件规模: 与普通软件中子程序调用的区别: 普通软件子程序调用增加处理时间; VHDL中每调用一次子程序,其综合后都将 对应一个相应的电路模块。子程序调用次数与综 合后的电路规模成正比。 设计中应严格控制子程序调用次数。
EDA技术 子程序的类型: 过程(Procedure): 0 个或多个 in、inout、或 out 参数。 可获得多个返回值。 函数(Function): 0 个或多个 in 参数,一个 return 值。 只能获得一个返回值。 过程可作为一种独立的语句结构而单独存在, 函数通常作为表达式的一部分来调用。 子程序包含两部分:子程序声明和子程序主体。
EDA技术 子程序声明 Procedure 过程名[(参数声明)]; [参数名:方式 参数类型 {;参数名:方式 参数类型}] 1、过程声明语法 参数声明指明输入输出端口的数目和类型, 语法如下: 方式指参数的传递方向,有三种形式: in、out、inout Procedure 过程名[(参数声明)]; [参数名:方式 参数类型 {;参数名:方式 参数类型}]
EDA技术 2、函数声明语法 Function 函数名 [(参数声明)] 参数声明指明输入输出端口的数目和类型, return 类型; 语法如下: 对函数,方式只能用 in 方式。 Function 函数名 [(参数声明)] return 类型; [参数名:方式 参数类型 {;参数名:方式 参数类型}]
EDA技术 例:函数和过程的声明(放在程序包首中)
EDA技术 子程序主体 子程序主体: 定义子程序算法的具体实现。 1、过程主体语法: Procedure 过程名 [(参数声明)] is {子程序声明项} begin {顺序语句} end [过程名];
EDA技术 2、函数主体语法: Function 函数名称 [(参数声明)] return 类型 is {函数声明项} begin {顺序语句} end [函数名称];
EDA技术 例:前述子程序声明的子程序主体(程序包体中)
EDA技术 子程序的调用: 在程序包中定义了子程序后,即可调用: use work.pkg.all; ┇ signal int : integer ; variable even : boolean ; int <= 7 ; even := is_even(int) ; variable top, bot : nibble ; byte_to_nibbles (“00101101”, top, bot) ; P1 P2
第四节、基本逻辑电路设计 EDA技术 基本逻辑电路: 组合逻辑电路、时序逻辑电路 组合逻辑电路设计 简单门电路、编码器、译码器、 加法器、多路选择器、三态门等。
EDA技术 1、基本门电路
EDA技术 2、编码器 设计一个 8 输入优先级编码器,y0 级别最低, y7 级别最高;输出为3位编码。
EDA技术 方法1:利用 if 多选择语句自顶向下的优先特性
EDA技术 方法2:进程内为顺序语句,最先描述优先级最 低,最后描述优先级最高,可实现优先级编码。
EDA技术 方法3:利用条件赋值语句 architecture behavior of priority is begin vec <= “111” when y7 = ‘1’ else “110” when y6 = ‘1’ else “101” when y5 = ‘1’ else “100” when y4 = ‘1’ else “011” when y3 = ‘1’ else “010” when y2 = ‘1’ else “001” when y1 = ‘1’ else “000” when y0 = ‘1’ else “XXX”; end behavior;
EDA技术 3、译码器 译码器是编码器的逆过程。如 3-8 译码器:
EDA技术 方法1:使用逻辑左移运算符 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity decoder is port(inp : in std_logic_vector(2 downto 0); outp : out std_logic_vector(7 downto 0)); end decoder; architecture rtl of decoder is begin outp<=“00000001” sll(conv_integer(inp)); end rtl; 译码输出高有效
EDA技术 方法2:使用process语句 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity decoder is port(inp : in std_logic_vector(2 downto 0); outp : out std_logic_vector(7 downto 0)); end decoder; architecture rtl of decoder is begin process(inp) outp<=(others=>’0’); outp(conv_integer(inp))<=‘1’; end process; end rtl; 译码输出高有效
EDA技术 4、加法器 带进位的 4位加法器符号如下:
EDA技术 方法1:用for – loop语句实现
EDA技术
EDA技术 方法2:直接使用加法“+”函数:
EDA技术
EDA技术 加法器仿真结果:
EDA技术 5、多路选择器 6、三态门及总线缓冲器 选择赋值语句分别描述过 4 选 1 选择器。 a : std_logic; 前面用 if 语句、case 语句、条件赋值语句、 选择赋值语句分别描述过 4 选 1 选择器。 6、三态门及总线缓冲器 VHDL语言通过指定大写的 Z 值表示高阻状态 a : std_logic; a_bus : std_logic_vector(7 downto 0); 指定高阻状态如下: a <= ‘Z’ ; a_bus <= “ZZZZZZZZ” ;
EDA技术 时序逻辑电路设计 触发器、寄存器、计数器、分频器、 信号发生器等。 一、时序电路特殊信号的描述 时钟信号和复位信号 1、时钟信号描述 常用的描述方式: 1)进程的敏感信号是时钟信号,在进程内部 用if 语句描述时钟的边沿条件。
EDA技术 如: process (clock) begin if (clock_edge_condition) then signal_out <= signal_in ; ┇ 其它时序语句 end if ; end process ;
EDA技术 2)在进程中用 wait until 语句描述时钟信号,此 时进程将没有敏感信号。 如: process begin wait until (clock_edge_condition) ; signal_out <= signal_in ; ┇ 其它时序语句 end process ;
EDA技术 注意: a. 在对时钟边沿说明时,一定要注明是上升 沿 还是下降沿。 b. 一个进程中只能描述一个时钟信号。 c. Wait until 语句只能放在进程的最前面或 最后面。 3)时钟边沿的描述 时钟上升沿: (clock’event and clock = ‘1’) 时钟下降沿: (clock’event and clock = ‘0’)
EDA技术 2、触发器的复位信号描述 1)同步复位:在只有以时钟为敏感信号的 进程中定义。 如:process (clock) begin if (clock_edge_condition) then if (reset_condition) then signal_out <= reset_value ; else signal_out <= signal_in ; ┇ end if ; end process ;
EDA技术 号外,还有复位信号。 如:process (reset_signal, clock) begin 2)异步复位:进程的敏感信号表中除时钟信 号外,还有复位信号。 如:process (reset_signal, clock) begin if (reset_condition) then signal_out <= reset_value; elsif (clock_edge_condition) then signal_out <= signal_in ; ┇ end if ; end process ;
EDA技术 二、常用时序电路设计 1、触发器(Flip_Flop) 1)D触发器
EDA技术 2)T触发器 library ieee; use ieee.std_logic_1164.all; entity t_ff is port(t, clk : in std_logic; q : buffer std_logic); end t_ff; architecture rtl of t_ff is begin process(clk) if clk’event and clk=‘1’ then q<=not q; end if; end process; end rtl;
EDA技术 2、寄存器 8位串行输入、串行输出移位寄存器:
EDA技术 方法一:8位移位寄存器的结构化描述
EDA技术 方法二:直接用信号连接描述
EDA技术
EDA技术 3、计数器 计数器分为:同步计数器 异步计数器 (1)同步计数器 同步计数器指在时钟脉冲(计数脉冲)的控 制下,构成计数器的各触发器状态同时发生变化 的计数器。
EDA技术 带允许端的十二进制计数器
EDA技术
EDA技术 例:六十进制(分、秒)计数器
EDA技术
EDA技术 60进制计数器仿真结果:
EDA技术 异步计数器又称为行波计数器,它的低位计 数器的输出作为高位计数器的时钟信号。 异步计数器采用行波计数,使计数延迟增加, (2)异步计数器 异步计数器又称为行波计数器,它的低位计 数器的输出作为高位计数器的时钟信号。 异步计数器采用行波计数,使计数延迟增加, 计数器工作频率较低。 描述异步计数器与同步计数器的不同主要体 现在对各级时钟脉冲的描述上。
EDA技术 例:由8个触发器构成的行波计数器:
EDA技术 基本元件 dffr 的描述:
EDA技术 采用元件例化描述8位行波计数器:
EDA技术 8 位行波计数器仿真结果:
EDA技术 第五节、状态机的VHDL设计 状态机的分类: 摩尔型状态机(Moore) 米勒型状态机(Mealy)
EDA技术 摩尔状态机的VHDL设计 摩尔型状态机的输出仅与当前状态有关 状态 寄存器 次态 逻辑 输出 逻辑 复位信号 输入 次态 时钟信号
EDA技术 摩尔型状态机真值表: 当前状态 下一状态 输出 X=0 X=1 S0 S2 S1 1 S3
EDA技术
EDA技术
EDA技术
EDA技术
EDA技术 米勒状态机的VHDL设计 米勒型状态机的输出不仅是当前状态的函数. 也是输入信号的函数。 状态 寄存器 次态 逻辑 输出 逻辑 复位信号 状态 寄存器 次态 逻辑 输出 逻辑 输入 次态 当前状态 输出 时钟信号
EDA技术 米勒型状态机真值表: 当前状态 下一状态 输出 X=0 X=1 S0 S2 1 S1 S3
EDA技术
EDA技术
EDA技术
EDA技术