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

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [Altera/] [ip.hwp.cpu/] [nios_ii_sdram/] [hdl/] [timer_1.v] - Blame information for rev 147

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 147 lanttu
//Legal Notice: (C)2012 Altera Corporation. All rights reserved.  Your
2
//use of Altera Corporation's design tools, logic functions and other
3
//software and tools, and its AMPP partner logic functions, and any
4
//output files any of the foregoing (including device programming or
5
//simulation files), and any associated documentation or information are
6
//expressly subject to the terms and conditions of the Altera Program
7
//License Subscription Agreement or other applicable license agreement,
8
//including, without limitation, that your use is for the sole purpose
9
//of programming logic devices manufactured by Altera and sold by Altera
10
//or its authorized distributors.  Please refer to the applicable
11
//agreement for further details.
12
 
13
// synthesis translate_off
14
`timescale 1ns / 1ps
15
// synthesis translate_on
16
 
17
// turn off superfluous verilog processor warnings 
18
// altera message_level Level1 
19
// altera message_off 10034 10035 10036 10037 10230 10240 10030 
20
 
21
module timer_1 (
22
                 // inputs:
23
                  address,
24
                  chipselect,
25
                  clk,
26
                  reset_n,
27
                  write_n,
28
                  writedata,
29
 
30
                 // outputs:
31
                  irq,
32
                  readdata
33
               )
34
;
35
 
36
  output           irq;
37
  output  [ 15: 0] readdata;
38
  input   [  2: 0] address;
39
  input            chipselect;
40
  input            clk;
41
  input            reset_n;
42
  input            write_n;
43
  input   [ 15: 0] writedata;
44
 
45
  wire             clk_en;
46
  wire             control_continuous;
47
  wire             control_interrupt_enable;
48
  reg     [  3: 0] control_register;
49
  wire             control_wr_strobe;
50
  reg              counter_is_running;
51
  wire             counter_is_zero;
52
  wire    [ 31: 0] counter_load_value;
53
  reg     [ 31: 0] counter_snapshot;
54
  reg              delayed_unxcounter_is_zeroxx0;
55
  wire             do_start_counter;
56
  wire             do_stop_counter;
57
  reg              force_reload;
58
  reg     [ 31: 0] internal_counter;
59
  wire             irq;
60
  reg     [ 15: 0] period_h_register;
61
  wire             period_h_wr_strobe;
62
  reg     [ 15: 0] period_l_register;
63
  wire             period_l_wr_strobe;
64
  wire    [ 15: 0] read_mux_out;
65
  reg     [ 15: 0] readdata;
66
  wire             snap_h_wr_strobe;
67
  wire             snap_l_wr_strobe;
68
  wire    [ 31: 0] snap_read_value;
69
  wire             snap_strobe;
70
  wire             start_strobe;
71
  wire             status_wr_strobe;
72
  wire             stop_strobe;
73
  wire             timeout_event;
74
  reg              timeout_occurred;
75
  assign clk_en = 1;
76
  always @(posedge clk or negedge reset_n)
77
    begin
78
      if (reset_n == 0)
79
          internal_counter <= 32'hC34F;
80
      else if (counter_is_running || force_reload)
81
          if (counter_is_zero    || force_reload)
82
              internal_counter <= counter_load_value;
83
          else
84
            internal_counter <= internal_counter - 1;
85
    end
86
 
87
 
88
  assign counter_is_zero = internal_counter == 0;
89
  assign counter_load_value = {period_h_register,
90
    period_l_register};
91
 
92
  always @(posedge clk or negedge reset_n)
93
    begin
94
      if (reset_n == 0)
95
          force_reload <= 0;
96
      else if (clk_en)
97
          force_reload <= period_h_wr_strobe || period_l_wr_strobe;
98
    end
99
 
100
 
101
  assign do_start_counter = start_strobe;
102
  assign do_stop_counter = (stop_strobe                            ) ||
103
    (force_reload                           ) ||
104
    (counter_is_zero && ~control_continuous );
105
 
106
  always @(posedge clk or negedge reset_n)
107
    begin
108
      if (reset_n == 0)
109
          counter_is_running <= 1'b0;
110
      else if (clk_en)
111
          if (do_start_counter)
112
              counter_is_running <= -1;
113
          else if (do_stop_counter)
114
              counter_is_running <= 0;
115
    end
116
 
117
 
118
  //delayed_unxcounter_is_zeroxx0, which is an e_register
119
  always @(posedge clk or negedge reset_n)
120
    begin
121
      if (reset_n == 0)
122
          delayed_unxcounter_is_zeroxx0 <= 0;
123
      else if (clk_en)
124
          delayed_unxcounter_is_zeroxx0 <= counter_is_zero;
125
    end
126
 
127
 
128
  assign timeout_event = (counter_is_zero) & ~(delayed_unxcounter_is_zeroxx0);
129
  always @(posedge clk or negedge reset_n)
130
    begin
131
      if (reset_n == 0)
132
          timeout_occurred <= 0;
133
      else if (clk_en)
134
          if (status_wr_strobe)
135
              timeout_occurred <= 0;
136
          else if (timeout_event)
137
              timeout_occurred <= -1;
138
    end
139
 
140
 
141
  assign irq = timeout_occurred && control_interrupt_enable;
142
  //s1, which is an e_avalon_slave
143
  assign read_mux_out = ({16 {(address == 2)}} & period_l_register) |
144
    ({16 {(address == 3)}} & period_h_register) |
145
    ({16 {(address == 4)}} & snap_read_value[15 : 0]) |
146
    ({16 {(address == 5)}} & snap_read_value[31 : 16]) |
147
    ({16 {(address == 1)}} & control_register) |
148
    ({16 {(address == 0)}} & {counter_is_running,
149
    timeout_occurred});
150
 
151
  always @(posedge clk or negedge reset_n)
152
    begin
153
      if (reset_n == 0)
154
          readdata <= 0;
155
      else if (clk_en)
156
          readdata <= read_mux_out;
157
    end
158
 
159
 
160
  assign period_l_wr_strobe = chipselect && ~write_n && (address == 2);
161
  assign period_h_wr_strobe = chipselect && ~write_n && (address == 3);
162
  always @(posedge clk or negedge reset_n)
163
    begin
164
      if (reset_n == 0)
165
          period_l_register <= 49999;
166
      else if (period_l_wr_strobe)
167
          period_l_register <= writedata;
168
    end
169
 
170
 
171
  always @(posedge clk or negedge reset_n)
172
    begin
173
      if (reset_n == 0)
174
          period_h_register <= 0;
175
      else if (period_h_wr_strobe)
176
          period_h_register <= writedata;
177
    end
178
 
179
 
180
  assign snap_l_wr_strobe = chipselect && ~write_n && (address == 4);
181
  assign snap_h_wr_strobe = chipselect && ~write_n && (address == 5);
182
  assign snap_strobe = snap_l_wr_strobe || snap_h_wr_strobe;
183
  always @(posedge clk or negedge reset_n)
184
    begin
185
      if (reset_n == 0)
186
          counter_snapshot <= 0;
187
      else if (snap_strobe)
188
          counter_snapshot <= internal_counter;
189
    end
190
 
191
 
192
  assign snap_read_value = counter_snapshot;
193
  assign control_wr_strobe = chipselect && ~write_n && (address == 1);
194
  always @(posedge clk or negedge reset_n)
195
    begin
196
      if (reset_n == 0)
197
          control_register <= 0;
198
      else if (control_wr_strobe)
199
          control_register <= writedata[3 : 0];
200
    end
201
 
202
 
203
  assign stop_strobe = writedata[3] && control_wr_strobe;
204
  assign start_strobe = writedata[2] && control_wr_strobe;
205
  assign control_continuous = control_register[1];
206
  assign control_interrupt_enable = control_register;
207
  assign status_wr_strobe = chipselect && ~write_n && (address == 0);
208
 
209
endmodule
210
 

powered by: WebSVN 2.1.0

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