EDA技术实用教程PPT课件-第3章_VHDL设计初步.ppt_第1页
EDA技术实用教程PPT课件-第3章_VHDL设计初步.ppt_第2页
EDA技术实用教程PPT课件-第3章_VHDL设计初步.ppt_第3页
EDA技术实用教程PPT课件-第3章_VHDL设计初步.ppt_第4页
EDA技术实用教程PPT课件-第3章_VHDL设计初步.ppt_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

eda技术实用教程,第3章 vhdl设计初步,教学内容:,3.1 组合电路的vhdl描述 3.2 基本时序电路的vhdl描述 3.3 计数器的vhdl设计 3.4 实用计数器的vhdl设计,教学要求:,通过对vhdl电路示例分析学习,了解用vhdl表达和设计电路的方法,理解vhdl语言现象和语句规则的特点。,vhdl的优点,*易于设计复杂的、多层次的设计。支持设计库和设计的重复使用 *与硬件独立,一个设计可用于不同的硬件结构,而且设计时不必了解过多的硬件细节。 *有丰富的软件支持vhdl的综合和仿真,从而能在设计阶段就能发现设计中的bug,缩短设计时间,降低成本。 *更方便地向asic过渡 *vhdl有良好的可读性,容易理解。,vhdl与计算机语言的区别,*运行的基础 计算机语言是在cpuram构建的平台上运行 vhdl设计的结果是由具体的逻辑、触发器组成的数字电路 *执行方式 计算机语言基本上以串行的方式执行 vhdl在总体上是以并行方式工作 *验证方式 计算机语言主要关注于变量值的变化 vhdl要实现严格的时序逻辑关系,3.1 组合电路的vhdl描述,3.1.1 2选1多路选择器及其vhdl描述1,通道选择控制信号端,数据通道输入端口,数据输出端,entity mux21a is port ( a, b : in bit; s : in bit; y : out bit ); end entity mux21a; architecture one of mux21a is begin y = a when s = 0 else b ; end architecture one ;,【例3-1】 2选1多路选择器,s = 0 y = a s = 1 y =b,3.1.1 2选1多路选择器及其vhdl描述1,2选1多路选择器,s = 0 y = a s = 1 y =b,(1) 以关键词entity引导,end entity 结尾的语句部分,称为实体。,mux21a实体,2选1多路选择器的vhdl描述,功能:描述设计模块的输入/输出信号或引脚,并给出设计模块与外界的接口。 实体类似一个“黑盒”,实体描述了“黑盒”的输入输出口。 port: *在层次化设计时,port为模块之间的接口 *在芯片级,则代表具体芯片的管脚,(2) 以关键词architecture引导,end architecture 结尾的语句部分,称为结构体。,图3-2 mux21a结构体,功能:通过若干顺序语句和并行语句来描述设计实体的逻辑功能(行为描述)或内部电路结构(结构描述),从而建立设计实体输出与输入之间的关系。 一个设计实体可以有多个结构体 结构体有三种描述方式 *行为描述(behavioral): 高层次的功能描述,不必考虑在电路中到底是怎样实现的。 *数据流描述(dataflow): 描述输入信号经过怎样的变换得到输出信号 *结构化描述(structural): 类似于电路的网络表,将各个器件通过语言的形式进行连接,与电路有一对应的关系,一般用于大规模电路的层次化设计时。,设计实体:,一个完整的、可综合的vhdl程序设计构建,vhdl程序设计基本结构:,结构体三种描述方式的比较,1. 实体表达 描述电路器件端口构成、端口类型(信号流动方向和方式)和信号属性,【例】 entity e_name is port ( p_name : port_m data_type; . p_namei : port_mi data_type ); end entity e_name;,vhdl相关语法说明,语法格式 entity 实体名 is port()端口说明; end entity 实体名 ;,注意:关键词,2. 实体名,3.端口语句port和端口信号名,实体名实际上是器件名,最好根据相应的电路功能确定;实体名必须与文件名相同,否则无法编译;实体名不能用工具库中定义好的元件名;实体名不能用中文,也不能用数字开头。,端口语句(port)说明:以port为引导,并在语句结尾处加分号“;” port (端口信号名:端口模式 数据类型名 :=初始值;);,4. 端口模式,“in”、“out”、“inout”、“buffer”,输入(in):从外部输入至实体;单向端口; 输出(out):从实体输出至外部;单向端口; 双向(inout):可以从外部输入至实体;也可以从实体输出至外部;双向端口;可代替所有其他模式,但降低了程序的可读性,一般用于与cpu的数据总线接口; 缓冲(buffer):可以从实体输出至外部;也可以从端口回读该输出值至实体;不可以从外部输入至实体;单向端口(伪双向端口);允许该管脚名作为一些逻辑的输入信号。,vhdl语言中数据对象(信号、变量、常数)被赋予的类型规定取值范围和数值类型,即对传输或存储数据的类型作明确的界定。 如integer(整型)、bit(位型)等; *vhdl - 强类型语言 *预定义类型 vs. 自定义类型:-数据类型的分类 已在vhdl标准中预先定义,可直接使用 ,如integer, real, bit等; 按照类型说明的格式自定义用户所需的类型;,5. 数据类型,bit:位数据类型 规定的取值范围是逻辑位1和0; 可参与逻辑运算或算术运算; bit数据类型的定义在vhdl标准程序包standard中,6. 结构体表达,【例】 architecture arch_name of e_name is (说明语句)说明和定义数据对象、数据类型、元件调用说明等 begin (功能描述语句)电路功能描述语句,可以是并行语句、顺序语句或是他们的混合语句 end architecture arch_name ;,一个设计实体的功能与(/或)结构描述; 一个设计实体可以有多个结构体; 语法格式 architecture 结构体名 of 设计实体名 is 说明区; begin 执行语句区; end architecture 结构体名 ;,顺序语句: 由进程语句引导的,以顺序方式执行的语句,其执行结果与书写先后顺序有关.如赋值语句;分支控制语句;循环控制语句;同步控制语句,并行语句: 在结构体中以并行方式执行的语句。其结果与书写先后顺序无关.并行语句有五种语句结构:块语句、进程语句、信号赋值语句、子程序调用语句和元件例化语句。,vhdl的基本语句 顺序语句 并行语句,-eqcomp4 is a four bit equality comparator library ieee; use ieee.std_logic_1164.all; entity eqcomp4 is port(a, b:in std_logic_vector(3 downto 0); equal :out std_logic); end entity eqcomp4; architecture dataflow of eqcomp4 is begin equal = 1 when a=b else 0; end architecture dataflow;,vhdl 大小写不敏感,eqcomp4.vhd,包,实体,结构体,文件名和实体名一致,每行;结尾,关键字begin,关键字end后跟实体名,关键字end后跟构造体名,库,7. 赋值符号和数据比较符号,8. when_else条件信号赋值语句 并行语句 并行逻辑操作符:,赋值符号: “= ”用于信号数据的传输,仿真传输延时最短为一个。 要求两边的 信号的 数据类型必须一致 数据比较符号 : “=” 在条件语句表式中用于比较待测数据的关系。 没有赋值的含义,只是一种数据比较符号。 输出结果的数据类型是布尔(boolead),赋值目标 = 表达式 when 赋值条件 else 表达式 when 赋值条件 else . 表达式 ;,例: z = a when p1 = 1 else b when p2 = 1 else c ;,vhdl语言中预定义的有特殊含义的英文词语。 用户不能用关键词命名自用对象或用作标识符。,9关键字,10标识符,11规范的程序书写格式,用户在编程中自定义的,用于表示不同名称的词语,12文件取名和存盘,文件取名: 建议文件名与vhdl设计的实体名一致,后缀是.vhd。,文件存盘: vhdl设计文件必须存于指定为工程的目录中,此目录将被设定为work库,work库的路径即为此目录的路径。,文件名后缀为.vhd 文件名英文字母不分大小,【例4-2】 2选1多路选择器 entity mux21a is port ( a, b : in bit; s : in bit; y : out bit ); end entity mux21a; architecture one of mux21a is signal d,e : bit; begin d = a and (not s) ; e = b and s ; y = d or e ; end architecture one ;,vhdl数据对象(data objects),s = 0 y = a s = 1 y =b,d,e,并行语句,3.1.2 2选1多路选择器及其vhdl描述2,布尔表达式,1. 逻辑操作符,在and(与)、or(或)和not(取反)等的作用下可构成组合电路。,and、or、not nand、nor、xor、xnor 操作对象的数据类型为:bit、boolead、std_logic,bit数据类型定义: 种取值 type bit is (0,1); std_logic数据类型定义: 种取值 type std_logic is (u-未初始化的 x-强未知的 0-强0 1-强1 z-高阻态 w-弱未知的 l-弱0 h-弱1 -忽略) 可实现:x - 0 1 z,2. 标准逻辑位数据类型std_logic,库(library)存放预先设计好的程序包和数据的集合体。常用的库有ieee、std、work、用户库等。这些设计单元可用作其他vhdl描述的资源。用户编写的设计单元既可以访问多个设计库,又可以加入到设计库中,被其他单元所访问。 程序包(package)将已定义的数据类型、元件调用说明及子程序收集在一起,供vhdl设计实体共享和调用,若干个包则形成库。程序包由两个独立的单元组成:程序包声明单元和程序包体单元构成。,3. 设计库和标准程序包,ieee库包括:std_logic_1164 std_logic_arith是synopsys公司加入ieee库程序包,包括: std_logic_signed(有符号数) std_logic_unsigned(无符号数) std_logic_small_int(小整型数) vhdl 87版本使用ieee std 1076-1987 语法标准 vhdl 93版本使用ieee std 1076-1993 语法标准 描述器件的输入、输出端口数据类型中将要用到的ieee的标准库中的std_logic_1164程序包。,使用库和程序包的一般定义表式是: library ; use all ;,信号是在结构体(architecture)、程序包(package)和实体(entity)中说明的全局量。,信号定义格式: signal 信号名:数据类型:=初值; 例如:signal q1:std logic:=0;,信号赋值语句: 目标信号名=表达式 例如:x=9; z=x after 5ns;,4. signal信号定义和数据对象,数据对象:,数据对象定义: 类似于容器,可接受不同数据类型的赋值 数据对象类型: 信号、变量、常数,【例3-3】 2选1多路选择器 entity mux21a is port ( a, b, s: in bit; y : out bit ); end entity mux21a; architecture one of mux21a is begin process (a,b,s) begin if s = 0 then y = a ; else y = b ; end if; end process; end architecture one ;,3.1.3 2选1多路选择器及其vhdl描述3,进程语句,敏感信号,s = 0 y = a s = 1 y =b,if then else 顺序语句,1. 条件语句,2. 进程语句和顺序语句,if语句必须以语句“end if;”结束,if_then_else 顺序,进程语句以process(敏感信号表).end process引导的语句结构 敏感信号表中敏感信号的变化将激活所在进程; 在一个结构体中可以包含任意个进程语句结构,所有进程语句是并行语句; 由process引导的语句是顺序语句 顺序语句以顺序方式执行的语句,其执行结果与书写先后顺序有关.,进程语句: 主要用于设计实体的算法和功能描述,即行为描述;,语法格式 进程标号: process( 敏感信号表 ) 进程说明区 begin 进程程序区 end process; 进程说明区:只能定义类型、变量、子程序,不能定义信号; 进程程序区:只能包含顺序语句; 可包含信号和变量两种数据对象: 变量为进程内部对象,不可跨越进程; 信号为实体全局对象,用于与其它实体内模块建立联系; 敏感信号表 可以激活该进程的信号列表 敏感信号表中信号的变化将激活所在进程; 敏感信号表中只能包含信号,不能包含变量;,在vhdl中所有合法的顺序描述的语句必须放在进程语句中,3.1.4 半加器及其vhdl的描述,so =a xnor (not b) co=a and,异或非(同或),半加器h_adder逻辑功能真值表,library ieee; -半加器描述(1):布尔方程描述方法 use ieee.std_logic_1164.all; entity h_adder is port (a, b : in std_logic; co, so : out std_logic); end entity h_adder; architecture fh1 of h_adder is begin so = not(a xor (not b) ; co = a and b ; end architecture fh1;,so =a xnor (not b) co=a and,【例3-4】半加器,library ieee; -半加器描述(2):真值表描述方法 use ieee.std_logic_1164.all; entity h_adder is port (a, b : in std_logic; co, so : out std_logic); end entity h_adder; architecture fh1 of h_adder is signal abc : std_logic_vector(1 downto 0) ; -定义标准逻辑位矢量数据类型 begin abc so so so so null ; end case; end process; end architecture fh1 ;,【例3-5】半加器,格式: case is when = ; . ; ; when = ; . ; ; . end case ;,case语句属于顺序语句,须放在进程语句中使用. case语句根据满足的条件直接选择多项顺序语句中的一项执行,它常用来描述总线行为、编码器、译码器等的结构。可读性比if 语句强。,1. case语句,when条件选择值可以有四种表达方式;,(1)单个普通数值,形如 when 选择值 = 顺序语句; (2)并列数值,形如 when 值/值/值 = 顺序语句; (3)数值选择范围,形如 when 值to值 = 顺序语句; (4)when others = 顺序语句;,使用case语句需注意以下几点: ( 1) case语句中每一条语句的选择值只能出现一次,即不能有相同选择值的条件语句出现 (2) case语句执行中必须选中,且只能选中所列条件语句中的一条,即case语句至少包含一个条件语句。 (3) 除非所有条件语句中的选择值能完全覆盖case语句中表达式的取值,否则最末一个条件语句中的选择必须用“others”表示,它代表已给出的所有条件语句中未能列出的其他可能的取值。否则在综合过程中会插入不必要的锁存器。关键词others只能出现一次,且只能作为最后一种条件取值。,当执行到case语句时,首先计算case和is之间的表达式的值,然后根据条件语句中与之相同的选择值,执行对应的顺序语句,最后结束case语句。,在使用std_logic_vector中,必须注明其数组宽度,即位宽 如: b : out std_logic_vector(7 downto 0) ; 或 signal a :std_logic_vector(1 to 4),b = “01100010“ ; - b(7)为 0 b(4 downto 1) = “1101“ ; - b(4)为 1 b(7 downto 4) = a ; - b(6)等于 a(2),2. 标准逻辑矢量数据类型std_logic_vector,并置操作示例: signal a : std_logic_vector (3 downto 0) ; signal d : std_logic_vector (1 downto 0) ; . a = 10d(1)1 ; - 元素与元素并置,并置后的数组长度为4 . if a d = “101011“ then .- 在if条件句中可以使用并置符,并置操作是将操作数或数组合并起来形成新的数组。,并置后的数组长度为6,3. 并置操作符 ,3.1.5 一位二进制全加器及其vhdl描述,1位全加器逻辑功能真值表,library ieee ; use ieee.std_logic_1164.all; entity or2a is port (a, b : in std_logic; c : out std_logic ); end entity or2a; architecture one of or2a is begin c = a or b ; end architecture one;,【例3-6】或门逻辑描述,【例3-7】 library ieee; use ieee.std_logic_1164.all; entity f_adder is port (ain,bin,cin : in std_logic; cout,sum : out std_logic ); end entity f_adder;,1位二进制全加器顶层设计描述,architecture fd1 of f_adder is component h_adder -调用半加器声明语句-例化语句 port ( a,b : in std_logic; co,so : out std_logic); end component ; component or2a -调用或门声明语句-例化语句 port (a,b : in std_logic; c : out std_logic); end component; signal d,e,f : std_logic; -定义3个信号作为内部的连接线。 begin u1 : h_adder port map(a=ain,b=bin,co=d,so=e); -映射语句-例化语句 u2 : h_adder port map(a=e, b=cin, co=f,so=sum); u3 : or2a port map(a=d, b=f, c=cout); end architecture fd1;,层次化设计:,对于一个复杂的电子系统,可以将其分解为若干个子系统,每个子系统再分解成模块,形成多层次设计。这样,可以使更多的设计者同时进行合作。 在多层次设计中,每个层次都可以作为一个元件,再构成一个模块或系统,可以先分别仿真每个元件,然后再整体调试。,元件例化是引入一种连接关系, 是将预先设计好的设计实体定义为一个元件,然后利用映射语句将此元件与当前设计实体中的指定端口相连,从而为当前设计实体引入了一个低一级的设计层次。 *在结构体中,描述只表示元件(或模块)和元件(或模块)之间的互连,就象网表一样。 *元件例化语句也是一种并行语句,各个例化语句的执行顺序与例化语句的书写顺序无关,而是按照驱动的事件并行执行的。 *元件例化可以是多层次的 *当引用库中不存在的元件时,必须首先进行元件的创建,然后将其放在工作库中,通过调用工作库来引用元件。在引用元件时,要先在结构体中说明部分进行元件的说明,然后在使用元件时进行元件例化。,3.1.6 例化语句,component 元件名 is port (端口名表) ; end component 元件名 ;,元件例化语句由两部分组成 第一部分:元件定义语句(或元件说明语句)是对一个现成的设计实体定义为一个元件,语句的功能是对待调用的元件作出调用声明,它的最简表达式如下所示:,即对设计实体进行封装,使其只留出对外的接口界面,其中端口名表须列出该元件对外通信的各端口名,命名方式与实体中的 port()语句相同,元件定义语句必须放在结构体的architecture与bigin之间-即在结构体的说明区。,元件例化语句组成:,第二部分:映射语句,是此元件与当前设计实体(顶层文件)中元件间及端口的连接说明。完成电路板上的元件“插座”的定义,“例化名”(标号名)相当于“插座名”是不可缺少的; 语句的表达式如下: 例化名 : 元件名 port map( 端口名 = 连接端口名,.);,port map:端口映射/端口连接 端口名:是在元件例化语句中端口名表中已定义好的元件端口名字 连接端口名:是在顶层系统中,准备与接入的元件的端口相连的通信线名 或顶层系统的端口名 “=” : 连接符号 ( 端口名 = 连接端口名,.)部分完成“元件”引脚与“插座”引脚的连接 “关联” 关联方法: 位置影射法上层元件端口说明语句中的信号名与port map()中 的信号名书写顺序和位置一一对应。 例如,u1:and1(a1,b1,y1); 名称映射法用“=”号将上层元件端口说明语句中的信号名与 port map()中的信号名关联起来。 例如,u1:and1(a=a1,b=b1,y=y1);,【例3-8】 d触发器,图3-6 d触发器,3.2 寄存器描述及其vhdl语言现象 3.2.1 d触发器的vhdl描述,library ieee ; use ieee.std_logic_1164.all ; entity dff1 is port (clk : in std_logic ; d : in std_logic ; q : out std_logic ); end ; architecture bhv of dff1 is signal q1 : std_logic ; -类似于在芯片内部定义一个数据的暂存节点 begin process (clk) begin if clkevent and clk = 1 then q1 = d ; end if; q = q1 ; -将内部的暂存数据向端口输出 end process ; end architecture bhv;,双横线-是注释符号,1. 上升沿检测表达式和信号属性函数event,关键词event是预定义信号属性,表示对当前的一个极小的时间段内发生事件的情况进行检测(如时钟的边沿)。 vhdl通过以下表式来测定某信号的跳变边沿: event,例如: clockevent -检测以clock为属性测试项目的事件 clockevent and clock=1; -检测clock的上升沿 clockevent and clock=0; -检测clock的下降沿,last_event从信号最近一次的发生至今所经历的时间,常用于检查定时时间、建立时间、保持时间和脉冲宽度等。,d触发器vhdl描述的语言现象说明,【例3-9】-比较器 entity comp_bad is port( a1 : in bit; b1 : in bit; q1 : out bit); end ; architecture one of comp_bad is begin process (a1,b1) begin if a1 b1 then q1 = 1 ; elsif a1 b1 then q1 = 0 ; - 未提及当a1=b1时,q1作何操作 end if; end process ; end ;,图3-7 例3-9的电路图,在设计组合逻辑电路时,如没有列出所有条件及其对应的处理方法,将导致不完整的条件语句,从而产生组合和时序电路 的混合体,浪费逻辑资源,降低电路工作速度,影响了电路的可靠性。,a1 b1 :q1= 1 a1 b1:q1= 0 a1 = b1:q1= ?,2. 不完整条件语句与时序电路,寄存器,【例3-10】-改进的比较器 entity comp_good is port(a1 : in bit; b1 : in bit; q1 : out bit ); end ; architecture one of comp_good is begin process (a1,b1) begin if a1 b1 then q1 = 1 ; else q1 = 0 ; end if; end process ; end ;,a1 b1 :q1= 1 a1 b1:q1= 0,【例3-11】 d触发器 . process (clk) begin if clkevent and (clk=1) and (clklast_value=0) then q = d ; -确保clk的变化是一次上升沿的跳变 end if; end process ;,3.2.2 vhdl实现时序电路的不同表述,clk last_value: 预定义信号属性,表示最近一次事件(event)发生前的值 clklast_value 0为true表示在时刻前为0 clklast_value 1为true表示在时刻前为1,【例3-12】 d触发器 . process (clk) begin if clk=1 and clklast_value=0 -同例4-11 then q = d ; -确保clk的变化是从0跳变到1 end if; end process ; . . .,【例3-13】 d触发器 library ieee ; use ieee.std_logic_1164.all ; entity dff3 is port (clk : in std_logic ; d : in std_logic ; q : out std_logic ); end ; architecture bhv of dff3 is signal q1 : std_logic; begin process (clk) begin if rising_edge(clk) - 必须打开std_logic_1164程序包 then q1 = d ; end if; q = q1 ; end process ; end ;,rising_edge()是vhdl在ieee库中标准程序包std_logic_1164内预定义函数。,【例3-14】 d触发器 . process begin wait until clk = 1; -利用wait语句 q = d ; end process; . . .,wait until:等待保持至,【例3-15】 d触发器 . process (clk) begin if clk = 1 then q = d ; -利用进程的启动特性产生对clk的边沿检测 end if; end process ;,图3-9 边沿型触发器时序波形,【例3-16】 d触发器 . process (clk,d) begin if clk = 1 -电平触发型寄存器 then q = d ; end if; end process ;,图3-10 电平触发型寄存器的时序波形,entity test1 is port (clk, d : in bit; q : out bit); end test1; architecture body of test1 is signal q1 : bit ; begin process (clk) begin if clk=1 and clklast_value=0 then q1 = d; end if; q = q1 ; end process; end test1_body;,library ieee; use ieee.std_logic_1164.all; entity test1 is port (clk, d : in bit; q : out bit); end test1; architecture body of test1 is begin process (clk) begin if rising_edge(clk) then q = d; end if; end process; end test1_body;,entity test1 is port (clk : in bit; d : in bit; q : out bit); end test1; architecture body of test1 is signal q1 : bit ; begin process (clk,d) begin if (clk = 1) then q1 = d; end if; q = q1 ; end process; end body;,entity test1 is port (clk : in bit; d : in bit; q : out bit); end test1; architecture body of test1 is signal q1 : bit ; begin process (clk) begin if (clk = 1) then q1 = d; end if; q = q1 ; end process; end body;,比较不同语句的d触发器vhdl程序,小结:,*时序逻辑电路只能利用进程中的顺序语句建立; *常用和通用的边沿检测表达式: clockevent and clock=1; -检测clock的上升沿 clockevent and clock=0; -检测clock的下降沿,3.2.3 异步时序电路设计,异步时序电路的实现: 一个时钟进程只能构成对应单一时钟信号的时序电路,异步时序电路最好用多个时钟进程构成.,时钟进程:构成时序电路的进程,【例3-17】用两个时钟进程描述的异步时序电路 . architecture bhv of multi_dff is signal q1,q2 : std_logic; begin pro1: process (clk) - -时钟进程 begin if clkevent and clk=1 then q1 = not (q2 or a); end if; end process ; pro2: process (q1) - -时钟进程 begin if q1event and q1=1 then q2 = d; end if; qq = q2 ; end process ; end architecture bhv,q1,q2,【例3-18】 4位加法计数器 entity cnt4 is port ( clk : in bit ; q : buffer integer range 15 downto 0 ) ; end ; architecture bhv of cnt4 is begin process (clk) begin if clkevent and clk = 1 then q = q + 1 ; end if; end process ; end bhv;,3.3 计数器的vhdl设计 3.3.1 4位二进制加法计数器设计,加、减算术操作符对应的操作数的数据类型为整数类型,语言现象:,*端口模式: buffer 缓冲 *数据类型: integer整数类型 *计数器累加表达式: q = q + 1 *加、减算术操作符: 对应的操作数的数据类型为整数类型 *数据对象更新时间: q = q + 1 下一时钟周期,3.3.2 整数类型,整数类型integer:正整数、负整数和零 表示范围:2147483647 2147483647(可用32位有符号的二进制 数表示,即从(2311)到+(2311 ),已定义在vhdl标准程序包 standard。可以使用预定义运算操作符,如: 加“”、减“”、 乘“”、除“”进行算术运算。) 自然数类型naturul:正整数和零 正整数类型positive:正整数,*vhdl仿真器将整数类型作为有符号数处理; *vhdl综合器将整数类型作为无符号数处理,要求使用range子句限定整数的范围,并根据限定范围决定信号或变量的二进制的位数,例: q : buffer integer range 15 downto 0,整数常量的书写方式示例如下: 1 十进制整数 0 十进制整数 35 十进制整数 10e3 十进制整数:1000 16#d9# 十六进制整数 8#720# 八进制整数 2#11010010# 二进制整数,vhdl规定加、减算术操作符对应的操作数的数据类型为整数类型,以数制基数表示的文字格式:数制#数值# b二进制基数符号; o八进制基数符号; x16进制基数符号,【例3-19】 library ieee ; use ieee.std_logic_1164.all ; use ieee.std_logic_unsigned.all ; entity cnt4 is port ( clk : in std_logic ; q : out std_logic_vector(3 downto 0) ) ; end entity cnt4 ; architecture bhv of cnt4 is signal q1 : std_logic_vector(3 downto 0); begin process (clk) begin if clkevent and clk = 1 then q1 = q1 + 1 ; end if; q = q1 ; end process ; end architecture bhv;,3.3.3计数器的其他vhdl表达方式,中间节点,语言现象:,*输出信号q: 数据类型: std_logic_vector(3 downto 0) library ieee ; use ieee.std_logic_1164.all 端口模式: out q = q+ 1 q1 = q1 +1 (定义内部信号) * 运算符的重载: 通过调用运算符的重载函数实现 q1 = q1 + 1 (标准逻辑矢量) (整数类型) use ieee.std_logic_unsigned.all,中间节点,4位加法计数器组成: 由两大部分组成:组合电路-加法器(加1器) 时序电路-锁存器(4位、边沿触发型),图3-13 4位加法计数器工作时序,* 数据类型: 整数类型integer、自然数类型naturul 、正整数类型positive,* buffer模式: buffer表达特定端口的特定功能,并非是特定的端口结构。,*运算符重载: vhdl允许用户对原有的基本操作符重新定义,赋予新的定义和功能,或允许不同的数据类型之间进行运算,从而建立新的操作符. 运算符重载方法之一:调用重载函数 *重载函数: 程序包std_logic_unsigned含有加号(+)和其他运算符的重载函数。,* 计数器结构: 加法计数由两部分组成:加1组合电路和寄存器时序电路。,归纳:,3.4 实用计数器的vhdl设计 【例3-20】带有异步复位和同步置数、时钟使能的十进制计数器,接下页,接上页,功能:主要用于数据暂存,十进制计数器相关语法 1)变量variable,变量的一般表述: variable 变量名 : 数据类型 := 初始值;,特征: *一个局部量,只能在进程中和子程序中使用。 *不能将信息带出对它作定义的当前设计单元。 *一种理想化的数据传输,立即发生,不延时。,变量赋值语句: 目标变量名 := 表达式;,信号赋值语句: 目标信号名 表达式 ;,为了简化表达才使用短语“(others=x)”,这是一个省略赋值操作符,它可以在较多位的位矢量赋值中作省略化的赋值, 如以下语句: signal d1 : std_logic_vector(4 downto 0); variable a1: std_logic_vector(15 downto 0); . d1 1, 3 =1, others=0); a1 := (others=0) ;,2)省略赋值操作符(others=x),2. 程序分析 rtl电路图,工作时序,3. 时序模块中的同步控制信号和异步控制信号的构建,异步信号与同步信号: 异步与同步相对于时钟信号而言,不依赖时钟而有效的信号为异步信号,否则为同步信号。,4. 另一种描述方式,3. 时序模块中的同步控制信号和异步控制信号的构建,4. 另一种描述方式,library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cnt10 is port (clk,rst,en : in std_logic; cq : out std_logic_vector(3 downto 0); cout : ou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论