fpga第六讲

  • 格式:pdf
  • 大小:128.58 KB
  • 文档页数:11

时序电路设计

下面我们讲第四讲的时序电路的设计。

时序的电路的一般结构

时序电路的一般结构,在前面的组合逻辑的基础上,我们首先给出时序电路一

般结构,首先应该是库的说明语句,如果采用 IEE的库,就是Library IEE,

是Library declarations就是库说明的语句。然后是实体,实体给出模块的

名称,Entity,下面由Port引出的输入输出的清单,这就是实体的结构,然

后是Aschitecture的结构,就是要有behavior of model_name 就是实体名称

的行为,结构体是这样的结构。然后给出了内部信号的说明,在结构体开始之

前给出内部信号Signal的说明。下面在时序电路里头分为两个部分,一个是

状态进程说明存储元件。我们要想到数字电路的复习中间说了,当组合逻辑的

一部分反馈到组合电路的输入端以后构成了有限状态机,分组合逻辑和纯状态

进程。所以首先我们设置了一个状态进程,定义这些存储元件,进程名称叫做

State process,敏感的清单一般是存储元件,reset、next_state、Input这

些的输入信号,是存储元件的输入信号,是它的敏感清单,这些的信号下进程

会激活,然后是状态进程的Begin,开始以后对状态的元件进行VHDL的描述,

顺序描述完了以后end process,把状态进程结束。然后我们再设置一个进程

叫做组合进程,定义的组合逻辑叫做组合的逻辑,名称Combinational字头,

comb,这个Process括号的敏感的清单通常包括所有的输入,除了外部的输入

不要忘记了,P的输入,就是说存储元件的输出返回过来的输入。然后是进程

的Begin,在Begin里头给出了规定组合逻辑的VHDL描述,最后是结束进程

comb,然后结束行为,结束结构体end behavior,结构体后面的叫做behavior,

所以这里结束叫做end behavior。

考虑同步硬件

同步设计在时序的电路在通过综合、仿真和布局布线的能够平滑的运行过去,

异步的设计要求准时的布局布线的验证,在异步逻辑里头必须隔离分割这些的

模块,异步设计就是第一级的输出作为第二级时钟 ,中间还有组合的逻辑,这

个时候可能出现竞争冒险的现象,所以我们避免异步采用同步的设计。

考虑同步的硬件的RTL描述

考虑同步的硬件的 RTL描述,描述设计的寄存器到寄存器的功能,即描述寄存

器之间组合逻辑的功能,就是刚才我们说的时序电路的一般结构,分成组合逻

辑部分,组合进程和状态描述存储器元件的两部分,组合逻辑的部分有组合的

元件实现,那么FPGA的结构特别适合这种组合进程加状态进程的流水的结构,

这里给出了VHDL和Verilog的一些描述,这里分了状态进程和组合进程、状

态进程加组合进程,但不止一个组合进程这样的进行描述,注意描述寄存器到

寄存器中间的组合逻辑的功能,寄存器之间的组合逻辑的功能。

分开时序进程和组合进程

那么注意分开时序进程和组合进程,下面我们会讲到怎么样保证组合进程是纯

组合逻辑的,不带触发器,在有限状态机里面怎么样把组合和状态分开,而保证组合进程是纯组合逻辑的,下面我们给出保证设计的这样的一个条件。

有效编码方式和If-Then-Else比较

在组合进程里头说了,进程的描述语句里头,用到 If-Then-Else和case语

句会带来的情况,在状态进程里头,也就是时序电路里头,状态进程里头,我

同样用到If-Then-Else和case的语句,综合出来的结果和组合的逻辑情况

一样,都会有不同,case语句用一个模块来实现,If-Then-Else用带有特

权编码的译码器实现。

优先编码器“If-Then-Else”什么时候使用?

用 If-Then-Else的多路的选择器设计的东西,在状态进程的控制下产生特

权的编码。

用“case”语句的优越性

用 8选1的多路开关里选择8个信号,用case语句,用了一个8选1的实现,

没有特权的引入,这里主要讲在组合进程和状态进程里头,用到If-Then-

Else和case语句所带来的问题。

Case语句1

对 Case语句的要求,一般情况下,我们如果不需要特权的编码,建议用Case

语句,像组合的逻辑对所有的分支进行定义,那么如果有don't care输出也

可以利用,也能够节省描述的方式,强调的一点就是Case语句的所有分支必

须定义,包括If-Then-Else也是一样。但是case语句可以节省资源减少延

时。

Case语句Ⅱ

那么下面我们主要看一下, Case语句在组合进程和在时序进程或者状态进程

带来的问题,Case语句在组合的进程VHDL或在always语句Verilog,要求在

case语句中,也是像前面说的所有的分支中所有的输出必须定义,在组合的进

程中把所有的分支都定义,才能防止出现锁存,因为我们前面分析了如果不是

所有的分支都定义了,在没有给的情况下可能抓住当前的值,产生锁存,那么

解决的办法在case语句之前利用一个缺省的语句来防止锁存的产生,在Case

语句在时序的进程里头或者是Verilog的always语句里头,如果在Case语句

的分支中有的输出没有定义,就会产生一个时钟的使能信号,这个信号并不出

现错误,但是可能会产生一个很长的时钟使能方程式,最后使你实现不了,在

case语句利用一个缺省的语句防止不必要的时钟使能产生,所以注意在组合进

程中需要缺省的语句来防止由于分支定义的不全而产生的锁存,在状态的进程

和时序的进程里头要求各个的分支都定义,避免有的分支没有定义,出现一个

不必要的使能方程实现不了。

case语句例子

那么这里尽管没有给缺省的语句,我们每个分支都定义了,任何的情况下给出

了一个 don't care来解决这个问题,表示了其他的分支,注意现在的数据类

型不仅是0和1,包括了其他可综合的状况在里头。 锁存器与寄存器

下面我们看一下,什么叫做锁存器和寄存器,锁存器和寄存器简单来说,一般

FPGA包括Altera的器件,现在的逻辑单元或宏单元,有寄存没有锁存器,实

现锁存器利用组合逻辑实现,使时序分析变成复杂化了,查找表期间的FPGA

利用组合回路的LET,这个时候典型的设计缺少LED没有寄存器,利用更多的,

所以这里强调推荐的设计采用寄存器,如果用锁存器要增加逻辑,查找表利用

组合的逻辑的话,由于逻辑的复杂性查找表不够,乘积项用很多的乘积项在

CPLD里头。什么是锁存器什么是寄存器简单的说,锁存是电平有效,在电平的

有效的情况下,输入送到输出,像这个例子。寄存器是时钟言有效,当到时钟

到的时候才输出,在逻辑的单元里头除了查找表都有寄存器,所以建议大家使

用沿有效的寄存器,不要用增加组合逻辑来实现的锁存器。

时钟使能

时钟使能,你的 VHDL程序的编码方式将决定是不是利用使能信号,一般的寄

存的元件,在FPGA里头寄存器的带有时钟的使能控制端,时钟使能使得时序

约束更容易控制,这里给出了两个例子,像VHDL的描述就是异步复位的时候,

当reset=1,输出端Q置0,否则的话,在时钟上升沿到来的时候,CLK'event

and CLK=1的时候,这个时候如果ENABLE 使能信号=1,输入信号送出去,

时钟沿来了,在时钟使能有效情况下输入信号送出去,下面我们看一下语言设

计的一些问题。

锁存推论-要锁存(Wanted Latch)

假设我们要求产生锁存的推论,要设计一个锁存器。我们敏感的清单里头包括

了两个输入,一个 data,一个gate,然后是电平的敏感,不要沿,也就是说

只要gate=1,data就送给Q,如果你是这样的电平敏感不是沿敏感,就推论

出要锁存,什么发生就意味着存储和反馈,电平有效的时候推论出这个图是要

锁存的,如果从RTL寄存器转移级观点看,锁存的两个信号产生的输出,但是

从技术观点看输入反馈回来,有存储有反馈。

不要锁存(Unwanted Latches)

如我们设计一个不要锁存的,输出 X、Y、Z是相互的独立,Elsif与所有的状

态和产生的锁存有关。首先看一个例子,进程有四个状态State、A、B、C四

个敏感量,如果一开始状态等于1时候,X,如果100的时候,B赋于Y,001

的时候Z赋于C,其他的情况下地X= 0,End IF,按照这个设计的推论得到

图上的结果,逻辑锁存以后得到的X、Y、Z的输出,它跟状态的电平有关。

移去不要的锁存

怎么样移去这些不要的锁存,从刚才的描述转换过来,把 IF语句关闭,初始

化给出缺省的语句避免锁存,如果状态=0,则X ,end if结束,如果状态等

于100,则Y=B end if,状态等于001,则C end if,if之前其他的E语句

靠缺省的语句,在这个语句之前我们给了三个缺省的语句,X、X0、Y、Z那么

从左边的描述变到这里简单化,综合出来的结果没有锁存了。

不要锁存-嵌套if语句

下面我们看一下嵌套的 IF语句怎么样不要锁存,嵌套的IF语句没有把所有的条件都覆盖,所以锁存产生了,我们前面说的要求各个的分支的嵌套的语句一

样,对各个的分支定义全。那么在我们的例子里头 IFsel 3等于1,则sel 2

等于1,sel 1等于1,IF们sel等于1,就是四个信号都等于1的时候结束了,

Y等于0,end if,出现了锁存,怎么样移去锁存呢?

移去锁存-嵌套if语句

就是我们在 IF语句的嵌套以外,先给缺省的语句Y赋于0,然后把这些的条

件写下来,end if、end if、end if,用缺省的语句覆盖所有的条件,来消除

锁存。

不要锁存-Case Statements

下面我看 Case语句怎么样不要锁存,case语句如果出现了不确定的输出条件,

就意味着要存储,那么锁存就要产生,在这个例子上,对所有的输出产生锁存,

因为有不确定的输出的条件。

移去锁存-case Statements

那么怎么移去锁存,也是加缺省的语句, Case语句之前加一个缺省语句,对

三个条件全部置0,跟前面的一页情况比较,如果不是在case语句加这个缺省

语句,在每个的case分支里面就有不确定的输出条件存在,前面的情况空闲

的情况下推导出来,sel丢掉了,tap1的情况下,next丢掉了,tap 2 next 丢

掉了,tap3的时候next和First丢掉了,tap4的时候First丢失,不确定的

输出的条件意味着产生的锁存,要存储锁存产生,加上缺省以后利用信号的初

始,case语句之前初始化的信号,我们避免的情况,保证输出从来没有不确定

的,case仅仅是处理这些变化的,可能把每一种情况的设置的输出列出来。

锁存与变量

锁存与变量,推荐可以用变量分配一个初始值或者信号给变量,就不会有反馈

出现,如果一个变量没有分配初始值,获得一个信号锁存就要产生。可能引起

设计功能不正确,所以锁存的产生和变量的情况也是一样,需要不要有不确定

的条件产生。

变量未初始化

下面我们看变量未初始化,也就是说 IF语句之前我们没有给出变量的初始值,

变量没有初始化利用,像这个例子IF=0,数字付给数值,否则的话,Val加1

给Val。

不正确结果

这个时候综合出来的结果,增加一个逻辑单元就要产生反馈,不必要的组合反

馈出现了。

分配初始值给变量

当我们分配一个初始值给变量,在 IF语句之前分配一个变量给信号,或者信