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
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86