VHDL语言程序的基本结构
时间:2023-03-11来源:佚名
|
一、VHDL语言设计的基本单元及其构成 l 一个完整的VHDL语言程序通常包含实体(Entity)、构造体(Architecture)、配置(Configuration)、包集合(Package)和库(Library): l 功能: 实体 -—- 用于描述所设计的系统的外部接口信号; 构造体—— 用于描述系统内部的结构和行为; 包集合—— 存放各设计模块都能共享的数据类型、常数和子程序库; 配置 —— 用于从库中选取所需单元来组成系统设计的不同版本; 库 —— 存放已经编译的实体、构造体、包集合和配置。 l 基本组成:实体说明和构造体两部分 实体说明(接口) 构造体(实现) 1. 实体说明: 规定此实体输入与输出的数目与类型。 l 结构: entity 实体名 is [generic(类属参数说明)]; [port(端口说明)]; end 实体名; l 类属参数说明: generic ( 常数名:数据类型 :=数值); 在端口说明前,用于指定参数。 l 端口说明: 在entity语句的实体说明部分,常用port语句描述实体对外界连接的端口(数目、方向和数据类型)。 port ( 端口名:端口方向 端口数据类型; . . . 端口名:端口方向 端口数据类型; ); 端口方向: in (输入),只能读,用于:时钟输入、控制输入(装入、复位、使能)、单向数据输入; out (输出),只能被赋值,用于不能反馈的输出; inout(输入输出) ,既可读又可被赋值,被读的值是端口输入值而不是被赋值,作为双向端口。 buffer(缓冲),类似于输出,但可以读,读的值是被赋值,用做内部反馈用,不能作为双向端口使用。 l 例1): entity NAND2 is port(A,B: in BIT; Z: out BIT); end NAND2; l 例2): --Define an entity (design) called COMP --that has 2 N-bit input and one output. entity COMP is generic(N : INTEGER :=8 ) ; -- default is 8 bits port ( x, y : in BIT_VECTOR ( 0 to N-1); equal : out BOOLEAN ); end COMP; 2. 构造体 构造体定义实体功能的一种实现。 l 构造体的结构: architecture 构造体名 of 实体名 is {块说明项} begin {并发语句} end 构造体名; l 块说明项(或定义语句),位于architecture 和begin之间,对构造体内部的使用信号、常数、数据类型和函数进行说明,包括: 使用语句 子程序说明 子程序体 类型说明 子类型说明 常数说明 信号说明 元件说明 l 并行语句处于begin 与end之间,描述构造体的行为与连接关系。 l 构造体的描述方法: 行为描述(按算法的路径来描述); 数据流描述或RTL描述(采用寄存器传输描述); 结构化描述(采用例化元件) 例化(instantiation ):在高层次的设计中调用低层次的实体作为元件的过程。 l 构造体的组织 l 例 entity COUNTER3 is port( clk: in bit; reset : in bit; count: out integer range 0 to 7); end COUNTER3; architecture MY_ARCH of COUNTER3 is signal count_tmp : integer range 0 to 7; begin process begin wait until (clk'event and clk='1'); if reset='1' or count_tmp =7 then count_tmp<=0; else count_tmp<=count_tmp 1; end if; end process; count<=count_tmp; end MY_ARCH; 注:构造体中的信号和常数名不能与实体端口名相同。 二、语言结构体的子结构描述 1. block语句结构 l 语句结构: 块结构名: block begin . . . end block 块结构名; 2. 进程(process)语句结构 l 进程语句的结构: [进程名]:process(信号1,信号2,……) {说明 内部变量} begin {顺序语句} end process; l 进程的组织 l 功能独立的电路可用进程来描述 l 进程中语句的顺序性 l 进程的启动 *敏感表 *敏感表中信号的变化将启动进程语句 *启动后,语句从上到下逐句执行,最后一个语句执行完毕后,返回进程开始的语句,等待下一次敏感表的变化。 l 进程的同步描述 同一结构体中有多个进程存在时,进程之间可一边进行通信,一边并行同步执行。 3.子程序(subprogram)语句结构描述 两种类型:过程(procedure) 函数 (function) l 过程语句 结构: procedure 过程名(参数1,参数2,…) is [定义语句]; begin [顺序处理语句]; end 过程名; *参数可以是输入也可以是输出 *例: 将位矢量转换为整数 procedure vector_to_int (z : in std_logic_vector; x_flag : out boolean; q : inout integer) is begin q:=0; x_flag:=false; for i in z' range loop q:=q*2; if (z(i)=1) then q:=q 1; elsif(z(i)/=0) then x_flag:=true; end if; end loop; end vector_to_int; 循环次数由z的位数决定,z(0)为最高位。 l 函数语句 结构: function 函数名(参数1,参数2,…) return 数据类型名 is [定义语句]; begin [顺序处理语句]; return 返回变量名 end 函数名; *参数为输入参数 *通常集中在包集合中 *例:将boolean型信号转换到 bit型 function b12bit(a: Boolean) return BIT is begin if a then return '1'; else return '0'; end if; end b12bit; 三、包集合、库与配置 1.库 库(Library)是经编译后的数据的集合,库说明总是放在设计单元的最前面。 1) 库的种类: l IEEE 库 包含:STD_LOGIC_1164 STD_LOGIC_ARITH STD_LOGIC_UNSIGNED l STD库 包含:STANDARD包集合 TEXTIO 包集合 TEXTIO 包集合使用例: LIBRARY STD; USE STD.TEXTIO. ALL; l ASIC矢量库 各公司提供的ASIC称逻辑门库 l WORK 库 为现行作业库,存放设计者的VHDL语言程序 l 用户定义的库 用户为自身设计需要所开发的共用包集合和实体。 2) 库的使用 l 除WORK、STD库外,首先要说明。格式: library [库名]; use [库名.包名.项目名]; 例: library ieee; use ieee.std_logic_1164.all; l 库说明的作用范围: 从实体开始到其所属构造体、配置为止。 2.包集合 l 包集合用于封装属于多个设计单元分享的公共信息。 l 包集合由包说明(说明数据类型、子程序和常量等)和包体(它 含有子程序体与现有的延时常数)所组成。子程序由执行公共操作的过程和函数组成。包集合是分享属于实体数据的一种机制,把子程序、数据类型和元件说明看成建立设计的工具,则包集合可看成工具箱。 1) 包集合的结构: package 包集合名 is [包集合说明语句]; end 包集合名; package body 包集合名 is [包集合体说明语句]; end 包集合名; 注:包集合体为可选项。 3) 包集合的使用: use work.[包集合名].all; 例: l 建一个包集合。此例中,用字母符号代表用于控制的二进编码序列。 library ieee; use ieee.std_logic_1164.all; --ALU source operand control mnemonics package mnemonics0 is constant aq: std_logic_vector(2 downto 0) :="000"; constant ab: std_logic_vector(2 downto 0) :="001"; constant zq: std_logic_vector(2 downto 0) :="010"; constant zb: std_logic_vector(2 downto 0) :="011"; constant za: std_logic_vector(2 downto 0) :="100"; constant da: std_logic_vector(2 downto 0) :="101"; constant dq: std_logic_vector(2 downto 0) :="110"; constant dz: std_logic_vector(2 downto 0) :="111"; end mnemonics0; l 编译通过后即可使用。 注:maxplus2在编译此package时,报告: "…does not contain an architecture body—stopping compilation",但此package 将被正确分析,并可成功地编译使用此package的其他设计。 l 用于其他使用此包集合的程序: --由控制信号控制两个多路选择器 library ieee; use ieee.std_logic_1164.all; use work.mnemonics0.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity src_op is port( d,ad,bd,q: in unsigned(3 downto 0); src_ctl: in std_logic_vector(2 downto 0); r,s: buffer unsigned(3 downto 0)); end src_op; architecture src_op of src_op is begin with src_ctl select r <= ad when aq | ab, "0000" when zq | zb | za, d when others; with src_ctl select s <= q when aq | zq | dq, bd when ab | zb , ad when za |da, "0000" when others; end src_op; 3.配置 描述层与层之间的连接关系以及实体与构造体之间的连接关系。在仿真时利用配置选择不同的构造体。 格式: CONFIGURATION 配置名 OF 实体名 IS FOR 构造体名 END FOR; END 配置名; l 例 configuration MY_CONFIG of COUNTER3 is for MY_ARCH end for; end MY_CONFIG; |








