第七章设计技巧课件_第1页
第七章设计技巧课件_第2页
第七章设计技巧课件_第3页
第七章设计技巧课件_第4页
第七章设计技巧课件_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

第七章设计技巧

7.1VHDL编码风格

■VHDL设计是行为级的设计,所带来的问题是设计

者的设计思考与实际电路结构是相脱节的。设计

者主要是根据VHDL的语法规则,对系统目标的逻

辑行为进行描述,然后通过综合工具进行电路结

构的综合、编译、优化,通过仿真工具进行逻辑

功能仿真和系统时延的仿真。

■实际设计过程中,由于每个设计工程师对语言规

贝人对电路行为的理解程度不同,每个人的编程

风格不同,往往同样的系统功能,描述的方式是

不一样的,综合出来的电路结构更是大相径庭。

■因此,即使最后综合出的电路都能实现相

同的逻辑功能,其电路的复杂程度和时延

特性都会有很大的差别,甚至某些臃肿的

电路还会产生难以预料的问题。

■从这些问题出发,很有必要深入讨论在

VHDL设计中如何简化电路结构,优化电路

设计的问题。

7.1-1描述方法对电路结构的影响

■用VHDL进行设计,最终综合出的电路的复杂程度,

除取决于设计要求实现的功能的难度外,还受设

计工程师对电路的描述方法和对设计的规划水平

的影响。

■最常见的使电路复杂化的原因之一是在设计中存

在许多本不必要的类似LATCH的结构。而且由于

这些结构通常都由大量的触发器组成,不仅使电

路更复杂,工作速度降低,而且由于时序配合的

原因会导致不可预料的结果。

L不必要的锁存

以下有2段设计,如果单从语法上来看是没有任何错误的,而且编译

时都可以通过,但是如果从电路结构上考虑,它们都存在问题。

Examl:Process(A,B)

Begin

IfA=,l,then

Q<=B;暗指锁存

Endif;

Endprocess;

Exam2:process(C)

Begin

CaseCis

WhenO=>Qv=1;

Z<=O;

WhenT=>Qv=O;缺少Z的值

Endcase;

Endprocess;

4仔细观察,在Examl和Exam2进程中的语句

都有同一个毛病。Examl进程中的if语句仅仅指

明了A在高电平(1)的时候将B的值传到Q端,

并没有指明A在低电平(0)的时候Q端应该是什

么值。综合工具在综合时,发现这杯不完全的状

态描述,会将其综合为锁存(latch)。

在ISE中,综合工具XST会发出一个警告:

Found1-bitlatchforsignal<q>锁存是由与或

非逻辑组成的,而这种嘉构在系统o中多半会埋下

不稳定的种子。

再看看Exam2进程,有两个输出信号,信号

的值在Case语句中被决定,但是Z的值只在C为

’0’时有明确的说明,当C为高T'时设计者并没

有明确指出。所以同样会使综合工具理解为锁存。

Q*data*gate+data*gate=Q

图7.L1采用门电路的锁存器原理图

2.描述寄存器代替锁存

既然锁存存在不稳定,那么有必要找

到一个好的替代,那就是寄存器。寄存器

由时钟触发,很大程度上抑制了毛刺。所

以,尽可能的使用寄存器而避免锁存。

下面是不同的D触发器的VHDL描述:

DFF:process(clk)--D触发器

Begin

Ifrising_edge(clk)then

Q<=A;

Endif;

Endprocess;

ID触发器的VHDL描述:

DFF_AR:process(clk,reset)--带异步复位的D触发器

Begin

Ifreset=,1,then

Qv=U;

Elseifrising_edge(clk)then

Q<=A;

Endif;

Endprocess;

DFF_AS:process(clk,preset)--带异步置位的D触发器

Begin

Ifpreset=5rthen

Qv=T;

Elsifrising_edge(clk)then

Q<=A;

Endif;

Endprocess;

DFF_SS:process(clk,preset)-带同步置位的D触发器

Begin

ifrising_edge(clk)then

Ifpreset=5Tthen

Qv=T;

else

Q<=A;

Endif;

Endif;

Endprocess;

3-使用括号描述想要的结构

■从上面的例子可以了解到不同的描述对

电路结构的影响,在下面的一个例子中,

有两种不同的加法描述,其电路结构也

是不同的。

(1)Outl<=Il+I2+I3+I4;

其电路结构如图7.L2所示。

114I

12

13E)-----------OUTl

14T>

(2)Out2V=(11+12)+(13+14);

iiD

OUTl

e-

13E>

14舟

从结构上看,第一种描述中没有使用括号,

电路结构为三层,加法一级一级的进行。它的特

点是,四个输入II,12,13,14到达加法器的路径不

相等。第二种描述中的使用了括号,电路结构分

为两层,显然它的特点是四个输入信号到达加法

器的路径是相等的。这里并不能简单的评论两种

结构的优劣,必须根据实际应用情况分析。

北上结构

■在VHDL语言描述中,进程中的语句是顺序

执行的。如果要设计一个并行的电路,不

要使用顺序语句,而要使用并行语句。

方法1.Process—,B,C)

begin

ifC=Wien

Y<=A;

日se

Y<=B;

Endif;

Endprocess;

方法2.Y<=AwhenC=,O,elseB;

如果电路结构是并行的,那么使用方法

2描述要比方法1好。

45.资源共享

■如果有可能的话,尽量使资源共享。一块FPGA

芯片中的资源是有限的。如果不有效利用仅有

的资源,将会导致资源不够,系统冗余过多,

稳定性也变会差。

■Casesis

■Whent0,=>Z<=a+b;

■When{T=>Z<=a+c;

Casesis

(a)(b)

图7.L4加法器的资源共享

加法器的资源共享

在图中7.L4框图中加法器的输出Z是A加上C

或者B,A与C、B哪个输入相加由选择信号S决定,

由于在设计中采用了多路选择器(Mux),在结

构上可以得到两种形式。图(b)的框图采用了

两个16位的加法器,两个加法器的结果通过MUX

由S选择输出。而图(a)的框图中只采用了一个

加法器,它将C、B信号通过MUX后的输出送到加

法器的一端,另一端连接A。两种结构都能达到

设计的要求,显然,图(a)框图中的设计占用

的资源要小些。

46.integer和std」ogic_vector

在VHDL中,信号一般都使用限制了位数的

stdjogic>std」ogic_vector类型,不使用

integer(整型)。如果使用integer,最分

在后面加上约束条件,例如:ainteger

range0to7;o

如果使用了integer而没有对其进行位

数的约束,那么在32位的PC机中,综合后

将是一个32bit的信号,会造成大量的浪费。

7.1.2不同的状态机描述

■1.状态机的选型

■2.状态编码

-3.多进程状态机

-4.单进程状态机

1.状态机的选型

按状态机的输出方式分类,有限状态机可分为

Mealy型和Moore型。从输出时序上看,Mealy型

状态机的输出是当前状态和所有输入信号的函数,

它的输出是在输入变化后立即发生的,不依赖时

钟的同步。Moore型状态机输出则仅为当前状态

的函数,状态机的输入发生变化还必须与状态机

的时钟同步。

"由于Me小状态机的输出不与时钟同步,所以

当在状态译码比较复杂的时候,很容易在输出端

产生大量的毛刺,这种情况是无法避免的。在

些特定的系统中,这些毛刺可能造成不可预料的

结果。

但是,由于输入变化可能出现在时钟周期内

的任何时刻,这就使得Mealy状态机对输入的响应

可以比Moore状态机对输入的晌应要阜一个时钟

周期。Moore状态机的输出与时钟同步,可以在

一定程度上剔除抖动。从稳定性的角度来讲,建

议使用Moore状态机以提高系统的稳定性。

在实际工程中,具体电路有具体的设计要求,可

能适应于Moore或Mealy状态机,也可能两种都可

以实现设计,所以设计者必须根据实际情况和经

验综合决定采用哪种状态机。

2.状态编码

状态编码,是指定义状态机现态和次态,一般有

3种方式:

(1)方式1

signalcurren_state:std_logic_vector(1downto0)

signalnext_state:std_logic_vector(1downto0)

方式1定义而状态有正较多山毛病。首先,这种方

式定义的状态为逻辑向量,缺乏具体的状态含义,程

序的可读性较差,更重要的是,设计后期调试修改比

较麻烦。

2)方式2

Typemystateis(st0,stl,st2,st3);

Signalcurren-state,next-state:mystate;

采用方式2定义的状态有具体的状态含义,可读

性好,易于调试和修改。

(3)方式3

Signalcurren_state,next_state:std_logic_vector(ldownto0);

ConstantstO:std_logic_vector(1downtoO):=,5OO,5;

Constantst1:sta_logic_vector(1donwot0):=,,0t,;

Constantst2:sta_logic_vector(1donwotO):=,51O55;

Constantst3:sta_logic_vector(1donwot

方式3比方式1要好,因为方式3的可读性比方式

1要好。但是方式3的修改没有方式2方便。

■状态机的编码在ISE中有6种,其中常用的

是顺序编码和一位热码。在ISE中可以通过

修改综合约束来指定状态机的编码。方法

如下:

■①综合前,在Processforcurrentsources

窗口中选中Synthesize,单击鼠标右键,弹

出下拉菜单,选中Properties(属性)。如图

7・1,5所示。

图7.1.5综合Properties(属性)

②在弹出的菜单中有3个选项¥,选中HDL

options选项栏,如图7.L6所示。在Properties

name(属性名)下的第一项便是FSMEncoding

Algorithm(有限状态机编码算法),在Value中打开

下拉菜单,可以看到几种编码方式。其中Auto(自

动)为ISE的缺省值,在一般情况下,如果目标芯

片是FPGA,那么XST会将状态机编码为One-

Hot(一位热码)。使用One・Hot(一位热码)的好处

是,状态转换快,状态译码简单。

・采用Sequential(顺序编码)的好处是,所需要的寄

存器少,冗余状态相对要少,系统进入其他状态

的机会就更少。

-还有一个比较常用的编码方式,User(用户)编

码方式。设计者是可以手动编码的,只要加上

Attribute语句便可。

■需要提醒大家注意的是,HDLOptions中

的设置的优先级要高于用户的attribute属

性。也就是说,如果使用了attribute语句

进行了手动编码,但是在FSMEncoding

Algorithm中选择的是Gray(格雷)码,

那么实际综合的效果是Gray(格雷)编

码。

例子:

typeSTATE_TYPEis(SI,S2,S3,S4);

attributeENUMENCODING:STRING;

attributeENUM_ENCODINGofSTATE_TYPE:type

isn1110110110110111”;

上面的四个状态SI,S2,S3,S4其实也是一位热码,是

用‘0’作为热码。选择User编码,那么综合后的实

际状态机编码就是设计者在attribute中描达的快态

码字。

ProcessProperties区

SynthesisOptionsHDLOptions|XilinxSpecificOptions!

PropertyHaae▼alue

:FSMEncodingAlcorithm.Auto▼

KAMExtraction|Auto-

RAXStyle

CompactL\

ROMExtractionSequential飞

RDMStyleGray

MuxExtractionJohnson

MuzStyleNone

DecoderEztractionp

PriorityEncoderExtractionYes

ShiftRegisterExtractionP

LogicalShifterExtractionK7

确定Dtfault帮助1

图7.1.6编码方式的设定

3,多进程状态机

在状态机的描述中,经典的应该属于3进程

状态机,基本结构可以由下面的模型描述:

SYNC_PROC:process(CLOCK,RESET)--同步进程

begin

if(RESET=T)then--现态v=初始状态;

elsif(CLOCK^ventandCLOCK=fr)then

一现态<=次态;

endif;

endprocess;

>-------------------------------------

COMB_PROC1:process(--现态,输入信号)-状态转化进程

begin

case现态is

when初始状态二>

if(一转换条件)then

--次态赋值

endif;

--其他所有状态转换的描述

endcase;

endprocess;

>------------------

C0MB_PR0C2:process(现态,输入端)--输出描

述进程

Begin

Case现态

When初始状态=>

if(输入端的变化)then

一输出赋值

--其他所有状态下输出的描述

endcase

endprocess;

或者:

COMB_PROC2:process(现态)--输出描述进程

Begin

Case现态

When初始状态=>--输出赋值

-其他所有状态下输出的描述

endcase

endprocess;

-以上模型描述的3进程状态机中的各个进程分工

相当明确。SYNC_PROC进程完成状态的同步描

述和状态机的初始化,COMB_PROC1进程完成对

状态转换的描述,COMB_PR(元2完成对输出的描

述。3个进程各负责一个工作互不扰,第一个进

程的电路是时序逻辑,第二,三进程的电路是组

合逻辑。C0MB_PR0C2进程中可能出现两种描述。

第一种描述,输出端是现态和输入的函数,是

Mealy状态机。第二种描述,输出端是仅为现态

的函数,是Moore状态机。

1.4,单进程状态机

k在实际的设计中,在输入端引入噪声是难免。

如果使用的是Mealy状态机,噪声很容易传到输出

端口,在输出端口出现毛刺,如果这个状态机的

输出要被用于作为其他模块的同步信号的话,系

统设计很有可能会失败。那么在这种情况下,最

好采用Moore状态机。但是,在3进程状态机中,

输出信号是由状态译码得来的,输出进程描述的

电路是组合逻辑,组合逻辑没有抑制毛刺的能力。

所以3进程的Moore状态机只是相对3进程的Mealy

状态机有一定的抗干扰能力。

■为了使系统更加稳定,可以在输出组合逻辑

后面在加一级寄存器,采用时钟边沿触发,

这样,可以在很大程度上剔除毛刺,抑制噪

声的干扰。

■采用单进程的状态机也可以达到设计目的。

(1)单进程状态机的基本结构模型

单进程状态机的基本结构可以由下面的模型

描述:

SYNC_PROC:process(CLOCK,RESET)--同步进程

begin

if(RESET二T)then

--现态〈二初始状态;

elsif(CLOCK'eventandCLOCK='1')then

--现态〈二现态;

case现态is

when初始状态=>if(--转换条件)then

--现态赋值

endif;

if(--一换条件)then

-输出赋值

endif;

-其他所有状态转换的描述

-其他所有状态下输出的描述

endcase;

endprocess;

可以看出,由于状态机的所有工作都是

在时钟上升沿触发下完成的,所以,输

出组合逻辑的后面必定产生了一组寄存

器,从而抑制了毛刺的产生。

■(2)状态机的比较

下面以一个简单的状态机为例,验证上面

的分析。其中EXAM1是2个进程的状态机,

分为时序进程和组合进程;EXAM2是单进

程状态机。这里不对状态机的工作做介绍,

仅仅表现是两种方法描述同一个功能的状

态机的差异。

①2个进程的状态机设计例

EXAMI:-EXAM1是2个进程的状态机,分为时序进程和组合

进程。

entitystatemachine2is

Port(ini:instdjogic;

in2:instdjogic;

reset:instdjogic;

elk:instdjogic;

outl:outstdjogic;

out2:outstdjogic);

endstatemachine2;

architectureBehavioralofstatemachine2is

Typemystateis(st0,stl,st2,st3);

Signalcurrent_state,next_state:mystate;

begin

process(elk,RESET)

begin

if(RESET=,1,)then

currentstate<=stO;

elsifrising_edge(clk)then

currentstate<=nextstate;

endif;

endprocess;

process(inl,in2,current_state)

begin

casecurrent_stateis

whenstO=>ifinl=Tthen

next_state<=stl;

endif;

outl<=,0,;

out2<=,0,;

whenstl=>ifin2=Tthen

nextstate<=st2;

endif;

outl<=*r;

out2<=,0,;

whenst2=>ifinl='O'andin2=Tthen

nextstate<=st3;

endif;

outl<=,0,;

out2<=,l,;

whenst3=>ifinl=Uandin2=,0,then

nextstate<=stO;

endif;

outl<=fr;

out2<=,l,;

whenothers=>nextstate<=stO;

endcase;

endprocess;

endBehavioral;

②单进程状态机设计例

EXAM2;-EXAM2是单进程状态机

entitystatemachineis

Port(ini:instdjogic;

in2:instdjogic;

reset:instdjogic;

elk:instdjogic;

outl:outstdjogic;

out2:outstdjogic);

endstatemachine;

②单进程状态机设计例

architectureBehavioralofstatemachineis

Typemystateis(stOzstl,st2,st3);

Signalcurrent_state:mystate;

begin

process(elk,RESET,inlzin2)

begin

if(RESET='l')then

current_state<=stO;

elsifrising_edge(clk)then

currentstate<=currentstate;

casecurrent_stateis

whenstO=>ifinl=Tthen

current_state<=stl;

endif;

outl<=,0,;

out2<=,0,;

whenstl=>ifin2=,l,then

current_state<=st2;

endif;

outl<=,l,;

out2<=,0,;

whenst2=>ifinl=Uandin2=,l,then

currentstate<=st3;

endif;

outl<=,0,;

温馨提示

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

评论

0/150

提交评论