基于FPGA的小数分频实现方法
- 格式:pdf
- 大小:271.06 KB
- 文档页数:3
FPGA分频与倍频的简单总结(涉及⾃⼰设计,调⽤时钟IP核,调⽤MMCM原语模块)原理介绍1、分频FPGA设计中时钟分频是重要的基础知识,对于分频通常是利⽤计数器来实现想要的时钟频率,由此可知分频后的频率周期更⼤。
⼀般⽽⾔实现偶数系数的分频在程序设计上较为容易,⽽奇数分频则相对复杂⼀些,⼩数分频则更难⼀些。
1)偶分频系数=时钟输⼊频率/时钟输出频率=50MHz/5MHz=10,则计数器在输⼊时钟的上升沿或者下降沿从0~(10-1)计数,⽽输出时钟在计数到4和9时翻转。
2)奇分频系数=50MHz/10MHz=5,则两个计数器分别在输⼊时钟的上升沿和下降沿从0~ (5-1)计数,⽽相应的上升沿和下降沿触发的输出时钟在计数到1和4时翻转,最后将两个输出时钟进⾏或运算从⽽得到占空⽐为50%的5分频输出时钟。
下图所⽰为50MHz输⼊时钟进⾏10分频和5分频的仿真波形2、倍频两种思路:PLL(锁相环)或者利⽤门延时来搭建注意:此仿真是利⽤FPGA内部电路延迟来实现的倍频需要在后仿真下才能看到波形,在⾏为仿真下⽆法得到输出波形。
⼀、时钟IP的分频倍频相关参数说明输⼊时钟:clk_in1(125MHz)输出时钟:clk_out1(50MHz),clk_out2(74.25MHz)则VCO Freq=1262.5MHz=clk_in1*CLKFBOUT_MULT_F/DIVCLK_DIVIDE=125*50.5/5clk_out1(50MHz)=VCO_Freq/Divide=1265.5/25.250clk_out2(74.25MHz)=VCO_Freq/Divide=1265.5/17⼆、MMCME4_ADVMMCME4是⼀种混合信号块,⽤于⽀持频率合成、时钟⽹络设计和减少抖动。
基于相同的VCO频率,时钟输出可以有单独的分频、相移和占空⽐。
此外,MMCME4还⽀持动态移相和分数除法(1)Verilog 初始化模板MMCME4_ADV #(.BANDWIDTH("OPTIMIZED"), // Jitter programming.CLKFBOUT_MULT_F(5.0), // Multiply value for all CLKOUT.CLKFBOUT_PHASE(0.0), // Phase offset in degrees of CLKFB.CLKFBOUT_USE_FINE_PS("FALSE"), // Fine phase shift enable (TRUE/FALSE).CLKIN1_PERIOD(0.0), // Input clock period in ns to ps resolution (i.e. 33.333 is 30 MHz)..CLKIN2_PERIOD(0.0), // Input clock period in ns to ps resolution (i.e. 33.333 is 30 MHz)..CLKOUT0_DIVIDE_F(1.0), // Divide amount for CLKOUT0.CLKOUT0_DUTY_CYCLE(0.5), // Duty cycle for CLKOUT0.CLKOUT0_PHASE(0.0), // Phase offset for CLKOUT0.CLKOUT0_USE_FINE_PS("FALSE"), // Fine phase shift enable (TRUE/FALSE).CLKOUT1_DIVIDE(1), // Divide amount for CLKOUT (1-128).CLKOUT1_DUTY_CYCLE(0.5), // Duty cycle for CLKOUT outputs (0.001-0.999)..CLKOUT1_PHASE(0.0), // Phase offset for CLKOUT outputs (-360.000-360.000)..CLKOUT1_USE_FINE_PS("FALSE"), // Fine phase shift enable (TRUE/FALSE).CLKOUT2_DIVIDE(1), // Divide amount for CLKOUT (1-128).CLKOUT2_DUTY_CYCLE(0.5), // Duty cycle for CLKOUT outputs (0.001-0.999)..CLKOUT2_PHASE(0.0), // Phase offset for CLKOUT outputs (-360.000-360.000)..CLKOUT2_USE_FINE_PS("FALSE"), // Fine phase shift enable (TRUE/FALSE).CLKOUT3_DIVIDE(1), // Divide amount for CLKOUT (1-128).CLKOUT3_DUTY_CYCLE(0.5), // Duty cycle for CLKOUT outputs (0.001-0.999)..CLKOUT3_PHASE(0.0), // Phase offset for CLKOUT outputs (-360.000-360.000)..CLKOUT3_USE_FINE_PS("FALSE"), // Fine phase shift enable (TRUE/FALSE).CLKOUT4_CASCADE("FALSE"), // Divide amount for CLKOUT (1-128).CLKOUT4_DIVIDE(1), // Divide amount for CLKOUT (1-128).CLKOUT4_DUTY_CYCLE(0.5), // Duty cycle for CLKOUT outputs (0.001-0.999)..CLKOUT4_PHASE(0.0), // Phase offset for CLKOUT outputs (-360.000-360.000)..CLKOUT4_USE_FINE_PS("FALSE"), // Fine phase shift enable (TRUE/FALSE).CLKOUT5_DIVIDE(1), // Divide amount for CLKOUT (1-128).CLKOUT5_DUTY_CYCLE(0.5), // Duty cycle for CLKOUT outputs (0.001-0.999)..CLKOUT5_PHASE(0.0), // Phase offset for CLKOUT outputs (-360.000-360.000)..CLKOUT5_USE_FINE_PS("FALSE"), // Fine phase shift enable (TRUE/FALSE).CLKOUT6_DIVIDE(1), // Divide amount for CLKOUT (1-128).CLKOUT6_DUTY_CYCLE(0.5), // Duty cycle for CLKOUT outputs (0.001-0.999)..CLKOUT6_PHASE(0.0), // Phase offset for CLKOUT outputs (-360.000-360.000)..CLKOUT6_USE_FINE_PS("FALSE"), // Fine phase shift enable (TRUE/FALSE).COMPENSATION("AUTO"), // Clock input compensation.DIVCLK_DIVIDE(1), // Master division value.IS_CLKFBIN_INVERTED(1'b0), // Optional inversion for CLKFBIN.IS_CLKIN1_INVERTED(1'b0), // Optional inversion for CLKIN1.IS_CLKIN2_INVERTED(1'b0), // Optional inversion for CLKIN2.IS_CLKINSEL_INVERTED(1'b0), // Optional inversion for CLKINSEL.IS_PSEN_INVERTED(1'b0), // Optional inversion for PSEN.IS_PSINCDEC_INVERTED(1'b0), // Optional inversion for PSINCDEC.IS_PWRDWN_INVERTED(1'b0), // Optional inversion for PWRDWN.IS_RST_INVERTED(1'b0), // Optional inversion for RST.REF_JITTER1(0.0), // Reference input jitter in UI (0.000-0.999)..REF_JITTER2(0.0), // Reference input jitter in UI (0.000-0.999)..SS_EN("FALSE"), // Enables spread spectrum.SS_MODE("CENTER_HIGH"), // Spread spectrum frequency deviation and the spread type .SS_MOD_PERIOD(10000), // Spread spectrum modulation period (ns).STARTUP_WAIT("FALSE") // Delays DONE until MMCM is locked)MMCME4_ADV_inst (.CDDCDONE(CDDCDONE), // 1-bit output: Clock dynamic divide done.CLKFBOUT(CLKFBOUT), // 1-bit output: Feedback clock.CLKFBOUTB(CLKFBOUTB), // 1-bit output: Inverted CLKFBOUT.CLKFBSTOPPED(CLKFBSTOPPED), // 1-bit output: Feedback clock stopped.CLKINSTOPPED(CLKINSTOPPED), // 1-bit output: Input clock stopped.CLKOUT0(CLKOUT0), // 1-bit output: CLKOUT0.CLKOUT0B(CLKOUT0B), // 1-bit output: Inverted CLKOUT0.CLKOUT1(CLKOUT1), // 1-bit output: CLKOUT1.CLKOUT1B(CLKOUT1B), // 1-bit output: Inverted CLKOUT1.CLKOUT2(CLKOUT2), // 1-bit output: CLKOUT2.CLKOUT2B(CLKOUT2B), // 1-bit output: Inverted CLKOUT2.CLKOUT3(CLKOUT3), // 1-bit output: CLKOUT3.CLKOUT3B(CLKOUT3B), // 1-bit output: Inverted CLKOUT3.CLKOUT4(CLKOUT4), // 1-bit output: CLKOUT4.CLKOUT5(CLKOUT5), // 1-bit output: CLKOUT5.CLKOUT6(CLKOUT6), // 1-bit output: CLKOUT6.DO(DO), // 16-bit output: DRP data output.DRDY(DRDY), // 1-bit output: DRP ready.LOCKED(LOCKED), // 1-bit output: LOCK.PSDONE(PSDONE), // 1-bit output: Phase shift done.CDDCREQ(CDDCREQ), // 1-bit input: Request to dynamic divide clock.CLKFBIN(CLKFBIN), // 1-bit input: Feedback clock.CLKIN1(CLKIN1), // 1-bit input: Primary clock.CLKIN2(CLKIN2), // 1-bit input: Secondary clock.CLKINSEL(CLKINSEL), // 1-bit input: Clock select, High=CLKIN1 Low=CLKIN2.DADDR(DADDR), // 7-bit input: DRP address.DCLK(DCLK), // 1-bit input: DRP clock.DEN(DEN), // 1-bit input: DRP enable.DI(DI), // 16-bit input: DRP data input.DWE(DWE), // 1-bit input: DRP write enable.PSCLK(PSCLK), // 1-bit input: Phase shift clock.PSEN(PSEN), // 1-bit input: Phase shift enable.PSINCDEC(PSINCDEC), // 1-bit input: Phase shift increment/decrement.PWRDWN(PWRDWN), // 1-bit input: Power-down.RST(RST) // 1-bit input: Reset);(2)本实验仿真所⽤参数配置说明及部分端⼝调⽤1、参数配置说明本实验通过输⼊时钟CLKIN1(150MHz),实现输出反馈时钟CLKFBOUT(150MHz)、输出时钟CLKOUT0(74.25MHz)、输出时钟CLKOUT1(74.25MHz)、输出时钟CLKOUT2(59.4MHz)、输出时钟CLKOUT3(49.5MHz)。
基于FPGA的双模前置小数分频器的设计时间:2010-11-12 10:28:13 来源:作者:频率合成技术是现代通讯系统的重要组成部分,他将一个高稳定和高准确度的基准频率,经过四则运算,产生同样稳定度和基准度的频率。
分频器是集成电路中最基础也是最常用的电路。
整数分频器的实现比较简单,可采用标准的计数器或可编程逻辑器件设计实现。
但在某些场合下,时钟源与所需的频率不成整数倍关系,此时可采用小数分频器进行分频。
本文利用VerilogHDL硬件描述语言的设计方式,通过ModelSimSE开发软件进行仿真,设计基于FPGA的双模前置小数分频器。
随着超大规模集成电路的发展,利用FPGA小数分频合成技术解决了单环数字频率合成器中高鉴相频率与小频间隔之间的矛盾。
1 双模前置小数分频原理小数分频器的实现方法很多,但其基本原理一样,即在若干个分频周期中采取某种方法使某几个周期多计或少计一个数,从而在整个计数周期的总体平均意义上获得一个小数分频比,设要进行分频比为K的小数分频,K可表示为:式中:n,N,X均为正整数;n为到X的位数,即K有n位小数。
另一方面,分频比又可以写成:式中:M为分频器输入脉冲数;P为输出脉冲数。
令P=10n,则:以上是小数分频器的一种实现方法,即在进行10n次N分频时,设法多输入X个脉冲。
2 电路组成每个周期分频N+10-n.X,其电路双模前置小数分频器电路由÷N/N+1双模分频器、控制计数器和控制逻辑3部分组成。
当a点电平为1时,进行÷N分频;当a点电平为0时进行÷N+1分频。
适当设计控制逻辑,使在10n个分频周期中分频器有X次进行÷N+1分频,这样,当从fo输出10n个脉冲时,在fi处输入了X.(N+1)+(10n-X).N个脉冲,也就是10n.N+X个脉冲,其原理如图1所示。
3 小数分频器的Verilog-HDL设计现通过设计一个分频系数为8.7的分频器来给出使用VerilogHDL语言设计数字逻辑电路的一般设计方法。
基于CPLD/FPGA的半整数分频器的设计摘要:简要介绍了CPLD/FPGA器件的特点和应用范围,并以分频比为2.5的半整数分频器的设计为例,介绍了在MAX+plus II开发软件下,利用VHDL硬件描述语言以及原理图的输入方式来设计数字逻辑电路的过程和方法。
关键词:VHDL CPLD/FPGA 数字逻辑电路设计半整数分频器1 引言CPLD(Complex programmable Logic Device,复杂可编程逻辑器件)和FPGA(Field programmable Gates Array,现场可编程门阵列)都是可编程逻辑器件,它们是在PAL、GAL等逻辑器件基础上发展起来的。
同以往的PAL、GAL相比,FPGA/CPLD的规模比较大,适合于时序、组合等逻辑电路的应用。
它可以替代几十甚至上百块通用IC芯片。
这种芯片具有可编程和实现方案容易改动等特点。
由于芯片内部硬件连接关系的描述可以存放在磁盘、ROM、PROM、或EPROM中,因而在可编程门阵列芯片及外围电路保持不动的情况下,换一块EPROM芯片,就能实现一种新的功能。
它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及实时在检验等优点,因此,可广泛应用于产品的原理设计和产品生产之中。
几乎所有应用门阵列、PLD和中小规模通用数字集成电路的场合均可应用FPGA和CPLD器件。
在现代电子系统中,数字系统所占的比例越来越大。
系统发展的越势是数字化和集成化,而CPLD/FPGA作为可编程ASIC(专用集成电路)器件,它将在数字逻辑系统中发挥越来越重要的作用。
在数字逻辑电路设计中,分频器是一种基本电路。
通常用来对某个给定频率进行分频,以得到所需的频率。
整数分频器的实现非常简单,可采用标准的计数器,也可以采用可编程逻辑器件设计实现。
但在某些场合下,时钟源与所需的频率不成整数倍关系,此时可采用小数分频器进行分频。
比如:分频系数为2.5、3.5、7.5等半整数分频器。
基于FPGA的分频器设计FPGA(Field-Programmable Gate Array)是一种可编程逻辑设备,它可以在设计过程中根据需求进行编程和配置,实现不同的功能。
在FPGA中实现分频器是一个常见的应用,本文将介绍基于FPGA的分频器设计。
1.分频器的原理分频器用于将输入信号的频率减小到所需的频率。
它包含一个计数器和一个比较器。
计数器根据一个时钟信号进行计数,当达到一个预设值时,比较器会产生一个输出信号,作为分频器的输出。
在FPGA中实现分频器,首先需要选择适当的时钟源作为输入信号。
FPGA通常有一个高频时钟源,我们可以利用这个时钟源生成所需的低频信号。
3.设计步骤(1)确定时钟源:选择一个合适的高频时钟信号作为输入信号。
(2)选择分频器类型:根据需求选择分频器的类型,常见的有可控分频器和固定分频器。
(3)设置分频值:根据需要将输入信号的频率降低到所需的频率,设置分频值。
(4)设置计数器:在FPGA中,使用计数器来实现分频器。
根据所需的分频值,设置计数器的初始值和比较值。
(5)设计比较器:比较器用于判断计数器是否达到比较值,如果达到则产生一个输出信号。
(6)输出信号:比较器产生的输出信号作为分频器的输出信号,可以将其连接到需要的模块或引脚。
4.分频器设计实例下面以一个简单的可控分频器为例进行分频器的设计。
假设需要将输入信号的频率分频为输入频率的1/8,即输入频率为100MHz,输出频率为12.5MHz。
根据步骤,我们可以选择一个100MHz的时钟源作为输入信号。
然后,设置分频值为8,计数器的初始值为0,比较值为7(8-1)。
接下来,在FPGA中使用一个8位计数器来实现分频器。
计数器的输出连接到一个8位比较器,比较器的输出即为分频器的输出信号。
最后,将输出信号连接到需要的模块或引脚,以完成分频器的设计。
5.总结本文介绍了基于FPGA的分频器设计。
分频器是将输入信号的频率降低到所需频率的设备,可通过在FPGA中实现计数器和比较器来完成。
装……订……线基于FPGA的分频器设计一、实验目的1、了解EDA软件在电子设计当中的重要作用EDA:EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术:就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性。
2、熟悉并掌握MAXPLUS II 或QUARTUS II等开发软件的基本使用方法。
3、运用图解法设计分频器电路,并进行电路仿真。
二、实验内容利用MAXPLUS II开发软件设计分频电路。
1MHz图分频电路框图从图中我们可以看出将1MHZ的脉冲连续6次除10,即可得到我们需要的输出频率。
利用MAXPLUS II 或QUARTUS II等开发软件的器件库,找到一个BCD的计数器:74LS160,(如图)从它的波形图中可看到它具有的逻辑功能:BCD计数,异步清零,有进位输出。
其中CLK—为时钟信号;ENT、ENP—为使能信号,高电平有效;CLRN—异步清零端,电平为高时,计数器清零,电平为低时,允许计数;QD~QA—计数器输出端;RCO—进位输出端。
图74LS160图形符号装……订……线图74LS160波形图74LS160是一个对输入时钟进行十分频的器件。
当计数器从0计数到9时,RCO从低电平跳到高电平,在下一个脉冲到来时,RCO再回到低电平。
每十个计数脉冲RCO翻转一次,利用RCO特性,将前一级的TC输出端接到下一级的时钟输入端,就完成了连续分频的目的。
调用6次74LS160,即可完成设计电路要求。
FPGA中的小数运算FPGA是一种可编程的逻辑器件,可以实现各种数字电路功能。
FPGA中的数据通常是二进制的,也就是说,只有0和1两种状态。
那么,如果我们想在FPGA中处理小数,该怎么办呢?本文将介绍一种常用的方法,即定点小数。
什么是定点小数?定点小数是一种用二进制表示小数的方式,它将一个二进制数分为整数部分和小数部分,并规定小数点的位置。
定点小数有两种类型:有符号和无符号。
有符号定点小数可以表示正负数,而无符号定点小数只能表示非负数。
有符号定点小数通常用补码来表示,即最高位为符号位,0表示正数,1表示负数。
如何进行定点小数运算?在FPGA中进行定点小数运算,需要遵循以下基本原则:加法和减法:两个操作数必须有相同的小数位数,结果也保持之和。
除法:两个操作数可以有不同的小数位数,结果的小数位数等于被除数的小数位数减去除数的小数位数。
用公式表示如下:加法和减法:q3=q1±q2,如果x3=x1±x2乘法:q3=q1×q2/2n,如果x3=x1×x2除法:q3=q1×2n/q2,如果x3=x1/x2其中,x1,x2,x3代表三个浮点数(如2.2),q1,q2,q3代表其二进制表示(如70),n代表其小以下是一些例子:加法:假设我们要计算x3=x1+x2=2.2+(−6.03125),其中x1和x2都是8位有符号定点小数,小数位数为5,那么:q1=70=01000110q2=−193=10111111q3=q1+q2=−123=10000101将q3转换为十进制,得到:x3=−12325=−3.84375乘法:假设我们要计算x3=x1×x2=2.2×(−6.03125),其中x1是8位无符号定点小数,小数位数为5,x2是8位有符号定点小数,小数位数为5,那么:q1=70=01000110q2=−193=10111111q3=q1×q2/210=−13465/210=−13.15625将q3转换为二进制,得到:q3=−13.15625=11000011.0010由于q3超过了8位的范围,我们需要对其进行截断或舍入,以适应FPGA的硬件资源。