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

合集下载

基于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%//说明:奇数分频。

一种基于Verilog的任意整数分频器实现方法

一种基于Verilog的任意整数分频器实现方法

一种基于Verilog的任意整数分频器实现方法谷涛;黄勇;卢晨【摘要】在分析基于Verilog的偶数分频程序和奇数分频程序的基础上,提出了一种基于Verilog的任意整数分频器的实现方法,并在QuartusⅡ平台上完成了基于这种实现方法的任意整数分频器的编程和综合,在Modelsim中完成了任意整数分频器的仿真获得通过.该文的Verilog程序可以直接引用,为此类程序实际提供借鉴.【期刊名称】《广西民族大学学报(自然科学版)》【年(卷),期】2015(021)004【总页数】5页(P62-66)【关键词】Verilog;偶数分频;奇数分频;任意整数分频【作者】谷涛;黄勇;卢晨【作者单位】广西民族大学信息科学与工程学院,广西南宁 530006;广西民族大学信息科学与工程学院,广西南宁 530006;广西民族大学信息科学与工程学院,广西南宁 530006【正文语种】中文【中图分类】TN740 引言1 任意整数分频器的实现框架Verilog HDL是电子设计的主流硬件描述语言之一(另一个是VHDL),采用硬件描述语言完成电路设计是当前数字电路设计的主流方法.Quartus II是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL 以及AHDL(Altera Hardware Description Language)等多种设计输入形式[1].Modelsim是MENTOR公司推出的业界最优秀的HDL语言仿真软件,Quartus II可以方便地调用Modelsim进行电路设计的RTL级和门级仿真.尽管在目前大部分设计中,可以使用芯片厂家集成的锁相环资源进行时钟的分频,但通过硬件描述语言设计的时钟分频电路可以节省芯片内部的锁相环资源,而且消耗不多的逻辑单元就可以达到对时钟操作的目的.所以在时钟要求不高的电路设计中,使用语言来说设计分频电路是必要的也是广泛应用的.笔者以Quartus II为设计平台,基于Verilog语言设计了一个任意整数分频器,并在Modelsim中完成仿真[2-3].任意整数不是奇数就是偶数,所以笔者的设计思路分别对输入时钟源进行奇分频和偶分频,然后再判断分频比是奇数还是偶数.如果是奇数则选择奇分频器输出的信号为最终输出信号(此时偶分频器在执行分频,但分频比不符合要求),如果是偶数则选择偶分频器输出的信号为最终输出信号(此时奇分频器在执行分频,但分频比不符合要求).电路构造简单,在一定程度上缩短了输入到输出的时延.任意整数分频器的实现框架如图1所示.如图1所示,输入信号clk分别经过奇数分频和偶数分频,然后根据分频比是奇数还是偶数,选择分频后的输出作为最终的输出信号clkk.分频比是奇数,选择奇数分频后的输出,是偶数则选择偶数分频后的输出.对于二进制形式的分频比k,只需要根据最后一位是1还是0即可判定它是奇数还是偶数.例如输入分频比是k [3∶0],可以根k[0]来判断分频比的奇偶性.图1 任意整数分频器的实现原理框图Fig.1Implementation principle of arbitrary integer frequency divider2 实现框架中各部分的原理2.1 奇数分频的实现原理k倍奇数分频有两种实现办法:1)首先进行k/2分频(带小数,即等于(k-1)/2+0.5),然后再进行二分频得到[4].这种办法需要先实现小数分频,比较麻烦,所以笔者采用第二种奇分频方法.2)通过计数器来实现.一般的方法为:对于实现占空比为50%的k倍奇数分频,首先进行输入时钟上升沿触发模k计数(从0计到k-1),计数到1时输出时钟翻转,然后经过(k-1)/2个脉冲上升沿计数到(k+1)/2时输出时钟再次翻转.然后继续计数,计到k-1时计数器清零继续计数,再次计到1时输出时钟再翻转一次.这样可以得到一个占空比非50%的奇数k分频时钟.再者同时进行输入时钟下降沿触发模k计数(从0计到k-1),计数到1时输出时钟翻转,然后经过(k-1)/2个脉冲下降沿计数到(k+1)/2时输出时钟再次翻转.然后继续计数,计到k-1时清零并继续计数,再次计到1时输出时钟再翻转一次.这样得到另一个占空比非50%的奇数k分频时钟.两个模k计数依次这样循环下去,得到的输出时钟为两个占空比非50%的输入时钟k分频.把它们相或运算,得到占空比为50%的奇数k分频时钟.以5分频为例,奇数分频的实现原理如图2.图2 5分频原理图Fig.2Schematic diagram of frequency divider(mode=5)以5分频为例,在图2中可以看到,k1内部的计数器对clk的上升沿计数,k1的输出波形初始为低电平,遇到第1个上升沿计0,遇到第2个上升沿计1,此时k1的输出波形翻转为高电平.遇到第3个上升沿计2,遇到第4个上升沿计3,此时k1的输出波形翻转为低电平.遇到第5个上升沿计4,第6个上升沿计数器清零,第7个上升沿计1,此时k1的输出波形再次翻转,为高电平.然后依次类推……我们可以看到从第2个上升沿到第7个上升沿之间,k1的输出波形形成了一个完整的脉冲.随着第8个及后续上升沿的到来,k1的计数器计数和输出波形依次循环下去.k1的输出波形是对clk的5分频,但占空比不是50%.k2的内部计数器计数和输出波形翻转办法与k1类似,只不过k2是对clk的下降沿计数.从图2中还可以看到把k1和k2相或,可以得到占空比为50%的5分频信号k.2.2 偶数分频的实现原理偶数分频原理为:当进行占空比为50%的k倍偶数分频时,可以由待分频信号clk 的上升沿去触发计数器计数.当计数器从0计数到(k/2)-1时,输出信号进行翻转,同时给计数器赋值为零.待分频信号clk的下一个上升沿到来时重新从0开始计数,计数到(k/2)-1时,输出信号再次进行翻转,计数器再次赋值为零,以此循环下去.采用这种方法可以实现占空比为50% 的任意偶数倍分频[5].这里不再做详细叙述.2.3 输出信号选择原理因为可以根据k[0]来判断分频比k[n∶0]的奇偶性,所以把k[0]作为选择输出信号的依据.k[0]=1选择奇数分频的输出作为最终输出信号,k[0]=0选择偶数分频的输出作为最终输出信号.这个在Verilog中可以用条件赋值语句实现,具体语句将在下面的程序中给出.3 任意整数k分频器的完整Verilog设计程序及测试程序3.1 任意整数k分频器的完整Verilog设计程序module kfenpin(rst_n,clk,k,clkk);//该例中任意整数k为输入值k程序中rst_n是全局的复位信号;clk是输入的待分频时钟信号;k是输入的分频比,该例程序中是4位二进制输入信号,可以改变位宽来达到实现更大分频比的目的;clkk是分频后的输出信号.3.2 任意整数k分频器的测试程序任意整数k分频器的测试程序如下:4 仿真结果在上述设计程序和测试程序下,在Quartus II程序中调用Modelsim,可以看到仿真结果.在测试程序中,k赋不同的值,就可以得到相应的分频输出.下面给出k=2,k=7,k=8的仿真结果:可以看到除了最初的几个周期外(具体几个周期与分频比有关),输出信号是输入信号的k分频.该例程序的2分频的仿真测试也可以通过.图3 k=2时的仿真结果(2分频输出)Fig.3The simulation results when k =2(2divider output)图4 k=7时的仿真结果(7分频输出)Fig.4The simulation results when k =7(7divider output)图5 k=8时的仿真结果(8分频输出)Fig.5The simulation results when k =8(8divider output)[参考文献]【相关文献】[1]潘松,等.EDA技术实用教程-Verilog HDL版[M].北京:科学出版社,2013.[2]帅旗.基于FPGA的全数字锁相环的设计与实现[D].大连理工大学工程硕士学位论文,2013.[3]张成.基于FPGA的全数字锁相环的设计与应用[D].合肥工业大学硕士学位论文,2010. [4]邓玉元,等.数字电路中等占空比分频器的实现[J].现代电子技术,2006(24). [5]黄国达.基于FPGA的任意整数分频器的设计[J].福建电脑,2013(7).。

VHDL任意整数的分频器的设计(从1到任意位)

VHDL任意整数的分频器的设计(从1到任意位)

1、按键去抖电路的设计一、按键电路常用的非编码键盘,每个键都是一个常开开关电路。

计数器输入脉冲最好不要直接接普通的按键开关,因为记数器的记数速度非常快,按键、触点等接触时会有多次接通和断开的现象。

我们感觉不到,可是记数器却都记录了下来。

例如,虽然只按了1下,记数器可能记了3下。

因此,使用按键的记数电路都会增加单稳态电路避免记数错误。

二、按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。

由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。

这是一个很重要的时间参数,在很多场合都要用到。

按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。

键抖动会引起一次按键被误读多次。

为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。

在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。

按键的抖动,可用硬件或软件两种方法。

三、硬件消抖在键数较少时可用硬件方法消除键抖动。

下图所示的RS触发器为常用的硬件去抖。

图中两个“与非”门构成一个RS触发器。

当按键未按下时,输出为1;当键按下时,输出为0。

此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。

也就是说,即使B 点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。

这一点通过分析RS触发器的工作过程很容易得到验证。

利用电容的放电延时,采用并联电容法,也可以实现硬件消抖:四、软件延时消抖如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。

任意整数分频器的设计

任意整数分频器的设计

XX大学课程设计报告设计题目:任意整数分频器的设计姓名:XX学号:XX院系:信息工程学院专业:电子信息科学与技术年级:XXXX 年XX 月XX 日任意整数分频器时序电路设计中需要各种各样的分频器来获得不同频率的时钟,其中以整数分频器最为常见。

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

本设计主要利用计数器完成题目要求。

利用仿真工具Modelsim仿真及Quartus综合验证该程序的正确性。

一、设计要求:1。

查找相关资料理解常见的数字分频方法。

2. 使用Verilog或VHDL完成任意整数分频器的编码.3。

在QuartusII中使用原理图或代码形式,进行分频器设计.4。

在QuartusII或ModelSim中完成仿真分析。

二、设计思路:任意整数分频器由两部分构成,奇数分频器和偶数分频器。

其中偶数分频器由以下四部分构成:1、时钟信号2、频率字(选择为4位)3、计数器4、反相器。

奇数分频器则由两个偶数分频器加一个异或门构成。

根据设计要求:定义输入信号为时钟信号clk,输入频率字D,计数器为temp1,temp2,temp3,中间输出信号为division2,division4,out1,最终输出信号是FOUT,其中偶频输出信号就是out1,奇频输出信号就是division2 XOR division4。

偶分频:输入一个任意偶数,每来一个上升沿,temp1加一,设定其在temp1=1时开始反转,实现高低电平的转换,即out1<=not out1,当temp1等于输入D/2时,temp1又归为1,又开始了新一轮的计数,这样就完成了分频。

奇分频:输入一个任意奇数D,奇分频是用两个偶分频异或完成的,因此我们使用了这样一种方法,两个偶分频周期为2D倍,一个在上升沿来到时反转电平,另一个在下降沿到来时反转电平,并且两个分频的反转时刻错开D/2。

基于FPGA的任意小数分频的实现

基于FPGA的任意小数分频的实现

桂林航天工业高等专科学校学报
OF GUILIN COLLEGE OF AEROSPACE
TECHNOLOGY毛为勇祁中洋王兰/文
count-----count+11

这两种情况了。因此,有必要对连续扣除两个或两个以上 脉冲的情况予以处理: 当分频系数X满足I<X<2时。不会出现连续扣除两 个脉冲的现象;而当X>2时,则一定会出现连续扣除诱个 脉冲的现象。因此,可以作如下处理: 假设存在正整数M,使 M<X<M十1 则
—194.
[6]周冬成,王永斌,郑亚平.基于FPGA的小数分频频率合成器设计[J].电子测量技术,2006,29(3):79—93. (责任编辑李卫华)
32
万方数据
X=Mq-燕=坠垛掣
系:
文章编号:1009--1033(2009)01--0030--03
(1)
整数时,从订尚可以得到任意一个小数,就可以从理
论上实现任意小数分频比的分频.由于o≤∑鳓·∥≤
1,(口。=o,1),所以从工程角度可以进一步构造出下列关
其中,N,和N:均为整数。当N1和N2取不同的正
而得到的小数分频——用一个半整数分频器和一个整数分
●d●to

电路实现
FPGA现场可编程阵列是20世纪80年代中期出现的
高密度可编程逻辑器件。FPGA及其软件系统是开发数字 电路的最新技术。它利用EDA技术,以硬件描述语育 (VHDL和Verilog HDL)、电路原理图等形式输入设计逻 辑;它提供功能仿真和时序仿真等仿真手段,在功能仿真和 时序仿真被满足之后,经过一系列的变换,将输入逻辑转换
群‰2争q1
(2)
式(2)有明确的物理意义,它的右边实际上是个多位累 加器。例如,要把13MHz的时钟信号分频为8MHz的时

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

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

任意数(整数、小数)分频器一、分频原理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小数分频小数分频有很多方法,基本原理都是一样,在若干分频周期中,使某几个周期多计或少计一个数,从而在整个周期的总体平均意义上获得一个小数分频比。

设:K为分频系数;N为分频系数的整数部分;X为分频系数的小数部分;M为输入脉冲个数;P为输入脉冲个数;n为小数部分的位数。

  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。

相关文档
最新文档