一、分频器
实现偶分频方式
方式一:在分频之后的时钟产生的(分频)
方式二:在系统信号中产生的(降频)
其区别如下,实现的条件一个是在分频之后为条件,另外一个是在系统时钟下产生的,我们建议使用第二种方式
二、实现
1.方式一分频器波形图
由于奇数分频器的特殊性,没有办法采取偶数分频器的方法,所以采取使其产生两个clk1与clk2,然后让其两个相与得到最终的五分频clk_out,波形图如下图所示
2.程序
module divider_five
(
input wire sys_clk ,
input wire sys_rst_n ,
output wire clk_out
);
reg [2:0] cnt;
reg clk1;
reg clk2;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
cnt <= 3’d0;
else if (cnt == 3’d4)
cnt <= 3’d0;
else
cnt <= cnt + 3’d1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
clk1 <= 1’b0;
else if (cnt == 3’d2)
clk1 <= 1’b0;
else if (cnt == 3’d4)
clk1 <= 1’b1;
else
clk1 <= clk1;
always@(negedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
clk2 <= 1’b0;
else if (cnt == 3’d2)
clk2 <= 1’b0;
else if (cnt == 3’d4)
clk2 <= 1’b1;
else
clk2 <= clk2;
assign clk_out = (clk1 & clk2);
endmodule
仿真程序与六倍频仿真程序相似
`timescale 1ns/1ns
module tb_divider_five();
reg sys_clk;
reg sys_rst_n;
wire clk_out;
initial
begin
sys_clk = 1’b0;
sys_rst_n <= 1’b0;
#20
sys_rst_n <= 1’b1;
end
always #10 sys_clk = ~sys_clk;
initial
begin
$timeformat(-9,0,“ns”,6);
m
o
n
i
t
o
r
(
"
@
t
i
m
e
monitor("@time %t:clk_out=%b",
monitor("@timetime,clk_out);
end
divider_five divider_five_inst
(
.sys_clk (sys_clk) ,
.sys_rst_n(sys_rst_n) ,
.clk_out (clk_out)
);
endmodule
2.方式二降频波形图
与六倍频相似,只是相差了一个相位,可对比得到
3.程序
module divider_five
(
input wire sys_clk,
input wire sys_rst_n,
output reg clk_out
);
reg [2:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
clk_out <= 1’b0;
else if (cnt == 3’d3)
clk_out <= 1’b1;
else
clk_out <= 1’b0;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
cnt <= 3’b0;
else if(cnt == 3’d4)
cnt <= 3’d0;
else
cnt <= cnt + 1’b1;
endmodule
仿真程序与方式一没啥区别