任意数(整数、小数)分频器

合集下载

小数分频器的设计及其应用

小数分频器的设计及其应用

第24卷 增刊2005年9月国 外 电 子 测 量 技 术Foreign Elect ronic Measurement TechnologyVol.24,Suppl.Sep.,2005作者简介: 尹佳喜(1981-),华中科技大学电气与电子工程学院04级研究生,研究方向电力电子与电力传动。

研究与设计小数分频器的设计及其应用尹佳喜(华中科技大学电气与电子工程学院 湖北武汉430074)摘要:分频器是数字系统设计中最常见的电路之一,在数字系统设计中,经常需要对时钟进行小数倍分频。

本文给出了三种用于实现小数分频的方案,并将三种方案进行了比较。

在此基础上,介绍了小数分频器在直接数字频率合成技术和步进电机驱动速度控制中的两种常见应用。

关键词:小数分频器 直接数字频率合成 步进电机 频率The Design and Application of Decim al Fraction Frequency DividerY in Jiaxi(College of Elect ricit y and Elect ronic Engeneering ,H uaz hong Universit y of S cience and Techlonog y ,W uhan 430074,China )Abstract :Frequency division is one of t he mo st common circuit s in t he design of digital system.Generally ,decimal f raction f requency division is needed.In t his paper ,t hree met hods to realize deci 2mal f raction frequency division are given ,and t he comparison among t he t hree met hods is presented.Applications of decimal Fraction Frequency divider in t he area such as direct digital f requency syn 2t hesis technology and stepper motor drive speed controller are int roduced.K eyw ords :decimal f raction frequency divider ,direct digital frequency synt hesis (DDS ),stepper mo 2tor ,frequency.0 引言 现代电子系统设计中,数字电子系统所占的比例越来越大,现代电子系统发展的趋势是数字化和集成化。

基于FPGA的任意小数分频器的设计(正文).

基于FPGA的任意小数分频器的设计(正文).

邵阳学院课程设计第1章绪论1.1 课题背景当今社会是数字化的社会,是数字集成电路广泛应用的社会。

数字集成电路本身在不断地进行更新换代。

它由早期的电子管、晶体管、小中规模集成电路,发展到超大规模集成电路( VLSIC ,几万门以上)以及许多具有特定功能的专用集成电路。

但是,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。

系统设计师们更愿意自己设计专用集成电路(ASIC )芯片,而且希望ASIC 的设计周期尽可能短,最好是在实验室里就能设计出合适的ASIC 芯片,并且立即投入实际应用之中,因而出现了现场可编程逻辑器件(FPLD),其中应用最广泛的当属现场可编程门阵列( FPGA)和复杂可编程逻辑器件(CPLD)。

1.2 研究的目的及意义目的是一方面使我们能够进一步理解课程内容,基本掌握 EDA 技术和系统知识,增加集成电路应用知识,培养我们的实际动手能力以及分析、解决问题的能力。

另一方面也可以是我们更好地巩固和加深对基础知识的理解,学会设计中小型数字系统的方法,独立完成调试过程,增强我们理论联系实际的能力,提高电路分析和设计能力。

通过实践引导我们在理论指导下有所创新,为专业课的学习和日后工程实践奠定基础。

通过设计,一方面可以加深我们对理论知识的理解,另一方面也可以提高我们考虑问题的全面性,将理论知识上升到一个实践的阶段。

1.3EDA的发展历程及应用1.3.1 EDA 的发展历程随着集成电路和计算机技术的飞速发展,EDA (Electronic Design Automation)应运而生,它是一种高级、快速、有效的电子设计自动化技术。

EDA 技术以计算机为工具,代替人完成数字系统的逻辑综合、布局布线和设计仿真等工作。

设计者只需要完成对系统功能的描述,然后就可以由计算机来处理这些描述,得到设计结果,修改设计也很方便。

利用EDA 工具进行设计,可以极大的提高设计效率。

EDA 技术的发展经历了一个由浅到深的过程。

分频器 原理

分频器 原理

分频器原理分频器是一种电子电路装置,主要用于将输入的信号分为不同频率的部分。

其工作原理主要基于LC滤波器(电感和电容构成的滤波网络)来实现。

根据输入信号的频率特性,分频器可以将信号分为高频、中频和低频等不同部分,从而满足各种应用场景的需求。

分频器在音频领域中的应用较为常见,如在音频功率放大器中,分频器可以帮助将音频信号分为不同频率段,如高音、中音和低音等。

这样,各个频率段的信号可以分别经过相应的放大器处理,再传输给相应的扬声器进行播放,从而实现完整的声音还原。

分频器的工作原理如下:1.偶数分频:使用计数器在信号的上升沿或下降沿进行计数。

当计数器的值等于分频系数的一半或整数时,信号翻转。

例如,一个上升沿计数的计数器,每次计数到2时,输出信号翻转一次;每次计数到4时,输出信号再次翻转。

这种方法适用于偶数分频。

2.奇数分频:相较于偶数分频,奇数分频器的设计稍复杂。

一般采用上升沿计数,当计数到(N-1)/2时,输出信号翻转;计数到(N-1)时,输出信号再次翻转。

若要实现50%的占空比,可以通过“错位相或”的方法实现。

3.LC滤波器:分频器中的LC滤波器根据信号频率的不同,对信号进行筛选。

高通滤波器允许高频信号通过,阻止低频信号;低通滤波器则允许低频信号通过,阻止高频信号;带通滤波器则允许特定频率范围内的信号通过。

4.阻抗补偿网络:有些分频器中还会加入由电阻、电容构成的阻抗补偿网络,以使音箱的阻抗曲线更平坦,便于功放驱动。

分频器利用LC滤波器和计数器等电路元件,将输入信号分为不同频率部分,以满足各种应用需求。

在不同领域,分频器的具体实现方式可能有所不同,但其核心原理均基于LC滤波器和计数器。

分频系数为5的小数分频器verilog代码

分频系数为5的小数分频器verilog代码

分频系数为5的小数分频器Verilog代码1. 引言在数字电路设计中,分频器是一种常见的电路模块,用来将输入的时钟信号分频成较低频率的输出信号。

而小数分频器则是一种特殊的分频器,可以将输入的时钟信号按照小数进行分频。

在本文中,我们将讨论分频系数为5的小数分频器的Verilog代码设计。

2. 设计思路分频系数为5的小数分频器可以通过累加器和比较器的组合来实现。

具体的设计思路如下:- 我们需要一个累加器来对输入时钟信号进行累加,累加的阈值为5。

- 当累加器的值达到5时,触发一个使能信号,将输出信号置高,同时清零累加器的值。

- 输出信号的高电平持续一个时钟周期,然后重新开始累加。

3. Verilog代码```verilogmodule FractionalDivider (input wire clk,input wire rst,output reg out);reg [2:0] count;always @(posedge clk or posedge rst) beginif (rst) begincount <= 3'b0;out <= 1'b0;end else beginif (count == 3'b100) begincount <= 3'b0;out <= 1'b1;end else begincount <= count + 1'b1;out <= 1'b0;endendendendmodule```4. 代码解释- 该Verilog模块名为FractionalDivider,包含一个时钟信号输入clk,一个复位信号输入rst,一个分频后的输出信号out。

- 使用一个3位寄存器count来实现累加器的功能,用于累加输入时钟信号。

- 累加器的阈值设置为3'b100,即5。

- 当累加器的值达到5时,输出信号out置高,持续一个时钟周期,然后重新开始累加。

关于VHDL的任意整数分频器的设计

关于VHDL的任意整数分频器的设计

关于VHDL的任意整数分频器的设计0 引言在数字逻辑电路设计中,分频器是一种基本电路,通常用来对某个给定频率的时钟进行分频,得到所需的时钟。

时序电路设计中需要各种各样的分频器来获得不同频率的时钟,其中以整数分频器最为常见。

整数分频可以简单的使用模n 计数器实现,即随驱动时钟跳变n 次后就输出一个进位脉冲,然后立即被清零或置位,再开始新一轮的循环的计数。

模 n 计数器的进位脉冲的宽度一般与驱动时钟相同,这对于边沿驱动的时序逻辑并不会带来什么问题。

但是在某些需要使用电平逻辑的设计中,我们更希望分频时钟拥有50%,或者与驱动时钟相同的占空比。

这时就需要通过另外的逻辑方法来进行分频,或者使用PLL。

在基于 CPLD(复杂可编程逻辑器件)/FPGA(现场可编程门阵列)的数字系统设计中,很容易实现由计数器或其级联构成各种形式的偶数分频及非等占空比的奇数分频,但对等占空比的奇数分频及半整数分频的实现较为困难。

本文利用 VHDL(超高速集成电路硬件描述语言),通过Quartus II 7.1 开发平台,设计了一种能够实现等占空比的整数分频器,这种设计方法原理简单,可重用性好,而且只需很少的逻辑宏单元。

1 分频原理1.1 偶数倍(2N)分频使用一个模 N 计数器模块即可实现,即利用模N 计数器从0 开始对输入时钟的上升沿计数,计数值等于N 时,输出时钟进行翻转,同时给计数器一个复位信号使之从0 开始重新计数,以此循环即可。

为偶数倍分频原理示意图。

1.2 奇数倍(2N+1)分频占空比为 X/(2N+1)或(2N+1-X)/(2N+1)分频,用模(2N+1)计数器模块可以实现。

取0 至2N 之间某一数值X(0<X<2N),当计数器时钟上升沿从0 开始计数到X 值时输出时钟翻转一次,在计数器继续计数达到2N+1 时,输出时钟再次翻转并对计数器置一复位信号,使之从0 开始重新计数,即可实现。

1.3 占空比为 50%的分频1.2 中占空比为非50%的输出时钟在输入时钟的上升沿触发翻转。

使用VHDL进行任意整数分频器设计摘要

使用VHDL进行任意整数分频器设计摘要

使用VHDL进行任意整数分频器设计摘要分频器是数字电路中最常用的电路之一,在FPGA的设计中也是使用效率非常高的基本设计。

基于FPGA实现的分频电路一般有两种方法:一是使用FPGA芯片内部提供的锁相环电路,如ALTERA提供的PLL(Phase Locked Loop),Xilinx 提供的DLL(Delay Locked Loop);二是使用硬件描述语言,如VHDL、Verilog HDL 等。

使用锁相环电路有许多优点,如可以实现倍频;相位偏移;占空比可调等。

但FPGA提供的锁相环个数极为有限,不能满足使用要求。

因此使用硬件描述语言实现分频电路经常使用在数字电路设计中,消耗不多的逻辑单元就可以实现对时钟的操作,具有成本低、可编程等优点。

本文使用实例描述了FPGA/CPLD上使用VHDL进行分频器设计,将奇数分频,和偶数分频结合起来,可以实现50%占空比任意正整数的分频,并在仿真中实现了将50MHZ的信号分频。

总体方案设计:首先定义8个输入端来选择是n分频然后分别写出偶数分频和奇数分频,最后再判断输入的8位是奇数还是偶数,选择相应的分频。

偶数分频:一般来说有两种方案:一是当计数器计数到N/2-1时,将输出电平进行一次翻转,同时给计数器一个复位信号,如此循环下去;二是当计数器输出为0到N/2-1时,时钟输出为0或1,计数器输出为N/2到N-1时,时钟输出为1或0N-1时,复位计数器,如此循环下去。

需要说明的是,第一种方案仅仅能实现占空比为50%的分频器,第二种方案可以有限度的调整占空比,也可以实现非50%占空比的奇数分频。

奇数分频:实现占空比为50%的2N+1分配器,则需要对待分频时钟上升沿和下降沿分别进行N/(2N+1)分频,然后将两个分频所得的时钟信号相或,即可得到占空比为50%的2N+1分频器。

VHDL语言如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity fp isgeneric (data_width : integer := 8 );port(input : in std_logic_vector(data_width-1 downto 0);clk_in : in std_logic;clk_out : out std_logic);end entity fp;architecture div of fp issignal clk_outQ : std_logic ;signal coutQ : std_logic_vector (data_width - 1 downto 0); signal cout1,cout2 : std_logic_vector(data_width - 1 downto 0); signal clk1,clk2 : std_logic;signal a : std_logic;begin-------------------------------------------------process(clk_in)beginif clk_in'event and clk_in = '1' thenif coutQ < (conv_integer(input) - 1) thencoutQ <= coutQ + 1;else coutQ <= (others => '0');end if;end if;end process;---------------------------------------------------process(coutQ)beginif coutQ < (conv_integer(input))/2 thenclk_outQ <= '0';else clk_outQ <= '1';end if;end process;---------------------------------------------------process(clk_in)------rising edgebeginif clk_in'event and clk_in='1' thenif cout1 < (conv_integer(input)-1) thencout1 <= cout1 + 1;else cout1 <= (others => '0');end if;if cout1 < (conv_integer(input)-1)/2 thenclk1 <= '1';else clk1 <= '0';end if;end if;end process;---------------------------process(clk_in)------falling edgebeginif clk_in'event and clk_in='0' thenif cout2 < (conv_integer(input)-1) thencout2 <= cout2 + 1;else cout2 <= (others => '0');end if;if cout2 < (conv_integer(input)-1)/2 thenclk2 <= '1';else clk2 <= '0';end if;end if;end process;---------------------------process(clk_outQ,clk1,clk2)beginif ((conv_integer(input) mod 2)=0) then clk_out <= clk_outQ;elseclk_out <= clk1 or clk2;end if;end process;end architecture div;仿真结果:待分频信号采用50MHZ(周期20ns)的方波。

分频器介绍

分频器介绍

分频器-概述分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。

在许多电子设备中如电子钟、频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种频率成分,分频器是一种主要变换手段。

早期的分频器多为正弦分频器,随着数字集成电路的发展,脉冲分频器(又称数字分频器)逐渐取代了正弦分频器,即使在输入输出信号均为正弦波时也往往采用模数转换-数字分频-数模转换的方法来实现分频。

正弦分频器除在输入信噪比低和频率极高的场合已很少使用。

对于任何一个N 次分频器,在输入信号不变的情况下,输出信号可以有N 种间隔为2π/N 的相位。

这种现象是分频作用所固有的,与分频器的具体电路无关,称为分频器输出相位多值性。

分频器-原理从电路结构来看,分频器本质上是由电容器和电感线圈构成的LC 滤波网络,高音通道是高通滤波器,它只让高频信号通过而阻此低频信号;低音通道正好想反,它只让低音通过而阻此高频信号;中音通道则是一个带通滤波器,除了一低一高两个分频点之间的频率可以通过,高频成份和低频成份都将被阻止。

在实际的分频器中,有时为了平衡高、低音单元之间的灵敏度差异,还要加入衰减电阻;另外,有些分频器中还加入了由电阻、电容构成的阻抗补偿网络,其目的是使音箱的阻抗曲线心理平坦一些,以便于功放驱动。

由于现在的音箱几乎都采用多单元分频段重放的设计方式,所以必须有一种装置,能够将功放送来的全频带音乐信号按需要划分为高音、低音输出或者高音、中音、低音输出,才能跟相应的喇叭单元连接,分频器就是这样的装置。

如果把全频带信号不加分配地直接送入高、中、低音单元中去,在单元频响范围之外的那部分“多余信号”会对正常频带内的信号还原产生不利影响,甚至可能使高音、中音单元损坏。

分频器-作用好坏至关重要。

功放输出的音乐讯号必须经过分频器中的各滤波元件处理,让各单元特定频率的讯号通过。

要科学、合理、严谨地设计好音箱之分频器,才能有效地修饰喇叭单元的不同特性,优化组合,使得各单元扬长避短,淋漓尽致地发挥出各自应有的潜能,使各频段的频响变得平滑、声像相位准确,才能使高、中、低音播放出来的音乐层次分明、合拍,明朗、舒适、宽广、自然的音质效果。

基于FPGA的任意数值分频器的设计

基于FPGA的任意数值分频器的设计

3
11
16
4
第 36卷第 2期
周殿凤, 等: 基于 FPGA 的任意数值分频器的设计
# 技术应用 #
到了最大。
5 结束语
图 4 3 161分频器波形图
4 任意数值分频器
加入控制模块就可以将上述 4种分频器集成到一 起, 变成任意数值分频器, 顶层原理见图 5。
文中介绍了任意数值分频器的设计, 可以方便地 对占空比和分频系数进行调节而不需要重新编程, 整 个程序占用逻辑资源不到 EP2C35 芯片的千分之一。 本设计有很 大的 通用 性, 可以 在不 同的 FPGA 甚至 CPLD芯片间移植, 不管对初学者还是程序设计人员 都有一定的参考价值。
通过分析分频器的原理探索出了一套简单明了的设计方法设计了一个任意数值通用分频器整数分频器偶数分频器的设计较为简单可以利用计数器实2n分频当计数器的值为0在计数器值为2n1时复位计数器如此循环下去即可实现占空比为都是预置数不同分频系数也就不同如果预置数是奇数则可实现占空比不等于50的奇数分频
第 36卷第 2期 2010年 2月
[ 1] 张静亚. FPGA 系统设计中资源分配的分析和研 究 [ J]. 信 息化研究, 2009, 35( 3) : 37-39.
[ 2] 周子昂, 王福 源, 魏军 辉. 基于 FPGA 的通 用分 频 器设 计 [ J]. 微计算机学报, 2009, 25( 3-2): 207-209.
[ 3] 潘松, 黄 继业. EDA 技术 实用 教 程 [ M ] . 北京: 科学 出 版 社, 2006.
关键词: FPGA; VHDL; 分频器 中图分类号: TP277
0引 言
FPGA 作 为 未来 数 字 系统 的 3 大 基 石 ( FPGA、 D SP、CPU ) 之一, 成为 目前硬 件设 计研 究的重 点 [ 1 ] 。 在数字系统的设计中, 设计人员会遇到各种形式的分 频需求, 如偶数分频、奇数分频、半整数分频、小数分频 和分数分频等。在某些设计中, 系统不仅对频率有要 求, 而且对占空比也有严格的要求。由计数器或计数 器的级联构成各种形式的偶数分频及非等占空比的奇 数分频实现起来较为简单, 但对半整数分频及等占空 比的奇数分频实现较为困难, 小数分频和分数分频更 困难 [ 2] 。为了解决这一问题, 本文首先分析了各种分 频器的设计方法, 然后将其综合起来成为一个通用分 频器。通过分析分频器的原理, 探索出了一套简单明 了的设计方法, 设计了一个任意数值通用分频器, 该分 频器没有毛刺且占用的逻辑资源较少。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

任意数(整数、小数)分频器一、分频原理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为小数部分的位数。

则有:K=N+10-n *X 1K=M/P 2由式1和式2可得M=K*P=(N+10-n *X)*P 3令P约等于10n,则:M= 10n *N+X 4可知在进行次N分频时,多输入X个脉冲,则可实现小数分频。

1.3.2电路组成每个周期分频N+10-n.X,其电路双模前置小数分频器电路由÷N/N+1双模分频器、控制计数器和控制逻辑3部分组成。

当a点电平为0时,进行÷N分频;当a点电平为1时进行÷N+1分频。

适当设计控制逻辑,使在10n个分频周期中分频器有X 次进行÷N+1分频,这样,当从f o输出10n个脉冲时,在f i处输入了X.(N+1)+(10n-X).N个脉冲,也就是10n.N+X图1-2 双模前置分频电路结构图若是电路从N分频切换到N+1分频和从N+1分频切换到N 分频都会产生一个随时间增长的相位,如果简单的先进行n次N分频后做n1次N+1分频会产生很大的相位抖动。

所以采用“均匀”法将两种分频混合均匀。

具体方法如下:⑴:若K 为一位小数形式,则:设累加变量 a ;常量 b = 10 –小数位 * 10。

①:a >= 10 ,a = a – 10 。

以N分频;②:a <= 10 ,a = a + d 。

以N+1分频。

⑵:若K 为两位小数形式,则:设累加变量 a ;常量 b = 100 –小数位 * 100。

①:a >= 100 ,a = a – 100 。

以N分频;②:a <= 100 ,a = a + d 。

以N+1分频。

n 位小数依次类推。

二、设计方案及功能现实2.1设计方案本设计小数部分保留三位,根据上述原理控制逻辑输出flag控制N/N+1分频,flag为高电平时进行N+1倍分频,flag为低电平是进行N倍分频。

分频系数使用参数,可灵活更改。

当N为偶数,且flag=0(或N为奇数,且flag=1)时就择行偶数分频模块输出时钟;当N为奇数,且flag=0(或N为偶数,且flag=1)时就择行奇数分频模块输出时钟。

下面以分频系数为2.4以例讲述一下分频过程。

分频过程如表1-1所示,时序图如图1-3所示。

表1-1 分频系数为2.4的分频过程图1-3 2.4倍分频器时序图分频器的精度受控制计数器的影响,当 N 值100时,小数分频精度达到1/100,当N 值为1 000时,小数分频的精度达到1/1 000,依次类推。

因此,此分频器在分频系数值较小时相位误差大,故在实际应用中很少用,但应输出时钟较高,分频系数较大时还是可以满足一些应用的。

2.2功能现实分频系数可能通过参数INT_DIV或POI_DIV修改,方便应用于不同的程序。

程序代码如下所示。

若参数INT_DIV为0时,输出无时钟;当输入时钟占空比为50%,输出时钟占空比也为50%。

//*******************************************************//// 任意数(整数、小数)分频模块//// 原理:双模前置小数分频////*******************************************************////功能:对输入时钟clock进行(INT_DIV + POI_DIV/1000)倍分频后//输出clk_out。

其中INT_DIV为分频系数整数部分,POI_DIV为分频//系数小数部分,范围为1~2^n的任意数,小数点后保留三位。

其中//(n=INT_DIV_WIDTH)。

//若要改变分频系数,改变参数INT_DIV或POI_DIV到相应范围即可。

//若输入时钟占空比为50%。

当分频系数为整数倍时,则输出时钟占//空比为是50%,且误差为0;当分频系不为整数倍时,输出时钟的//每个周期占空比也为50%,只是输出时钟精度为:1/N (N为分频系//数的整数部分)。

所以当N越大时,其输出精度越高。

故当为小数//分频时,输出时钟误差大(宏观上是无误差或误差很小),不能//用于对时钟要求高的场合。

module float_div(clock,clk_out);//I/O口声明input clock; //输入时钟output clk_out; //输出时钟//内部寄存器reg clk_odd_p; //奇数倍分频上升沿输出时钟reg clk_odd_n; //奇数倍分频下降沿输出时钟reg clk_even; //偶数倍分频输出时钟reg[INT_DIV_WIDTH - 1:0] count_odd_p; //奇数倍分频上升沿脉冲计数器reg[INT_DIV_WIDTH - 1:0] count_odd_n; //奇数倍分频下降沿脉冲计数器reg[INT_DIV_WIDTH - 1:0] count_even_p; //偶数倍分频上升沿脉冲计数器reg[10:0] count_c; //N/N+1分频控制计数器reg flag; //N/N+1分频控制标志位//参数--分频系数<<<<<<<<<<<-----------------------分频系数在这里修改//注:小数部分分频值是保留三位。

同时INT_DIV的位宽INT_DIV_WIDTH也要与//之对应。

如分频系数为5.5,则INT_DIV=5,POI_DIV=500;//分频系数为2.145,则INT_DIV=2,POI_DIV=145;parameter INT_DIV = 5; //分频系数整数部分parameter POI_DIV = 0; //分频系数小数部分parameter INT_DIV_WIDTH = 16; //整数分频值计数器宽度//计数标志位wire even_full_div_p; //偶数倍分频上升沿计数满标志wire even_half_div_p; //偶数倍分频上升沿计数半满标志wire odd_full_div_p; //奇数倍分频上升沿计数满标志wire odd_half_div_p; //奇数倍分频上升沿计数半满标志wire odd_full_div_n; //奇数倍分频下降沿计数满标志wire odd_half_div_n; //奇数倍分频下降沿计数半满标志wire clk_odd; //奇数倍分频输出时钟//判断计数标志位置位与否assign even_full_div_p = INT_DIV[0] ?(count_even_p < INT_DIV) : (count_even_p < INT_DIV - 1);assign even_half_div_p = INT_DIV[0] ?(count_even_p < ((INT_DIV + 1)>>1) - 1) : (count_even_p < (INT_DIV>>1) - 1); assign odd_full_div_p = INT_DIV[0] ?(count_odd_p < INT_DIV - 1) : (count_odd_p < INT_DIV);assign odd_half_div_p = INT_DIV[0] ?(count_odd_p < (INT_DIV>>1) - 1) : (count_odd_p < ((INT_DIV + 1)>>1) - 1); assign odd_full_div_n = INT_DIV[0] ?(count_odd_n < INT_DIV) : (count_odd_n < INT_DIV + 1);assign odd_half_div_n = INT_DIV[0] ?(count_odd_n < (INT_DIV>>1) ) : (count_odd_n < ((INT_DIV + 1)>>1));//时钟输出assign clk_out = ((~flag && INT_DIV[0]) || (flag && ~INT_DIV[0])) ?((INT_DIV == 1) ? ~clock : clk_odd) : clk_even;//***************************************************************//偶数倍分频,只有分频系数为偶数时才使能计数//上升沿脉冲计数always @(posedge clock)beginif((INT_DIV[0] && ~flag) || (~INT_DIV[0] && flag))begincount_even_p <= 0;clk_even <= 1'b0;endelse if(even_full_div_p)begincount_even_p <= count_even_p + 1'b1;if(even_half_div_p)clk_even <= 1'b0;elseclk_even <= 1'b1;endelsebegincount_even_p <= 0;clk_even <= 1'b0;endend//***************************************************************//***************************************************************//奇数倍分频,只有分频系数为奇数时才使能计数//上升沿脉冲计数//如下面为三倍分频的时序图// 1 2 3 4 5 6//clock |---|__|---|__|---|__|---|__|---|__|---|__|//clk_odd_p |____|--------------|____|---------------|//clk_odd_n ---|____|---------------|____|-----------//clk_odd |______|-----------|_______|----------|always @(posedge clock)beginif((INT_DIV[0] && flag) || (~INT_DIV[0] && ~flag))begincount_odd_p <= 0;clk_odd_p <= 1'b0;endelse if(odd_full_div_p)begincount_odd_p <= count_odd_p + 1'b1;if(odd_half_div_p)clk_odd_p <= 1'b0;elseclk_odd_p <= 1'b1;endelsebegincount_odd_p <= 0;clk_odd_p <= 1'b0;endend//下降沿脉冲计数always @(negedge clock)beginif((INT_DIV[0] && flag) || (~INT_DIV[0] && ~flag))begincount_odd_n <= 0;clk_odd_n <= 1'b0;endelse if(odd_full_div_n)begincount_odd_n <= count_odd_n + 1'b1;if(odd_half_div_n)clk_odd_n <= 1'b0;elseclk_odd_n <= 1'b1;endelsebegincount_odd_n <= 1;clk_odd_n <= 1'b0;endendassign clk_odd = clk_odd_p && clk_odd_n; //输出奇数倍分频时钟//*************************************************************** //输出时钟脉冲控制计数器always @(negedge clk_out)begincount_c = count_c + 11'd1000 - POI_DIV[9:0];if(count_c >= 11'd1000)begincount_c = count_c - 11'd1000;flag = 1'b0; //控制N分频endelseflag = 1'b1; //控制N+1分频endendmodule。

相关文档
最新文档