-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCLK_DIVIDER.v
141 lines (102 loc) · 2.73 KB
/
CLK_DIVIDER.v
1
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 05/11/2022 08:37:33 PM
// Design Name:
// Module Name: CLK_DIVIDER
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module CLK_DIVIDER #( range_clk_div = 12, channel = 5)(
input clk_in,
input rst,
input [range_clk_div - 1 : 0] clk_divider_odd, // The clock divider takes odd values
input [range_clk_div - 1 : 0] clk_divider_even, // The clock divider takes odd values
output [channel -1 : 0] pwm_clk_odd,
output [channel -1 : 0] pwm_clk_even,
output Clk_Even,
output Clk_Odd
);
reg [range_clk_div - 1 : 0] pos_edge_counter;
reg [range_clk_div - 1 : 0] neg_edge_counter;
reg [range_clk_div - 1 : 0] counter;
reg [range_clk_div - 1 : 0] counter_1;
wire [range_clk_div - 1 : 0] counter_2;
reg clk_gen;
wire clk_even;
wire clk_odd;
// Odd clock Divider
always @ (posedge clk_in)
begin
if(rst)
begin
pos_edge_counter <= 12'd0;
end
else if (pos_edge_counter == (clk_divider_odd - 1))
begin
pos_edge_counter <=12'd0;
end
else
begin
pos_edge_counter <= pos_edge_counter + 12'd1;
end
end
always @ (negedge clk_in)
begin
if(rst)
begin
neg_edge_counter <= 12'd0;
end
else if (neg_edge_counter == (clk_divider_odd - 1))
begin
neg_edge_counter <=12'd0;
end
else
begin
neg_edge_counter <= neg_edge_counter + 12'd1;
end
end
assign clk_odd = ((pos_edge_counter > (clk_divider_odd >> 1)) | (neg_edge_counter > (clk_divider_odd >> 1)));
assign Clk_Odd = clk_odd;
// Even Clock Divider
always @(posedge clk_in)
begin
if(rst)
begin
counter_1 <= 12'd0;
clk_gen <= 1'b0;
end else if( counter_2 == (clk_divider_even/2))
begin
counter_1 <= 12'd0;
clk_gen <= ~clk_gen;
end
else
begin
counter_1 <= counter_2;
end
end
assign clk_even = clk_gen;
assign Clk_Even = clk_even;
assign counter_2 = counter_1 + 1;
// Even clock divider pwm generator instantiation
PWM_EVEN_CLK PWM_Even (
.clk_even(clk_even),
.pwm_even_clk(pwm_clk_even)
);
// Odd clock divider pwm generator instantiation
PWM_ODD_CLK PWM_Odd (
.clk_odd(clk_odd),
.pwm_odd_clk(pwm_clk_odd)
);
endmodule