用Verilog语言实现任意整数分频器

合集下载

Verilog实现任意分频

Verilog实现任意分频

Verilog实现任意分频在Verilog中实现任意分频可以通过使用计数器和分频比例来实现。

下面是一个基于计数器的Verilog代码示例,用于实现任意分频。

```verilogmodule frequency_dividerinput clk,input rst,input [7:0] div_ratio,output reg outreg [7:0] count;beginif (rst)count <= 0;else if (count == div_ratio - 1)count <= 0;elsecount <= count + 1;endbeginif (rst)out <= 0;else if (count == div_ratio - 1)out <= ~out;endendmodule```在以上代码中,我们定义了一个名为"`frequency_divider`"的模块,该模块具有以下输入和输出:- `clk`:时钟信号- `rst`:复位信号- `div_ratio`:分频比例,使用8位二进制表示,范围为0到255- `out`:输出信号我们使用一个8位计数器(`count`)来进行分频。

每当计数器达到分频比例减1时,输出信号取反。

例如,如果分频比例为1,则输出信号将与时钟信号同步;如果分频比例为2,则输出信号将是时钟信号的一半频率;如果分频比例为4,则输出信号将是时钟信号的四分之一频率,以此类推。

需要注意的是,以上示例代码仅展示了分频的基本原理,并未考虑输入和输出信号的时序问题,如使 `div_ratio` 在运行时可更改、输出信号的不稳定性等。

针对具体应用需求,可以根据实际情况做出适当的修改和调整。

希望以上内容对您有所帮助!。

实验六Verilog设计分频器计数器电路

实验六Verilog设计分频器计数器电路

实验六Verilog设计分频器/计数器电路一、实验目的1进一步掌握最基本时序电路的实现方法;2学习分频器/计数器时序电路程序的编写方法;3进一步学习同步和异步时序电路程序的编写方法。

二、实验内容1、用Verilog设计一个10分频的分频器,要求输入为clock(上升沿有效),reset(低电平复位),输出clockout为5个clock周期的低电平,5个clock周期的高电平),文件命名为fenpinqi10.v。

2、用Verilog设计一异步清零的十进制加法计数器,要求输入为时钟端CLK(上升沿)和异步清除端CLR(高电平复位),输出为进位端C和4位计数输出端Q,文件命名为couter10.v。

3、用Verilog设计8位同步二进制加减法计数器,输入为时钟端CLK(上升沿有效)和异步清除端CLR(低电平有效),加减控制端UPDOWN,当UPDOWN为1时执行加法计数,为0时执行减法计数;输出为进位端C和8位计数输出端Q,文件命名为couter8.v。

4、用VERILOG设计一可变模数计数器,设计要求:令输入信号M1和M0控制计数模,当M1M0=00时为模18加法计数器;M1M0=01时为模4加法计数器;当M1M0=10时为模12加法计数器;M1M0=11时为模6加法计数器,输入clk上升沿有效,文件命名为mcout5.v。

5、VerilogHDL设计有时钟时能的两位十进制计数器,有时钟使能的两位十进制计数器的元件符号如图所示,CLK是时钟输入端,上升沿有效;ENA是时钟使能控制输入端,高电平有效,当ENA=1时,时钟CLK才能输入;CLR是复位输入端,高电平有效,异步清零;Q[3..0]是计数器低4位状态输出端,Q[7..0]是高4位状态输出端;COUT是进位输出端。

三、实验步骤:第一个实验:1、打开QuartusII,新建一个工程f_fenpinq10yjq2、新建一个Verilog HDL文件3、输入程序:module fenpinqi10(clk,reset,clkout);input clk,reset;output clkout;reg clkout;reg[2:0] cnt;always @(posedge clk , negedge reset)beginif(!reset)begin clkout<=0;cnt<=0;endelse if(cnt==4)begin cnt<=0;clkout<=~clkout;endelse cnt<=cnt+1;endendmodule4、设置顶层实体名(点settings>general >下拉选fenpinqi10)5、编译6、执行file>Create/Update>Create Symbol Files for Current Flie为VHDI设计文件生成原件符号7、建立波形文件8、导入引脚9、仿真结果如下:总结:仿真结果与实验一的题意相符,所以仿真正确。

Verilog实现奇数和偶数分频器和半整数及任意小数分频器程序

Verilog实现奇数和偶数分频器和半整数及任意小数分频器程序

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的FPGA整数分频器设计及仿真

基于Verilog的FPGA整数分频器设计及仿真

基于Verilog的FPGA整数分频器设计及仿真张泽;刘慧慧;田涛;梁天泰;周英杰【摘要】A brief introduction for the main clock division method was given,put forward limitations of FPGA internal PLL frequency divider,and gave the integer divide method based on Verilog HDL.Wrote Verilog HDL program,realized an arbitrary integer divider that the duty cycle is 50% and based on the hardware platform of the bined with Quartus development platform and Modelsim simulation software validation,the results showed that the frequency division method is simple and practical.By using this method,the replacement value of N can realize any integer frequency divider that duty cycle.%简单介绍了主要的时钟分频方法,提出了FPGA内部PLL分频的局限性,给出了基于 Ver-ilog HDL的整数分频方法。

编写了Verilog HDL程序,实现了基于 FPGA 硬件平台的占空比为50%的任意整数分频。

结合 Quartus开发平台和Modelsim仿真软件验证表明,该分频方法简单、实用。

采用该方法,替换N值可实现任意整数等占空比的分频。

【期刊名称】《新技术新工艺》【年(卷),期】2015(000)004【总页数】3页(P40-42)【关键词】Verilog HDL;FPGA;计数;分频;仿真;占空比【作者】张泽;刘慧慧;田涛;梁天泰;周英杰【作者单位】北京工业大学机电学院,北京 100124;北京石油化工学院光机电装备技术北京市重点实验室,北京 102617;北京工业大学机电学院,北京 100124;北京石油化工学院光机电装备技术北京市重点实验室,北京 102617;北京化工大学机电工程学院,北京 100029【正文语种】中文【中图分类】TN40在大部分时钟电路设计中, 首先考虑的方法是集成的锁相环资源,如使用Xilinx的DLL或ALTERA的PLL模块对时钟分频设计;但芯片内部的DLL或PLL资源十分有限,所以设计一些基本时钟电路时,往往采用高频晶振产生高频率的脉冲,然后通过分频方法进行分频,得到不同频率的脉冲。

VERILOG 分频原理

VERILOG 分频原理

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分频时钟。

verilog分频器的设计原理

verilog分频器的设计原理

Verilog分频器的设计原理一、概述Verilog分频器是数字电路设计中常用的一个模块,它可以将输入的时钟信号分频成较低频率的信号。

在数字系统中,分频器的应用非常广泛,可以用于时钟频率控制、时序信号生成等领域。

本文将介绍Verilog分频器的设计原理,帮助读者了解其工作原理和实现方法。

二、分频器的基本结构1. 分频器的概念分频器是一种能够将输入时钟信号分频成较低频率的信号的电路。

在数字系统中,分频器通常用于降低时钟频率,以满足某些特定的时序要求。

其基本原理是通过对输入时钟信号进行计数和判断,当计数值达到一定阈值时输出一个时钟脉冲,从而实现对输入信号的分频操作。

2. 分频器的基本结构一个简单的分频器通常由计数器和触发逻辑两部分组成。

计数器用于对输入信号进行计数,触发逻辑用于判断计数值是否达到分频的要求,并生成相应的时钟脉冲输出。

根据计数器的位宽和触发逻辑的设计,可以实现不同的分频比。

三、Verilog分频器的设计原理1. Verilog分频器的模块化设计在Verilog中,通常将分频器设计为一个独立的模块,通过实例化和连接可以方便地集成到更大的数字系统中。

分频器的模块化设计可以使其具有良好的可重用性和扩展性,提高数字系统的整体设计效率。

2. Verilog分频器的时序要求在Verilog中设计分频器时,需要考虑到时钟信号的时序要求。

由于分频器通常用于时序控制,因此需要保证分频的输出信号能够与系统中其他模块的时钟信号同步,避免出现不稳定和不可预测的情况。

3. Verilog分频器的实现方法在Verilog中,可以使用寄存器、计数器和逻辑门等原语来实现分频器的功能。

通过合理的组合和连接这些原语,可以实现不同的分频比和时钟脉冲输出。

Verilog语言本身对于多种数字逻辑的建模和描述具有很好的支持,可以方便地实现各种分频器的设计。

四、Verilog分频器的设计实例1. 2分频器的设计以2分频器为例,其实现原理比较简单。

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

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

1、按键去抖电路的设计、按键电路常用的非编码键盘,每个键都是一个常开开关电路计数器输入脉冲最好不要直接接普通的按键开关, 因为记数器的记数速度非 常快,按键、触点等接触时会有多次接通和断开的现象。

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

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

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

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

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

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

抖动时间的长短由按键的机械特性决定,一般为5ms- 10ms 这是一 个很重要的时间参数,在很多场合都要用到。

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

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

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

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

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

AT89S51VCC丄2 3 4、硬件消抖在键数较少时可用硬件方法消除键抖动。

下图所示的RS触发器为常用的硬~1 1~无弹跳件去抖图中两个“与非”门构成一个RS触发器。

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

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

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

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

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

基于verilog的分频器设计 (可实现任意整数分频)

基于verilog的分频器设计 (可实现任意整数分频)

1. 讲废话此,有时候在我们的设计中或多或少会需要用到不同频率的时钟信号,这就要求我们对系统时钟进行分频。

如果你现在去网上搜索关于FPGA分频器的设计,会有不少大牛已经做出来了。

比如“任意奇数分频” “任意偶数分频” “任意小数分频” ,类似云云。

作为一个爱折腾的小菜,我总是觉得,搞这么多好麻烦哦,我不就是需要分一下频嘛,干哈还要整出这么多样式出来,顿时觉得不会再爱了。

后来的后来,我实在受不了这么多种分频方法给我带来的困扰和烦恼,决定来一个大统一,把“任意偶数分频”和“任意奇数分频” 整合成一个模块,实现“任意整数分频”。

所以,各位大大们,如果实在没事儿,就不要再“捡肥皂”了,试一试下面的分频方法吧,相信会让你在以后的FPGA道路上走得更加顺畅和游刃有余。

2. 晒干货例化时,仅需要按您的需求修改代码中带★号的参数 ps. 这里只有一处需要修改/*********************************************************************** *******************Author: Bob LiuE-mail:shuangfeiyanworld@Device: EP2C8Q208C8Tool: Quartus 8.1Function: 实现时钟的任意分频Version: 2012-1-9 v1.0************************************************************************ ********************/module div_N (input CLK, // 基准时钟output CLK_div_N // N分频后得到的时钟);wire [31:0] N=20; // ★ N为分频系数,N≥2即可,N的值为CLK除以CLK_div_N后取整(四舍五入)/******************** 产生备用时钟1 ***************/reg [31:0] cnt1;reg CLK_div_N_1;always @ (posedge CLK)beginif(N[0]==0) // 如果N为偶数,比N%2==0这种判断方式更节省资源beginif(N==2) // 如果N为2CLK_div_N_1 <= ~CLK_div_N_1;elsebeginif(cnt1==((N-2)>>1)) //比cnt1==(N-2)/2这种判断方式更节省资源begincnt1 <= 0;CLK_div_N_1 <= ~CLK_div_N_1;endelsecnt1 <= cnt1+1;endendelse // 如果N为奇数beginif(cnt1==N-1)cnt1 <= 0;elsecnt1 <= cnt1+1;if((cnt1==N-1) || (cnt1==(N-1)/2))CLK_div_N_1 <= ~CLK_div_N_1;else ;endend/*********************** 产生备用时钟2 *********************/wire CLK0=(N%2)? (~CLK):0; // 如果N为偶数,备用时钟2(CLK_div_N_2)恒为0,即不需要用到此备用时钟reg [31:0] cnt2;reg CLK_div_N_2;always @ (posedge CLK0)beginif(cnt2==N-1)cnt2 <= 0;elsecnt2 <= cnt2+1;if((cnt2==N-1) || (cnt2==(N-1)/2))CLK_div_N_2 <= ~CLK_div_N_2;end/******************** 产生最终分频时钟************************/assign CLK_div_N = CLK_div_N_1 | CLK_div_N_2;endmodule3. 扯犊子忘了交代一点,上面的设计可实现任意整数分频,任意小数分频这样的精度要求还没有加进去,请小伙伴儿们见谅啊。

分频的verilog语言实现

分频的verilog语言实现

分频的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%可以采用:用两个计数器,一个由输入时钟下降沿触发,一个由输入时钟的上升沿触发,最后将两个计数器的输出进行相或,就可得到。

Verilog-实现任意占空比、任意分频的方法

Verilog-实现任意占空比、任意分频的方法

Verilog-实现任意占空比、任意分频(fēn pín)的方法Verilog-实现任意占空比、任意分频(fēn pín)的方法分频(fēn pín)程序虽然简单,但我觉得由简入难是学习的一个必然阶段,慢慢的我们自然会成长起来。

所以如果有时间的话,大家都可以将自己的这种“小程序(chéngxù)”贴到论坛上来。

如果你的程序好,其他人也可以学习;如果你的程序有问题,大家可以一起(yīqǐ)帮你找问题,共同进步。

还有,我觉得在发贴的时候,最好能将原理说一下。

一来大家看你的贴能学到东西;二来也方便解答你的问题,不然(bùrán)还得解答者自己去找资料搞懂原理,然后再回答你,回答你问题的人自然(zìrán)也就不多了。

说了一些题外话,下面转入正文:在verilog程序设计中,我们往往要对一个频率进行任意分频,而且占空比也有一定的要求这样的话,对于程序有一定的要求,现在我在前人经验的基础上做一个简单的总结,实现对一个频率的任意占空比的任意分频。

比如:我们FPGA系统时钟是50M Hz,而我们要产生的频率是880Hz,那么,我们需要对系统时钟进行分频。

我们很容易想到用计数的方式来分频:50000000/880 = 56818这个数字不是2的整幂次方,那么怎么办呢?我们可以设定一个参数,让它到56818的时候重新计数不就完了吗?呵呵,程序如下:module div(clk, clk_div);input clk;output clk_div;reg [15:0] counter;always @(posedge clk)if(counter==56817) counter <= 0;else counter <= counter+1;assign clk_div = counter[15];endmodule//module div(clk,rst,clk_div);input clk,rst;output reg clk_div;reg[15:0] counter;salways@(posedge clk)if(!rst)begincounter<=0;clk_div<=0;endelse if (counter==56817)begincounter<=0;clk_div<~clk_div;endelsecounter<=counter+1;endmodule下面我们来算一下它的占空比:我们清楚地知道,这个(zhè ge)输出波形在counter为0到32767的时候(shí hou)为低,在32767到56817的时候(shí hou)为高,占空比为40%多一些,如果(rúguǒ)我们需要占空比为50%,那么(nàme)怎么办呢?不用急,慢慢来。

用Verilog语言实现任意整数分频器

用Verilog语言实现任意整数分频器

用Verilog语言实现任意整数分频器分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相环资源,如赛灵思(Xilinx)的DLL.来进行时钟的分频,倍频以及相移。

但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相移仍然非常流行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单元就可以达到对时钟操作的目的。

另一方面,通过语言设计进行时钟分频,可以看出设计者对设计语言的理解程度。

因此很多招聘单位在招聘时往往要求应聘者写一个分频器(比如奇数分频)以考核应聘人员的设计水平和理解程度。

下面讲讲对各种分频系数进行分频的方法:第一,偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。

如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。

以此循环下去。

这种方法可以实现任意的偶数分频。

电路上只需一个D触发器和一个非门即可实现,Q(n+1)=D,D=~Q(n),clk_out=Q(n+1) .第二,奇数倍分频:奇数倍分频常常在论坛上有人问起,实际上,奇数倍分频有两种实现方法:占空比为非50%的三分频时钟,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。

即是在计数值在邻近的1和2进行了两次翻转。

这样实现的三分频占空比为1/3或者2/3。

module three(clk_in,rst,clk_out); // 三倍频inputclk_in,rst;output clk_out;reg clk_out;reg [1:0] count;always @(negedgerst or posedgeclk_in)beginif(rst==0) begin count<=0; clk_out<=0; endelsebegin count<=count+1;if(count==1) clk_out<=~clk_out;else if(count==2) begin clk_out=~clk_out; count<=0; endendendendmodule仿真图另一种实现:module div3(CLKIN,CLKOUT,RESETn); //依然是三倍频inputCLKIN,RESETn;output CLKOUT;wire d;wireCLKOUT;reg q1,q2;always @(negedgeRESETn or posedge CLKIN)beginif (RESETn==1'b0)q1<=1'b0;elseq1<=d; //q1是d延迟一个时钟后的信号endalways @(negedgeRESETn or posedge CLKIN)beginif (RESETn==1'b0) q2<=1'b0;elseq2<=q1; //q2是q1延迟一个时钟后的信号endassign d=~q1 & ~q2; //d在一个周期内,一个clk为高,另外两个clk为低assign CLKOUT=q2;endmodule仿真图电路中,利用两个D触发器和简单的门电路即可实现。

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

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

一种基于Verilog的任意整数分频器实现方法
谷涛;黄勇;卢晨
【期刊名称】《广西民族大学学报(自然科学版)》
【年(卷),期】2015(021)004
【摘要】在分析基于Verilog的偶数分频程序和奇数分频程序的基础上,提出了一种基于Verilog的任意整数分频器的实现方法,并在QuartusⅡ平台上完成了基于这种实现方法的任意整数分频器的编程和综合,在Modelsim中完成了任意整数分频器的仿真获得通过.该文的Verilog程序可以直接引用,为此类程序实际提供借鉴.【总页数】5页(P62-66)
【作者】谷涛;黄勇;卢晨
【作者单位】广西民族大学信息科学与工程学院,广西南宁 530006;广西民族大学信息科学与工程学院,广西南宁 530006;广西民族大学信息科学与工程学院,广西南宁 530006
【正文语种】中文
【中图分类】TN74
【相关文献】
1.一种任意比率电子齿轮分频器的实现方法 [J], 申建广;陶涛;梅雪松;许睦旬;刘善慧;彭志会
2.基于Verilog的FPGA整数分频器设计及仿真 [J], 张泽;刘慧慧;田涛;梁天泰;周英杰
3.一种基于Verilog代码的任意分数分频器的设计 [J], 任青莲;李东红
4.一种基于FPGA的任意分频器设计与实现 [J], 李炯
5.基于CPLD的任意整数半整数分频器设计 [J], 许永贤
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用Verilog语言实现任意整数分频器分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相环资源,如赛灵思(Xilinx)的DLL.来进行时钟的分频,倍频以及相移。

但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相移仍然非常流行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单元就可以达到对时钟操作的目的。

另一方面,通过语言设计进行时钟分频,可以看出设计者对设计语言的理解程度。

因此很多招聘单位在招聘时往往要求应聘者写一个分频器(比如奇数分频)以考核应聘人员的设计水平和理解程度。

下面讲讲对各种分频系数进行分频的方法:第一,偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。

如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。

以此循环下去。

这种方法可以实现任意的偶数分频。

电路上只需一个D触发器和一个非门即可实现,Q(n+1)=D,D=~Q(n),clk_out=Q(n+1) .第二,奇数倍分频:奇数倍分频常常在论坛上有人问起,实际上,奇数倍分频有两种实现方法:占空比为非50%的三分频时钟,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。

即是在计数值在邻近的1和2进行了两次翻转。

这样实现的三分频占空比为1/3或者2/3。

module three(clk_in,rst,clk_out); // 三倍频inputclk_in,rst;output clk_out;reg clk_out;reg [1:0] count;always @(negedgerst or posedgeclk_in)beginif(rst==0) begin count<=0; clk_out<=0; endelsebegin count<=count+1;if(count==1) clk_out<=~clk_out;else if(count==2) begin clk_out=~clk_out; count<=0; endendendendmodule仿真图另一种实现:module div3(CLKIN,CLKOUT,RESETn); //依然是三倍频inputCLKIN,RESETn;output CLKOUT;wire d;wireCLKOUT;reg q1,q2;always @(negedgeRESETn or posedge CLKIN)beginif (RESETn==1'b0)q1<=1'b0;elseq1<=d; //q1是d延迟一个时钟后的信号endalways @(negedgeRESETn or posedge CLKIN)beginif (RESETn==1'b0) q2<=1'b0;elseq2<=q1; //q2是q1延迟一个时钟后的信号endassign d=~q1 & ~q2; //d在一个周期内,一个clk为高,另外两个clk为低assign CLKOUT=q2;endmodule仿真图电路中,利用两个D触发器和简单的门电路即可实现。

如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。

这种方法可以实现任意的奇数分频。

归类为一般的方法为:●对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。

●再者同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。

●两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。

举例:用Verilog语言写的三分频电路方法一://上升沿触发的分频设计module three(clkin, clkout);input clkin;//定义输入端口output clkout;//定义输出端?reg [1:0] step1, step;always @(posedgeclkin)begincase (step) //这个状态机就是一个计数器2'b00: step<=2'b01;2'b01: step<=2'b10;2'b10: step<=2'b00;default :step<=2'b00;endcaseendalways @(negedgeclkin) //step1与step相差半个clkbegincase (step1)2'b00: step1<=2'b01;2'b01: step1<=2'b10;2'b10: step1<=2'b00;default :step1<=2'b00;endcaseendassign clkout=step[1] | step1[1]; //利用step和step1高位的或运算,实现在1.5个clk时翻转。

endmodule用Verilog语言写五分频电路,占空比为50%:module div_5 ( clkin,rst,clkout );input clkin,rst;output clkout;reg [2:0] step1, step2;always @(posedgeclkin )if(!rst)step1<=3'b000;elsebegincase (step1)3'b000: step1<=3'b001;3'b001: step1<=3'b011;3'b011: step1<=3'b100;3'b100: step1<=3'b010;3'b010: step1<=3'b000;default:step1<=3'b000;endcaseendalways @(negedgeclkin )if(!rst)step2<=3'b000;elsebegincase (step2)3'b000: step2<=3'b001;3'b001: step2<=3'b011; //注意调换了顺序,目的为了使最低位为1的情况互邻3'b011: step2<=3'b100;3'b100: step2<=3'b010;3'b010: step2<=3'b000;default:step2<=3'b000;endcaseendassign clkout=step1[0] | step2[0]; //step1与step2 最低位相或endmodule下面给出一个任意整数分频器的代码:module divn(clk,rst_n,o_clk);input clk,rst_n;output o_clk;parameter WIDTH = 3;parameter N = 5;reg [WIDTH-1:0] cnt_p,cnt_n; //count_pose,count_negeregclk_p,clk_n;assign o_clk = (N==1)? clk : (N[0])?(clk_p&clk_n) :clk_p;//如果N=1,o_clk=clk; 如果N为偶数,o_clk=clk_p; 如果N为奇数,o_clk=clk_p&clk_n,//之所以是相与运算,是因为clk_p和clk_n两者高电平比低电平多一个clk,而两者相差半个clk,相与结果使o_clk占空比为50%always @ (posedgeclk or negedgerst_n)if(!rst_n)cnt_p<=0;else if (cnt_p==(N-1))cnt_p<=0;else cnt_p<=cnt_p+1;always @ (posedgeclk or negedgerst_n)if(!rst_n)clk_p<=0;else if (cnt_p<(N>>1))clk_p<=0; //N>>1,计数到N/2时,时钟翻转。

如果将cnt_p<改成cnt_p<=,则clk_p低电平比//高电平多一个clk,如果clk_n也做类似修改,则N为奇数时,应执行相或运算,o_clk=clk_p | clk_nelse clk_p<=1;always @ (negedgeclk or negedgerst_n)if(!rst_n)cnt_n<=0;else if (cnt_n==(N-1))cnt_n<=0;else cnt_n<=cnt_n+1;always @ (negedgeclk or negedgerst_n)if(!rst_n)clk_n<=0;else if (cnt_n<(N>>1))clk_n<=0;else clk_n<=1;endmodule另外一种方法:对进行奇数倍n分频时钟,首先进行n/2分频(带小数,即等于(n-1)/2+0.5),然后再进行二分频得到。

得到占空比为50%的奇数倍分频。

小数分频(分子不为1)下面讲讲进行小数分频的设计方法小数分频:首先讲讲如何进行n+0.5分频,这种分频需要对输入时钟进行操作。

基本的设计思想:对于进行n+0.5分频,首先进行模n的计数,在计数到n-1时,输出时钟赋为‘1’,回到计数0时,又赋为0,因此,可以知道,当计数值为n-1时,输出时钟才为1,因此,只要保持计数值n-1为半个输入时钟周期,即实现了n+0.5分频时钟,因此保持n-1为半个时钟周期即是一个难点。

相关文档
最新文档