任意分频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` 在运行时可更改、输出信号的不稳定性等。

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

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

verilogHDL分频器(奇数分频和偶数分频)

verilogHDL分频器(奇数分频和偶数分频)

module clk_div(//-----------input-----------iCLK,div,//-----------output----------oCLK);//-----------input-----------parameter WIDE=14;input iCLK;input[WIDE-1:0]div;//-----------output-----------output oCLK;wire oCLK_odd;wire oCLK_even;assign oCLK=div[0]?oCLK_odd:oCLK_even;div_odd DUTo (.iCLK(iCLK),.oCLK(oCLK_odd),.div(div)); div_even DUTe (.iCLK(iCLK),.oCLK(oCLK_even),.div(div));endmodule// oddmodule div_odd(//--------input--------iCLK,div,//--------output--------oCLK);//--------input--------parameter WIDE=14;input iCLK;input[WIDE-1:0]div;//--------output--------output oCLK;reg outCLK;/*=========================== solve 1=========================== reg cout;reg[WIDE-1:0] cnt;initial cnt=0;wire inCLK;reg cc;initial cc=0;always @(posedge cout)cc<=~cc;assign inCLK = iCLK^cc;always @(posedge inCLK)beginif(cnt<(div[WIDE-1:1]))begincnt<=cnt+1;cout<=1'b0;endelsebegincnt<=0;cout<=1'b1;endendalways @(negedge iCLK)outCLK <= cout;assign oCLK=cc;*///======================== //solve 2//======================== reg[WIDE-1:0] cnt_a;initial cnt_a=0;reg[WIDE-1:0] cnt_b;initial cnt_b=0; reg cout_a;reg cout_b;always @(negedge iCLK)beginelse if(cnt_a<=(div[WIDE-1:1]))begincnt_a=cnt_a+1;cout_a=1'b1;endelse if(cnt_a>(div[WIDE-1:1])&&cnt_a<(div[WIDE-1:0]-1))begincout_a=1'b0;cnt_a=cnt_a+1;endelsebegincnt_a=0;endendalways @(posedge iCLK)beginif(cnt_b<=(div[WIDE-1:1]))begincnt_b=cnt_b+1;cout_b=1'b1;endelse if(cnt_b>(div[WIDE-1:1])&&cnt_b<(div[WIDE-1:0]-1))begincout_b=1'b0;cnt_b=cnt_b+1;endelsebegincnt_b=0;endendassign oCLK = cout_a&cout_b;endmodule//evenmodule div_even(//--------input--------iCLK,div,//--------output--------oCLK);//--------input--------parameter WIDE=14;input iCLK;input[WIDE-1:0]div;//--------output--------output oCLK;reg oCLK;initial oCLK = 1'b0;reg[WIDE-1:0] cnt;initial oCLK = 0;always @(posedge iCLK)beginif(cnt<(div[WIDE-1:1]-1))cnt <= cnt + 1;elsebegincnt <= 0;oCLK <= ~oCLK;endendendmodule//============================//testbench//============================/*module clk_div_test;//-----------input-----------parameter WIDE=14;reg iCLK;reg[WIDE-1:0] div;//-----------output-----------wire oCLK;clk_div cc(.iCLK(iCLK),.div(div),.oCLK(oCLK));always #20 iCLK = ~iCLK;initialbeginiCLK = 0;div=14'd7;#1000 $stop;endendmodule*/module clk_div14bits(clk,a,clkout);input clk,a;output clkout;reg clkout;wire oCLK1,oCLK2;clk_div cc1(.div(14'd8),.iCLK(iCLK),.oCLK(oCLK1)); clk_div cc2(.div(14'd9),.iCLK(iCLK),.oCLK(oCLK2));always @(a or posedge clkin)beginif(a==1)clkout=oCLK1;elseclkout=oCLK2;endendmodule//测试代码//testbenchmodule clk_div14bits_test;//-----------input-----------parameter WIDE=14;reg clk;reg[WIDE-1:0] div;//-----------output-----------wire oCLK;clk_div14bits cc3(.clk(clk),.a(a),.clkout(clkout)); always #20 clk = ~clk;initialbeginiCLK = 0;div=14'd7;#1000 $stop;EndModelsim仿真结果1.七分频2.四分频。

实验六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语言实现奇数倍分频电路3分频5分频7分频

用Verilog语言实现奇数倍分频电路3分频5分频7分频

用Verilog语言实现奇数倍分频电路3分频5分频7分频Verilog是一种硬件描述语言(HDL),用于描述数字电路的行为和结构。

使用Verilog语言实现奇数倍分频电路可以分为以下几个步骤:1.定义输入和输出端口通过module关键字定义一个模块,并指定输入和输出端口的信号。

```verilogmodule OddDividerinput clk,output reg out_3x,output reg out_5x,output reg out_7x```2.定义局部变量和计数器定义一个局部变量和一个计数器,用于跟踪时钟周期并确定何时输出。

```verilogreg [2:0] count;```3.实现分频逻辑使用always块,根据计数器的值判断何时输出,并在输出端口上更新信号。

```verilogif (count == 3'b000) beginout_3x <= !out_3x;endif (count == 3'b001) beginout_5x <= !out_5x;endif (count == 3'b010) beginout_7x <= !out_7x;endcount <= count + 1;end```4.结束模块使用endmodule关键字结束模块定义。

```verilogendmodule完整的Verilog代码如下:```verilogmodule OddDividerinput clk,output reg out_3x,output reg out_5x,output reg out_7xreg [2:0] count;if (count == 3'b000) begin out_3x <= !out_3x;endif (count == 3'b001) begin out_5x <= !out_5x;endif (count == 3'b010) begin out_7x <= !out_7x;endcount <= count + 1;endmodule```以上代码实现了一个奇数倍分频电路,其中输入时钟信号为`clk`,输出分别是3倍分频的信号`out_3x`,5倍分频的信号`out_5x`和7倍分频的信号`out_7x`。

用verilog实现任意倍分频器的方法

用verilog实现任意倍分频器的方法

用verilog语言写的任意整数的分频器占空比:对于一串理想的脉冲序列中(如方波),正脉冲的持续时间与脉冲总周期的比值,叫做这个方波的占空比。

分频分为奇分频和偶分频第一,偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。

如进行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-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。

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

另外一种方法:对进行奇数倍n分频时钟,首先进行n/2分频(带小数,即等于(n-1)/2+0.5),然后再进行二分频得到。

verilog时钟分频设计

verilog时钟分频设计

verilog时钟分频设计1.偶分频模块设计偶分频意思是时钟模块设计最为简单。

首先得到分频系数M和计数器值N。

M = 时钟输入频率 / 时钟输出频率N = M / 2如输入时钟为50M,输出时钟为25M,则M=2,N=1。

偶分频则意味着M为偶数。

以M=4,N=2为例,我们希望得到的输出时钟时序如下:因此只需要将counter以clk_in为时钟驱动计数,当counter = (N-1)时,clk_out翻转即可。

verilog代码如下,其中WIDTH为(N的位宽-1):module time_adv_even #(parameter N = 2,WIDTH = 7)(input clk,input rst,output reg clk_out);reg [WIDTH:0]counter;always @(posedge clk or posedge rst) beginif (rst) begin// resetcounter <= 0;endelse if (counter == N-1) begincounter <= 0;endelse begincounter <= counter + 1;endendalways @(posedge clk or posedge rst) beginif (rst) begin// resetclk_out <= 0;endelse if (counter == N-1) beginclk_out <= !clk_out;endendendmoduletestbench测试8分频即N=4,ISE仿真结果如下:2.奇分频模块设计奇分频需要通过两个时钟共同得到。

首先得到分频系数M和计数器值N。

M = 时钟输入频率 / 时钟输出频率N = (M-1) / 2如输入时钟为50M,输出时钟为10M,则M=5,N=2。

奇分频则意味着M为奇数。

Verilog 常用语法及举例

Verilog 常用语法及举例
1,仅仅用于组合逻辑赋值。 2,用于条件赋值。 3,被赋值者类型必须是wire。
常用语句之五 for
for (i == 0; i< 100 ; i= i+1)
1,用于循环语句中。 2,循环次数必须是个常量。 3,i为integer(整型)类型。
小练习
1,分频电路设计,设计一个8分频。 2,设计一个0~23的计数器,在数码管上显示出来。 3,改进上述计数器,增加一个拨码输入,当拨码 为0时,数码管上显示一个固定值。当拨码为1时, 计数器继续计数。 4,按键去抖设计。每按键一次,数码管显示加1。 5,电子密码锁设计。
阻塞赋值与非阻塞赋值
阻塞赋值用在组合逻辑中。在always中使用 符号 = 非阻塞赋值用在时序逻辑中。在always中使 用符号 <=
阻塞赋值与非阻塞赋值
阻塞赋值 always @ (a,b,c) begin b = a; c = b; end
a
a
非阻塞赋值
always @ (posedge clk) begin b <= a; c <= b; end
常用语句之三 begin end
If (a == b)
begin c <= d; e <= f; g <= h; end 1,begin—end里面的所 有语句都是顺序执行。
常用语句之四 assign
assign a = b & c; assign a = (d ==1’b0) ? 0 : 1;
a b c b c
组合逻辑和时序逻辑
时序逻辑
时序逻辑需要时钟,输入变化不会引起输出立即变化。 而是要参考时钟沿的变化。 只能用非阻塞赋值的always语句实现。 结果会生产寄存器。

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设计

6. 偶数分频器的设计rate=even(偶数),占空比50%设计原理:定义一个计数器对输入时钟进行计数,(1)在计数的前一半时间里,输出高电平,(2)在计数的后一半时间里,输出低电平,这样输出的信号就是占空比为50%的偶数分频信号。

例如,设计一个6分频电路。

对什么计数?①计数值为0~2输出高电平,②计数值为3~5输出低电平。

上升沿计数一个计数周期0112分频module divder_even(clkin,clkout);parameter n=2;input clkin;output clkout;integer cnt;reg clkout;always@(posedge clkin)beginif(cnt<n-1) cnt<=cnt+1;else cnt<=0;endalways@(cnt)beginif(cnt<n/2) clkout<=1'b1;else clkout<=1'b0;end endmodule计数过程判断赋值过程module divder_even(clkin,clkout);parameter n=2;input clkin;output clkout;integer cnt;reg clkout;always@(posedge clkin)beginif(cnt==n/2-1)begincnt<=0;clkout<=~clkout;endelse cnt<=cnt+1;endendmodule 2分频分析4分频分析二分频四分频知识小结1.移位寄存器的verilog描述。

2.偶数分频的verilog描述。

作业1.设计一个5位串入并出的移位寄存器。

Clear :同步清零;clkin :时钟输入;databit :位输入y[4..0]并行数据输出;2.设计一个4位并入串出的移位寄存器Clear :同步清零;clkin :时钟输入(移位);dataIn :并行数据输入,y :串行数据输出。

verilog硬件描述语言课程设计

verilog硬件描述语言课程设计

Verilog课程设计题函数发生器(方波和阶梯波)目学生姓名:专业:班级:指导教师:完成日期:目录1、概述 (1)2、功能 (2)3设计方案(设计的技术方案、工作原理、设计框图) (3)4设计与仿真 (11)5、结束语 (14)6附录 (15)1.概述(1)实验目的:在基于QUARTUS2软件平台下,运用Verilog硬件描述语言来进行编写两种波形(方波和阶梯波)发生的程序,并结合DE2板与DVCC 实验板上的D/A转换器在示波器显示出波形。

初步了解Verilog的编程及DE2板的应用,加强对其的实际应用操作能力。

(2)实验要求:运用DE2上的DAC实现方波、阶梯信号发生器功能。

方波频率、占空比可设置。

阶梯波信号频率、幅度可调。

在完成基本要求的基础上,可进一步增加功能、提高性能。

2.功能实验内容:5 . 利用简易函数发生器基本要求:运用DE2上的DAC实现方波、阶梯信号发生器功能。

方波频率、占空比可设置。

阶梯波信号频率、幅度可调。

在完成基本要求的基础上,可进一步增加功能、提高性能。

3设计方案(1)设计流程图(2)波形产生的基本原理 时钟信号累加器设置时钟信号f_clk设置频率控制字p利用存储器存储32个采样点:16个梯形波采样点,16个方波采样点设置选择端口choose16个阶梯波采样点0~15 16个方波采样点16~31Choose=0 Choose=1送至输出端口data 输出程序结束1.先利用时钟信号f_clk产生一个工作频率,输入的频率字保存在频率寄存器中,经N位相位累加器,累加一次,相位步进增加,经过内部ROM波形表得到相应的幅度值,经过D/A转换和低通滤波器得到合成的波形。

2.利用存储器,先把定点值存入存储器中,再通过choose选择所需要的那段地址的值,在通过data读出值。

3.最后利用波形仿真,通过转换把数字量转换为波形图。

(3)产生波形频率可调的方法采用设置频率控制字的方法,设置一个输入端口【5:0】q,并且下载时将其绑定在6个控制开关上,可以实现频率的调整,采用2进制,q的值就是频率的缩小(扩大)倍数。

数字集成电路课程设计

数字集成电路课程设计

摘要Verilog HDL是一种硬件描述语言,是EDA技术的重要组成部分。

使用HDL 进行数字系统设计是电子设计技术的发展趋势和方向,因此学好这门知识并能够灵活运用于课程设计是非常有必要也非常有意义的。

本次设计主要实现了一个任意分频器的简单功能。

主要有以下两种方案:(一)对被分频时钟的上升沿和下降沿同时计数,计数到分频系数的一半时,对输出时钟进行电平翻转,从而得到占空比为50%的分频时钟。

(二)对被分频时钟的上升沿和下降沿分别计数,得到一个上升沿分频时钟clk_p 和一个下降沿分频时钟clk_q,最后通过对这两个时钟进行相应的逻辑运算,便可得到占空比为50%的输出时钟。

在仿真过程中,主要遇到的问题是无法综合。

经讨论思考发现对同一时钟的上升沿和下降沿同时进行操作时,Quartus II将无法对这一行为进行综合。

最后,为解决综合的问题,我们对程序进行了必要的修改。

最终,我们经过比较选择了方案(二),实现了预期的目标。

【关键词】Verilog HDL 任意分频器半整数分频综合ABSTRACTVerilog HDL is a hardware description language which is an important part of EDA technology. Nowadays,using HDL to design Digital systems is the development trend of electronic design technologies. So it is very necessary and very meaningful to learn this course and develop the ability to apply the knowledge learned to curriculum design flexibly.This design mainly realized a simple function of frequency divider at any frequency coefficients . Basically,we have the following two schemes:First: counting at the rise and fall of the input clock simultaneously, when arrive at half of the frequency coefficients, overturn the output clock, so a clock whose duty ratio is 50% can be achieved;Second: to get a clk_p at the rise of the input clock and a clk_q at the fall of the input clock respectively, then through the corresponding logic operation of the two clock,the wanted output clock can be easily achieved.In the debugging process, the main problem is unable to be synthesized. After discussion and reflection,we found that operations on one clock’s rise and fall at the same time are unable to be synthesized by Quartus II. Finally, in order to solve the problem, we have the program changed where is necessary and we choose the second scheme to meet the desired goals by comparison.【Key words】Verilog HDL Synthesize Divide at any Frequency Coefficients Frequency Division at Half an Integer第一章系统设计第一节课题目标及总体方案《集成电路设计》是一门专业性、技术性、应用性很强的学科,实验课教学是它的一个极为重要的环节。

分频器设计——50MHZ(含verilog程序)

分频器设计——50MHZ(含verilog程序)

分频器设计一、实验目的1、熟悉分频器的原理;2、掌握采用Verilog HDL 语言设计分频器的方法;3、进一步学习利用VerilogHDL 语言进行层次设计的方法。

二、实验内容1、采用Verilog 语言设计一个十分频器,记录Verilog 程序;2、对十分频器进行功能仿真,观察仿真波形;3、仿真没有问题后,将分频比改为50000000,实现一个50M 分频器。

利用此分频器和开发板上的50MHz 时钟信号,得到1Hz 的秒脉冲信号,完成如图1-2.28所示的秒计数器。

50M分频器50MHz 脉冲信号二位十进制计数器1Hz 秒脉冲数码管(个位)数码管(十位)复位和计数使能(拨码开关)程序设计如下:module fenp(clk_out,clk_in,reset);output clk_out;input clk_in;input reset;reg [1:0] cnt;reg clk_out;always@(posedge clk_in or posedge reset)beginif(reset)begincnt<=0;clk_out<=0;endelsebeginif(cnt==24999999)beginclk_out<=!clk_out;cnt<=0;endelsecnt<=cnt+1;endendendmodule本程序经验证,完全可以实现实验要求。

文章来自某大学EDA实验课。

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

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

分频程序虽然简单,但我觉得由简入难是学习的一个必然阶段,慢慢的我们自然会成长起来。

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

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

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

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

说了一些题外话,下面转入正文:在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下面我们来算一下它的占空比:我们清楚地知道,这个输出波形在counter 为0到32767的时候为低,在32767到56817的时候为高,占空比为40%多一些,如果我们需要占空比为50%,那么怎么办呢?不用急,慢慢来。

我们再设定一个参数,使它为56817的一半,使达到它的时候波形翻转,那不就完了吗?呵呵,再看看:module div(clk, clk_div);input clk;output clk_div;reg [14:0] counter;always @(posedge clk)if(counter==28408) counter <= 0;else counter <= counter+1;reg clk_div;always @(posedge clk)if(counter==28408) clk_div <= ~clk_div;endmodule占空比是不是神奇地变成50%了呢?呵呵。

实现任意整数分频电路设计

实现任意整数分频电路设计

《现代数字系统设计》实现任意整数分频电路设要求:占空比50%,分频系数可以通过拨码开关设定。

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity fenpin isport(input : in std_logic_vector(7 downto 0);led1: out std_logic_vector(6 downto 0);led2: out std_logic_vector(6 downto 0);clk_in : in std_logic;clk_out : out std_logic);end entity fenpin;architecture div of fenpin iscomponent decoder is ----decoderport(bin : in std_logic_vector(3 downto 0);de : out std_logic_vector(6 downto 0));end component;signal clk_outQ : std_logic ;signal coutQ : std_logic_vector (7 downto 0);signal cout1,cout2 : std_logic_vector(7 downto 0);signal clk1,clk2 : std_logic;signal a : std_logic;beginu1: decoder port map(bin=>input(3)&input(2)&input(1)&input (0),de=>led1);u2: decoder port map(bin=>input(7)&input(6)&input(5)&input (4),de=>led2);-------------------------------------------------process(clk_in)beginif clk_in'event and clk_in = '1' then --时钟上升沿if coutQ < (conv_integer(input)-1 ) thencoutQ <= coutQ + 1;--计数else coutQ <= (others => '0');--清零end if;if coutQ < (conv_integer(input))/2 thenclk_outQ <= '0';else clk_outQ <= '1';end if;--如果计数没有达到input/2,clk_outQ为0,达到为1 end if;end process;---------------------------------------------------process(clk_in)------rising edgebeginif clk_in'event and clk_in='1' then--输入时钟上升沿if 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' then--下降沿if 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) thenclk_out <= clk_outQ;--input为偶数elseclk_out <= clk1 or clk2;--input为奇数end if;end process;end architecture div;library ieee;use ieee.std_logic_1164.all;entity decoder isport(bin : in std_logic_vector(3 downto 0);de: out std_logic_vector(6 downto 0)); end entity;---------------------------------------------------- architecture deco of decoder isbeginprocess(bin)begincase bin iswhen "0000" => de <= "0111111";---0 when "0001" => de <= "0000110";---1 when "0010" => de <= "1011011";---2 when "0011" => de <= "1001111";---3 when "0100" => de <= "1100110";---4 when "0101" => de <= "1101101";---5 when "0110" => de <= "1111101";---6 when "0111" => de <= "0000111";---7 when "1000" => de <= "1111111";---8 when "1001" => de <= "1101111";---9 when "1010" => de <= "1110111";---A when "1011" => de <= "1111100";---b when "1100" => de <= "0111001";---C when "1101" => de <= "1011110";---d when "1110" => de <= "1111011";---e when others=> de <= "1110001";---Fend case;end process;end architecture;。

verilog奇偶分频、一段式、两段式、三段式状态机

verilog奇偶分频、一段式、两段式、三段式状态机

汇报总结1、偶数分频偶数倍分频相对简单,可以通过计数器对预分频的脉冲沿计数实现,如果要进行N倍(N为整数)偶数分频,可由预分频的时钟触发计数器计数,当计数器从0计数到N/2—1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数,以此循环下去。

分频的主体程序如下:`define div_en 8module freq_div_even(clk_in,reset,clk_out);input clk_in;input reset;output clk_out;reg clk_out;reg[2:0] count;initialbegincount=0;clk_out=0;endalways@(posedge clk_in)beginif(!reset)begincount<=0;clk_out<=0;endelseif(count==(`div_en/2-1))beginclk_out<=~clk_out;count<=0;endelsebegincount<=count+1;endendendmodule下面定义N为8,对一个脉冲8分频,测试程序如下:`timescale 1ns/1nsmodule testbench;reg reset;reg clk_in;reg[2:0] count;wire clk_out;freq_div_even test(.clk_in(clk_in),.reset(reset),.clk_out(clk_out));initialbeginreset=0;clk_in=0;#5 reset=1;endalways #10 clk_in=~clk_in;endmodule波形图如下:2、奇数分频对于对占空比没有特殊要求的奇数分频,需要对上升沿和下降沿脉冲进行计数,利用下降沿产生的波形移相半个输入脉冲的作用,最后用错位“异或”法实现。

Verilog实现三分频的多种方法(附有代码)

Verilog实现三分频的多种方法(附有代码)

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

关于分频器的FPGA实现整理思路

关于分频器的FPGA实现整理思路

关于分频器的FPGA实现整理思路分频器是⽤的最⼴的⼀种FPGA电路了,我最初使⽤的是crazybingo的⼀个任意分频器,可以实现⾼精度任意分频的⼀个通⽤模块,他的思想在于⾸先指定计数器的位宽⽐如32位,那么这个计数器的最⼤值就是2^32=4294967296,假设系统时钟为50MHz,那么假如要想实现输出频率为fout,那么可以使⽤的频率控制字为:K满⾜关系:,那么设计计数器在每个时钟上升沿累加的值为K,当计数值为2^31时,clkout=1;否则clkout=0.最终即可以实现任意频率的输出,精度的计算⽅法为当K=1时,可以得到clkout=0.0116415321826934814453125Hz,也即是说可以输出的最⼩频率为0.011Hz此外我们最为常见的分频器分为以下4种分析:1.偶数分频最简单,要想得到分频系数为N的频率输出,设定⼀个计数器,这个计数器从零开始加1,当加到N/2-1时计数器清零,或者clkout翻转,以此循环,即可实现偶数倍分频。

2.奇数分频(分占空⽐不确定以及占空⽐50%)⽅法⼀:分频系数为N,占总⽐不确定:以三(N)分频为例,上升沿触发计数,计数器计数到1(N-1)/2时输出时钟翻转,计数到2(N-1)时再次翻转.代码为产⽣1/11占空⽐为⼗⼀分频时钟:在计数值为9和10时均反转时钟,是产⽣抽样脉冲的有效⽅法:always @(posedge clk or posedge rst) beginif(rst)begin//复位cnt<=0;clk_div11<=0;endelseif(cnt==9) beginclk_div11<=~clk_div11; //时钟翻转cnt<=cnt+1; //继续计数endelseif(cnt==10) beginclk_div11<=~clk_div11; //时钟翻转cnt<=0; //计数清零endelsecnt<=cnt+1;end占空⽐50% ,则可以在上⾯的基础上,加上⼀个下降沿触发计数,然后将上升沿和下降沿产⽣的时钟进⾏相或运算,即可得到奇数分频输出。

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

1. 偶数倍(2N)分频使用一模N计数器模块即可实现,即每当模N计数器上升沿从0开始计数至N-1时,输出时钟进行翻转,同时给计数器一复位信号使之从0开始重新计数,以此循环即可。

偶数倍分频原理示意图见图1。

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

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

(2)占空比为50%的分频,设计思想如下:基于(1)中占空比为非50%的输出时钟在输入时钟的上升沿触发翻转;若在同一个输入时钟周期内,此计数器的两次输出时钟翻转分别在与(1)中对应的下降沿触发翻转,输出的时钟与(1)中输出的时钟进行逻辑或,即可得到占空比为50%的奇数倍分频时钟。

当然其输出端再与偶数倍分频器串接则可以实现偶数倍分频。

奇数倍分频原理示意图见图2。

(这也是许多公司常出的面试题,^_^,是不是很简单?)3. N-0.5倍分频采用模N计数器可以实现。

具体如下:计数器从0开始上升沿计数,计数达到N-1上升沿时,输出时钟需翻转,由于分频值为N-0.5,所以在时钟翻转后经历0.5个周期时,计数器输出时钟必须进行再次翻转,即当CLK为下降沿时计数器的输入端应为上升沿脉冲,使计数器计数达到N而复位为0重新开始计数同时输出时钟翻转。

这个过程所要做的就是对CLK进行适当的变换,使之送给计数器的触发时钟每经历N-0.5个周期就翻转一次。

N-0.5倍:取N=3,分频原理示意图见图3。

对于任意的N+A/B倍分频(N、A、B∈Z,A≦B)分别设计一个分频值为N和分频值N+1的整数分频器,采用脉冲计数来控制单位时间内两个分频器出现的次数,从而获得所需要的小数分频值。

可以采取如下方法来计算个子出现的频率:设N出现的频率为a,则N×a+(N+1)×(B-a)=N×B+A 求解a=B-A; 所以N+1出现的频率为 A.例如实现7+2/5分频,取a为3,即7×3+8×2就可以实现。

但是由于这种小数分频输出的时钟脉冲抖动很大,现实中很少使用。

通常实现偶数的分频比较容易,以十分频为例:always @( posedge clk or posedge reset)if(reset)begink<=0;clk_10<=0;endelseif(k==4)begink<=0;clk_10<=~clk_10;endelsek<=k+1;二分频最简单了,一句话就可以了:always @ (negedge clk) clk_2<=~clk_2; 若进行奇数分频,则稍微麻烦点,以11分频为例:always @( posedge clk)if(!reset)begini<=0;clk11<=0;endelseif(i==5)beginclk11<=~clk11;i<=i+1;endelseif(i==10)begini<=0;clk11<=~clk11;endelsei<=i+1;以上语句虽然可以实现,但是逻辑有点繁,弄不好就出错了,建议使用两个always语句来实现:always @( posedge clk)if(!reset)i<=0;elsebeginif(i==10)i<=0;elsei<=i+1;endalways @( posedge clk)if(!reset)clk11<=0;elseif((i==5)|(i==10))clk11<=~clk11;两个always,一个用来计数,一个用来置数。

另外,这个样子好像也可以,在时钟的上升沿和下降沿都计数,但是不被综合器综合,会提示敏感信号太复杂:always @( posedge clk or negedge clk)if(reset)begink<=0;clk_11<=0;endelseif(k==10)begink<=0;clk_11<=~clk_11;endelsek<=k+1;1.2 奇数倍分频奇数倍分频有两种实现方法,其中之一完全可以通过计数器来实现,如进行三分频,就可通过待分频时钟上升沿触发计数器来进行模三计数,当计数器计数到邻近值时进行两次翻转。

比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。

这样,就在计数值邻近的1和2进行了两次翻转。

如此便实现了三分频,其占空比为1/3或2/3。

占空比1/15的15分频设计的主要代码如下:如果要实现占空比为50%的三分频时钟,则可通过待分频时钟下降沿触发计数,并以和上升沿同样的方法计数进行三分频,然后对下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算。

即可得到占空比为50%的三分频时钟这是奇数分频的第三种方法。

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

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

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

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

图2所示是占空比为1:1的3分频电路原理图。

图3为其仿真波形。

2 半整数分频器设计进行n+0.5分频一般需要对输入时钟先进行操作。

其基本设计思想是:首先进行模n的计数,在计数到n-1时,将输出时钟赋为1,而当回到计数0时,又赋为0,这样,当计数值为n-1时,输出时钟才为1,因此,只要保持计数值n-1为半个输入时钟周期,即可实现n+0.5分频时钟。

因此,保持n-1为半个时钟周期即是该设计的关键。

从中可以发现,因为计数器是通过时钟上升沿计数,故可在计数为n-1时对计数触发时钟进行翻转,那么,时钟的下降沿就变成了上升沿。

即在计数值为n-1期间的时钟下降沿变成了上升沿,也就是说,计数值n-1只保持了半个时钟周期。

由于时钟翻转下降沿变成上升沿,因此,计数值变为0。

所以,每产生一个n+0.5分频时钟的周期,触发时钟都要翻转一次。

图4给出了通用的半整数分频器的电路原理图。

图5所示是一个分频系数为 2.5的分频器电路,该电路是用FPGA来设计半整数分频器的。

它由模3计数器、异或门和D触发器组成。

图6是其仿真波形图。

3 任意整数带小数分频任意整数带小数分频的基本原理是采用脉冲吞吐计数器和锁相环技术先设计两个不同分频比的整数分频器,然后通过控制单位时间内两种分频比出现的不同次数来获得所需要的小数分频值。

若设计一个分频系数为10.1的分频器,即可以将分频器设计成9次10分频和1次11分频,这样,总的分频值为:F=(9×10+1×11)/(9+1)=10.1从这种实现方法的特点可以看出,由于分频器的分频值不断改变,分频后得到的信号抖动一般较大。

当分频系数为N-0.5(N为整数)时,可控制扣除脉冲的时间,以使输出成为一个稳定的脉冲频率,而不是一次N 分频,一次N-1分频。

一般而言,这种分频由于分频输出的时钟脉冲抖动很大,故在设计中的使用已经非常少。

但是,这也是可以实现的。

总结:由3分频可以推得任意奇数分频。

对于任意奇数(2n-1)的50%占空比分频,则计数器cnt的模值为(2n-1),假设信号1为上升沿触发,在cnt=0时跳变,则信号2为下降沿触发,在cnt=n 时跳变。

这样就保持信号1和信号2间间隔(2n-1)/2 的周期,在(2n-1)×2 的周期内clkout为两个周期,实现了(2n-1)的50%占空比分频。

比如要7分频,则计数器的模值为7,信号S2在cnt=4时跳变即可。

实现的verilog源码:module fdiv ( clk, reset_n, clkout );input clk;input reset_n;output clkout;reg [1:0] count;reg div1;reg div2;always @(posedge clk)beginif ( reset_n )count <= 2'b00;elsecase ( count )2'b00 : count <= 2'b01;2'b01 : count <= 2'b10;2'b10 : count <= 2'b00;default :count <= 2'b00;endcaseendalways @( posedge reset_n or posedge clk )beginif ( reset_n )div1 <= 1'b1;else if ( count == 2'b00 )div1 <= ~ div1;endalways @( posedge reset_n or negedge clk ) beginif ( reset_n )div2 <= 1'b1;else if ( count == 2'b10 )div2 <= ~ div2;endassign clkout = div1 ^ div2;endmodule。

相关文档
最新文档