1.52k likes | 1.91k Views
VHDL 设计方法. —用 VHDL 语言实现可编程数字系统设计. VHDL 设计方法. VHDL 概述 VHDL 的设计单元 VHDL 的基本语法结构. 第一部分. VHDL 概述. VHDL 的含义. V HSIC (Very High Speed Integrated Circuit) H ardware D escription L anguage. VHDL 历史. 1982 年, 诞生于美国国防部赞助的 VHSIC 项目 1987 年底, VHDL 被 IEEE 和美国国防部确认为标准硬件描述语言 ,即 IEEE-1076( 简称87版)
E N D
VHDL设计方法 —用VHDL语言实现可编程数字系统设计
VHDL设计方法 • VHDL概述 • VHDL的设计单元 • VHDL的基本语法结构
第一部分 VHDL 概述
VHDL的含义 VHSIC (Very High Speed Integrated Circuit) Hardware Description Language
VHDL历史 • 1982年, 诞生于美国国防部赞助的VHSIC项目 • 1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言 ,即IEEE-1076(简称87版) • 1993年,IEEE对VHDL进行了修订,公布了新版本的VHDL,即IEEE标准的1076-1993(1164)版本 • 1996年,IEEE-1076.3成为VHDL综合标准
VHDL特点 • 与其他的硬件描述语言相比,VHDL具有更强的行为描述能力 • VHDL丰富的仿真语句和库函数,使得在设计的早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟 • VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能 • 对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表 • VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计
VHDL与其他HDL比较 • VHDL—“告诉我你想要电路做什么,我给你提供能实现这个功能的硬件电路” • Verilog—和VHDL类似 • ABEL、AHDL—“告诉我你想要什么样的电路,我给你提供这样的电路”
第二部分 VHDL的设计单元
VHDL的设计单元 • Entity(实体)用来说明模型的外部输入输出特征 • Architecture(构造体)用来定义模型的内容和功能 • 每一个构造体必须有一个实体与它相对应,所以两者一般成对出现
黑盒 rst q[7:0] d[7:0] co clk 实体 • 类似一个“黑盒”,实体描述了“黑盒”的输入输出口
关键字 类属参量 端口定义 实体结束 黑盒 rst q[7:0] d[7:0] co clk 端口模式 端口数 据类型 实体举例 ENTITY black_box IS Generic ( constant width : integer := 7;); PORT ( clk, rst: IN std_logic; d: IN std_logic_vector(widthDOWNTO0); q: OUT std_logic_vector(widthDOWNTO0); co: OUT std_logic); END black_box;
Generic • 类属参量 一种端口界面常数,用来规定端口的大小、实体中子元件的数目等 • 与常数不同,常数只能从内部赋值而类属参量可以由实体外部赋值 • 数据类型通常取Integer或Time • 综合器仅支持数据类型为整数的类属值。
PORTS • 端口(PORT)是实体的一部分 • PORT 类似于器件的管脚,主要用于信号的传输 • PORT 一般有 Name, Mode, 和Type • 端口说明格式PORT([SIGNAL] Name:ModeType [BUS] [:=表达式] ,… )
Entity 端口类型 IN: 数据只能从端口流入实体 OUT: 数据只能从端口流出实体 INOUT: 数据从端口流入或流出实体 BUFFER:数据从端口流出实体,同时可被内部反馈
数据类型 • BIT :位类型,其值只能为 ‘0’或 '1‘ • BIT_VECTOR :位矢量类型,包含一组位类型 • BOOLEAN:布尔类型,其值可为 ‘TRUE’或‘FALSE’ • INTEGER:整型,范围为-214783647到214783647(232),综合时,要对范围加以限制。常用于循环语句的循环次数、常量、数学函数或模式仿真 • Natural:自然数类型,整型的子类型,含零和正整数 • Positive:正整数类型,整型的子类型,含非零和非负整数 • REAL:浮点类型,范围为:-1.0E38到1.0E38很多综合器不支持该类型
数据类型 • 枚举类型:用户定义的数据类型例:TYPE traffic_light IS (red, yellow,green )TYPE int ISRANGE 0 TO 100 • 数组类型:分一维数组和二维数组,限定性和非限定性数组例: TYPE Bit_Vector IS ARRAY (Natural RANGE<>) OF Bit; TYPE Word IS ARRARY (31 downto 0) OF Bit; • SUBTYPE:子类型,一般用来对其父类型加以限制例: SUBTYPE Std_Logic IS resolved Std_Ulogic • TIME:时间类型,范围和整型一样,表达时要包括数值和单位两部分。单位包括:fs、ps、ns、us、ms、sec、min、hr。一般用于仿真
数据类型 • 记录类型 TYPE Month_Name IS (Jan,Fab,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); TYPE date IS RECORD day : Integer RANGE 1 TO 31; month : Month_Name; year : Integer RANGE 0 to 3000; END RECORD; VARIABLE today : date; today : =(15, may, 1995);
Std_Logic数据类型 • IEEE 1164中定义的一种数据类型,它包含9种取值分别为:‘U’ 未初始化 用于仿真’X’ 强未知 用于仿真’0’ 强0 用于综合与仿真’1’ 强1 用于综合与仿真’Z’ 高阻 用于综合与仿真’W’ 弱未知 用于仿真’L’ 弱0 用于综合与仿真’H’ 弱1 用于综合与仿真’_’ 忽略 用于综合与仿真
Std_Logic数据类型 • 它是数字电路设计的工业标准逻辑类型 • 它增加了VHDL语言编程、综合和仿真的灵活性 • 在多值逻辑系统中STD_LOGIC和STD_LOGIC_VECTOR 用于取代 BIT和 BIT_VECTOR • 若电路中有三态逻辑(Z) 必须用STD_LOGIC 和 STD_LOGIC _VECTOR • 要使用这种类型代码中必须申明库和程序包说明语句LIBRARY ieee; USE ieee.std_logic_1164.ALL;
my_design ad[11:0] d[11:0] a[11:0] oe int clk as 练习一 • 编写包含以下内容的实体代码 端口 D 为12位输入总线 端口 OE 和 CLK 都是1位输入 端口 AD 为 12位双向总线 端口 A为12位输出总线 端口 INT 是1位输出 端口 AS 是一位输出同时被用作内部反馈
my_design ad[11:0] d[11:0] a[11:0] oe int clk as 练习一答案 LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY my_design IS PORT ( d: IN std_logic_vector(11 DOWNTO 0); oe, clk: IN std_logic; ad: INOUT std_logic_vector(11 DOWNTO 0); a: OUT std_logic_vector(11 DOWNTO 0); int: OUT std_logic; as: BUFFER std_logic); END my_design;
构造体 • 用来描述实体的内部结构和逻辑功能 • 必须和实体(ENTITY)相联系 • 一个实体(ENTITY)可以有多个构造体 • 构造体的运行是并发的 • 构造体描述方式包括: —行为描述 —结构描述 —混合描述
实体和构造体之间的关系 Input 1 Output 1 实体 Input n Output n A B C D Sel MUX_Out 2
构造体 由一系列并行执行语句构成的组合体,它的功能是将结构体中的并行语句组成一个或多个子模块 说明语句 定义顺序语句模块,用以将从外部获得的信号值,或内部的运算数据向其它的信号进行赋值。 功能描述语句 块语句 将设计实体内的处理结果向定义的信号或界面端口进行赋值 进程语句 用以调用过程或函数,并将获得的结果赋值于信号 信号赋值语句 子程序调用语句 对其它的设计实体作元件调用说明,并将此元件的端口与其它的元件、信号或高层次实体的界面端口进行连接。 元件例化语句 构造体结构图
构造体—行为描述举例 • 2 X 8 Input AND gate: ENTITY black_box IS PORT ( a, b: IN std_logic_vector(7 DOWNTO 0); y: OUT std_logic_vector(7 DOWNTO 0)); END black_box; ARCHITECTURE example OF black_box IS BEGIN y <= a AND b; END example;
数据对象—常数 • 指在设计中不会变的值 • 改善代码可读性,便于代码修改 • 必须在程序包、实体、构造体或进程的说明区域加以说明 • 一般要赋一初始值 • 保留字——CONSTANT例: CONSTANT Width : Integer :=8
数据对象-信号 • 可代表连线、内连元件、或端口 • 用“<=”来给信号赋值 • SIGNALSIGNAL Count: Bit_Vector(3 downto 0); IF Rising_Edge(clk) THEN Count<=Count+1; END IF; • 信号在Package、Entity、Architecture 中声明
PROCESS PROCESS SIGNAL SIGNAL SIGNAL REG SIGNAL MUX 数据对象-信号
a b e g 端口信号 在构造体内声明 的内部连接信号 f c d 信号举例 LIBRARYieee; USEieee.std_logic_1164.all; ENTITYsimp IS PORT(a, b, c, d : INStd_Logic; g : OUTStd_Logic); ENDsimp; ARCHITECTURElogic OFsimp IS SIGNALe,f : Std_Logic; BEGIN e <= a or b; f<=not(c or d); g <=e and f; ENDlogic;
多位赋值 用双引号 逐位赋值 用单引号 赋值标志 信号赋值 • SIGNAL temp : Std_Logic_Vector (7 downto 0); • 整体赋值:temp <= “10101010”;temp <= x”AA” ; • 逐位赋值:temp(7) <= ‘1’; • 多位赋值: • temp (7 downto 4) <= “1010”;
数据对象—变量 • 仅用于进程和子程序 • 必须在进程和子程序的说明性区域说明 • 不能表达连线和存储元件 • 保留字——VARIABLEVARIABLE tmp : Bit; tmp:=‘1’;
多位赋值 用双引号 逐位赋值 用单引号 赋值标志 变量赋值 • 整体赋值:temp := “10101010”;temp := x”AA” ; • 逐位赋值:temp(7) := ‘1’; • 多位赋值temp (7 downto 4) := “1010”;
在进程的外面声明 作用范围为全局 在进程内部说明 作用范围为进程内 {SIGNAL 描述} label1: PROCESS1 {VARIABLE 描述} label2: PROCESS2 {VARIABLE 描述} 信号和变量的作用范围 ARCHITECTURE
运算优先级 高 ** ABS NOT * / MOD REM +正 -负 + - & SLL SLA SRL SRA ROL ROR = <= < > >= AND OR NAND NOR XOR XNOR 低
运算重载 • 若两信号类型不同,不能将一个信号的值赋给另一信号 • 数据转换必须要用运算重载 • 一般可用IEEE .1164中的标准重载函数实现LIBRARY IEEE;USE IEEE_Std_Logic_1164.all;USE IEEE_Std_Logic_Arith.all;USE IEEE_Std_Logic_unsigned.allUSE IEEE_Std_Logic_signed.all
并行语句 并行语句1 构造体 signal 并行语句2 signal 并行语句3
并行语句 • VHDL语言与传统软件描述语言最大的不同 • 有多种语句格式,包括:并行信号赋值语句、进程语句、块语句、条件信号赋值语句、元件例化语句、生成语句、并行过程调用语句 • 各种并行语句在结构体中的执行是同步进行的,或者说是并行运行的,其执行方式与书写的顺序无关。 • 在执行中,并行语句之间可以有信息往来,也可以是互为独立、互不相关、异步运行的(如多时钟情况)。 • 每一并行语句内部的语句运行方式可以有两种不同的方式,即并行执行方式(如块语句)和顺序执行方式(如进程语句)。
s 2 a x b mux c d 布尔表达式 • VHDL支持所有的标准逻辑运算符 • AND, OR, NOT, XOR, XNOR, NAND • 例:x <=(a AND NOT(s(1)) AND NOT(s(0))) OR (b AND NOT(s(1)) AND s(0)) OR (c AND s(1) AND NOT(s(0))) OR (d AND s(1) AND s(0)) ; y <= a OR b OR c;
With_Select_Then选择信号语句 • 所有的“WHEN”子句必须是互斥的 • 一般用 “When Others”来处理未考虑到的情况 • 只有一个参考信号和赋值符 (<=) • 每一子句结尾是逗号,最后一句是分号 WITH selection_signal SELECT signal_name <= value_1 WHEN value_a, value_2 WHEN value_b, ... value_n WHEN value_n, value_x WHEN OTHERS;
s 是 Std_Logic数据类型。 其值包括‘0’,’1’,’X’,’Z’等 s 2 a x b mux c d 加Others语句 With_Select_Then语句举例 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY cmpl_sig IS PORT ( a, b,c,d,s : IN STD_LOGIC; x : OUT STD_LOGIC); END cmpl_sig; ARCHITECTURE logic OF cmpl_sig IS BEGIN WITH s SELECT x <=a WHEN “00”, b WHEN “01”, c WHEN “10”, d WHEN OTHERS;
表示或逻辑 With_Select_Then语句举例 • 每个WHEN子句可以包含多个条件: WITH s SELECT x <= a WHEN ”000” | “001” | “010”, b WHEN "101" | "111", c WHEN OTHERS;
When_Else选择信号语句 • 根据指定条件对信号赋值,条件可以为任意表达式 • 根据条件的出现的先后次序隐含优先权 • 最后一个 ELSE子句隐含了所有未列出的条件 • 每一子句的结尾没有标点,只有最后一句有分号signal_name <= value_1 WHEN condition1 ELSE value_2 WHEN condition2 ELSE ... value_n WHEN conditionn ELSE value_x;
隐含了优先权 隐含了所有未列出的条件 s 2 a x b mux c d When_Else语句举例 x <= a when (s = “00”) else b when (s = “01”) else c when (s = “10”) else d ;