分频器、倍频器:就是基于某个时钟频率扩展出多个时钟频率
结构如下
根据上图可以看出,偶数分频的触发条件对应所有时钟的上升沿,当然下降沿也可以,奇数分频既包含上升沿也包含下降沿,以2分频举例,基本时钟上升沿到来一次,时钟翻转一次,4分频就是基本时钟上升沿到来两次,时钟翻转一次。
偶数分频代码如下:
//实现偶数分频
module div_even(
input clk,
input rst_n,
output clk_div
);
parameter div_num = 4;//分频数
reg[3:0] cnt; //上升沿采样计数值,位宽根据分频数设置
//上升沿计数
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
cnt <= 0;
else if(cnt < div_num-1)//cnt取值0-div_num-1
cnt <= cnt + 1'b1;
else
cnt <= 0;
end
assign clk_div=(cnt>(div_num/2-1))?1:0;//
endmodule
`timescale 1ns/1ps
module tb_div_even;
reg clk,rst_n;
wire clk_div;
div_even dut(.clk(clk),.rst_n(rst_n),.clk_div(clk_div));
initial begin
clk <= 0;rst_n<=0;
#14 rst_n<=1;
#1000 $stop;
end
always #5 clk<=~clk;
endmodule
四分频结果 ,分频数可以修改使用,但要注意计数器位宽
奇数分频以3分频为例,可以分为一个上升沿和一个下降沿的或
奇数分频代码如下,分频数可以修改使用,注意计数器的位宽;
//实现奇数分频
module div_odd(
input clk,
input rst_n,
output clk_div
);
parameter div_num = 3;//分频数
reg[2:0] cnt1,cnt2; //上升沿和下降沿计数
wire clk1, clk2;//上升沿和下降沿触发时钟频率
//上升沿计数
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
cnt1 <= 0;
else if(cnt1 < div_num - 1)//cnt取0-div_num - 1
cnt1 <= cnt1 + 1'b1;
else
cnt1 <= 0;
end
assign clk1=(cnt1>((div_num-1)/2))?1:0;//
//下降沿计数
always @(negedge clk or negedge rst_n) begin
if(!rst_n)
cnt2 <= 0;
else if(cnt2 < div_num - 1)
cnt2 <= cnt2 + 1'b1;
else
cnt2 <= 0;
end
assign clk2=(cnt2>((div_num-1)/2))?1:0;//下降沿触发时钟频率
assign clk_div = clk1 | clk2;//上升沿触发时钟和下降沿触发时钟相或
endmodule
`timescale 1ns/1ps
module tb_div_odd;
reg clk,rst_n;
wire clk_div;
div_odd dut(.clk(clk),.rst_n(rst_n),.clk_div(clk_div));
initial begin
clk <= 0;rst_n<=0;
#14 rst_n<=1;
#1000 $stop;
end
always #5 clk<=~clk;
endmodule
五分频结果