Verilog各种倍分频器设计
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.四分频。
vorilog分频器设计
一、含异步清零和同步时钟的四位加法计数器代码如下:module lww(clk,rst,ena,dout,cout); //模块名cnt4binput clk,rst,ena; //输入信号output[3:0]dout; //计数输出output cout; //进位输出reg[3:0]ent; //计数器assign cout=&ent; //进位输出assign dout=ent; //计数器输出always@(posedge clk or negedge rst)beginif(rst==1'b0) //异步清零,低电平有效ent<=4'h0;else if (ena==1'b1) //同步使能计数,高电平有效ent<=ent+1'b1;endendmodule二、Verilog多种方法设计38译码器代码如下:module decoder_38(data_in ,EN ,Y) ;input [2:0] data_in ;input EN ;output [7:0] Y ;reg [7:0] Y ;always @(data_in or EN )beginif (EN == 1)case (data_in )3'b000: Y = 8'b11111110;3'b001: Y = 8'b11111101;3'b010: Y = 8'b11111011;3'b011: Y = 8'b11110111;3'b100: Y = 8'b11101111;3'b101: Y = 8'b11011111;3'b110: Y = 8'b10111111;3'b111: Y = 8'b01111111;default:Y = 8'bxxxxxxxx;endcaseelseY = 8'b11111111;endendmodulemodule decoder_38(out,in) ;input [2:0] in ;output [7:0] out;reg [7:0] out ;always @(in)begincase (in)3'd0: out= 8'b11111110;3'd1: out= 8'b11111101;3'd2: out= 8'b11111011;3'd3: out= 8'b11110111;3'd4: out= 8'b11101111;3'd5: out= 8'b11011111;3'd6: out= 8'b10111111;3'd7: out= 8'b01111111;endcaseendendmodulemodule decode38u2 (data_in ,EN ,Y) ;input [2:0] data_in ;input EN ;output [7:0] Y ;reg [7:0] Y ;always @(data_in or EN )beginif (EN == 1)if (data_in == 3'b000 ) Y = 8'b11111110;else if (data_in == 3'b001 ) Y = 8'b11111101;else if (data_in == 3'b010 ) Y = 8'b11111011;else if (data_in == 3'b011 ) Y = 8'b11110111;else if (data_in == 3'b100 ) Y = 8'b11101111;else if (data_in == 3'b101 ) Y = 8'b11011111;else if (data_in == 3'b110 ) Y = 8'b10111111;else if (data_in == 3'b111 ) Y = 8'b01111111;else Y = 8'bxxxxxxxx;elseY = 8'b11111111;endendmodule三、D触发器及多路选通器的设计D触发器代码:module lww(q,qbar,d,clk,clear);output q,qbar;input d,clk,clear;wire s,sbar,r,rbar,cabar;assign cbar=~clear;assign sbar=~(rbar&s),s=~(sbar&cbar&~clk),r=~(rbar&~clk&s),rbar=~(r&cbar&d);assign q=~(s&qbar),qbar=~(q&r&cbar);endmodule4-1选通器代码:module leiweiwei(out,in0,in1,in2,in3,s1,s0,res,clk); input in0,in1,in2,in3,s0,s1;input res,clk;output out;reg out;always @(posedge clk)beginif(res)out=0;else if(!res)begincase({s1,s0})2'b00:out=in0;2'b01:out=in1;2'b10:out=in2;2'b11:out=in3;endcaseendendendmodule同步计数:module leiweiwei(q,clk,clear);output [3:0] q;input clk,clear;reg [3:0] q;always @(negedge clk )beginq<=4'b0;elseq<=q+1;endendmodule异步计数:module leiweiwei(q,clk,clear);output [3:0] q;input clk,clear;reg [3:0] q;always @(posedge clear or negedge clk ) beginif(clear)q<=4'b0;elseq<=q+1;endendmodule预置法:module leiweiwei(q,clk,clear);output [3:0] q;input clk,clear;reg [3:0] q;always @( negedge clk )beginif(clear)q<=4'b0111;elseq<=q+1;endendmodule静态、动态译码电路设计module lww(a,b,c,d,e,f,g,h,clk,zx,zw); input clk;input[3:0] a,d,g,c,f;input[2:0] b,e;input[1:0] h;output[3:0] zx;output[7:0] zw;reg[7:0] zw;reg[2:0] slip;always@(posedge clk )beginif(slip==100) slip<=4'b000;else slip<=slip+4'b001;endalways@(slip)begincase(slip)4'd0:begin zw=8'b00000000;zx=a;end4'd1:begin zw=8'b00000001;zx=b; end4'd2:begin zw=8'b00000010;zx=c; end4'd3:begin zw=8'b00000011;zx=d; end4'd4:begin zw=8'b00000100;zx=e; end4'd5:begin zw=8'b00000101;zx=f; end4'd6:begin zw=8'b00000110;zx=g; end4'd7:begin zw=8'b00000111;zx=h; enddefault:zw=8'bx;endcaseendendmodule静态module lww(a,b,c,d,e,f,g,h,D3,D2,D1,D0);output a,b,c,d,e,f,g,h;input D3,D2,D1,D0; //输入的4位二进制reg a,b,c,d,e,f,g,h;always @(D3 or D2 or D1 or D0)begincase({D3,D2,D1,D0}) //用case语句进行译码4'd0: {a,b,c,d,e,f,g,h}=8'b1111_1100;4'd1: {a,b,c,d,e,f,g,h}=8'b0110_0000;4'd2: {a,b,c,d,e,f,g,h}=8'b1101_1010;4'd3: {a,b,c,d,e,f,g,h}=8'b1111_0010;4'd4: {a,b,c,d,e,f,g,h}=8'b0110_0110;4'd5: {a,b,c,d,e,f,g,h}=8'b1011_0110;4'd6: {a,b,c,d,e,f,g,h}=8'b1011_1110;4'd7: {a,b,c,d,e,f,g,h}=8'b1110_0000;4'd8: {a,b,c,d,e,f,g,h}=8'b1111_1110;4'd9: {a,b,c,d,e,f,g,h}=8'b1111_0110;4'd10: {a,b,c,d,e,f,g,h}=8'b1110_0111;4'd11: {a,b,c,d,e,f,g,h}=8'b0011_1111;4'd12: {a,b,c,d,e,f,g,h}=8'b1001_1101;4'd13: {a,b,c,d,e,f,g,h}=8'b1111_1101;4'd14: {a,b,c,d,e,f,g,h}=8'b1001_1111;4'd15: {a,b,c,d,e,f,g,h}=8'b1000_1111;4'd16: {a,b,c,d,e,f,g,h}=8'b1111_0111;default: {a,b,c,d,e,f,g,h}=8'bx;endcaseendendmodule1.偶分频偶分频比较简单,假设为N分频,只需计数到N/2-1,然后时钟翻转、计数清零,如此循环就可以得到N(偶)分频。
实验六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是一种硬件描述语言(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`。
分频系数为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置高,持续一个时钟周期,然后重新开始累加。
用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 分频原理众所周知,分频器是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设计
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语言编写倍频代码,以及每一步的具体实现过程。
在开始之前,我们先来了解一下什么是倍频。
倍频是指将输入信号频率的倍数提高,例如将一个1MHz的时钟信号倍频为2MHz或更高频率。
实现倍频操作的核心是使用锁相环(PLL)或者数字锁相环(DLL)。
在本篇文章中,我们将以PLL为例进行讲解。
第一步,我们需要定义输入和输出信号的数据类型和位宽。
在这个例子中,我们假设输入信号的数据类型为时钟信号,位宽为1位,而输出信号的数据类型也为时钟信号,位宽为1位。
我们可以使用Verilog中的reg类型来定义这两个信号的数据类型,使用parameter来定义位宽。
代码示例如下:verilogmodule frequency_multiplier (input wire CLK, 输入时钟信号output wire CLK_OUT 输出时钟信号);reg CLK_DIV; 倍频时钟信号parameter DIV_FACTOR = 2; 倍频因子TODO: 实现PLL代码endmodule第二步,我们需要编写PLL代码。
PLL由相位频率检测器(PFD)、锁相环滤波器(LPF)、倍频分频器(DIV)和振荡器(VCO)组成。
在本例中,我们使用一个简化的PLL结构,其中只包含一个倍频分频器。
代码示例如下:verilog锁相环中的倍频分频器always (posedge CLK)CLK_DIV <= !CLK_DIV; 输入信号变化时,输出信号取反实现倍频操作输出时钟信号assign CLK_OUT = CLK_DIV;第三步,我们需要进行仿真测试。
我们可以使用Verilog中的testbench 文件来验证倍频代码的正确性。
Verilog常用分频器的实现
Verilog常用分频器的实现在Verilog中,实现常用分频器可以通过多种方法,包括基于计数器、移位寄存器和频率除法器等技术。
下面将介绍三种常用的Verilog分频器实现方法。
1.计数器分频器:计数器分频器是一种基于计数器的分频器实现方法。
该方法通常通过计数器对输入脉冲进行计数,并根据计数值的变化来控制输出信号的频率。
```module CounterDividerinput wire clk,input wire reset,output wire outreg [31:0] count;if (reset) begincount <= 0;end else begincount <= count + 1;endendassign out = count[31];endmodule```在这个示例中,计数器模块接收一个时钟信号和复位信号,并在时钟上升沿时对计数器进行计数。
输出信号是计数器的最高位,用于将输入信号除以计数器的最大值。
2.移位寄存器分频器:移位寄存器分频器是一种基于移位寄存器的分频器实现方法。
该方法通过对输入信号进行连续的移位操作来实现分频。
```module ShiftDividerinput wire clk,input wire reset,input wire enable,output wire outreg [31:0] shift_register;reg [3:0] count;if (reset) beginshift_register <= 0;count <= 0;end else beginif (enable) beginshift_register <= {shift_register[30:0], shift_register[31]};count <= count + 1;endendendassign out = shift_register[0];endmodule```在这个示例中,移位寄存器分频器模块接收一个时钟信号、复位信号和使能信号,并在使能信号有效时对输入信号进行连续的位移操作。
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奇偶分频、一段式、两段式、三段式状态机
汇报总结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、奇数分频对于对占空比没有特殊要求的奇数分频,需要对上升沿和下降沿脉冲进行计数,利用下降沿产生的波形移相半个输入脉冲的作用,最后用错位“异或”法实现。
分频器的设计
分频器的设计-奇偶分频 2 的 n 次方分频实现 如下电路可以实现对 CLK 的 2 分频。原理很简单,上电复位先给寄存器 一个初始值,然后只有在 CLK 上升沿 CLK_DIV2 才会翻转一次。故 CLK 两 个上升沿之后,CLK_DIV2 才完成两次翻转。 要实现 2 的 n 次方分频可以通过复用 n 次这个电路。如下所示。 偶数倍分频 方式一:如下所示。通过移位寄存器实现分频。例如要实现 2n 倍分频, 则需要用 n 个寄存器。 优点:不需要其它任何控制逻辑,只需要寄存器加一个反相器。
仿真波形如下: 思考 大家以上面的为基础,思考一下占空比可调的分频时钟的实现。
缺点:当分频倍数很大时,需要的寄存器也是倍增。当然你也可以采用复 用的方式去减少所需寄存器数目,例如,36 分频,可以做两个 6 分频器相 连,则所需寄存器为 6 个,需要的寄存器数大大减少。 方式二:如下图所示,通过计数器来实现分频。比如,做一个 2n 分频 器,则计数器计数从 0 到 n-1,CLK_DIV 就翻转一次。 代码如下(分频数为 DIV_NUM=20): 仿真波形: 奇数倍分频 如上方式只能实现偶数倍分频,是因为寄存器都是源时钟 CLK 上升沿触 发的,因此 DIV_CLK 只能在上升沿去发生跳转,这导致 DIV_CLK 必定只能 是 CLK 的偶数倍分频关系(CLK 跳转两次,DIV_CLK 才可能跳转一次) 。 奇数倍分频的一种实现方式如下。一路计数器用 CLK 的非 CLK_N 控 制,一路用 CLK 控制。最后将两路的输出分频波形相亦或,得到最后的分频 输出。如果难以理解可以对着最后的波形去看。 Verilog 实现如下(分频数为 DIV_NUM=9):
分频的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-数字频率计
3.1
由于晶体振荡器提供的为48M的时钟,而在整个频率计里将用到周期为2s、0.2s和0.02s的闸门信号,还有译码显示的扫描信号1KHz,所以我们在此模块先分频产生1Hz、10Hz、100Hz、1KHz四个分频信号,以留作其它模块用。
分频分别采用4个计数器来实现,当计到一定的值时输出的分频信号翻转,最后分别获得4个分频输出,分频器模块如下图所示:
关键词:FPGA,Verilog,ISE,测频方法
Abstract
This paper introducesthedesign methodofdigitalfrequencymeter based on FPGA,whichusehardware description language-Verilogin software development platform ISEandcanwordin relatively high-speed clockof48MHz. The frequency meter usesthemethodoffrequency measurement, whichcouldaccuratelymeasurethefrequencyofsignalsbetween10Hz to 100MHz.This systemusesthe simulation tool-ModelSim to run and debug theVerilogprogram, and design the circuit placement. A good result can be achieved when the program was burnt on the chip Spartan3A.
图1-7时基信号产生电路
第二章
分频器设计——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+HDL语言设计分频器和32位计数器
i<i+1l
end
cs)∥有片选信号
end endrnodule
begin if(addr)
aceuh<2data}
该模块已通过软件仿真,符合设计要求。并已将程序下载到FPGA芯片,在电路板上与 系统进行联调,已证明设计达到预期功能,正式投入使用。
参 考 文 献
1夏宇闻.复杂数字电路与系统的VerilogHDL设计技术.北京t北京航空航天大学出版杜,1999.1—86 2阎石鼓字电子技术基础.北京:高等教育出版社.1 997.224--295 3束万焘·罗 车,吴顺军.CPI,D技术及其盥用西安:西安电子科技大学出版社,1999.30】oo
end end
output
elkl.c}//输出时钟和计数进位信号
j
wirte[15
reg
பைடு நூலகம்
O]data—reg·dataI
c,clkl{
if(i>=119) 计数值的高16位数和低
begin
∥对输人时钟进行J20分频
reg[1 5:O]aceub.aecul;
1
6位数
j<=0; clkl<=~clkl;
第23卷第6期 2002年1 1月
微计算机应用
MICROCOMPUTER APPLICATIONS
Vol
23.N。.6
Nov-,2002
用Ver|log
HDL语言设计分频器和32位计数器
谈艳云 罗志强
100083)
仍局
(北京航空航天大学电子工程东北京
擅要t介绍一种软件实现分频器和32位计数器的设计思路.即采用大规模可编程逻辑芯片.
+PLUS
II仿真正是一种实用的EDA软件,它具有原理图输入和文本输入(采用硬件描述语
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
module odd_division(clk,rst,count,clk_odd); /*count没必要放在端口中,这里只是为了仿真时观察*/input clk,rst;output clk_odd;output[3:0] count;reg clk_odd;reg[3:0] count;parameter N = 6; /*6分频* /always @ (posedge clk)if(! rst)begincount <= 1'b0;clk_odd <= 1'b0;endelseif ( count < N/2-1)begincount <= count + 1'b1;endelsebegincount <= 1'b0;clk_odd <= ~clk_odd;endendmodule奇数倍分频:归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数从零开始,到N-1)/2进行输出时钟翻转,然后经过(N+1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。
再者同时进行下降沿触发的模N计数,到和上升沿过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。
两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。
module even_division(clk,rst,count1,count2,clk_even); /*count1,count2没必要放在端口中,这里只是为了仿真时观察*/input clk,rst;output[3:0] count1,count2;output clk_even;reg[3:0] count1,count2;reg clkA,clkB;wire clk_even,clk_re;parameter N = 5; /*5分频*/assign clk_re = ~clk;assign clk_even = clkA | clkB;always @(posedge clk)if(! rst)begincount1 <= 1'b0;clkA <= 1'b0;endelseif(count1 < (N - 1))begincount1 <= count1 + 1'b1; /*这里是非阻塞赋值是先执行了下面的IF判断,最后才赋的值。
最初看这程序时没注意,想了好半天*/if(count1 == (N - 1)/2)beginclkA <= ~clkA;endendelsebeginclkA <= ~clkA;count1 <= 1'b0;endalways @ (posedge clk_re)if(! rst)begincount2 <= 1'b0;clkB <= 1'b0;endelseif(count2 < (N - 1))begincount2 <= count2 + 1'b1;if(count2 == (N - 1)/2)beginclkB <= ~clkB;endendelsebeginclkB <= ~clkB;count2 <= 1'b0;endendmoduleVerilog HDL的分频器设计2009-12-03 10:22用D触发器实现2倍分频的Verilog描述?module divide2( clk , clk_o, reset);input clk , reset;output clk_o;wire in;reg out ;always @ ( posedge clk or posedge reset)if ( reset)out <= 0;elseout <= in;assign in = ~out;assign clk_o = out;endmodule用verilog实现分频的一点心得2007-08-04 22:40在用verilog编写程序的过程中,将时钟进行11分频,花了好多的心思才将其搞定。
通常实现偶数的分频比较容易,以十分频为例: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;三分频的Verilog实现rickywu 发表于2005-12-12 11:14:00//很实用也是笔试面试时常考的,已经经过仿真占空比要求50%和不要求占空比差别会很大,先看一个占空比50%的描述module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;//internal counter signalsreg[1:0] count_a;reg[1:0] count_b;reg CLKOUT;always @(negedge RESETn or posedge CLKIN)beginif (RESETn==1'b0)count_a<=2'b00;elseif (count_a==2'b10)count_a<=2'b00;elsecount_a<=count_a+1;endalways @(negedge RESETn or negedge CLKIN)beginif (RESETn==1'b0)count_b<=2'b0;elseif (count_b==2'b10)count_b<=2'b00;elsecount_b<=count_b+1;endalways @(count_a or count_b or RESETn)beginif (RESETn==1'b0)CLKOUT=1'b0;else if((count_a+count_b==4)||(count_a+ count_b==1)) CLKOUT=~CLKOUT;endendmodule0 1 2 0 1 2\ / / \ \ / / \0 1 2 0 1 2下面是一个非50%的描述,只用了上升沿module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;wire d;reg q1,q2;wire CLKOUT;always @(negedge RESETn or posedge CLKIN) beginif (RESETn==1'b0)q1<=1'b0;elseq1<=d;endalways @(negedge RESETn or posedge CLKIN) beginif (RESETn==1'b0)q2<=1'b0;elseq2<=q1;endassign d=~q1 & ~q2;assign CLKOUT=q2;endmodule占空比不是50%,只用了单沿触发器,寄存器输出。
至于其他奇数要求50%的或者不要求的占空比的,都可以参照上面两个例子做出。
占空比为50%的一个更好的实现。
module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;//internal counter signalsreg[1:0] count_a;reg b,c;//reg CLKOUT;wire CLKOUT;always @(negedge RESETn or posedge CLKIN)beginif (RESETn==1'b0)count_a<=2'b00;elseif (count_a==2'b10)count_a<=2'b00;elsecount_a<=count_a+1;endalways @(negedge RESETn or negedge CLKIN)beginif (RESETn==1'b0)b<=1'b0;elseif (count_a==2'b01)b<=2'b0;elseb<=1'b1;endalways @(negedge RESETn or posedge CLKIN)beginif (RESETn==1'b0)c<=1'b0;elseif (count_a==2'b10)c<=1'b1;else if (count_a==2'b01)c<=1'b0;endassign CLKOUT=b & c;endmodule如果不考虑占空比,直接利用计数器来进行分频,则占空比会发生变化。