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
18module int_div(clock,clk_out);
19
20//I/O口声明
21input clock; //输入时钟
22output clk_out; //输出时钟
23
24//内部寄存器
25reg clk_p_r; //上升沿输出时钟
26reg clk_n_r; //下降沿输出时钟
27reg[F_DIV_WIDTH - 1:0] count_p; //上升沿脉冲计数器
28reg[F_DIV_WIDTH - 1:0] count_n; //下降沿脉冲计数器
29
30//参数--分频系数
31parameter F_DIV = 48000000; //分频系数<<<<-----修改这里
32parameter F_DIV_WIDTH = 32; //分频计数器宽度
33
34wire full_div_p; //上升沿计数满标志
35wire half_div_p; //上升沿计数半满标志
36wire full_div_n; //下降沿计数满标志
37wire half_div_n; //下降沿计数半满标志
38
39//判断计数标志位置位与否
40assign full_div_p = (count_p < F_DIV - 1);
41assign half_div_p = (count_p < (F_DIV>>1) - 1);
42assign full_div_n = (count_n < F_DIV - 1);
43assign half_div_n = (count_n < (F_DIV>>1) - 1);
44
45//时钟输出
46assign clk_out = (F_DIV == 1) ?
47 clock : (F_DIV[0] ? (clk_p_r & clk_n_r) : clk_p_r); //F_DIV[0]用于判断奇偶数
48
49//上升沿脉冲计数
50always @(posedge clock)
51begin
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
65end
66
67//下降沿脉冲计数
68always @(negedge clock)
69begin
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
83end
84
85endmodule
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 6
13//clock |--|__|--|__|--|__|--|__|--|__|--|__|
14//clk_p_r |_____|-----------|_____|-----------|
15//clk_n_r ---|_____|-----------|_____|---------
16//clk_out |________|--------|________|--------|
17
18module int_div(clock,clk_out);
19
20//I/O口声明
21input clock; //输入时钟
22output clk_out; //输出时钟
23
24//内部寄存器
25reg clk_p_r; //上升沿输出时钟
26reg clk_n_r; //下降沿输出时钟
27reg[F_DIV_WIDTH - 1:0] count_p; //上升沿脉冲计数器
28reg[F_DIV_WIDTH - 1:0] count_n; //下降沿脉冲计数器
29
30//参数--分频系数
31parameter F_DIV = 48000000; //分频系数<<<<-----修改这里
32parameter F_DIV_WIDTH = 32; //分频计数器宽度
33
34wire full_div_p; //上升沿计数满标志
35wire half_div_p; //上升沿计数半满标志
36wire full_div_n; //下降沿计数满标志
37wire half_div_n; //下降沿计数半满标志
38
39//判断计数标志位置位与否
40assign full_div_p = (count_p < F_DIV - 1);
41assign half_div_p = (count_p < (F_DIV>>1) - 1);
42assign full_div_n = (count_n < F_DIV - 1);
43assign half_div_n = (count_n < (F_DIV>>1) - 1);
44
45//时钟输出
46assign clk_out = (F_DIV == 1) ?
47 clock : (F_DIV[0] ? (clk_p_r & clk_n_r) : clk_p_r); //F_DIV[0]用于判断奇偶数
48
49//上升沿脉冲计数
50always @(posedge clock)
51begin
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
65end
66
67//下降沿脉冲计数
68always @(negedge clock)
69begin
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
83end
84
85endmodule
86