第六章-CPLDFPGA的常用设计_第1页
第六章-CPLDFPGA的常用设计_第2页
第六章-CPLDFPGA的常用设计_第3页
第六章-CPLDFPGA的常用设计_第4页
第六章-CPLDFPGA的常用设计_第5页
已阅读5页,还剩48页未读, 继续免费阅读

下载本文档

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

文档简介

6.1基本数学运算模块

6.2分频器设计6.3存储模块设计

6.4状态机设计

第六章CPLD/FPGA的常用设计6.1基本数学运算模块一、加法器二、减法器三、乘法器6.1基本数学运算模块一、加法器

加法是最基本的算术运算。无论减法、乘法、除法或其他运算最终都要分解为加法运算。加法器是数字电路中最常用﹑最基本的算术运算单元电路。

6.1基本数学运算模块

加法器的实现方法有很多,下面介绍几种常用的加法器设计方法。

1、串行进位加法器

2、并行进位加法器

3、流水线加法器

6.1基本数学运算模块1、串行进位加法器串行进位加法器是最简单的加法器结构,它是将多个一位全加器串联构成的,其中前一级的进位输出作为后一级的进位输入,故该加法器又称为行(xing)波进位加法器。串行进位加法器的优点是结构简单,实现方便;缺点是速度慢,这是因为位数为N的加法运算会产生N-1级迟延,位数越多迟延越大。

例6-16.1基本数学运算模块例1:设计一个8位的串行进位加法器。设计8位串行进位加法器首先需要设计一个1位全加器,然后将八个1位全加器级联起来即可。全加器的设计采用结构化的设计方法。先设计一个半加器电路,然后由半加器和门电路构成全加器。半加器电路如图6-1所示。半加器电路有两个输入端a、b,两个输出端s、c。输入出之间的逻辑函数表达式为:

s=a⊕bc=a&b

全加器电路如图6-2所示。全加器电路有三个输入端a、b、c,两个输出端sum、co。输入、输出之间的逻辑函数表达式为:

sum=a⊕b⊕cco=a&b十a&c十b&c6.1基本数学运算模块6.1基本数学运算模块2、并行进位加法器并行进位加法器是预先将N位加法表存放在一个查找表中,然后使用操作数作为地址去访问查找表,来得到加法值。该加法器又称为查找型加法器。并行进位加法器的优点是速度快,只有一级延迟;缺点是当加法器位数较多时,查找表的容量太大,需要占用太多的存储单元。

例6-26.1基本数学运算模块设计一个2位加2位的并行加法器。

例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadder2IS

PORT(a,b:INSTD_LOGIC_VECTOR(1DOWNTO0);

ci:INSTD_LOGIC;

sum:OUTSTD_LOGIC_VECTOR(1DOWNTO0);

co:OUTSTD_LOGIC);ENDadder2;ARCHITECTUREaddOFadder2ISSUBTYPEromwordISSTD_LOGIC_VECTOR(2DOWNTO0);TYPEromtableISARRAY(0TO15)OFromword;CONSTANTaddertable:romtable:=((B"000"),(B"001"),(B"010"),(B"011"),(B"001"),(B"010"),(B"011"),(B"100"),6.1基本数学运算模块

(B"010"),(B"011"),(B"100"),(B"101"),(B"011"),(B"100"),(B"101"),(B"110"));SIGNALsumtemp:STD_LOGIC_VECTOR(2DOWNTO0);BEGIN

PROCESS(a,b,ci)VARIABLEcom:STD_LOGIC_VECTOR(3DOWNTO0);BEGINcom:=a&b;IF(ci='1')THEN

sumtemp<=addertable(CONV_INTEGER(com))+'1';ELSE

sumtemp<=addertable(CONV_INTEGER(com));ENDIF;ENDPROCESS;sum<=sumtemp(1DOWNTO0);co<=sumtemp(2);ENDadd;

6.1基本数学运算模块

2位加2位的并行加法器的时序仿真波形如图所示。6.1基本数学运算模块3、流水线加法器流水线加法器是将每一步的运算结果都用寄存器锁存。尽管单个运算需要多个时钟周期才能得到结果,但是由于操作数是不断加到运算端的,所以总的效果是每个加法运算平均耗费的时间等于锁存时钟的周期。

6.1基本数学运算模块二、减法器减法运算实际上也是借助加法器来完成的。要完成减法运算a-b,实际上是将减法运算转换补码的加法运算来做的,即:

a-b=a+(-b)补。例6-56.1基本数学运算模块三、乘法器

硬件乘法器也有许多设计方法,常用的有:

移位相加查询表逻辑树加法器树混合乘法器这5种乘法器各有优缺点。

6.1基本数学运算模块

移位相加乘法器实现起来相对较简单,大多数的单片机和微处理器的乘法运算都采用这种方法,CPLD/FPGA器件也可采用此法。移位相加乘法器的优点是原理简单、易于实现;最大缺点是速度慢。6.1基本数学运算模块设计一个8位乘8位的乘法器。例LIBRARYieee;USEieee.std_logic_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYmulti8IS

PORT(clk:INSTD_LOGIC;

x,y:ININTEGERRANGE0TO127;

f:OUTINTEGERRANGE0TO65535);ENDmulti8;ARCHITECTUREmultiOFmulti8ISTYPEstatetypeIS(st0,st1,st2);SIGNALstate:statetype;SIGNALytemp:STD_LOGIC_VECTOR(7DOWNTO0);BEGINp1:PROCESSVARIABLEpreg,treg:INTEGERRANGE0TO65535;VARIABLEcount:INTEGERRANGE0TO7;6.1基本数学运算模块

BEGIN

ytemp<=CONV_STD_LOGIC_vector(y,8);WAITUNTILclk='1';CASEstateISWHENst0=>state<=st1;--初始化

count:=0;

preg:=0;

treg:=x;WHENst1=>--乘法

IFcount=7THENstate<=st2;ELSEIFytemp(count)='1'THEN

preg:=preg+treg;ENDIF;

treg:=treg*2;count:=count+1;state<=st1;ENDIF;WHENst2=>f<=preg;--输出乘法结果

state<=st0;ENDCASE;ENDPROCESS;ENDmulti;

6.1基本数学运算模块乘法器的仿真波形如图所示。6.1基本数学运算模块

查询表法是把乘积放在存储器中,使用被乘数和乘数组成的操作数作为地址访问存储器,得到的输出数据就是乘法运算的结果。对于位数不多的乘法器使用查询表法非常合适。该方法的缺点是随着操作数位数增多,查找表将会变得非常庞大。6.1基本数学运算模块

逻辑树的输出数据的每一位都可以写成所有操作数的逻辑函数。该方法的速度和查找表一样快,但实现起来比较困难,因为乘法器需要占用很多资源,而逻辑器件的资源不一定能满足乘法运算的需要。

6.1基本数学运算模块

加法器树乘法器由移位相加器和查询表组成。

混合乘法器是利用存储部分乘积的小型查找表和加法器组合得到最后的乘积结果。例如完成一个8位乘8位A×B的乘法运算,可将a分解为两个半字节AHAL,则乘法运算可改写为:

A×B=(AH×24+AL)×B=AH×24×B+AL×B。这就将8位乘法运算转化为两个4位的乘法运算,从而缩小了乘法查找表的规模。这样实现一个8位乘法运算只需要两个24×12位的查找表和一个16位加法器即可。注意在用该方法设计到最后进行加法运算时,必须对高位乘积进行加权,对低位乘积高位补0;此外还须注意在用CPLD/FPGA进行设计时,不同器件查找表的规模不同。

6.2分频器设计

分频器就是对某个给定较高频率的信号进行分频操作,以期得到所需的较低频率的电路。分频器一般分为整数分频器和小数分频器。整数分频器分为偶数分频器和奇数分频器。在时钟源与所需的频率不成整数倍的场合下,采用小数分频器,此类分频器设计较整数分频器复杂。

一、偶数分频器设计

二、奇数分频器设计

三、半整数分频器设计6.2分频器设计一、偶数分频器设计

所谓偶数分频器就是指分频系数为偶数的分频器,即分频系数N=2n(n=1,2,…)。若输入的信号频率为f,那么分频器的输出信号的频率为f/2n(n=1,2,…)。偶数分频器完全可以通过计数器计数来实现。例6-66-76-86.2分频器设计例设计一个分频系数分别为2、4和8的分频器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcnt1IS

PORT(clk:INSTD_LOGIC;div2,div4,div8:OUTSTD_LOGIC);ENDcnt1;6.2分频器设计ARCHITECTUREdivcntOFcnt1ISSIGNALtemp:STD_LOGIC_VECTOR(2DOWNTO0);BEGIN

PROCESS(clk)BEGINIF(clk'EVENTANDclk='1')THENIF(temp="111")THENtemp<=(OTHERS=>'0');ELSEtemp<=temp+1;ENDIF;ENDIF;ENDPROCESS;div2<=NOTtemp(0);div4<=NOTtemp(1);div8<=temp(2);ENDdivcnt;6.2分频器设计上述分频器的时序仿真波形如下图所示。6.2分频器设计1.占空比为1:1的偶数分频器例6:设计一个分频系数分别为2(21)、4(22)和8(23)的分频器。例7:设计一个分频系数是6的分频器。2.占空比不为1:1的偶数分频器例8:设计一占空比为1:3的6分频电路。6.2分频器设计二、奇数分频器设计

所谓奇数分频器就是指分频系数为奇数的分频器,即分频系数N=2n+1(n=1,2,…)。若输入的信号频率为f,那么分频器的输出信号的频率为f/(2n+1)(n=1,2,…)。奇数分频器完全可以通过计数器计数来实现。6.2分频器设计例设计一个占空比为1∶2的3分频电路。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcnt4IS

PORT(clk:INSTD_LOGIC;div3:OUTSTD_LOGIC);ENDcnt4;ARCHITECTUREdivcntOFcnt4ISSIGNALtemp:STD_LOGIC_VECTOR(1DOWNTO0);CONSTANTcst:STD_LOGIC_VECTOR(1DOWNTO0):="10";6.2分频器设计BEGINp1:PROCESS(clk)BEGINIF(clk'EVENTANDclk='1')THENIF(temp=cst)THENtemp<=(OTHERS=>'0');ELSEtemp<=temp+1;ENDIF;ENDIF;ENDPROCESS;p2:PROCESS(clk)BEGINIF(clk'EVENTANDclk='1')THENIF(temp<1)THENdiv3<='1';ELSEdiv3<='0';ENDIF;ENDIF;ENDPROCESS;ENDdivcnt;6.2分频器设计上述分频器的时序仿真波形如下图所示。6.2分频器设计6.2分频器设计三、半整数分频器设计

半整数分频器的设计相对整数分频器要复杂。它的实现方法是:首先需要设计一个计数器,计数器的模为分频系数的整数部分加1;然后设计一个扣除脉冲的电路,并把它加在计数器的输出之后;这样便可以得到任意半整数的分频器。

6.2分频器设计例设计一个分频系数为2.5的分频器。

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcnt6IS

PORT(clk:INSTD_LOGIC;div25:OUTSTD_LOGIC);ENDcnt6;ARCHITECTUREdivcntOFcnt6ISCONSTANTcst:STD_LOGIC_VECTOR(1DOWNTO0):="11";SIGNALtemp:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALclktemp,div2,divtemp:STD_LOGIC;6.2分频器设计BEGIN

clktemp<=clk

xordiv2;p1:PROCESS(clktemp)BEGINIF(clktemp'EVENTANDclktemp='1')THENIF(temp=0)THENtemp<=cst-1;

divtemp<='1';ELSEtemp<=temp-1;

divtemp<='0';ENDIF;ENDIF;ENDPROCESS;p2:PROCESS(divtemp)BEGINIF(divtemp'EVENTANDdivtemp='1')THENdiv2<=notdiv2;ENDIF;ENDPROCESS;div25<=divtemp;ENDdivcnt;6.2分频器设计上述分频器的时序仿真波形如下图所示。6.3存储模块设计一、只读存储器(ROM)二、随机存储器(RAM)三、顺序存取存储器(SAM)6.3存储模块设计一、只读存储器(ROM)

只读存储器是一种重要的时序逻辑存储电路,它的逻辑功能是在地址信号的选择下从指定的存储单元中读取相应的数据。由于只读存储器只能进行数据的读取而不能修改或写入新的数据,因此它一般不能用来存储动态数据。

6.3存储模块设计

ROM的设计通常有两种方法:一种是采用逻辑单元设计;另外一种是利用CPLD/FPGA中的EAB/ESB等嵌入式模块构成的LPM宏功能模块设计。

只有具有EAB/ESB资源的可编程逻辑器件才支持用后一种方法设计的ROM。

注意6.3存储模块设计二、随机存储器(RAM)

随机存储器的逻辑功能是在地址信号的选择下对指定的存储单元进行相应的读写操作。随机存储器不仅可以读取数据,而且还可以进行存储数据的修改或重新写入,因此此类存储器常用于动态数据的存储。随机存储器的最大优点是可以方便读/写数据,但存在易失性的缺点,掉电后所存数据便会丢失。

6.3存储模块设计三、顺序存取存储器(SAM)顺序存取存储器对信息的存入或取出是按顺序进行的,即具有“先入先出(FIFO)”或“先入后出(FILO)”的特点,此类存储器也称为队列或堆栈。

FIFO是一种特殊功能的存储器,数据以到达FIFO输入端口的先后顺序依次存储在存储器中,并以相同的顺序从FIFO的输出端口送出。

FIFO在数字系统中有着十分广泛的应用,可以用作并行数据延迟线、数据缓冲存储器以及速率变换器等。6.4状态机设计一、状态机的VHDL描述二、状态机编码三、状态机设计中需要注意的问题6.4状态机设计一、状态机的VHDL描述用VHDL设计的状态机有多种形式。从输出信号的特点可将状态机分为:摩尔(Moore)型状态机和米里(Mealy)型状态机。从结构上分为:单进程状态机和多进程状态机。从状态表达方式上分为:有符号化状态机和确定状态编码的状态机。从编码方式上分为:有顺序编码状态机、一位热码编码状态机和其他编码方式状态机。6.4状态机设计

状态机的结构模式相对简单,设计方案相对固定。这里给出状态机一种风格的完整VHDL描述。设计者可以以此为模板方便地进行有限状态机的设计。状态机的完整VHDL描述如下:LIBRARYieee;USEieee.std_logic_1164.all;ENTITY<entity_name>IS

PORT(input:IN<data_type>;reset,clock:INSTD_LOGIC;output:OUT<data_type>);END<entity_name>;ARCHITECTURE<architecture_name>OF<entity_name>ISTYPEstateIS(state0,state1,state2,state3,…);--状态说明部分

SIGNALcurrent_state,next_state:state;BEGIN6.4状态机设计

IF(reset=’1’)THEN

current_state<=state0;ELSIF(clock’EVENTANDclock=’1’)THEN

current_state<=next_state;ENDIF;ENDPROCESS;PROCESS(input,current_state)BEGINCASEcurrent_stateISWHENstate0=>IF(input=…)THENoutput<=<value>;

next_state<=state1;ELSE….ENDIF;6.4状态机设计

WHENstate1=>IF(input=…)THENoutput<=<value>;

next_state<=state2;ELSE….ENDIF;WHENstate2=>IF(input=…)T

温馨提示

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

评论

0/150

提交评论