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
