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

Subversion Repositories eco32

[/] [eco32/] [tags/] [eco32-0.25/] [fpga/] [src/] [tmr/] [tmr.v] - Blame information for rev 67

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 27 hellwig
module tmr(clk, reset,
2 67 hellwig
           en, wr, addr,
3 27 hellwig
           data_in, data_out,
4
           wt, irq);
5
    input clk;
6
    input reset;
7
    input en;
8
    input wr;
9 67 hellwig
    input addr;
10 27 hellwig
    input [31:0] data_in;
11
    output [31:0] data_out;
12
    output wt;
13
    output irq;
14
 
15
  reg [15:0] prescaler;
16
  reg tick;
17
  reg [31:0] counter;
18
  reg [31:0] divisor;
19
  reg divisor_loaded;
20
  reg expired;
21
  reg alarm;
22
  reg ien;
23
 
24
  always @(posedge clk) begin
25
    if (reset == 1) begin
26
      prescaler <= 16'd50000;
27
      tick <= 0;
28
    end else begin
29
      if (prescaler == 16'd1) begin
30
        prescaler <= 16'd50000;
31
        tick <= 1;
32
      end else begin
33
        prescaler <= prescaler - 1;
34
        tick <= 0;
35
      end
36
    end
37
  end
38
 
39
  always @(posedge clk) begin
40
    if (divisor_loaded == 1) begin
41
      counter <= divisor;
42
      expired <= 0;
43
    end else begin
44
      if (tick == 1) begin
45
        if (counter == 32'h00000001) begin
46
          counter <= divisor;
47
          expired <= 1;
48
        end else begin
49
          counter <= counter - 1;
50
          expired <= 0;
51
        end
52
      end else begin
53
        expired <= 0;
54
      end
55
    end
56
  end
57
 
58
  always @(posedge clk) begin
59
    if (reset == 1) begin
60
      divisor <= 32'hFFFFFFFF;
61
      divisor_loaded <= 1;
62
      alarm <= 0;
63
      ien <= 0;
64
    end else begin
65
      if (expired == 1) begin
66
        alarm <= 1;
67
      end else begin
68 67 hellwig
        if (en == 1 && wr == 1 && addr == 0) begin
69 27 hellwig
          alarm <= data_in[0];
70
          ien <= data_in[1];
71
        end
72 67 hellwig
        if (en == 1 && wr == 1 && addr == 1) begin
73 27 hellwig
          divisor <= data_in;
74
          divisor_loaded <= 1;
75
        end else begin
76
          divisor_loaded <= 0;
77
        end
78
      end
79
    end
80
  end
81
 
82
  assign data_out =
83 67 hellwig
    (addr == 0) ? { 28'h0000000, 2'b00, ien, alarm } :
84 27 hellwig
                   divisor;
85
  assign wt = 0;
86
  assign irq = ien & alarm;
87
 
88
endmodule

powered by: WebSVN 2.1.0

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