1、分频器的概念及应用
分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。在许多电子设备中如电子钟、频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种频率成分,分频器是一种主要变换手段。
早期的分频器多为正弦分频器,随着数字集成电路的发展,数字分频器逐渐取代了正弦分频器。
2、数字分频器类型
数字分频器类型主要包括了2的整数次幂的分频器、偶数分频、占空比为1:15的分频电路和奇数分频电路等。
3、分频器的rtl和testbench
在硬件电路设计中时钟信号是最重要的信号之一,经常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号,这里以50Mhz为主振源,分别进行2的整数次幂的分频器、偶数分频、占空比为1:15的分频电路和奇数分频电路。
3.1 2的整数次幂的分频器
2的整数次幂的分频器是指对时钟信号clk进行2分频、4分频、8分频和16分频等,这是最简单的分频电路,只需要一个计数器就可以,这里采用4位计数器。
3.1.1 rtl代码
//div2_4_8_16
module div2_4_8_16(
input rst_n,
input clk,
output div2,
output div4,
output div8,
output div16
);
reg [3:0] cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt<=4'd0;
else
cnt<=cnt+1'b1;
end
assign div2 =cnt[0];
assign div4 =cnt[1];
assign div8 =cnt[2];
assign div16 =cnt[3];
endmodule
3.1.2 testbench
//tb_div
`timescale 1ns/1ns
module tb_div();
reg clk;
reg rst_n;
wire div2;
wire div4;
wire div8;
wire div16;
//parameter define
parameter PERIOD=20;
//clock define
always #(PERIOD/2) clk=~clk;
//初始化
initial
begin
clk=1'b1;
rst_n=1'b0;
#(20*PERIOD)
rst_n=1'b1;
#(1000*PERIOD)
$finish;
end
//例化
div2_4_8_16 u0(
.clk(clk),
.rst_n(rst_n),
.div2(div2),
.div4(div4),
.div8(div8),
.div16(div16)
);
endmodule
3.1.3 波形分析
图3.1 2的整数次幂的分频器波形图
3.2 偶数分频电路
这里以50Mhz为主振源,采用6分频。
3.2.1 rtl代码
//div6
module div6(
input rst_n,
input clk,
output reg div6
);
reg [1:0] cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt<=2'd0;
elseif(cnt==2'd2)
cnt<=2'd0;
else
cnt<=cnt+1'b1;
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
div6<=1'b0;
elseif(cnt==2'd2)
div6<=~div6;
else
div6<=div6;
end
endmodule
3.2.2 testbench
//tb_div
`timescale 1ns/1ns
module tb_div6();
reg clk;
reg rst_n;
wire div6;
//parameter define
parameter PERIOD=20;
//clock define
always #(PERIOD/2) clk=~clk;
//初始化
initial
begin
clk=1'b1;
rst_n=1'b0;
#(20*PERIOD)
rst_n=1'b1;
#(1000*PERIOD)
$finish;
end
//例化
div6 u1(
.clk(clk),
.rst_n(rst_n),
.div6(div6)
);
endmodule
3.2.3 波形分析
图3.2 6分频波形图
3.3 占空比为1:15的分频电路
这里以50Mhz为主振源,占空比为1:15。
3.3.1 rtl代码
//div6
module div6(
input rst_n,
input clk,
output reg div115
);
reg [3:0] cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt<=4'd0;
elseif(cnt==4'd15)
cnt<=4'd0;
else
cnt<=cnt+1'b1;
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
div115<=1'b0;
elseif(cnt==4'd14)
div115<=1'b1;
elseif(cnt==4'd15)
div115<=1'b0;
else
div115<=div115;
end
endmodule
3.3.2 testbench
//tb_div
`timescale 1ns/1ns
module tb_div1_15();
reg clk;
reg rst_n;
wire div115;
//parameter define
parameter PERIOD=20;
//clock define
always #(PERIOD/2) clk=~clk;
//初始化
initial
begin
clk=1'b1;
rst_n=1'b0;
#(20*PERIOD)
rst_n=1'b1;
#(1000*PERIOD)
$finish;
end
//例化
div6 u1(
.clk(clk),
.rst_n(rst_n),
.div115(div115)
);
Endmodule
3.3.3 波形分析
图3.3 占空比为1:15的分频器电路波形图
3.4 奇数分频电路
这里以50Mhz为主振源,采用5分频。3.4.1 rtl代码
//div6
module div5(
input rst_n,
input clk,
output div5
);
reg [2:0] cnt1;
reg [2:0] cnt2;
reg div1;
reg div2;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt1<=3'd0;
elseif(cnt1==3'd4)
cnt1<=3'd0;
else
cnt1<=cnt1+1'b1;
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
div1<=1'b0;
elseif(cnt1==3'd0 || cnt1==3'd1)
div1<=1'b1;
else
div1<=1'b0;
end
always@(negedge clk or negedge rst_n)
begin
if(!rst_n)
cnt2<=3'd0;
elseif(cnt2==3'd4)
cnt2<=3'd0;
else
cnt2<=cnt2+1'b1;
end
always@(negedge clk or negedge rst_n)
begin
if(!rst_n)
div2<=1'b0;
elseif(cnt2==3'd0 || cnt2==3'd1)
div2<=1'b1;
else
div2<=1'b0;
end
assign div5=div1 | div2;
endmodule
3.4.2 testbench
//tb_div
`timescale 1ns/1ns
module tb_div5();
reg clk;
reg rst_n;
wire div5;
//parameter define
parameter PERIOD=20;
//clock define
always #(PERIOD/2) clk=~clk;
//初始化
initial
begin
clk=1'b1;
rst_n=1'b0;
#(20*PERIOD)
rst_n=1'b1;
#(1000*PERIOD)
$finish;
end
//例化
div5 u1(
.clk(clk),
.rst_n(rst_n),
.div5(div5)
);
endmodule
3.4.3 波形分析
图3.4 5分频波形图