2.17k likes | 2.55k Views
第 2 章 VHDL 语言程序的基本结构. 一个 VHDL 设计由若干个 VHDL 文件构成,每个文件主要包含五个部分的一个或全部:在 max+plusⅡ 中后缀为( VHD). 其中 1~4 为可分别编译 的源设计单元。. 1. 程序包 ( Package ) 2. 实体 ( Entity) 3. 结构体 (Architecture) 4. 配置( configuration) 5. 库( library). 库用来存放已编译过 的实体、构造体、包 和配置。. 2.1 VHDL 语言设计的基本单元. 基本单元:基本设计实体,可很简单,如门,
E N D
第2章 VHDL语言程序的基本结构 一个VHDL设计由若干个VHDL文件构成,每个文件主要包含五个部分的一个或全部:在max+plusⅡ中后缀为(VHD). 其中1~4为可分别编译 的源设计单元。 1.程序包 ( Package ) 2.实体 (Entity) 3.结构体 (Architecture) 4.配置(configuration) 5.库(library) 库用来存放已编译过 的实体、构造体、包 和配置。
2.1 VHDL语言设计的基本单元 基本单元:基本设计实体,可很简单,如门, 也可很复杂,如包含CPU的系统。 设计一个数字系统,首先要解决两个问题: 1) 输入、输出是什么; 2)内部完成什么功能。 对于1,由实体(Entity)说明来描述; 对于2,由构造体(Architecture)来描述。
Entity mux is Generic (m: Time:=1ns); Port(do,d1,sel: IN Bit; q: out Bit); End mux; 实体说明部分 Architecture connect Of mux is Signal tmp: Bit; Begin cale: Process(d0,d1,sel) Variable tmp1,tmp2,tmp3:Bit; Begin tmp1:=d0 AND sel; tmp2:=d1 AND (NOT sel); tmp3:= tmp1 OR tmp2; tmp<=tmp3; q<=tmp AFTER m; END PROCESS; END CONNECT; 构造体说明部分 一个二选一数据选择器的描述
2.1.1 实体说明 实体中定义电路单元和使用环境的接口,实体名必须与电路名相同。 实体的格式 ENTITY 实体名 IS [类属参数说明]; [端口说明]; END 实体名; 1)VHDL语言书写不分大 小写;(个别例外) 2)[ ]中内容有时可不要; 3)END后的实体名可省。 1.类属参数说明 1)类属参数说明(generic)用来为设计引入信息,如时间; 2)类属参数说明(generic)必须放在端口之前;
3)类属参数说明(generic)常用来设计通用元件。3)类属参数说明(generic)常用来设计通用元件。 2.端口说明 格式: Port(端口名{,端口名}:方向 数据类型名; … 端口名{,端口名}:方向 数据类型名); 1)端口名 电路外部引脚的名称,通常用英文字母加数字命名,如d0,A1, En,clk,LD. 2) 端口方向(模式) 端口方向定义外部引脚信息的方向,共有五种: in, out, inout, buffer, linkage 常用前4种 Linkage: 不指定方向,任何方向均可连接,只在文挡中使用。
IN OUT BUFFER INOUT ●IN信号进入实体但并不输出; ●OUT信号离开实体但并不输入;并且不能在有内部反 馈情况下使用; ●INOUT信号是双向的(既可以进入实体,也可以离开实 体); ●BUFFER 信号输出到实体外部,同时也可在实体内部反馈; BUFFER (缓冲)是INOUT(双向)的子集,但不是由外部 驱动。 端口模式可用下图说明:(黑框代表一个设计或模块)
3)数据类型 • VHDL中有10种数据类型,但逻辑设计只用两种,另在库中还定 • 义了多种数据类型: • Bit 2. bit_vector • Bit :位逻辑数据类型,取值为0或1; • bit_vector:位矢量,取值为一组二进制位。 Port(do,d1,sel: IN Bit; q: out Bit; bus:out bit_vector(7 downto 0)); Library ieee; 在编译时在指定的库、 Use ieee.std_logic_1164.all 包中寻找这种数据类型 Entity mu is Port(do,d1,sel: IN std_logic; q: out std_logic; bus:out std_logic__vector(7 downto 0)); End mu;
--构造体声明区域 定义语句 --声明构造体所用的内部信号及数据类型 --如果使用元件例化,则在此声明所用的元件 2.1.2 构造体 构造体(Architecture)定义实体的实现,即电路的具体描述. 构造体的一般格式如下: Architecture<architecture_name 构造体名> of <entity_name> is begin –以下开始构造体,用于描述设计的功能 --concurrent signal assignments 并行语句信号赋值 --processes 进程(顺序语句描述设计) --component instantiations 元件例化 end<architecture_name>;
1.构造体名称的命名:一般以描述方法命名,描述方法一般有:1.构造体名称的命名:一般以描述方法命名,描述方法一般有: 行为特性:behavioral简写为beh 结构: structural 简写为str 数据流: dataflow 如: Architecture beh Of mux is 2. 定义语句:位于architecture和begin之间,用于对构造体内部使用的信号、变量、数据类型和函数定义。 Architecturebeh Of mux is signal n1:bit; … begin … 1)信号为内部使用,不须加方向 2)信号应有名和数据类型 3.并行处理语句:位于begin和end之间,描述构造体的行为和电路 连接关系。 所谓并行,指多个语句不以书写顺序执行。
y=a0s1s0+a1s1s0+a2s1s0+a3s1s0 • =(a0s0+a1s0)s1+(a2s0+a3s0)s1 一数据选择器的构造体: architecture arch of mux4 is begin y<=((((a0 and not (s(0))) or (a1 and s(0)))) and not (s(1))) or (((a2 and not s(0))) or (a3 and s(0))) and s(1)); end archmux;
2.2 VHDL 语言构造体的子结构 一个构造体可以用几个子结构来构成,即一个系统可以用几个比较独立的模快来构成。 • BLOCK语句结构 • PROCESS语句结构 • SUBPROGRAMS语句结构 2.2.1 BLOCK语句结构描述 1.BLOCK语句的结构 格式: 块结构名; block begin … end block 块结构名;
Entity mux is Port(d0,d1,sel: IN Bit; q: out Bit); End mux; Architecture connect Of mux is Signal tmp1,tmp2,tmp3 : Bit; Begin cale: block Begin tmp1<=d0 AND sel; tmp2<=d1 AND (NOT sel); tmp3<= tmp1 OR tmp2; q<=tmp3 ; End block cale; END CONNECT; 一个二选一数据选择器的描述
d q qb clk 2.块(block)和子原理图的关系:一个block相当于总图中的一个 子图,分块设计有利于编辑查错。 3.块(block)中语句的并发性:block中的语句为并发的。 4.卫式block(Guarded block):指满足条件时,块语句执行,不满足 时不执行。 1)卫式块不能综合; 2)after语句不能综合; 3)当满足clk=1时执行。 例:… begin G1: block(clk=‘1’) begin q<=guarded d after 5ns; qb<=guarded not(d) after 7ns; end block G1;
2.2.2进程(process)语句结构描述 1.process语言结构 [进程名]:process(信号1,信号2,…) Begin … End process; Architecture connect Of mux is Signal tmp: Bit; Begin cale: Process(d0,d1,sel) Variable tmp1,tmp2,tmp3:Bit; Begin tmp1:=d0 AND sel; tmp2:=d1 AND (NOT sel); tmp3:= tmp1 OR tmp2; tmp<=tmp3; q<=tmp AFTER m; END PROCESS; END CONNECT; 例如: 变量只在进程中定义和使用。
2. process中语句的顺序性:process中的语句按顺序执行。 • process语句的启动:process( )括号内的量称为敏感量, • 敏感量发生变化,启动进程。 • Process的同步描述:当一个构造体内含有多个process时,进 • 程之间为并行的,进程之间能通信。 2.2.3 子程序(subprogram)语句结构描述 子程序有两类:1)过程(procedure) 2) 函数(function) 1.过程语句格式
Procedure 过程名(参数1,参数2,…)is [定义语句];(变量等定义) Begin [顺序处理语句]; (过程语句) End 过程名; 过程中的参数可以是输入,也可以是输出。 见教材例2-7 z: 输入,位矢量 x_flag:输出 ,布尔量 q:输入输出,整数 该过程实现将二进制数转换为整型数,x_flag为出错标志 在过程中,如不作说明,则认为in为常量,out和inout为变量。
如在过程调用后要将属性为in和inout的参数传递给信号,则要事先在过程中说明。(见例2-8)如在过程调用后要将属性为in和inout的参数传递给信号,则要事先在过程中说明。(见例2-8) 2)过程语句中的顺序性 过程语句按顺序执行 调用:①将初始值传递给过程的输入参数 ②执行语句 ③将输出值拷贝到out和inout所定义的变量和信号 中去
如定义过程: Architecture rtl of ex is procedure cale (a,b : in integer; avg,max: out integer) is – 默认为变量 begin avg:=(a+b)/2 if a>b then max:=a; else max:=b; end if; end cale; 调用 过程 Begin cale (d1,d2,q1,q2); --错误,并行语句。 Process(d3,d4) Variable a,b: integer; Begin cale(d3,d4,a,b);--正确 …
2.函数语句 1)格式: function 函数名 (参数1,2…) return 数据类型名 is [定义语句] begin 顺序语句 [返回变量名] end 函数名; 子程序可定义在进程、包和构造体中。例2-9为定义在包中的例子。定义了一 个max函数。
2)函数调用及结果返回 ①函数调用和一般高级语言相同; ②函数调用既可在并行语句中,也可在顺序语句中; ③函数和过程通常不必指定参数的矢量长度; ④例2-9是将max 函数放在了名为bpac的包中,而bpac 包应放在库中。 ⑤例2-10第1行应写为 library ieee; library newlib; ⑥由例2-10可知,bpac包存放在newlib库中。
2.3 包集合、库及配置 包集合、库及配置是三个可独立编译的源设计单元。
2.3.1库(Library) 库专门存放预先编译好的程序包、实体、构造体和配置等,这样它们就可以在其它设计中被调用。库的功能类似一个子目录或文件夹。使用库时,要进行库说明。 LIBRARY ieee; library newlib; 1.库的种类 有5种: ieee; std; 面向ASIC的库; work;用户定义库。 其中:ieee库为ieee正式认可的库,使用库中包时要说明; std库为VHDL的标准库,使用该库中数据可不必说明;但 使用库中TEXTIO包须说明。
面向ASIC库: 由工具商提供的库,在MAX-PLUSⅡ中,有ALTERA公司自己定义的库,名为ALTERA.里面 存放两个程序包。 1) maxplus2; 2) megacore. WORK 库:现行作业库,使用不必说明。 用户定义库:由用户自己定义,使用需要说明。使用工作 界面窗口中的options 选项,在user libraries 选项中选择你所要存放库的路径。
2.库的使用 1)库的说明 如: library ieee; use ieee.std_logic_1164.all; 2) 库说明的作用范围 作用范围为它下面的一个设计(包括实体、构造体和配置等)。 当有两个实体时,应有两个库使用说明。(如例2-11)
2.3.2 包集合 包集合中存放信号定义、常量、数据类型、元件语句、函数、过程等,它可以编译,使用时用use语句。 如: use ieee.std_logic_1164.all; 包结构: package 包集合名 is [说明语句]; end 包集合名; Package body 包集合名 is [说明语句]; end 包集合名; 包的说明部分(包头) 包体(可选)
--包头说明 PACKAGE Logic IS TYPE Three_level_logic IS (‘0’, ‘1’, ‘Z’); CONSTANT Unknown_Value:Three_level_logic:=‘0’; FUNCTION Invert (input:Three_level_logic) RETURN Three_level_logic; END Logic;
--包体说明 PACKAGEBODY Logic IS --如下是函数的子程序体 FUNCTION Invert (input:Three_level_logic) RETURN Three_level_logic; BEGIN CASE input IS WHEN ‘0’=>RETURN ‘1’; WHEN ‘1’=>RETURN ‘0’; WHEN ‘Z’=>RETURN ‘Z’; END CASE; END Invert; END Logic;
关于包: 1)一个元件、函数或过程如只在包体中定义,则只能在 本包体中调用(例2-12) ,如要在其它设计中调用, 必须在包头中说明,建议函数和过程在包中定义; 2)包可以只有包头,无包体;(例2-13) 例2-13 在包upac中,定义了 k: 常量; instruction: 枚举类型(一种数据类型) cpu_bus: 4位位矢量。
2.3.3 配置 配置语句描述层与层之间,实体与结构体之间的连接关系。 如:一个电路,实体是一个(表示框图),但构造体可有多个(实现方法多种),可利用配置语句把不同的构造体连接起来,验证其性能。 格式: Configuration 配置名 of 实体名 is [语句说明];(如for 选配构造名 end 选配构造名;) end 配置名;
关于配置: ①配置只用于模拟仿真; ②综合工具忽略所有的配置,只对最后输入的结构体进行综合; 见例2-14,实体是一个计数器,构造体 small_count为8位计数器, 构造体 big_count为16位计数器。 如编译: Configuration small_count of counter is … end small_count; 则实现8位计数器;
如编译: Configuration big _count of counter is … end big_count; 则实现16位计数器; ③在例2-14中,由于max-plusⅡ中的std_std_logic包中无T_wlogic类 型,可改用ieee库中的std_logic_1164包,用std_logic类型 ④在例2-14中,实体中data_in和data_out均为整数类型(integer), 则自动设置为32位(由计算机定); ⑤例2-14,综合结果为32位输出的模216计数器。
第3 章 VHDL语言的数据类型及运算操作符
3.1 VHDL语言的客体及其分类 在逻辑设计中,VHDL语言常用的数据对象为信号、常量、变量,数据对象称为客体。 3.1.1常量(或常数) 常量在设计描述中保持某一规定类型的特定值不变 。如利用它可设计不同模值的计数器,模值存于常量中,不同的设计,改变模值仅需改变此常量值。 格式:CONSTANT 常量名:数据类型:=表达式; 常量赋值符号为“ : = ”。 例 constant vcc: real:=5.0;
3.1.2 变量(variable) 变量只在给定的进程中用于声明局部值或用于子程序中,可以是任意类型。赋值符号为“ : = ”。 变量说明格式: variable 变量名 :数据类型 约束条件:=表达式; 例:variable cnt: integer range 0 to 255 :=10; 变量赋值立即生效,不产生附加延时, 不能写成:y:=x after 10ns;
3.1.3信号(Signal) 信号表示一条连线,通常在构造体、包集合和实体中说明, 信号是全局量,内部信号说明不要注明数据流向,外部信号(外部信号对应为in,out,inout,buffer)说明时signal省略。 信号也可在状态机中表示状态变量。信号赋值符号为“<=”。 信号说明格式: signal 信号名:数据类型 约束条件:=表达式; 信号赋初值 用“:=” 程序中信号代入用“<=” 例: signal a: bit;
3.1.4 信号和变量值代入的区别 1)变量赋值是立即执行的; 2)信号的代入和语句的处理在时间上是分开的。 在例3-1的前部分,A,B,C,D为信号,当语句处理时,信号并不立即代入,当结束进程时,信号才被代入。 在例3-1的前部分,A,B,C,D为变量,当语句处理时,变量立即赋值。所以前后两部分结果不同。 下面是一个加法器的例子:
Entity bcdadder is Port(op1,op2 :in integer range 0 to 15; result :out integer range 0 to 31 ); End dcdadder; Architecture behavior of bcdadder is constant adjustnum :integer:=6 --定义一常量:整数型,值为6 signal binadd :integerrange 0 to 18; --定义一个信号,以保存两数二进制相加的和.
Begin binadd<=op1+op2; --信号赋值 process(binadd) variable tmp : integer:=0;-- 定义一个变量,并赋初值为0 begin if binadd>9 then tmp:=adjustnum; --变量赋值,立即起作用 else tmp:=0; end if; result<=binadd+tmp; endprocess; End behavior;
3.2 VHDL 语言的数据类型 3.2.1 标准的数据类型 标准的数据类型共10种,见下表。
3.2.2 用户定义的数据类型 VHDL允许用户自己定义数据类型: 格式:type 数据类型名 {,数据类型名} 数据类型定义; 由用户定义的数据类型可有多种: 枚举;整数;实数;浮点数;数组;存取;文件;记录;时间 3.2.3 用户定义的子类型 VHDL允许用户自己给数据类型加以限制,形成子类型: 格式 subtype 子类型名 is 数据类型名 范围;
数据类型的说明: 1)boolean 型 常量、信号和变量均可说明为boolean 型,综合工具将false译为0,将true译为1。 2)integer 型 没有定义长度,由工具而定,一般为32位。不用32位时, 可采用: a)自定义类型,如:type digit isintegerrange 0 to 9; b) 直接注明范围,如:port( x: in integer range 0 to 9);
3) 位和位矢量 VHDL标准中只定义了bit和bit_vector,而bit只能取“0”和“1”,给设计带来限制: a) 不能描述三态 b)不能使同一信号具有多个驱动源 c)不能给信号赋未知值 d)不能给信号赋无关值 • 解决方法:由ieee制定了标准化数据类型。 • 在ieee.std_logic_1164包中定义了 • std_ulogic类型 具有9种不同的值(见p44) • Std_logic 类型 是std_ulogicd的决断子类型
4) Character 字符型 由ASCII码表示的128个字符,要用单引号标注,如‘c’,多数综合工具支持VHDL-87定义的字符,可综合。 5) std_logic是决断类型 含义:当一个信号有多个驱动器驱动时,则调用定义的决断函数以解决冲突,并决定给信号赋什么值,这可用在三态总线中。
Library ieee; Use ieee.std_logic_1164.all; Entity ex is port(d,c,en1,en2: in std_logic; dbus: out std_logic); End; Architecture rtl of ex is Begin dbus<=d when en1=‘1’ else ‘Z’; dbus<=c when en2=‘1’ else ‘Z’; End; dbus en1 d en2 c
使用std_logic型后,缺点是如误将两个驱动器驱动同一信号,也不会有出错报告。使用std_logic型后,缺点是如误将两个驱动器驱动同一信号,也不会有出错报告。 6)关于数组(array) type 类型名 is array 范围 of 原数据类型名 • Type A_4 is array (3 downto 0) of std_logic; • 表示一维数组(4行1列,每个元素为一位) b) Type A_43 is array (3 downto 0) of std_logic_vector(2 downto 0); 表示一维数组(4行1列,每个元素为三位的位矢量) c) Type A_453 is array (3 downto 0, 4 downto 0) of std_logic_vector (2 downto 0); 表示二维数组(4行5列,每个元素为三位的位矢量)
如一个信号a,为A_453类型,即如下形式: 3 “101” 2 1 “011” 0 4 3 2 1 0 a(1,2) a(1,2)(0)
7) 枚举类型 格式:type 名 is (.., .., ..); 枚举类型经常用时序电路的设计中,时序电路有许多状态,这些 状态在设计中可编码,如用枚举类型,就可以自己不去编码,而 交给工具。大多数综合工具都支持枚举类型。 如: type state_type is (start,idle,waiting,run,error); signal state: state_type; 表示state可取5个值,综合工具将每个状态转换为3位矢量,表示5种不同值。