关于奇数分频和小数分频
- 格式:doc
- 大小:33.00 KB
- 文档页数:2
任意数(整数、小数)分频器一、分频原理1.1偶数倍分频偶数倍分频通过计数器计数是很容易实现的。
如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。
以此循环下去。
这种方法可以实现任意的偶数分频。
1.2奇数倍分频奇数倍分频通过计数器也是比较容易实现的,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。
即是在计数值在邻近的1和2进行了两次翻转。
这样实现的三分频占空比为1/3或者2/3。
要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。
这种方法可以实现任意的奇数分频。
归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。
与此同时进行下降沿触发的模N 计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。
两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。
如图1-1所示,是一个3分频器的仿真时序图。
图1-1 3分频器时序图1.3小数分频1.3.1原理小数分频有很多方法,基本原理都是一样,在若干分频周期中,使某几个周期多计或少计一个数,从而在整个周期的总体平均意义上获得一个小数分频比。
设:K为分频系数;N为分频系数的整数部分;X为分频系数的小数部分;M为输入脉冲个数;P为输入脉冲个数;n为小数部分的位数。
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)。
在数字逻辑电路设计中,分频器是一种基本电路,通常用来对某个给定频率进行分频,从而得到所需的频率。
数字分频器一般有两大类:一类是脉冲波形均匀分布的分频器,即常规分频器;另一类是脉冲波形非分布均匀的分频器。
常规分频器只能进行整数或半整数分频,即分频倍数只能是整数或半整数。
但在某些应用场合,时钟源与所需的频率不一定成整数或半整数倍关系,这时就需要脉冲波形非均匀分布的分频器,这种分频器不仅能实现整数或半整数分频,还应能进行任意小数倍分频。
文献[1,2]给出了实现整数和半整数分频的常规分频器的两种设计方法,文献[3]则提出了一种可实现任意小数分频的设计方法——双模前置小数分频的实现方法。
在文献[1-3]研究的基础上,文献[4]总结归纳了实现任意数分频的设计方法。
在文献[1-3]研究的基础上,本文提出了一种改进的小数分频器设计方法,相对双模前置小数分频器,该方法使总体意义上与小数分频比等效的计数周期减小一半,并进一步减小了分频后得到的信号的相位抖动。
1整数和半整数分频对于N整数倍分频,可以方便地用模N的计数器来简单实现分频输出,其设计方法常用数字电子技术教程都有相关论述,这里就不赘述。
对于半整数分频N/2 (N为奇数),可以采用―脉冲周期剔除法‖来进行设计,即让触发前移半个周期的方式来剔除半个脉冲周期[4]。
假定输入计数脉冲周期为T,则当计数器计数到第(N+1)/2个周期时,只计数半个周期,即下一个计数循环到来时改变计数器的脉冲触发沿极性,这样一来,一个计数循环持续时间为计数脉冲周期的(N+1)/2-0.5 = N/2倍,即(N/2)T,从而输出信号频率为输入信号频率的1/(N/2)。
只要将整数和半整数分频器与一个T’触发器(二分频器)级联,就可以实现任意占空比为50%的整数倍分频。
2双模前置小数分频[3]2.1 分频原理在若干个分频周期中采取某种方法使某几个周期多计或少计一个脉冲,从而在整个计数周期的总体平均意义上获得一个小数分频比。
奇数分频器实验报告1. 背景奇数分频器是一种电子电路模块,主要用于将输入的时钟信号进行分频,并输出比输入频率低的信号。
奇数分频器的主要应用场景包括计数器、时钟频率降低等。
2. 分析2.1 奇数分频器的工作原理奇数分频器通常采用了三角波类型的振荡器来产生输入时钟信号,并通过相应的逻辑门电路对时钟信号进行分频。
常见的奇数分频器包括模2、模4和模8等。
以模8奇数分频器为例,其工作原理如下:1.奇数分频器接收输入时钟信号,并通过一个振荡器产生三角波类型的输入信号。
2.输入信号经过逻辑门电路进行分频,产生分频后的信号。
3.输出信号经过滤波电路以去除杂散信号。
4.输出信号即为输入信号的1/8。
2.2 奇数分频器的主要特点奇数分频器的主要特点包括:•输入输出频率比例为奇数,如1/2、1/4、1/8等;•分频系数固定,无法调节;•输出信号的相位与输入信号相同;•输出信号的波形稳定,幅值与输入信号相同。
2.3 奇数分频器的设计要求为了设计一个稳定可靠的奇数分频器,需要满足以下要求:•选用合适的逻辑门电路,以实现所需的分频倍数;•设计合适的滤波电路,以去除杂散信号;•保证输入输出电路的匹配性,以确保信号的传输稳定性;•选择合适的元器件,以满足设计要求,并考虑成本和可获得性。
3. 实验步骤及结果3.1 实验步骤本实验以模8奇数分频器为例,设计了以下实验步骤:1.准备实验所需的元器件和设备。
2.搭建电路原型。
3.设计逻辑门电路,实现1/8分频。
4.测试电路,检查信号传输和波形稳定性。
5.调整滤波电路,优化输出信号质量。
6.记录实验数据。
3.2 实验结果在实验中,成功搭建了模8奇数分频器电路,并进行了测试。
实验结果表明,输入信号的频率为100kHz,输出信号的频率为12.5kHz,且波形稳定。
4. 结论在本次实验中,我们成功设计了一个模8奇数分频器,实现了1/8分频。
实验结果表明,输入信号经过分频后,输出信号的频率比例为奇数,并且波形稳定,符合设计要求。
郑州航空工业管理学院毕业论文(设计)2012 届通信工程专业0813073 班题目基于FPGA分频器的设计姓名刘洋学号081307317指导教师张松炜职称讲师二О一二年五月二十日内容提要分频器是数字系统设计中的基本电路,在复杂数字逻辑电路设计中,根据不同设计的需要,会遇到偶数分频、奇数分频、半整数分频、小数分频等,有时要求等占空比,也有要求非等占空比。
在同一个设计中有时要求多种形式的分频,通常由计数器或计数器的级联构成各种形式的偶数分频和奇数分频,实现较为简单,但在某些场合下,时钟源与所需要的频率并不成整数关系,此时便需要采用小数分频器进行分频。
这时设计师希望有一种比较方便实用的设计方法,根据情况的需要,在实验室就能设计分频器并且可以马上检测使用,只需要更改分频系数而不修改其他器件或是电路板。
此次设计利用V erilog HDL硬件描述语言的设计方式,采用频率合成技术,通过QuartusⅡ5.0开发平台,使用Altera公司的FPGA器件,设计并实现了一种使小数分频“掺匀”更均匀的任意小数分频器。
只需在输入端更改分频系数,便可以得到所需的频率。
关键词分频器;整数;小数;分频系数; FPGAResearch and design of FPGA-based dividerAuthor: Liu Y ang Tutor: Zhang SongweiAbstractThe frequency divider is a basic circuit design of digital systems. In complex digital logic circuit design, according to different design needs, will meet the even number of odd divider, half integer divider, fractional divider and so on . Sometimes requirements so occupies emptiescompared, also have the required v. In the same design sometimes require various forms of points frequency, usually by a counter or counter of a cascade of all forms of frequency and odd number even points separate frequency, achieve comparatively simple,but in some cases, the clock frequency of the source and need not into integer relationship, at this time will need to adopt the decimal prescaler for points frequency.Designers hope to have a more convenient and practical design methods, according to the needs of the laboratory condition, can design frequency device and can immediately detection using, only need to change frequency coefficients and not modify other device or circuit board.This design using Verilog HDL hardware description language design methods, the frequency synthesis technology, through the Quartus Ⅱ5.0 development platform, and use of Altera company FPGA device, we design and implement a decimal points frequency "mixed well" more uniform any decimal prescaler. Just in the input frequency coefficient change points, and have a frequency required.KeywordsFrequency divider;Integer;Decimal,;Frequency coefficient ;FPGA目录内容提要 (1)目录 (III)第一章绪论 (1)1.1FPGA简介 (1)1.2选题的意义和目的 (3)1.3国内外应用现状及研究现状 (6)1.3.1应用现状 (6)1.3.2研究现状 (7)第二章整数分频器的设计及其分频原理 (10)2.1偶数分频 (10)2.1.1分频原理 (10)2.1.2软件仿真 (10)2.2奇数分频 (12)2.2.1分频原理 (12)2.2.2软件仿真 (13)第三章小数分频器的设计 (14)3.1小数分频器基本原理 (14)3.2小数分频器的设计方案及功能实现 (16)3.2.1半整数分频 (16)3.2.2任意小数分频器的设计与实现 (17)3.2.3小数分频器的应用 (20)致谢 (24)参考文献 (25)附录 (26)基于FPGA分频器的研究与设计081307317刘洋指导教师:张松炜讲师第一章绪论1.1FPGA简介FPGA是现场可编程门阵列的简称,是可编程逻辑器件(PLD)问世以来的第四代产品,适合于时序、组合等逻辑电路的应用。
fpga实现奇分频和偶分频的方法FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,可以通过重新编程来实现不同的功能。
在数字电路设计中,奇分频和偶分频是常见的需求,本文将介绍如何使用FPGA实现奇分频和偶分频的方法。
奇分频是指将输入信号的频率除以一个奇数,得到输出信号的频率。
而偶分频则是将输入信号的频率除以一个偶数,得到输出信号的频率。
在FPGA中,可以通过计数器和比较器来实现奇分频和偶分频。
我们需要明确需要实现的分频比例。
假设我们要实现一个2分频的功能。
对于奇分频,我们可以使用一个计数器来计数输入信号的上升沿或下降沿的个数,当计数器的值达到一定阈值时,输出一个脉冲信号,从而实现奇分频。
对于2分频,我们可以设置计数器的阈值为2,也就是每两个上升沿或下降沿输出一个脉冲信号。
在FPGA中,我们可以使用Verilog或VHDL等硬件描述语言来描述奇分频和偶分频的逻辑。
下面以Verilog为例,给出奇分频和偶分频的代码示例。
```verilogmodule OddDivider(input wire clk_in,output wire clk_outreg [1:0] count;wire tick;always @(posedge clk_in) begin if(count == 2'b00) begincount <= 2'b01;tick <= 1;end else if(count == 2'b01) begin count <= 2'b10;tick <= 0;end else begincount <= 2'b00;tick <= 0;endendassign clk_out = tick; endmodulemodule EvenDivider(input wire clk_in,output wire clk_outreg [2:0] count;wire tick;always @(posedge clk_in) beginif(count == 3'b000) begincount <= 3'b001;tick <= 1;end else if(count == 3'b001) begin count <= 3'b010;tick <= 0;end else if(count == 3'b010) begin count <= 3'b011;tick <= 0;end else begincount <= 3'b000;tick <= 0;endendassign clk_out = tick; endmodule在上面的Verilog代码中,OddDivider模块实现了奇分频的功能,EvenDivider模块实现了偶分频的功能。
数字系统设计hdl课后答案【篇一:数字系统设计与verilog hdl】ss=txt>(复习)eda(electronic design automation)就是以计算机为工作平台,以eda软件工具为开发环境,以pld器件或者asic专用集成电路为目标器件设计实现电路系统的一种技术。
1.电子cad(computer aided design)2.电子cae(computer aided engineering)3.eda(electronic design automation)eda技术及其发展p2eda技术的应用范畴1.3 数字系统设计的流程基于fpga/cpld的数字系统设计流程1. 原理图输入(schematic diagrams )2、硬件描述语言 (hdl文本输入)设计输入硬件描述语言与软件编程语言有本质的区别综合(synthesis)将较高层次的设计描述自动转化为较低层次描述的过程◆行为综合:从算法表示、行为描述转换到寄存器传输级(rtl)◆逻辑综合:rtl级描述转换到逻辑门级(包括触发器)◆版图综合或结构综合:从逻辑门表示转换到版图表示,或转换到pld器件的配置网表表示综合器是能自动实现上述转换的软件工具,是能将原理图或hdl语言描述的电路功能转化为具体电路网表的工具适配适配器也称为结构综合器,它的功能是将由综合器产生的网表文件配置于指定的目标器件中,并产生最终的可下载文件对cpld器件而言,产生熔丝图文件,即jedec文件;对fpga器件则产生bitstream位流数据文件p8仿真(simulation)功能仿真(function simulation)时序仿真(timing simulation)仿真是对所设计电路的功能的验证p9编程(program)把适配后生成的编程文件装入到pld器件中的过程,或称为下载。
通常将对基于eeprom工艺的非易失结构pld器件的下载称为编程(program),将基于sram工艺结构的pld器件的下载称为配置(configure)。
VERILOG 分频原理众所周知,分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相环资源,如altera 的PLL,Xilinx的DLL.来进行时钟的分频,倍频以及相移。
但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相移仍然非常流行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单元就可以达到对时钟操作的目的。
另一方面,通过语言设计进行时钟分频,可以看出设计者对设计语言的理解程度。
因此很多招聘单位在招聘时往往要求应聘者写一个分频器(比如奇数分频)以考核应聘人员的设计水平和理解程度。
下面讲讲对各种分频系数进行分频的方法:第一,偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。
如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。
以此循环下去。
这种方法可以实现任意的偶数分频。
第二,奇数倍分频:奇数倍分频常常在论坛上有人问起,实际上,奇数倍分频有两种实现方法:首先,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。
即是在计数值在邻近的1和2进行了两次翻转。
这样实现的三分频占空比为1/3或者2/3。
如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。
这种方法可以实现任意的奇数分频。
归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。
通用分频器基本原理整数分频包括偶数分频和奇数分频,对于偶数N分频,通常是由模N/2计数器实现一个占空比为1:1的N分频器,分频输出信号模N/2自动取反。
对于奇数N分频,上述方法就不适用了,而是由模N计数器实现非等占空比的奇数N分频器,分频输出信号取得是模N计数中的某一位(不同N值范围会选不同位)。
这种方法同样适用于偶数N分频,但占空比不总是1:1,只有2的n次方的偶数(如4、8、16等)分频占空比才是1:1。
这种方法对于奇数、偶数具有通用性。
半整数分频器也是在这种方法基础上实现的。
除了一个模N计数器,还需要一个异或模块和一个2分频模块。
半整数分频器原理如图1所示:半整数分频器设计思想:通过异或门和2分频模块组成一个改变输入频率的脉冲添加电路,也就是说N-0.5个输入信号周期内产生了N个计数脉冲,即输入信号其中的一个含一个脉冲的周期变为含两个脉冲的周期。
而这一改变正是输入频率与2分频输出异或的结果。
由2分频输出决定一个周期产生两个脉冲有两种方式:当一个输入信号来一个脉冲(前半周期)时,2分频输出变为‘1’,clk_in 取反,后半周期就会产生一个脉冲;2分频输出由‘1’变为‘0’时,clk_in 刚把一个周期(前半周期)内低电平变为高电平产生一个脉冲,而后半周期的脉冲与‘0’异或不变。
从而实现N-0.5分频。
要实现奇数、偶数、半整数通用分频器只需再加一个控制选择信号sel。
当sel=‘1’时,clk_in与2分频输出异或,实现半整数分频;当sel=‘0’时,只选通clk_in,实现整数分频。
通用分频器原理如图2所示:Verilog语言的实现本设计采用层次化的设计方法,首先设计通用分频器中各组成电路元件,然后通过元件例化的方法,调用各元件,实现通用分频器。
1、选择异或门模块half_select:modulehalf_select(sel,a,b,c);outputc;inputsel,a,b; xoru1(w,a,b); assignc=sel?w:a; (当sel=‘1’时,clk_in与2分频输出异或,实现半整数分频;当sel=‘0’时,只选通clk_in,实现整数分频。
使用VHDL 进行分频器设计作者:ChongyangLee摘要使用VHDL 进行分频器设计作者:ChongyangLee本文使用实例描述了在FPGA/CPLD 上使用VHDL 进行分频器设计,包括偶数分频、非50%占空比和50%占空比的奇数分频、半整数(N+0.5)分频、小数分频、分数分频以及积分分频。
所有实现均可通过Synplify Pro 或FPGA 生产厂商的综合器进行综合,形成可使用的电路,并在ModelSim 上进行验证。
目录概述 (1)计数器 (1)普通计数器 (1)约翰逊计数器 (3)分频器 (4)偶数分频器 (4)奇数分频器 (6)半整数分频器 (9)小数分频器 (11)分数分频器 (15)积分分频器 (18)概述分频器是数字电路中最常用的电路之一,在FPGA 的设计中也是使用效率非常高的基本设计。
基于FPGA 实现的分频电路一般有两种方法:一是使用FPGA 芯片内部提供的锁相环电路,如ALTERA 提供的PLL (Phase Locked Loop),Xilinx 提供的DLL(Delay Locked Loop);二是使用硬件描述语言,如VHDL、Verilog HDL 等。
使用锁相环电路有许多优点,如可以实现倍频;相位偏移;占空比可调等。
但FPGA 提供的锁相环个数极为有限,不能满足使用要求。
因此使用硬件描述语言实现分频电路经常使用在数字电路设计中,消耗不多的逻辑单元就可以实现对时钟的操作,具有成本低、可编程等优点。
计数器计数器是实现分频电路的基础,计数器有普通计数器和约翰逊计数器两种。
这两种计数器均可应用在分频电路中。
普通计数器最普通的计数器是加法(或减法)计数器。
下面是加法计数器的VHDL实现,其Synplify Pro下的RTL View如图1所示。
--file Name: ripple.vhd--Description: 带复位功能的加法计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity ripple isgeneric (width: integer := 4);port(clk, rst: in std_logic;cnt: out std_logic_vector(width - 1 downto 0));end ripple;architecture a of ripple issignal cntQ: std_logic_vector(width - 1 downto 0);beginprocess(clk, rst)beginif (rst = '1') thencntQ <= (others => '0');elsif (clk'event and clk = '1') thencntQ <= cntQ + 1;end if ; end process ;cnt <= cntQ;end a;代码 1 加法计数器 VHDL 代码图 1 加法计数器 RTL 视图加法计数器的Test Bench 代码如下所示,在ModelSim 下进行功能仿真,仿真 波形结果如图 2所示。
分频的Verilog实现1.分频:在实际应用中,自己设计的开发板上不会去装多个晶振来产生不同频率的时钟信号,这就要我们在已有的基础上自己来创造设计电路中所需要的时钟信号来,有时候所需要的频率并不是在已有的频率上直接进行简单的整数分频就可以得到的,有时需要进行小数的分频。
2.在分频的过程中,偶数分频并不困难,若要进行2N次分频的话,只需要计数到N的时候,波形进行翻转就行了,或者在最后一级加一个2分频也可以实现。
下面是我写的一个偶数分频的代码:module div2n(rst,clk,cnt,clk_2n);//偶数次分频input rst,clk;output clk_2n,cnt;reg [3:0] cnt;//刚开始没有定义计数的位宽仿真的时候老是出现输出为0的现象,看似很简单的程序搞的有些纠结啊reg clk_2n;always @(posedge clk )beginif(rst) //若复位信号为高电平则计数清零和输出清零begincnt<=0;clk_2n<=0;endelseif(cnt==3)//进行8分频,这里的cnt取不同的值进行其他的分频,若计数到达4时从0开始的输出电平翻转beginclk_2n<=~clk_2n;cnt<=0;endelse cnt<=cnt+1;endendmodule功能仿真波形以及后仿真波形如下:从后仿真中可以明显的看出输出时钟信号和输入的标准信号有延迟时间,在计数寄存器中出现了相邻两个数之间的竞争,但是没有出现在时钟的上升沿,不会引起最后实现的错误!奇数分频:若奇数分频中不考虑占空比的话,分频代码可以按照偶数分频的思路来写,但是大多数情况下需要考虑的是使占空比设计为50%。
若要进行奇数次的分频而且要求占空比为50%可以采用:用两个计数器,一个由输入时钟下降沿触发,一个由输入时钟的上升沿触发,最后将两个计数器的输出进行相或,就可得到。
1、半整数分频占空比不为50%//说明:我设计的史上最好用的半整数分频占空比不为50%,包含设计思路module div_5(clk,clk_div,cnt1,cnt2,temp1,temp2);//N+0.5input clk;output clk_div;output reg[31:0]cnt1,cnt2;output reg temp1,temp2;initial begin temp1=0;temp2=1;end //首先进行初始化,temp1=0;temp2=1 parameter N=5; //设定分频系数为N+0.5always @(posedge clk) //temp1上升沿跳变beginif(cnt1==2*N) //2*Nbegin cnt1[31:0]<=32'd0;endelse begin cnt1[31:0]<=cnt1[31:0]+32'd1;endif(cnt1==32'd0) begin temp1<=1;end //高电平时间为N+1;if(cnt1==N+1) begin temp1<=0;end//低电平时间为N;endalways@(negedge clk) //temp2下降沿跳变beginif(cnt2==2*N) //2*Nbegin cnt2[31:0]<=32'd0;endelse begin cnt2[31:0]<=cnt2[31:0]+32'd1;endif(cnt2==32'd0) begin temp2<=0;end //低电平时间为N;if(cnt2==N) begin temp2<=1;end //高电平时间为N+1;endassign clk_div=temp1&&temp2; //逻辑与endmodule//如果要进行N+0.5分频//思路:总的来说要进行N+1+N=2N+1次分频//在时钟的上升沿和下降沿都进行跳变//上升沿进行占空比为N+1比N的时钟temp1;//下降沿进行占空比为N比N+1的时钟temp2;//最后div=temp1&&temp2 即可得到所需要的半整数分频分频5.5仿真结果2、奇数分频占空比为50%//说明:奇数分频。
基于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等半整数分频器。
奇偶分频的原理及应用1. 引言奇偶分频是一种常见的信号处理技术,主要用于将输入信号按照奇偶性分成两个不同的频谱成分。
它在通信、图像处理、音频处理等领域得到了广泛的应用。
本文将介绍奇偶分频的原理及其在不同领域中的应用。
2. 奇偶分频的原理奇偶分频的原理基于信号的对称性和周期性。
在信号处理中,我们可以将一个周期性信号表示为奇函数和偶函数的和。
奇函数满足f(−x)=−f(x),而偶函数满足f(−x)=f(x)。
奇偶分频技术就是利用这种对称性,将信号按照奇偶性分成两个不同的频谱成分。
具体来说,奇偶分频的过程如下: - 首先,将输入信号进行离散傅立叶变换(DFT),将它转换为频域信号。
- 然后,利用信号的奇偶性质,将频域信号分成奇数频率和偶数频率的两部分。
- 最后,将分别得到的奇数频率和偶数频率信号进行逆离散傅立叶变换(IDFT),将其转换回时域信号。
通过奇偶分频,我们可以得到原始信号中的奇函数成分和偶函数成分,从而实现对信号的分离和处理。
3. 奇偶分频的应用3.1 通信领域奇偶分频在通信领域中有广泛的应用。
例如,在调制解调器中,奇偶分频可以用于信号的调制和解调。
调制过程中,原始信号经过奇偶分频后,可以将其奇偶分量分别调制到不同的频率上,以增加信号的分辨率和抗噪性能。
解调过程中,可以将接收到的信号按照奇偶分频原理进行解调,得到原始信号的奇偶分量,从而实现信号的恢复和解码。
3.2 图像处理领域在图像处理领域,奇偶分频常用于图像的滤波和压缩。
通过将图像信号进行奇偶分频,可以将图像的低频和高频成分分离开来。
然后,可以对这两部分信号分别进行滤波处理,以实现图像的降噪和增强。
此外,奇偶分频还可以用于图像的压缩,通过保留图像中重要的奇偶分量,可以有效地减小图像的数据量,实现高效的图像存储和传输。
3.3 音频处理领域在音频处理领域,奇偶分频主要应用于音频的合成和特效处理。
通过将音频信号进行奇偶分频,可以将音频的低频和高频成分分开处理。
奇偶分频的原理和应用1. 奇偶分频的概述奇偶分频是一种电路设计技术,用于将输入信号分为奇数和偶数两个部分。
通过奇偶分频电路可以将一个频率连续变化的信号分成两路,分别输出奇数和偶数频率成分。
奇偶分频广泛应用于数字通信领域和信号处理领域,用于实现对不同频率信号的独立处理。
2. 奇偶分频的原理奇偶分频的原理是基于信号频谱的奇偶性质。
对于一个周期性信号,其频谱中的成分可以分为奇数和偶数频率成分。
奇偶分频电路通过对输入信号进行滤波和频域处理操作,将奇数和偶数频率成分分别提取出来,以实现奇偶分频的目的。
3. 奇偶分频的应用奇偶分频的应用非常广泛,下面列举了一些常见的应用场景:•频率分析:奇偶分频可以用于对输入信号的频谱进行分析。
通过提取出奇数和偶数频率成分,可以得到输入信号的频域特性,并进行进一步的信号处理和分析。
•信号处理:奇偶分频可以用于将输入信号的奇数频率成分和偶数频率成分分别处理。
这样可以实现对不同频率分量的独立处理,提高信号处理的效果。
•通信系统:奇偶分频在通信系统中有着广泛的应用。
比如在正交频分复用技术中,通过奇偶分频可以将不同频率的信号进行分离,并在接收端进行合并。
这样可以提高通信系统的频谱利用效率。
•音频处理:奇偶分频可以用于音频信号处理。
比如在音频均衡器中,可以将输入信号分为低频和高频两个部分,分别调节其增益和频率响应,以实现音频信号的均衡处理。
4. 奇偶分频电路的设计方法设计奇偶分频电路需要考虑信号频率范围、滤波器设计和频域处理方法等因素。
一般来说,可以采用以下步骤进行设计:1.确定输入信号的频率范围和带宽要求。
2.根据频率范围选择适当的滤波器类型,如低通滤波器和高通滤波器。
3.设计滤波器的阶数和参数,以满足输入信号的频率要求。
4.根据设计要求选择合适的频域处理方法,如FFT(快速傅里叶变换)和DFT(离散傅里叶变换)。
5.搭建电路并进行仿真测试,调整参数以满足设计要求。
5. 总结奇偶分频是一种常用的信号处理技术,通过将输入信号分为奇数和偶数频率成分,可以实现对不同频率分量的独立处理。
奇数分频器1 引言分频器在CPLD/FPGA设计中使用频率非常高,尽管目前大部分设计中采用芯片厂家集成的锁相环资源,但是对于要求奇数倍分频、小数倍分频的应用场合却往往不能满足要求。
硬件工程师希望有一种灵活的设计方法,根据需要,在实验室就能设计分频器并马上投入使用,更改频率时无需改动原器件或电路板,只需重新编程,在数分钟内即可完成。
对于偶数分频,使用一模N计数器模块即可实现,即每当模N计数器从0开始计数至N时,输出时钟进行翻转,同时使计数器复位,使之从0开始重新计数,以此循环即可实现。
但对于奇数分频,实现50%的占空比却是比较困难的。
下面给出占空比50%的奇数分频器的设计源程序和仿真结果。
2 VHDL程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;--添加库ENTITY fdiv IS --设计实体PORT( clk,reset : IN STD_LOGIC;--端口说明preset: IN INTEGER;--preset:分频预置数clkout : OUT STD_LOGIC);- -clkout :分频后得到的时钟END fdiv;ARCHITECTURE behave OF fdiv IS--设计构造体SIGNAL s1,s2 : STD_LOGIC;--内部信号s1,s2 SIGNAL cnt : INTEGER RANGE 0 TO preset-1;--模为preset的计数信号BEGINP1: PROCESS(clk,reset) --计数器BEGINIF reset='1' THENcnt<=0;ELSIF clk'event AND clk='1' THENIF cnt=0 THENcnt<=preset-1;ELSEcnt<=cnt-1;END IF;END IF;END PROCESS;P2: PROCESS(clk,reset) --信号1 BEGINIF reset='1' THENs1<='1';ELSIF clk'event AND clk='1' THENIF cnt=0 THEN --计数信号为0时,S1翻转s1<=NOT s1;ELSEs1<=s1;END IF;END IF;END PROCESS;P3: PROCESS(clk,reset) --信号2 BEGINIF reset='1' THENs2<='1';ELSIF clk'event AND clk='0' THENIF cnt=(preset-1)/2 THEN --计数信号为N时,S2翻转s2<=NOT s2;ELSEs2<=s2;END IF;END IF;END PROCESS;clkout<= s1 XOR s2; -- 异或输出END BEHA VE;程序说明:以上程序实现任意奇数为PRESET的50%占空比分频,计数器CNT的模值为PRESET,计数器是为了控制信号S1和信号S2,使两信号保持恒定的时间差。
关于奇数分频和小数分频
小数分频
举例,对于8.7分频,先进行几次8分频,后进行几次9分频,这样平均下来就是小数分频,至于具体几次就是靠公式了:
这其中K就是8.7,N等于8,-n就是-1,X就是7。
这样,其中就会有X(也就是7)次9分频,按照平均,就有3次8分频(87-7*9)/8。
还有一个问题,就是从N 分频切换到N + 1 分频和从N + 1 分频切换到N 分频都会产生一个随时间增长的相位移, 如果简单的先进行3 次8 分频后做7 次9 分频将会产生很大的相位
波动。
解决方法是将这两种分频混合。
怎样混合就有要牵扯到另一个控制逻辑:每进行分频,就用10减去小数部分(10-7),这个结果值累加,小于10的次数进行N+1
分频,然后进行N分频,但是每次超过又要减去10重新累加:
这个过程有一个变量控制。
奇数分频
N倍奇数分频,要使占空比为50%,以如下思路实现:
A、以原时钟周期的N倍作为一个处理周期;(用计数器计数的作用)
B、生成占空比为N/2 :N/2+1(除法取整)的波形;(以计数器值采样)
C、将B生成的波形相移原时钟的半个周期;(用负沿打的作用)
D、若高电平占N/2宽,输出将B和C的波形相或;若高电平占N/2+1宽,输出将B和C 的波形相与
具体代码如下:
module odddiv(rst,clk,clkout);
parameter N=3; //计数器的位数N的最大计数值要大于或等于M parameter M=7; //要分频的模,取奇数
input rst;
input clk;
output clkout;
reg tempp,tempn;
//assign clkp=clk;
//assign clkn=~clk;
reg [N-1:0] count;
always @(negedge rst or posedge clk)
if(!rst)
begin
count<=0;
tempp<=0;
end
else
begin
count<=count+1;
if(count==M/2)
tempp<=1;
else if(count==M-1)
begin
tempp<=0;
count<=0;
end
end
always @(negedge rst or negedge clk)
if(!rst)
tempn<=0;
else
tempn<=tempp;
assign clkout=tempp|tempn;
endmodule。