|
1.代码文件说明
分频器的代码并不难,网上多数是奇偶分频分开写的代码,按照电路结构去理解,分频器分为奇偶数两个module是比较理想的。如果把奇偶两个模块写到一个module中,则会导致输出经过较多的逻辑电路,这对于一个时钟输出是极其不利的,会产生较差的时序,在做数字IC的时候要尤为注意这一点。调用本次代码时,只需例化Div.v,本次代码得到的都是占空比为50%的信号。
名字 说明
div_even.v 偶数分频module
div_odd.v 奇数分频module
Div.v 例化奇偶分频module的module
2.端口说明
仅以Div.v这个module来说明:
名字 类型 说明
fre_div parameter 分频数
clk input 输入时钟
rst_n input 复位
clk_out output 输出时钟
————————————————
//-----------------------------------------------------------------------------------------------
// Copyright :
// File Name : TOP
// Author : Luk.wj
// Data : 2021.10.14
// Description : TOP file for test
//-----------------------------------------------------------------------------------------------
module TOP #(
parameter fre_div = 4 //frequency division
) (
input clk,
input rst_n,
output clk_out
);
Div#(
.fre_div ( fre_div )
)u1_Div(
.clk ( clk ),
.rst_n ( rst_n ),
.clk_out ( clk_out )
);
endmodule
//-----------------------------------------------------------------------------------------------
// Copyright :
// File Name : div_even
// Author : Luk.wj
// Data : 2021.10.13
// Description : Even frequency division
//-----------------------------------------------------------------------------------------------
module div_even #(
parameter fre_div = 4 //frequency division
) (
input clk,
input rst_n,
output reg clk_out
);
reg [fre_div/2-1:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 0;
clk_out <= 1'b0;
end
else if (cnt == (fre_div/2-1)) begin
cnt <= 0;
clk_out <= ~clk_out;
end
else
cnt <= cnt + 1;
end
endmodule
//-----------------------------------------------------------------------------------------------
// Copyright :
// File Name : div_odd
// Author : Luk.wj
// Data : 2021.10.13
// Description : Odd numkber frequency division
//-----------------------------------------------------------------------------------------------
module div_odd #(
parameter fre_div = 5 //frequency division
) (
input clk,
input rst_n,
output clk_out
);
reg [(fre_div-1)/2:0] cnt_p, cnt_n; //posedge, negedge count
reg clk_p, clk_n; //posedge, negedge generate clock
//==================================================== clk_p unit
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt_p <= 0;
clk_p <= 1'b0;
end
else if (cnt_p == (fre_div-1)/2) begin
clk_p <= ~clk_p;
cnt_p <= cnt_p + 1;
end
else if (cnt_p == (fre_div-1)) begin
cnt_p <= 0;
clk_p <= ~clk_p;
end
else
cnt_p <= cnt_p + 1;
end
//==================================================== clk_n unit
always @(negedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt_n <= 0;
clk_n <= 1'b0;
end
else if (cnt_n == (fre_div-1)/2) begin
clk_n <= ~clk_n;
cnt_n <= cnt_n + 1;
end
else if (cnt_n == (fre_div-1)) begin
cnt_n <= 0;
clk_n <= ~clk_n;
end
else
cnt_n <= cnt_n + 1;
end
assign clk_out = clk_p | clk_n;
endmodule
版权声明:本文为CSDN博主「小火子Velsuked」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42446721/article/details/120823047
|
|