1 / 224

一个 VHDL 设计由若干个 VHDL 文件构成,每个文件主要包含五个部分的一个或全部:在 max+plusⅡ 中后缀为( VHD).

第 2 章 VHDL 语言程序的基本结构. 一个 VHDL 设计由若干个 VHDL 文件构成,每个文件主要包含五个部分的一个或全部:在 max+plusⅡ 中后缀为( VHD). 其中 1~4 为可分别编译 的源设计单元。. 1. 程序包 ( Package ) 2. 实体 ( Entity) 3. 结构体 (Architecture) 4. 配置( configuration) 5. 库( library). 库用来存放已编译过 的实体、构造体、包 和配置。. 2.1 VHDL 语言设计的基本单元. 基本单元:基本设计实体,可很简单,如门,

alaura
Download Presentation

一个 VHDL 设计由若干个 VHDL 文件构成,每个文件主要包含五个部分的一个或全部:在 max+plusⅡ 中后缀为( VHD).

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第2章 VHDL语言程序的基本结构 一个VHDL设计由若干个VHDL文件构成,每个文件主要包含五个部分的一个或全部:在max+plusⅡ中后缀为(VHD). 其中1~4为可分别编译 的源设计单元。 1.程序包 ( Package ) 2.实体 (Entity) 3.结构体 (Architecture) 4.配置(configuration) 5.库(library) 库用来存放已编译过 的实体、构造体、包 和配置。

  2. 2.1 VHDL语言设计的基本单元 基本单元:基本设计实体,可很简单,如门, 也可很复杂,如包含CPU的系统。 设计一个数字系统,首先要解决两个问题: 1) 输入、输出是什么; 2)内部完成什么功能。 对于1,由实体(Entity)说明来描述; 对于2,由构造体(Architecture)来描述。

  3. Entity mux is Generic (m: Time:=1ns); Port(d0,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; 构造体说明部分 一个二选一数据选择器的描述

  4. 2.1.1 实体说明 实体中定义电路单元和使用环境的接口,实体名必须与电路名相同。 实体的格式 ENTITY 实体名 IS [类属参数说明]; [端口说明]; END 实体名; 1)VHDL语言书写不分大 小写;(个别例外) 2)[ ]中内容有时可不要; 3)END后的实体名可省。 1.类属参数说明 1)类属参数说明(generic)用来为设计引入信息,如时间; 2)类属参数说明(generic)必须放在端口之前;

  5. 3)类属参数说明(generic)常用来设计通用元件。3)类属参数说明(generic)常用来设计通用元件。 2.端口说明 格式: Port(端口名{,端口名}:方向 数据类型名; … 端口名{,端口名}:方向 数据类型名); 1)端口名 电路外部引脚的名称,通常用英文字母加数字命名,如d0,A1, En,clk,LD. 2) 端口方向(模式) 端口方向定义外部引脚信息的方向,共有五种: in, out, inout, buffer, linkage 常用前4种 Linkage: 不指定方向,任何方向均可连接,只在文挡中使用。

  6. IN OUT BUFFER INOUT ●IN信号进入实体但并不输出; ●OUT信号离开实体但并不输入;并且不能在有内部反 馈情况下使用; ●INOUT信号是双向的(既可以进入实体,也可以离开实 体); ●BUFFER 信号输出到实体外部,同时也可在实体内部反馈; BUFFER (缓冲)是INOUT(双向)的子集,但不是由外部 驱动。 端口模式可用下图说明:(黑框代表一个设计或模块)

  7. 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;

  8. --构造体声明区域 定义语句 --声明构造体所用的内部信号及数据类型 --如果使用元件例化,则在此声明所用的元件 2.1.2 构造体 构造体(Architecture)定义实体的实现,即电路的具体描述. 构造体的一般格式如下: Architecture<architecture_name 构造体名> of <entity_name> is begin –以下开始构造体,用于描述设计的功能 --concurrent signal assignments 并行语句信号赋值 --processes 进程(顺序语句描述设计) --component instantiations 元件例化 end<architecture_name>;

  9. 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之间,描述构造体的行为和电路 连接关系。 所谓并行,指多个语句不以书写顺序执行。

  10. 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;

  11. 2.2 VHDL 语言构造体的子结构 一个构造体可以用几个子结构来构成,即一个系统可以用几个比较独立的模快来构成。 • BLOCK语句结构 • PROCESS语句结构 • SUBPROGRAMS语句结构 2.2.1 BLOCK语句结构描述 1.BLOCK语句的结构 格式: 块结构名; block begin … end block 块结构名;

  12. 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; 一个二选一数据选择器的描述

  13. d q qb clk 2.块(block)和子原理图的关系:一个block相当于总图中的一个 子图,分块设计有利于编辑查错。 3.块(block)中语句的并发性:block中的语句为并发的。 4.卫式block(Guarded block):指满足条件时,块语句执行,不满足 时不执行。 1)当卫式表达式为真时,带guarded的语句被执行; 2)卫式块不能综合; 3 )after语句不能综合; 例:… begin G1: block(clk=‘1’) begin q<=guarded d after 5ns; qb<=guarded not(d) after 7ns; end block G1;

  14. 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; 例如: 变量只在进程中定义和使用。

  15. 2. process中语句的顺序性:process中的语句按顺序执行。 • process语句的启动:process( )括号内的量称为敏感量, • 敏感量发生变化,启动进程。 • Process的同步描述:当一个构造体内含有多个process时,进 • 程之间为并行的,进程之间能通信。 2.2.3 子程序(subprogram)语句结构描述 子程序有两类:1)过程(procedure) 2) 函数(function) 1.过程语句格式

  16. Procedure 过程名(参数1,参数2,…)is [定义语句];(变量等定义) Begin [顺序处理语句]; (过程语句) End 过程名; 过程中的参数可以是输入,也可以是输出。 见教材例2-7 z: 输入,位矢量 x_flag:输出 ,布尔量 q:输入输出,整数 该过程实现将二进制数转换为整型数,x_flag为出错标志 在过程中,如不作说明,则认为in为常量,out和inout为变量。

  17. 如在过程调用后要将属性为in和inout的参数传递给信号,则要事先在过程中说明。(见例2-8)如在过程调用后要将属性为in和inout的参数传递给信号,则要事先在过程中说明。(见例2-8) 2)过程语句中的顺序性 过程语句按顺序执行 调用:①将初始值传递给过程的输入参数 ②执行语句 ③将输出值拷贝到out和inout所定义的变量和信号 中去

  18. 如定义过程: 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);--正确 …

  19. 2.函数语句 1)格式: function 函数名 (参数1,2…) return 数据类型名 is [定义语句] begin 顺序语句 [返回变量名] end 函数名; 子程序可定义在进程、包和构造体中。例2-9为定义在包中的例子。定义了一 个max函数。

  20. 2)函数调用及结果返回 ①函数调用和一般高级语言相同; ②函数调用既可在并行语句中,也可在顺序语句中; ③函数和过程通常不必指定参数的矢量长度; ④例2-9是将max 函数放在了名为bpac的包中,而bpac 包应放在库中。 ⑤例2-10第1行应写为 library ieee; library newlib; ⑥由例2-10可知,bpac包存放在newlib库中。

  21. 2.3 包集合、库及配置 包集合、库及配置是三个可独立编译的源设计单元。

  22. 2.3.1库(Library) 库专门存放预先编译好的程序包、实体、构造体和配置等,这样它们就可以在其它设计中被调用。库的功能类似一个子目录或文件夹。使用库时,要进行库说明。 LIBRARY ieee; library newlib; 1.库的种类 有5种: ieee; std; 面向ASIC的库; work;用户定义库。 其中:ieee库为ieee正式认可的库,使用库中包时要说明; std库为VHDL的标准库,使用该库中数据可不必说明;但 使用库中TEXTIO包须说明。

  23. 面向ASIC库: 由工具商提供的库,在MAX-PLUSⅡ中,有ALTERA公司自己定义的库,名为ALTERA.里面 存放两个程序包。 1) maxplus2; 2) megacore. WORK 库:现行作业库,使用不必说明。 用户定义库:由用户自己定义,使用需要说明。使用工作 界面窗口中的options 选项,在user libraries 选项中选择你所要存放库的路径。

  24. 2.库的使用 1)库的说明 如: library ieee; use ieee.std_logic_1164.all; 2) 库说明的作用范围 作用范围为它下面的一个设计(包括实体、构造体和配置等)。 当有两个实体时,应有两个库使用说明。(如例2-11)

  25. 2.3.2 包集合 包集合中存放信号定义、常量、数据类型、元件语句、函数、过程等,它可以编译,使用时用use语句。 如: use ieee.std_logic_1164.all; 包结构: package 包集合名 is [说明语句]; end 包集合名; Package body 包集合名 is [说明语句]; end 包集合名; 包的说明部分(包头) 包体(可选)

  26. --包头说明 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;

  27. --包体说明 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;

  28. 关于包: 1)一个元件、函数或过程如只在包体中定义,则只能在 本包体中调用(例2-12) ,如要在其它设计中调用, 必须在包头中说明,建议函数和过程在包中定义; 2)包可以只有包头,无包体;(例2-13) 例2-13 在包upac中,定义了 k: 常量; instruction: 枚举类型(一种数据类型) cpu_bus: 4位位矢量。

  29. 2.3.3 配置 配置语句描述层与层之间,实体与结构体之间的连接关系。 如:一个电路,实体是一个(表示框图),但构造体可有多个(实现方法多种),可利用配置语句把不同的构造体连接起来,验证其性能。 格式: Configuration 配置名 of 实体名 is [语句说明];(如for 选配构造名 end 选配构造名;) end 配置名;

  30. 关于配置: ①配置只用于模拟仿真; ②综合工具忽略所有的配置,只对最后输入的结构体进行综合; 见例2-14,实体是一个计数器,构造体 small_count为8位计数器, 构造体 big_count为16位计数器。 如编译: Configuration small_count of counter is … end small_count; 则实现8位计数器;

  31. 如编译: Configuration big _count of counter is … end big_count; 则实现16位计数器; ③在例2-14中,由于quartusⅡ中的std库中std_logic包内无T_wlogic类型,可改用ieee库中的std_logic_1164包,用std_logic类型 ④在例2-14中,实体中data_in和data_out均为整数类型(integer), 则自动设置为32位(由计算机定); ⑤例2-14,综合结果为32位输出的模216计数器。

  32. 第3 章 VHDL语言的数据类型及运算操作符

  33. 3.1 VHDL语言的客体及其分类 在逻辑设计中,VHDL语言常用的数据对象为信号、常量、变量,数据对象称为客体。 3.1.1常量(或常数) 常量在设计描述中保持某一规定类型的特定值不变 。如利用它可设计不同模值的计数器,模值存于常量中,不同的设计,改变模值仅需改变此常量值。 格式:CONSTANT 常量名:数据类型:=表达式; 常量赋值符号为“ : = ”。 例 constant vcc: real:=5.0;

  34. 3.1.2 变量(variable) 变量只在给定的进程中用于声明局部值或用于子程序中,可以是任意类型。赋值符号为“ : = ”。 变量说明格式: variable 变量名 :数据类型 约束条件:=表达式; 例:variable cnt: integer range 0 to 255 :=10; 变量赋值立即生效,不产生附加延时, 不能写成:y:=x after 10ns;

  35. 3.1.3信号(Signal) 信号表示一条连线,通常在构造体、包集合和实体中说明, 信号是全局量,内部信号说明不要注明数据流向,外部信号(外部信号对应为in,out,inout,buffer)说明时signal省略。 信号也可在状态机中表示状态变量。信号赋值符号为“<=”。 信号说明格式: signal 信号名:数据类型 约束条件:=表达式; 信号赋初值 用“:=” 程序中信号代入用“<=” 例: signal a: bit;

  36. 3.1.4 信号和变量值代入的区别 1)变量赋值是立即执行的; 2)信号的代入和语句的处理在时间上是分开的。 在例3-1的前部分,A,B,C,D为信号,当语句处理时,信号并不立即代入,当结束进程时,信号才被代入。 在例3-1的前部分,A,B,C,D为变量,当语句处理时,变量立即赋值。所以前后两部分结果不同。 下面是一个加法器的例子:

  37. 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; --定义一个信号,以保存两数二进制相加的和.

  38. 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;

  39. 3.2 VHDL 语言的数据类型 3.2.1 标准的数据类型 标准的数据类型共10种,见下表。

  40. 3.2.2 用户定义的数据类型 VHDL允许用户自己定义数据类型: 格式:type 数据类型名 {,数据类型名} 数据类型定义; 由用户定义的数据类型可有多种: 枚举;整数;实数;浮点数;数组;存取;文件;记录;时间 3.2.3 用户定义的子类型 VHDL允许用户自己给数据类型加以限制,形成子类型: 格式 subtype 子类型名 is 数据类型名 范围;

  41. 3.2.4 数据类型的转换

  42. 数据类型的说明: 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);

  43. 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的决断子类型

  44. 4) Character 字符型 由ASCII码表示的128个字符,要用单引号标注,如‘c’,多数综合工具支持VHDL-87定义的字符,可综合。 5) std_logic是决断类型 含义:当一个信号有多个驱动器驱动时,则调用定义的决断函数以解决冲突,并决定给信号赋什么值,这可用在三态总线中。

  45. 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

  46. 使用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列,每个元素为三位的位矢量)

  47. 如一个信号a,为A_453类型,即如下形式: 3 “101” 2 1 “011” 0 4 3 2 1 0 a(1,2) a(1,2)(0)

  48. 7) 枚举类型 格式:type 名 is (.., .., ..); 枚举类型经常用时序电路的设计中,时序电路有许多状态,这些 状态在设计中可编码,如用枚举类型,就可以自己不去编码,而 交给工具。大多数综合工具都支持枚举类型。 如: type state_type is (start,idle,waiting,run,error); signal state: state_type; 表示state可取5个值,综合工具将每个状态转换为3位矢量,表示5种不同值。

More Related