手撕代码——任意偶数分频
一、偶数分频器原理与设计
对时钟进行N倍偶数分频,需要设计一个计数器cnt,当计数器cnt计数到N/2-1和N-1时,对分频时钟进行反转,得到偶数分频时钟信号。
二、完整代码与仿真文件
任意偶数分频器代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/05/22 15:17:31
// Design Name:
// Module Name: clk_divide_even
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module clk_divide_even
#(
parameter DIV_PARAM = 4 //分频系数(偶数)
)
(
input sys_clk ,
input sys_rst_n,
output clk_o
);
parameter CNT_WIDTH = $clog2(DIV_PARAM); //计数器位宽
reg [CNT_WIDTH-1:0] cnt; //计数器
reg clk_o_r;
//计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt <= 'd0;
else if(cnt == DIV_PARAM-1)
cnt <= 'd0;
else
cnt <= cnt + 1'b1;
end
//偶数分频时钟
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
clk_o_r <= 'd0;
else if(cnt == DIV_PARAM-1 || cnt ==( DIV_PARAM>>1)-1)
clk_o_r <= ~clk_o_r;
else
clk_o_r <= clk_o_r;
end
assign clk_o = clk_o_r;
endmodule
仿真代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/05/22 15:22:14
// Design Name:
// Module Name: tb_clk_divide_even
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module tb_clk_divide_even();
parameter DIV_PARAM = 4; //分频系数(偶数)
reg sys_clk ;
reg sys_rst_n;
wire clk_o ;
initial begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
#20
sys_rst_n <= 1'b1;
end
always #5 sys_clk = ~sys_clk;
clk_divide_even
#(
.DIV_PARAM(DIV_PARAM) //分频系数(偶数)
)
clk_divide_even
(
.sys_clk (sys_clk ),
.sys_rst_n(sys_rst_n),
.clk_o (clk_o )
);
endmodule
三、仿真结果
对4分频时钟分频器进行仿真,得到如下结果,仿真通过。