Verilog各种倍分频器设计

合集下载

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.四分频。

vorilog分频器设计

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设计分频器计数器电路

实验六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`。

分频系数为5的小数分频器verilog代码

分频系数为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实现任意倍分频器的方法

用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 分频原理众所周知,分频器是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 :串行数据输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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如果不考虑占空比,直接利用计数器来进行分频,则占空比会发生变化。

相关文档
最新文档