OpenCores
URL https://opencores.org/ocsvn/freq_div/freq_div/trunk

Subversion Repositories freq_div

[/] [freq_div/] [trunk/] [rtl/] [odd.v] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 joecrop
 
2
`include "defines.v"
3
 
4 4 joecrop
module odd(clk, out, N, reset, enable);
5 2 joecrop
 
6 4 joecrop
        input clk;                                      // slow clock
7
        output out;                                     // fast output clock
8
        input [`SIZE-1:0] N;             // division factor
9
        input reset;                            // synchronous reset
10
        input enable;                           // odd enable
11 2 joecrop
 
12 4 joecrop
        reg [`SIZE-1:0] counter; // these 2 counters are used
13
        reg [`SIZE-1:0] counter2;        // to non-overlapping signals
14
        reg out_counter;                        // positive edge triggered counter
15
        reg out_counter2;                       // negative edge triggered counter
16
        reg rst_pulse;                          // pulse generated when vector N changes
17
        reg [`SIZE-1:0] old_N;           // gets set to old N when N is changed
18
        wire not_zero;                          // if !not_zero, we devide by 1
19 2 joecrop
 
20 4 joecrop
        assign out = out_counter2 ^ out_counter;        // xor to generate 50% duty, half-period
21
                                                                                                // waves of final output
22
        // positive edge counter/divider
23 2 joecrop
        always @(posedge clk)
24
        begin
25
                if(reset | rst_pulse)
26
                begin
27 4 joecrop
                        counter <= N;
28 2 joecrop
                        out_counter <= 1;
29
                end
30 3 joecrop
                else if (enable)
31 2 joecrop
                begin
32
                        if(counter == 1)
33
                        begin
34 4 joecrop
                                counter <= N;
35 2 joecrop
                                out_counter <= ~out_counter;
36
                        end
37
                        else
38
                        begin
39 5 joecrop
                                counter <= counter - 1'b1;
40 2 joecrop
                        end
41
                end
42
        end
43
 
44 4 joecrop
        reg [`SIZE-1:0] initial_begin;           // this is used to offset the negative edge counter
45
        wire [`SIZE:0] interm_3;                 // from the positive edge counter in order to
46 5 joecrop
        assign interm_3 = {1'b0,N} + 2'b11;             // guarante 50% duty cycle.
47 2 joecrop
 
48 4 joecrop
        // counter driven by negative edge of clock.
49 2 joecrop
        always @(negedge clk)
50
        begin
51 4 joecrop
                if(reset | rst_pulse)                                           // reset the counter at system reset
52
                begin                                                                           // or change of N.
53
                        counter2 <= N;
54 2 joecrop
                        initial_begin <= interm_3[`SIZE:1];
55
                        out_counter2 <= 1;
56
                end
57 4 joecrop
                else if(initial_begin <= 1 && enable)           // Do normal logic after odd calibration.
58
                begin                                                                           // This is the same as the even counter.
59 2 joecrop
                        if(counter2 == 1)
60
                        begin
61 4 joecrop
                                counter2 <= N;
62 2 joecrop
                                out_counter2 <= ~out_counter2;
63
                        end
64
                        else
65
                        begin
66 5 joecrop
                                counter2 <= counter2 - 1'b1;
67 2 joecrop
                        end
68
                end
69 3 joecrop
                else if(enable)
70 2 joecrop
                begin
71 5 joecrop
                        initial_begin <= initial_begin - 1'b1;
72 2 joecrop
                end
73
        end
74
 
75 4 joecrop
        //
76
        // reset pulse generator:
77
        //               __    __    __    __    _
78
        // clk:       __/  \__/  \__/  \__/  \__/
79
        //            _ __________________________
80
        // N:         _X__________________________
81
        //               _____
82
        // rst_pulse: __/     \___________________
83
        //
84
        // This block generates an internal reset for the odd divider in the
85
        // form of a single pulse signal when the odd divider is enabled.
86 2 joecrop
        always @(posedge clk or posedge reset)
87
        begin
88
                if(reset)
89
                begin
90
                        rst_pulse <= 0;
91
                end
92 3 joecrop
                else if(enable)
93 2 joecrop
                begin
94 4 joecrop
                        if(N != old_N)          // pulse when reset changes
95 2 joecrop
                        begin
96
                                rst_pulse <= 1;
97
                        end
98
                        else
99
                        begin
100
                                rst_pulse <= 0;
101
                        end
102
                end
103 5 joecrop
        end
104
 
105
        always @(posedge clk)
106
        begin
107 4 joecrop
                old_N <= N;     // always save the old N value to guarante reset from
108
        end                             // an even-to-odd transition.
109 2 joecrop
 
110
endmodule //odd

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.