1
//*******************************************************//
2
// 任意整数分频模块 //
3
//*******************************************************//
4
//功能:对输入时钟clock进行F_DIV倍分频后输出clk_out。
5
//其中F_DIV为分频系数,分频系数范围为1~2^n (n=F_DIV_WIDTH)
6
//若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。
7
//若分频系数为偶数,则输出时钟占空比为50%;
8
//若分频系数为奇数,则输出时钟占空比取决于输入时钟占空比和分
9
//频系数(当输入为50%时,输出也是50%)。
10
//--------------------------------------------------------
11
//奇数倍分频:三倍分频的时序图如下所示。
12
// 1 2 3 4 5 6
13
//clock |--|__|--|__|--|__|--|__|--|__|--|__|
14
//clk_p_r |_____|-----------|_____|-----------|
15
//clk_n_r ---|_____|-----------|_____|---------
16
//clk_out |________|--------|________|--------|
17
18
module int_div(clock,clk_out);
19
20
//I/O口声明
21
input clock; //输入时钟
22
output clk_out; //输出时钟
23
24
//内部寄存器
25
reg clk_p_r; //上升沿输出时钟
26
reg clk_n_r; //下降沿输出时钟
27
reg[F_DIV_WIDTH - 1:0] count_p; //上升沿脉冲计数器
28
reg[F_DIV_WIDTH - 1:0] count_n; //下降沿脉冲计数器
29
30
//参数--分频系数
31
parameter F_DIV = 48000000; //分频系数<<<<-----修改这里
32
parameter F_DIV_WIDTH = 32; //分频计数器宽度
33
34
wire full_div_p; //上升沿计数满标志
35
wire half_div_p; //上升沿计数半满标志
36
wire full_div_n; //下降沿计数满标志
37
wire half_div_n; //下降沿计数半满标志
38
39
//判断计数标志位置位与否
40
assign full_div_p = (count_p < F_DIV - 1);
41
assign half_div_p = (count_p < (F_DIV>>1) - 1);
42
assign full_div_n = (count_n < F_DIV - 1);
43
assign half_div_n = (count_n < (F_DIV>>1) - 1);
44
45
//时钟输出
46
assign clk_out = (F_DIV == 1) ?
47
clock : (F_DIV[0] ? (clk_p_r & clk_n_r) : clk_p_r); //F_DIV[0]用于判断奇偶数
48
49
//上升沿脉冲计数
50
always @(posedge clock)
51
begin
52
if(full_div_p)
53
begin
54
count_p <= count_p + 1'b1;
55
if(half_div_p)
56
clk_p_r <= 1'b0;
57
else
58
clk_p_r <= 1'b1;
59
end
60
else
61
begin
62
count_p <= 0;
63
clk_p_r <= 1'b0;
64
end
65
end
66
67
//下降沿脉冲计数
68
always @(negedge clock)
69
begin
70
if(full_div_n)
71
begin
72
count_n <= count_n + 1'b1;
73
if(half_div_n)
74
clk_n_r <= 1'b0;
75
else
76
clk_n_r <= 1'b1;
77
end
78
else
79
begin
80
count_n <= 0;
81
clk_n_r <= 1'b0;
82
end
83
end
84
85
endmodule
86
//*******************************************************//2
// 任意整数分频模块 //3
//*******************************************************//4
//功能:对输入时钟clock进行F_DIV倍分频后输出clk_out。5
//其中F_DIV为分频系数,分频系数范围为1~2^n (n=F_DIV_WIDTH)6
//若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。7
//若分频系数为偶数,则输出时钟占空比为50%;8
//若分频系数为奇数,则输出时钟占空比取决于输入时钟占空比和分9
//频系数(当输入为50%时,输出也是50%)。10
//--------------------------------------------------------11
//奇数倍分频:三倍分频的时序图如下所示。12
// 1 2 3 4 5 613
//clock |--|__|--|__|--|__|--|__|--|__|--|__|14
//clk_p_r |_____|-----------|_____|-----------|15
//clk_n_r ---|_____|-----------|_____|---------16
//clk_out |________|--------|________|--------|17

18
module int_div(clock,clk_out);19

20
//I/O口声明21
input clock; //输入时钟22
output clk_out; //输出时钟23

24
//内部寄存器25
reg clk_p_r; //上升沿输出时钟26
reg clk_n_r; //下降沿输出时钟27
reg[F_DIV_WIDTH - 1:0] count_p; //上升沿脉冲计数器28
reg[F_DIV_WIDTH - 1:0] count_n; //下降沿脉冲计数器29

30
//参数--分频系数31
parameter F_DIV = 48000000; //分频系数<<<<-----修改这里32
parameter F_DIV_WIDTH = 32; //分频计数器宽度33

34
wire full_div_p; //上升沿计数满标志35
wire half_div_p; //上升沿计数半满标志36
wire full_div_n; //下降沿计数满标志37
wire half_div_n; //下降沿计数半满标志38

39
//判断计数标志位置位与否40
assign full_div_p = (count_p < F_DIV - 1);41
assign half_div_p = (count_p < (F_DIV>>1) - 1);42
assign full_div_n = (count_n < F_DIV - 1);43
assign half_div_n = (count_n < (F_DIV>>1) - 1);44

45
//时钟输出46
assign clk_out = (F_DIV == 1) ? 47
clock : (F_DIV[0] ? (clk_p_r & clk_n_r) : clk_p_r); //F_DIV[0]用于判断奇偶数48

49
//上升沿脉冲计数50
always @(posedge clock)51
begin52
if(full_div_p)53
begin54
count_p <= count_p + 1'b1;55
if(half_div_p)56
clk_p_r <= 1'b0;57
else58
clk_p_r <= 1'b1;59
end60
else61
begin62
count_p <= 0;63
clk_p_r <= 1'b0;64
end65
end66

67
//下降沿脉冲计数68
always @(negedge clock)69
begin70
if(full_div_n)71
begin72
count_n <= count_n + 1'b1;73
if(half_div_n)74
clk_n_r <= 1'b0;75
else76
clk_n_r <= 1'b1;77
end78
else79
begin80
count_n <= 0;81
clk_n_r <= 1'b0;82
end83
end84

85
endmodule86
