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

Subversion Repositories jt51

[/] [jt51/] [trunk/] [jt51/] [jt51_timers.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 gryzor
/*  This file is part of JT51.
2
 
3
    JT51 is free software: you can redistribute it and/or modify
4
    it under the terms of the GNU General Public License as published by
5
    the Free Software Foundation, either version 3 of the License, or
6
    (at your option) any later version.
7
 
8
    JT51 is distributed in the hope that it will be useful,
9
    but WITHOUT ANY WARRANTY; without even the implied warranty of
10
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
    GNU General Public License for more details.
12
 
13
    You should have received a copy of the GNU General Public License
14
    along with JT51.  If not, see <http://www.gnu.org/licenses/>.
15
 
16
        Author: Jose Tejada Gomez. Twitter: @topapate
17
        Version: 1.0
18
        Date: 27-10-2016
19
        */
20
 
21
`timescale 1ns / 1ps
22
 
23
module jt51_timers(
24
  input                 clk,
25
  input                 rst,
26
  input [9:0]    value_A,
27
  input [7:0]    value_B,
28
  input                 load_A,
29
  input                 load_B,
30
  input                 clr_flag_A,
31
  input                 clr_flag_B,
32
  input                 set_run_A,
33
  input                 set_run_B,
34
  input                 clr_run_A,
35
  input                 clr_run_B,
36
  input                 enable_irq_A,
37
  input                 enable_irq_B,
38
  output                flag_A,
39
  output                flag_B,
40
  output                overflow_A,
41
  output                irq_n
42
);
43
 
44
assign irq_n = ~( (flag_A&enable_irq_A) | (flag_B&enable_irq_B) );
45
 
46
jt51_timer #(.mult_width(6), .counter_width(10)) timer_A(
47
        .clk            ( clk           ),
48
        .rst            ( rst           ),
49
        .start_value( value_A   ),
50
        .load           ( load_A        ),
51
        .clr_flag   ( clr_flag_A),
52
        .set_run        ( set_run_A     ),
53
        .clr_run        ( clr_run_A ),
54
        .flag           ( flag_A        ),
55
        .overflow       ( overflow_A)
56
);
57
 
58
jt51_timer #(.mult_width(10), .counter_width(8)) timer_B(
59
        .clk            ( clk           ),
60
        .rst            ( rst           ),
61
        .start_value( value_B   ),
62
        .load           ( load_B        ),
63
        .clr_flag   ( clr_flag_B),
64
        .set_run        ( set_run_B     ),
65
        .clr_run        ( clr_run_B ),
66
        .flag           ( flag_B        ),
67
        .overflow       (                       )
68
);
69
 
70
endmodule
71
 
72
module jt51_timer #(parameter counter_width = 10, mult_width=5 )
73
(
74
        input   clk,
75
        input   rst,
76
        input   [counter_width-1:0] start_value,
77
        input   load,
78
        input   clr_flag,
79
        input   set_run,
80
        input   clr_run,
81
        output reg flag,
82
        output reg overflow
83
);
84
 
85
reg run;
86
reg [   mult_width-1:0] mult;
87
reg [counter_width-1:0] cnt;
88
 
89
always@(posedge clk)
90
        if( clr_flag || rst)
91
                flag <= 1'b0;
92
        else if(overflow) flag<=1'b1;
93
 
94
always@(posedge clk)
95
        if( clr_run || rst)
96
                run <= 1'b0;
97
        else if(set_run || load) run<=1'b1;
98
 
99
reg [mult_width+counter_width-1:0] next, init;
100
 
101
always @(*) begin
102
        {overflow, next } <= { 1'b0, cnt, mult } + 1'b1;
103
        init <= { start_value, { (mult_width){1'b0} } };
104
end
105
 
106
always @(posedge clk) begin : counter
107
        if( load ) begin
108
          mult <= { (mult_width){1'b0} };
109
          cnt  <= start_value;
110
        end
111
        else if( run )
112
          { cnt, mult } <= overflow ? init : next;
113
end
114
endmodule

powered by: WebSVN 2.1.0

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