欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    使用VHDL进行数字电路设计.ppt

    • 资源ID:4915050       资源大小:1.23MB        全文页数:362页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    使用VHDL进行数字电路设计.ppt

    使用VHDL进行数字电路设计,ASIC技术的发展电路系统设计方法自定向下的设计流程设计描述风格,高层次设计方法,ASIC技术的发展,由于所设计的系统的规模已从几十几百门增加到几万几十万门,使得从前电子工程师所熟悉的画电路图、真值表和卡诺图的设计方法已经远远不能满足数字系统的复杂性要求,ASIC技术的发展,高层次设计方法HLD(High Level Design)是从八十年代末以来,最新专用集成电路设计的、最先进的设计方法,它为用户设计更大规模、更高水平、性能优良的数字系统提供了可靠的保证,HLD符合目前对电路的两个要求,Time to Market:对于通信领域来说,快速推出市场需要的系统具有非常重要的价值,HLD使得快速设计较大的芯片成为可能。SOC:目前对数子系统的需求是规模越来越大,HLD非集成电路专业背景的通信厂商设计大规模芯片提供了可能,设计技术的发展使得HLD成为可能,设计技术的发展使得HLD成为可能,采用最原始的版图设计只需要相应的图形编辑工具采用电路图设计就需要相应的布局布线工具采用HDL语言设计电路就需要相应的综合工具支持结论:正是综合技术的提出使得HLD成为可能,电路设计方法,由底向上的设计(Bottom-up):从结构层开始,采用结构化单元和由少数行为级模块构成的层次式模型,逐级向上搭建出符合要求的系统。自顶而下的设计(Top-Down):先对所要设计的系统进行功能描述,然后逐步分块细化,直至结构化最底层的具体实现,Top-Down的优越性,提高设计生产的效率:自顶向下的设计方法允许设计者从一个高抽象层次上对系统的功能进行定制,而不需要考虑门级的具体实现方法,这充分体现了工艺无关性的基本设计思想。设计者只需要写出设计中所需部件的硬件描述语言代码或者是其它类型的模型,设计工具就会根据编写的高层描述生成门级的实现,这就大大减少了设计者以往必须花费在设计细节上的时间,Top-Down的优越性,增加了设计的重用性:在大多数的自顶向下设计过程中,对设计的描述都保持在一个通用的工艺水平上,它不是为某一厂家的工艺库而特意定制的,也就是说,设计是与工艺无关的,所以在实现设计时不必使用某一特定厂家的工艺,这样就极大的提高了设计的可重用性,如果需要改变设计所使用的工艺,只需要将设计在相应的工艺库上映设即可。,Top-Down的优越性,错误的早期发觉:可以带来好处1、减少产品开发周期2、降低开发成本3、增加设计一次成功通过的可能性,电路设计应该采用的方法,强调进行系统开发的方式:首先进行系统分析,给出Specification,划分模块,明确模块接口,确定模块内部功能,此时应该编写详细的设计说明文档,之后才是编程,调试。目前国内很难达到这个层次,但一般较大的设计都是多个设计者完成,因此模块划分和确定接口信号是非常重要的,可以极大的减少设计的调试时间。模块尽量以寄存器为边界,这样对于联调和最后的系统集成非常方便。建立合理的设计习惯对于今后的工作的效率会有巨大帮助,设计技术的发展,CAD:SchematicsEDA:HDLVHDL和Verilog是影响最广的两种HDL。VHDL相对于Veirlog而言,它在语法上更严谨一些,虽然这样也使它失去了一些灵活性和多样性,但从文档纪录、综合以及器件和系统级的仿真上讲VHDL是一种更好的选择。,VHDL语言,在1981年,美国国防部提出了一种新的硬件描述语言,称之为VHSIC Hardware Description Language,也就是我们现在所说的VHDL,它是美国国防部委托IBM和Texas Instruments联合开发的。1986年,VHDL被建议作为IEEE标准,经过了多次更改后,直到1987年12月,它才被接纳为IEEE1076标准。该标准经过不断完善和更新,目前的标准为IEEE1164,它已被绝大多数IC生产厂家和EDA工具供应商所接受。当前几乎所有的EDA软件,象Synopsys、Mentor Graphics、InovaEDA、Cadence等,均支持该标准。,VHDL语言的特点,VHDL是工业标准的文本格式语言VHDL能同时支持仿真和综合VHDL是一种并发执行的语言VHDL支持结构化设计和TOP-DOWN设计方法VHDL的描述与工艺无关支持多风格的描述方法,数字系统描述的Gajski图,VHDL描述数字电路的层次,采用VHDL语言描述电路时,我们将电路的描述分为行为(Behavioral)和寄存器传输级(Register Transfer Level)和门级描述(Gate Level)三个层次。这样的划分是根据寄存器和组合逻辑的确定性而言的行为级:寄存器和组合逻辑都不明确RTL级:寄存器明确,组合逻辑不明确。门级:寄存器和组合逻辑都明确,三种描述层次的比较,在目前的实际设计工作中,行为描述和门级描述都很少用到。门级描述投入大量精力描述电路的具体细节,无法体现出高层描述的优点。行为描述的抽象层次太高,综合工具无法很好的理解设计者的意图,综合出的电路距离设计者的实际要求有很大差距,并且目前主流的综合工具都不具有这种功能,目前有一些推出的行为综合器如Synopsys的Behavioral Complier,但用户的反映都不是很良好,使用VHDL描述组合逻辑的方法,在使用VHDL描述组合逻辑电路时,根据描述风格的不同,我们将它分为行为级描述、结构流(Data Flow)描述和结构级(Structural Level)描述。这里的行为级(Behavioral Level)描述和前面的行为描述(Behavioral)从概念上是有区别的,或者说是行为描述具体在组合逻辑中的定义。行为级描述是指一个组合逻辑的功能已经明确,但它的具体实现结构没有确定,但限定使用组合逻辑实现。,高层次设计流程,一、系统功能分析,进行系统功能分析的目的是在进行系统设计之前明确系统的需求,也就是确定系统所要完成的功能、系统的输入输出、以及这些输入输出之间的关系等,并且要确定系统的时序要求。系统功能分析的另外一个目的,就是系统的模块划分。在系统分析时,应根据功能的耦合程度,将系统划分为不同的功能模块,每一个功能都映射到一个模块,同时还需要确定模块之间的相互关系,这是模块化设计的基本要求。,二、体系结构设计,体系结构设计又是整个系统设计阶段最重要的工作,它的首要任务就是数据通路和控制通路的设计。在数字系统的设计中,系统的控制是建立在数据通路的基础之上的,不同的数据通路对应了不同的控制通路。数据通路的设计包括被处理数据的类型分析、处理单元的划分、以及处理单元之间的关联程度等。控制通路是数据通路上数据传输的控制单元,用于协调数据处理单元之间的关系,控制通路的设计主要包括数据的调度、数据的处理算法和正确的时序安排等。数据通路和控制通路的设计并不是截然分开的,有时在确定好数据通路后,由于时序或数据的调度等问题,而不得不重新修改数据通路。所以数据通路与控制通路的设计往往要经过许多次反复才能达到最优的效果,三、系统描述,谓系统描述也就是使用VHDL语言对系统进行编码。在进行大型软件的开发时,编码相对于前面所进行的系统划分工作相比就显得不是那么重要,但在使用硬件描述语言进行数字电路描述时,情况则完全不同,因为语言的描述直接决定着电路的性能,不好的编码将无法反映所确定的体系结构,可能导致前面所做的工作完全浪,四、系统功能仿真,系统的功能仿真(Functional Simulation)是用来验证设计者所编写的VHDL代码是否完成了预定的功能。几乎所有的高层设计软件都支持语言级的系统仿真,这样在系统综合前就可以通过系统功能仿真来验证所设计系统的功能正确与否。在语言级系统仿真时,要求设计者使用VHDL语言所提供的丰富的仿真语句来编写系统的测试基准程序(Testbench)。测试基准程序在高层次设计中占有非常重要的地位,不仅在系统功能仿真时被用来作为功能验证的基准,而且在门级仿真与后时序仿真都要以此为基准。,综合优化阶段,综合器对系统的综合优化主要分为两步:第一步是将硬件描述语言翻译成门电路,第二步是对产生的电路进行优化。主要工作是在第二步进行的,判断一个综合器性能的标准也是基于这一方面的。系统优化的目的就是花费最小的硬件资源满足最大的时序要求,所以系统优化就是在系统的速度(Speed)和面积(Area)之间找到一个最佳方案(Trade-off)。系统优化的关键在于系统约束条件(Constraints)的设定,施加到系统的约束条件将使综合器对系统的优化按照设计者所期望的目标进行。,系统实现,如果系统综合优化的结果满足设计者的要求,就可以进行系统实现的工作。在一般的ASIC设计中,设计者应该将综合后电路的网表(Netlist)文件和设计的时序要求,交给IC生产厂家进行下一步的工作。这是国内一般的做法,专业的微电子公司将会参与更多的后面的layout的工作。,设计风格描述,设计描述的风格直接控制着EDA工具综合的结果。描述同一功能的两段RTL描述能产生出时序和面积上完全不同的电路,好的描述方式就是易于被综合器识别并可以被综合出设计者期望的电路,电路的质量取决于工程师使用的描述风格和综合工具的能力。我将会在外面介绍。,我个人对高层次设计方法的理解,硬件描述语言-schematic(netlist)-版图 综合工具 布局布线工具高级语言-汇编语言-机器语言 高级语言编译器 机器语言编译器(assembler)目前国内还有很多人不认同采用HDL的高层次设计方法,其实就是不能理解综合工具的作用,但映射到不认同C编译器或BASIC编译器的作用确是荒谬的。我认为高层次设计方法实际就是牺牲描述精确度来换取描述效率,在某些具体应用中是不适用的,比如最先进的处理器研究。但对于通常应用背景的数字系统来说Time to Market是非常重要的,高层次设计方法可以极大的提高设计的效率。随着综合工具性能的不断提高,高层设计方法的应用范围会越来越广。,VHDL语言基础,设计实体和结构体的概念,VHDL把一个电路模块看作一个单元,对任何一个单元的描述包括接口描述和内部特性描述两个部分。接口描述称为设计实体(entity),它提供该单元的公共信息,如名称、端口等;内部特性描述称为结构体(architecture),它定义单元的内部操作特性。一个结构体可以对应多个实体,结构体和实体的绑定关系称为配置(configuration)。一个电路单元只能有一个entity,下面是一个最简单的例子,描述的电路是一个半加器,一个半加器的VHDL描述,entity halfadder is port(a,b:in bit;sum,carry:out bit);end halfadder;architecture behavior of halfadder is beginprocess(a,b)beginif(a=1 and b=1)then carry=1;else carry=0;end if;if(a/=b)then sum=1;else sum=0;end if;end process;end behavior;,Entity的描述,entity 实体名 is 类属参数说明 端口说明end 实体名;,entity mux isgeneric(m:time:=1ns);port(d0,d1,sel:in bit;q:out bit);end mux;,端口的方向,in(输入)、out(输出,结构体内部不能再使用)、inout(输入输出双向)、buffer(输出,结构体内可再使用)不提倡使用buffer型,可以在内部在起一个名字),结构体的框架,architecture 结构体名 of 实体名 is定义语句begin 并行处理语句end 结构体名;定义语句位于architecture和begin之间,用于对结构体内部所使用的信号、常数、数据类型、函数等进行定义。信号定义和端口说明一样,应有信号名和数据类型,因它是内部使用,不需要有方向的说明。并行处理语句处于语句begin和end之间,具体描述了结构体的行为及其连接关系。在结构体中的语句都是可以并行执行的,语句的执行顺序不以书写的语句顺序为执行顺序。,Entity和architecture 总结,一个单元只有一个设计实体,而结构体的个数可以不限。也就是说,一个设计实体可以对应于多个结构体。这种方式的意义在于:每个结构体代表该电路的某一方面的特性(如行为特性、结构特性等),而且,即使是同一特性的描述,也可以有不同的抽象层次。,在一个单元中引用另外一个单元,architecture structure of fulladder issignal ts:bit;signal tc1,tc2:bit;component halfadderport(a,b:in bit;sum,carry:out bit);end component;beginU0:halfadder port map(a,b,ts,tc1);U1:halfadder port map(ts,cin,sum,tc2)end structure;,设计库,库(library)是经过编译后的数据的集合,它存放程序包定义、设计实体定义、结构体定义和配置定义。在VHDL中,库的说明总是放在设计单元的最前面,如:library IEEE;use IEEE.std_logic_1164.all;这样,在设计单元内就可以使用库中的数据。在VHDL中,可以存在多个不同的库,但是库与库之间是独立的,不能互相嵌套。当前在VHDL中存在的库大致包括:标准库、工艺库、用户自定义的库和WORK库。其中,WORK库是现行工作库,设计者描述的VHDL不需要任何说明,都可以存放在WORK库中,而且对WORK库的使用不需要任何说明。,常用的数据类型,在设计可综合电路是常用的类型 整形(一般只在作下标时用,内部)std_logic,std_logic_vector(9值逻辑),端口都用这两种类型类型之间的转化 首先说明IEEE.std_logic_unsigned库 conv_integer(),conv_std_logic_vector(integer,n),Std_logic和std_logic_vector,Std_logic信号用单引号,比如a1)来赋值使用&可以将位数较短的std_logic_vector型组合为数位较长的std_logic_vector型,九值逻辑,1-force 1 0-force 0X-Force UnknownZ-High ImpedanceU-UninitializedW-Weak unknownH-Weak 1L-Weak 0-dont care,在可综合电路中设计中需要的:1,0,Z,X,-Z用来描述三态X用来赋不可能出现的缺省值-用来赋无关值,利于优化U在仿真中会遇到,没有初始化,在功能仿真中按照else来计算,在后仿真中则会传递,导致错误,常用的运算符,逻辑运算符 not、and、or、nand、nor、xor算术运算符+和-,其它运算符,/,*,mod对于一般的可综合电路来讲,都不使用,因为它们的算法都比较复杂,综合器综合的效果不好,需要是用户自己设计算法,比如采用booth算法实现乘法连接运算符&,比较常用关系运算符=、/=、=都非常常用赋值运算符=,:=,逻辑运算,And or nand xor nor not操作数必须类型和长度都相同注意使用括号 c=a and b and c c=(a and b)and c-?一样,不一定一样,关系运算符,=只要是同一类型,长度不同可以比较在synopsys中是可以的,比如“11111”“1100”这是因为定义了IEEE.std_logic_unsigned库,Std_logic_unsigned库,function(L:STD_LOGIC_VECTOR;R:STD_LOGIC_VECTOR)return BOOLEAN;function(L:STD_LOGIC_VECTOR;R:INTEGER)return BOOLEAN;function(L:INTEGER;R:STD_LOGIC_VECTOR)return BOOLEAN;function=(L:STD_LOGIC_VECTOR;R:STD_LOGIC_VECTOR)return BOOLEAN;function=(L:STD_LOGIC_VECTOR;R:INTEGER)return BOOLEAN;function=(L:INTEGER;R:STD_LOGIC_VECTOR)return BOOLEAN;function=(L:STD_LOGIC_VECTOR;R:STD_LOGIC_VECTOR)return BOOLEAN;function=(L:STD_LOGIC_VECTOR;R:INTEGER)return BOOLEAN;function=(L:INTEGER;R:STD_LOGIC_VECTOR)return BOOLEAN;,加法运算,最常见的加一计数器可以写成:A=A+1这是因为在unsigned 中定义了function+(L:STD_LOGIC_VECTOR;R:STD_LOGIC_VECTOR)return STD_LOGIC_VECTOR;function+(L:STD_LOGIC_VECTOR;R:INTEGER)return STD_LOGIC_VECTOR;function+(L:INTEGER;R:STD_LOGIC_VECTOR)return STD_LOGIC_VECTOR;function+(L:STD_LOGIC_VECTOR;R:STD_LOGIC)return STD_LOGIC_VECTOR;function+(L:STD_LOGIC;R:STD_LOGIC_VECTOR)return STD_LOGIC_VECTOR;,引用库文件,这个预先定义的包文件std_logic_unsigned.vhd被已经被预先编译的IEEE库中,因此设计者在使用上面的操作时,需要使用IEEE.std_logic_unsigned.all;否则编译时就会出错.用户可以自己包文件,编译到指定库中,并在源文件中引用这个包文件,进程process,一个进程就相当于一个并行的语句,它的内部时串行的进程名:process(进程敏感信号列表)begin顺序描述语句;end processprocess语句从process开始,到end process结束,进程名可以省略。,Process的例子,mux2:process(a,b,s)beginif(s=0)then f=a;else f=b;end if;end process;进程的所有输入信号应该放在敏感表内,否则会造成前后仿真不符,信号和变量,信号在电路模块之间传递信息,signal用在模块内部,具体表现在变量在entity的端口和architecture内说明,variable在process内部说明,无法传递到process外面赋给变量的值则立即成为当前值,而赋给信号的值必须在进程结束后才能成为当前值。,顺序语句,Waitif;caseloop对于一般的可综合电路描述,这四种顺序语句已经足够了,Wait 语句,Wait until clkevent and clk=1 then 用来描述寄存器在testbench中描述延迟时可以使用wait for xxx ns;敏感表相当于一个wait on语句,进程的启动,process(a,b,s)beginif(s=0)then f=a;else f=b;end if;-wait on a,b,s进程在这个地方挂起end process;,IF语句,IF condition1 THEN sequence_of_statements1ELSIF condition2 THEN sequence_of_statements2 ELSE sequence_of_statements3 END IF;其中括号内为可选部分,它表示当条件1成立时,执行顺序语句序列1;当条件2成立时,执行顺序语句序列2;否则执行顺序语句序列3。ELSEIF付句可以重复,但ELSE付句只能有一条。,IF语句,注意如果if引导event代表时钟,此时不能有else复句用户组合逻辑的if,如果没有else付句,一定要在IF语句前面有缺省赋值,否则会造成不需要的latch,IF语句,IF语句对应的电路就是多选电路,比如 if select=1 then output=a;else output=b;end if;对应的电路就是用select作为选择信号来选通a和b,Case语句,CASE 语句的描述如下:CASE expression IS WHEN choices1=sequence_of_statements1;WHEN choices2=sequence_of_statements1;END CASE 其中条件有如下四种表达方法:WHEN 值=WHEN 值值值=WHEN 值 TO 值=WHEN others=选择项必须覆盖表达式所有选项,不足时其它选项包括在others项中。,Case语句,Case语句对应的是无优先级的多选如果在case中给多个信号赋值一定要在前面有缺省赋值.大家看下面的程序有什么问题?,Case语句,Process(decoder_in)beginCASE decoder_in IS WHEN“000”=decoder_out decoder_out decoder_out decoder_out decoder_out decoder_out decoder_out decoder_out=“01111111”END CASE;,Decoder_in 为std_logic_vector型,所以即使是9个值也没有完全赋值,因此如果在case前没有decoder的缺省赋值,就应该有default选项when default=decoder_outX);,Loop语句,FOR identifier IN discrete_range LOOP sequence_of_statemetns END LOOP;LOOP语句适用于描述有重复操作,或模块需要很强的迭代能力时使用。如下电路完成对输入的8位向量的翻转,即信号的高位与低位对调:FOR i IN 0 TO 7 LOOP output_vector(i)=input_vector(7-i);END LOOP;,loop语句,上述程序中i为循环变量,在VHDL中不允许任何对循环变量的赋值,也就是说不允许在任何函数返回值中存在循环变量,或在任何过程的输出与双向参量中存在循环变量。并且循环变量不用显式说明,它的作用域仅存在于循环语句内部,因此不允许在循环语句内部存在于循环变量同名的变量或信号,进制,B(binary)O(octal)X(Hexadecimal)通常情况下我们都用二进制对于位宽为4n的用16进制极为方便,在VHDL的语言规定中,可以使用=X”0F”赋值,但synopsys到9910才支持,如果工具不支持只能使用2进制.,理解并行的概念,在architecture中的语句都是并行的,它们的执行顺序和位置无关,一个process相当于一个并行语句.比如在architecture 中存在:D=A+E;A=B+C;将产生两个加法器,第二个输出作为第一个的一个输入在仿真时,当B或C变化时,激活语句2,当A或E变化时,激活语句2.本质:在现实电路中,各个部件是并行工作的,一个部件的输入变化,才会引起这个部件的输出变换.,避免组合环,在一般情况下不要使用组合环,尤其是不要用行为级描述组合环,如果需要使用电路图形式,并在设计中不要优化这个模块,练习 写一个带有异步复位同步置数的增量计数器,Clk 时钟load 同步置数信号rst 异步清零data 置入数据count 计数器输出,lIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY counter IS PORT(clk:IN std_logic;load:IN std_logic;rst:IN std_logic;data:IN std_logic_vector(7 downto 0);count:OUT std_logic_vector(7 downto 0);END counter;ARCHITECTURE arc_counter OF counter IS SIGNAL cnt:std_logic_vector(7 downto 0);BEGIN PROCESS(clk,rst)BEGIN IF rst=1 THEN cnt0);ELSIF clkevent AND clk=1 THEN IF load=1 THEN cnt=data;ELSE cnt=cnt-1;END IF;END IF;END PROCESS;count=cnt;END arc_counter;,敏感表,Process(a,b)begin s=a;t=b;v=s or t;end process,Process(a,b,s,t)begin s=a;t=b;v=s or t;end process,仿真和综合的区别?,结论:出现在赋值号左边的都应该写在敏感表中,Latch,Process(x,z)begin if x=1 then y=z;end if;end process;,X=0时需要保存原值,导致产生一个latch,使用VHDL描述基本电路,原因,采用HDL语言进行数字电路设计的流程中最重要的环节就是将语言描述转化为电路,将你的设计付诸实现,因此你必须知道所描述的语言对应的电路,只有这样综合工具才会输出一个可预知的、准确的、高质量的结果,满足设计者对电路功能、时序和面积上的要求。数字电路都是由一些基本单元连接而成的,只有能准确的描述这些常见电路才有可能使用这些模块构建更复杂的数字电路,因此熟悉数字电路中一些常见电路的描述是进行大规模系统设计的基础,RTL电路模型,结论,对于RTL电路的描述主要就是针对时序部件和组合逻辑的描述,如果设计者在使用VHDL语言进行描述时,能遵照组合逻辑和时序电路描述的规范,那么就可以使综合工具明确设计者的意图,综合出设计者期望的电路。,数字系统的结构,除了调用的一些宏单元模块时序电路、组合逻辑以及总线和存储单元,这四种基本单元就可以构成各种各样的数字电路。我个人的理解,不知道对不对?,时序部件,时序逻辑电路在任一时刻的输出信号不但与当时的输入信号有关,而且还依赖于电路原来的状态,因此这类电路必须具有记录过去状态的能力。时序逻辑电路中最基本的记忆部件就是就是触发器(flip-flop)和锁存器(latch),它们都是一位的存储单元,多位存储单元就可以构成寄存器(Register),LATCH,锁存器是电平触发的,锁存器的值在时钟的一个逻辑状态可以更改,在另一个逻辑状态被保存下来,因此在使能阶段输入端的一个毛刺也会导致电路的误操作,无法阻止毛刺的传播,容易产生较多的竞争冒险现象。从数字电路教材中,我们可以知道锁存器的优点是面积小、功耗低、速度较快,因此在许多全定制和半定制ASIC设计中会使用锁存器单元,但在使用FPGA或CPLD实现电路时,应该避免使用锁存器。,寄存器的描述,PROCESS BEGIN WAIT UNTIL(edge)END PROCESS;或 PROCESS(sensitivity list)BEGIN IF(edge)END IF;END PROCESS;,时钟沿描述,使用WAIT语句时,进程不需要敏感表,WAIT UNTIL语句就相当于敏感表的功能。在使用IF语句时应该将时钟信号放入敏感表中。对于时钟的跳变有两种描述方法,event属性或函数调用。如下所示:clkevent AND clk=1-上跳沿的event属性描述 clkevent AND clk=0-下跳沿的event属性描述 rising_edge(clk)-上跳沿的函数调用 falling_edge(clk)-下跳沿的函数调用在电路设计中,应使用event属性来描述时钟跳变,因为一些VHDL的综合工具并不支持函数调用,并且函数只检测0到1和1到0的跳变,无法检测出X到1或0到X,这对于使用的九值逻辑是不适合的。,时钟沿描述,时钟沿在作为IF或ELSIF语句的条件时,只可以单独使用,不能和其他条件共存,如下面的语句就是错误的:IF(edge AND rst=1)THEN同时当某一IF语句或ELSIF语句后有时钟沿做条件时,就不可以在有ELSE付句,如下面的语句描述也是错误的:IF rst=1 THEN Sequential_statement ELSIF(edge)THEN Sequential_statement ELSE Sequential_statement END IF;,异步复位和同步复位,记忆部件在电路加电后其状态是不确定的,它的初值应由复位信号来设置,根据设置的时机不同,可分为同步置位和异步置位。所谓同步置位是指置位信号只有在给定的时钟沿下才可以完成工作;而异步复位是指复位信号一旦生效存储部件就会被置位。其原理如下图所示,Asyn reset 和syn reset,异步复位的VHDL描述,PROCESS(sensitivity list)BEGIN IF(reset)THEN ELSIF(set)THEN ELSIF(edge)THEN END IF;END PROCESS;此时的敏感表只需要异步负位信号和时钟信号即可,IF语句相对于WAIT语句更灵活一些,强调,在FPGA设计中尽量不要使用latch,触发器描述,LIBRARY IEEE;ENTITY dff IS PORT(data:IN std_logic;clk:IN std_logic;q:OUT std_logic);END dff;ARCHITECTURE dff OF dff IS BEGIN PROCESS BEGIN WAIT UNTIL clkevent AND clk=1;q=data;END PROCESS;END dff;,电路图,带异步复位上沿的D触发器,LIBRARY IEEE;ENTITY dff_asyn_reset IS PORT(data:IN std_logic;clk:IN std_logic;reset:IN std_logic;q:OUT std_logic);END dff_asyn_reset;ARCHITECTURE dff_asyn_reset OF dff_asyn_reset IS BEGIN PROCESS(clk,reset)BEGIN IF reset=0THEN q=0;ELSIF clkevent AND clk=1 THEN q=data;END IF;END PROCESS;END dff_asyn_reset;,电路图,带异步置位复位的上跳沿D触发器,LIBRARY IEEE;ENTITY dff_asyn IS PORT(data:IN std_logic;clk:IN std_logic;preset:IN std_logic;reset:IN std_logic;q:OUT std_logic);END dff_asyn_preset;ARCHITECTURE dff_asyn OF dff_asyn IS BEGIN PROCESS(clk,preset,reset)BEGIN IF preset=0THEN q=1;ELSIF reset=0THEN q=0;ELSIF clkevent AND clk=1 THEN q=data;END IF;END PROCESS;END dff_asyn;,电路图,带异步复位和输入使能的上跳沿D触发器,LIBRARY IEEE;ENTITY dff_ck_en IS PORT(data:IN std_logic;clk:IN std_logic;reset:IN std_logic;en:IN std_logic;q:OUT std_logic);END dff_ck_en;ARCHITECTURE dff_ck_en OF dff_ck_en IS BEGIN PROCESS(clk,reset)BEGIN IF reset=0 THEN q=0;ELSIF clkevent AND clk=1 THEN IF en=1THEN q=data;END IF;END IF;END PROCESS;END dff_ck_en;,电路图,计数器,计数器是数字系统中使用最多的时序电路。它不仅能用于对时钟脉冲计数,还可用于定时、分频、产生节拍脉冲以及进行数字运算等。稍微复杂的数字系统,几乎都包含计数器。按计数器中触发器翻转的次序,可以把计数器分为同步式和异步式两种。在同步计数器中,当时钟脉冲输入时触发器的翻转是同时的,而在异步计数器中,触发器则不是同时翻转的一般的设计中都使用同步计数器,带异步清零和计数使能的8位同步计数器,LIBRARY IEEE;ENTITY counter8 IS PORT(clk:IN std_logic;en:IN std_logic;rst:IN std_logic;count:OUT std_logic_vector(7 downto 0);END counter8;ARCHITECTURE counter8 OF counter8 IS SIGNAL cnt:std_logic_vector(7 downto 0);BEGIN PROCESS(clk,en,cnt,rst)BEGIN IF rst=0THEN cnt0);ELSIF clkevent AND clk=1 THEN IF en=1 THEN cnt=cnt+1;END IF;END IF;END PROCESS;count=cnt;END counter8;,RTL视图,建议,大家在初期的练习中,对于简单电路可以使用synplify综合后观察它的RTL视图,比较自己对模块的基本理解,可以提高对vhdl描述和综合的认识。,移位操作,LIBRARY IEEE;ENTITY shift IS PORT(clk:IN std_logic;rst:IN std_logic;data:IN std_logic;Q:OUT std_logic_vector(7 downto 0);END shift;ARCHITECTURE shift OF shift IS SIGNAL Q_temp:std_logic_vector(7 downto 0);BEGIN PROCESS(rst,clk)BEGIN IF rst=1 THEN Q_temp0);ELSIF clkevent AND clk=1 THEN Q_temp=Q_temp(6 downto 0)&data;END IF;END PROCESS;Q=Q_temp;END shift;,电路图,练习,描述一个串并转换电路,并行输出位8位,搜索到同步字AA后开始发送一个同步标记,以后每组一个字,发一次.,结果,Process(Q_temp,data)variable compare_AA:std_logic_vector(7 downto 0)begin compare_AA:=Q_temp(6 downto 0),结果,Process(rst,clk)begin if rst=1 then word_counter=“000”;elsif clkevent and clk=1 then if word_counter_enable=1 then word_counter=word_counter+1;end if;end if;end pro

    注意事项

    本文(使用VHDL进行数字电路设计.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开