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

合集下载

基于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 技术的发展经历了一个由浅到深的过程。

任意数值分频器的FPGA实现

任意数值分频器的FPGA实现

任意数值分频器的FPGA实现郜继红;荀延龙;卢旭盛【摘要】A multi-value frequency divider design based on FPGA is described, it can achieve that its the duty cycle and the frequency division factor are adjustable, the dividing valve can be integer, decimal or fractional. The simulation results and the test results are showed, the frequency divider use Altera Corporation CycloneⅡseries EP2C5Q208C chip to complete the configuring and functions, the test results showed that the design is correctness and feasibility. The frequency divider is programmed by VHDL language, users can set its function by self, the frequency divider design has very practical and portability.%本文介绍了一种基于FPGA的多数值分频器的设计,该分频器可以实现占空比及分频系数可调,其分频数值可以是整数、小数和分数. 文章给出了使用Altera公司的CycloneII系列EP2C5Q208C型FPGA芯片中实现后的仿真结果和测试结果,这些结果表明设计的正确性和可行性.分频器采用VHDL语言编程实现,用户可以自行设置分频器功能,这种分频器设计具有很强的实用性和可移值性.【期刊名称】《电子设计工程》【年(卷),期】2015(023)022【总页数】3页(P122-124)【关键词】FPGA;VHDL;任意数值;分频器;数字设计【作者】郜继红;荀延龙;卢旭盛【作者单位】内蒙古工业大学电力学院, 内蒙古呼和浩特 010051;内蒙古工业大学信息学院, 内蒙古呼和浩特 010051;内蒙古工业大学电力学院, 内蒙古呼和浩特 010051【正文语种】中文【中图分类】TN77FPGA是数字系统主流控制器之一,成为目前硬件设计的研究重点[1]。

关于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中,一般外接的晶振是50Mhz,如果电路中一个模块需要25mhz时钟,那么进行一个2分频,这个是相当容易的,下面是一种方法,还有可以用一个二进制计数器实现。

process(clk)--clk输入时钟;beginif(rst = '0') then --rst复位信号;clkout <= '0';elsif(clk;event and clk = '1')thenclkout <= not clk;end if;end process;但是如果实现一个三分频呢?是不是3分频器应该是每1.5的clock就0变1、1变0,但问题来了,哪来的1.5个clock?计数器并不能产生1.5!正源触发与负源触发的间隔时间刚好是0.5个clock?所以我们产生两个clock,一个是posedge clk,一个是negedge clk,最后将两个clock做or,这样就可以产生出0.5个clock了。

下面给出代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clk_div_n isport(clk : in std_logic;rst : in std_logic;clkout :out std_logic);end clk_div_n;architecture rtl of clk_div_n isconstant n : integer range 0 to 10 := 6; --这里的n可以是任意值,当然要大于1.signal clk_p : std_logic;signal clk_n : std_logic;signal cnt_p : integer range 0 to n;signal cnt_n : integer range 0 to n;beginprocess(clk_p, clk_n)beginif((n mod 2) = 0)thenclkout <= clk_p;elseclkout <= clk_p or clk_n;end if;end process;process(clk, rst)beginif(rst = '0') thencnt_p <= 0;elsif(clk'event and clk = '1') thenif(cnt_p = n-1) thencnt_p <= 0;elsecnt_p <= cnt_p + 1;end if;end if;end process;process(clk, rst)beginif(rst = '0') thenclk_p <= '0';elsif(clk'event and clk = '1')thenif (cnt_p < (n/2)) thenclk_p <= '1';elseclk_p <= '0';end if ;end if;end process;process(clk, rst)beginif(rst = '0') thencnt_n <= 0;elsif(clk'event and clk = '0')thenif(cnt_n = n-1) thencnt_n <= 0;elsecnt_n <= cnt_n + 1;end if;end if;end process;process(clk, rst)beginif(rst = '0') thenclk_n <= '0';elsif(clk'event and clk = '0')thenif (cnt_n < (n/2)) thenclk_n <= '1';elseclk_n <= '0';end if ;end if;end process;end rtl;接下来我给出对应的testbench::有兴趣可以用make a simulation in modelsim LIBRARY ieee ;USE ieee.std_logic_1164.all ;USE ieee.std_logic_arith.all ;USE ieee.std_logic_unsigned.all ;ENTITY clk_div_n_tb ISEND clk_div_n_tb;ARCHITECTURE clk_div_tb_arch OF clk_div_n_tb ISSIGNAL clkout : std_logic ;SIGNAL rst : std_logic := '0' ;SIGNAL clk : std_logic := '1' ;COMPONENT clk_div_nPORT (clk : in std_logic ;rst : in std_logic ;clkout : out std_logic);END COMPONENT ;BEGINprocessbeginwait for 50ns;clk <= not clk;end process;rst <= '1' after 200ns;test:clk_div_nPORT MAP (clk => clk,rst => rst,clkout => clkout) ;END clk_div_tb_arch;。

一种小数_整数分频器电路及其实现方法[发明专利]

一种小数_整数分频器电路及其实现方法[发明专利]

专利名称:一种小数_整数分频器电路及其实现方法专利类型:发明专利
发明人:郭斌
申请号:CN201410494264.7
申请日:20140925
公开号:CN104300975A
公开日:
20150121
专利内容由知识产权出版社提供
摘要:本发明公开了一种小数_整数分频电路及其实现方法,包括正交时钟产生模块,吞脉冲电路,二分频器,模式控制模块以及时钟选择模块;首先,初始时钟通过正交时钟产生模块产生互为正交的两对差分时钟信号;其次,MODE信号通过模式控制模块产生吞脉冲控制信号,确定吞脉冲的次数;最后,时钟选择模块选择输出时钟。

本电路通过编程MODE控制信号和时钟选择信号,可以实现不同整数和小数分频因子的分频,具有频率分辨率高、分频因子范围大以及模块重复利用率高的特性。

本分频器适用于可编程小数分频锁相环、频率综合器以及其他时钟系统设计领域。

申请人:长沙景嘉微电子股份有限公司
地址:410205 湖南省长沙市岳麓区麓景路2号长沙生产力促进中心
国籍:CN
更多信息请下载全文后查看。

使用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)的方波。

基于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、半整数分频占空比不为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%//说明:奇数分频。

  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所示。

图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。

相关文档
最新文档