OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_processor/] [mor1kx-5.0/] [rtl/] [verilog/] [mor1kx_ticktimer.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/* ****************************************************************************
2
 This Source Code Form is subject to the terms of the
3
 Open Hardware Description License, v. 1.0. If a copy
4
 of the OHDL was not distributed with this file, You
5
 can obtain one at http://juliusbaxter.net/ohdl/ohdl.txt
6
 
7
 Description: mor1kx tick timer unit
8
 
9
 Copyright (C) 2012 Authors
10
 
11
 Author(s): Julius Baxter <juliusbaxter@gmail.com>
12
 
13
***************************************************************************** */
14
 
15
`include "mor1kx-defines.v"
16
 
17
module mor1kx_ticktimer
18
  (
19
   input         clk,
20
   input         rst,
21
 
22
   output [31:0] spr_ttmr_o,
23
   output [31:0] spr_ttcr_o,
24
 
25
   // SPR Bus interface
26
   input         spr_access_i,
27
   input         spr_we_i,
28
   input [15:0]  spr_addr_i,
29
   input [31:0]  spr_dat_i,
30
   output        spr_bus_ack,
31
   output [31:0] spr_dat_o
32
   );
33
 
34
   // Registers
35
   reg [31:0]    spr_ttmr;
36
   reg [31:0]    spr_ttcr;
37
 
38
   wire spr_ttmr_access;
39
   wire spr_ttcr_access;
40
 
41
   // ttcr control wires
42
   wire          ttcr_clear;
43
   wire          ttcr_run;
44
   wire          ttcr_match;
45
 
46
   assign spr_ttmr_o = spr_ttmr;
47
   assign spr_ttcr_o = spr_ttcr;
48
 
49
   assign spr_ttmr_access =
50
     spr_access_i &
51
     (`SPR_OFFSET(spr_addr_i) == `SPR_OFFSET(`OR1K_SPR_TTMR_ADDR));
52
   assign spr_ttcr_access =
53
     spr_access_i &
54
     (`SPR_OFFSET(spr_addr_i) == `SPR_OFFSET(`OR1K_SPR_TTCR_ADDR));
55
 
56
   assign spr_bus_ack = spr_access_i;
57
   assign spr_dat_o = (spr_access_i & spr_ttcr_access) ? spr_ttcr :
58
                      (spr_access_i & spr_ttmr_access) ? spr_ttmr : 0;
59
 
60
   assign ttcr_match = spr_ttcr[27:0] == spr_ttmr[27:0];
61
 
62
   // Timer SPR control
63
   always @(posedge clk `OR_ASYNC_RST)
64
     if (rst)
65
       spr_ttmr <= 0;
66
     else if (spr_we_i & spr_ttmr_access)
67
       spr_ttmr <= spr_dat_i[31:0];
68
     else if (ttcr_match & spr_ttmr[29])
69
       spr_ttmr[28] <= 1; // Generate interrupt
70
 
71
   // Modes (spr_ttmr[31:30]):
72
   // 00 Tick timer is disabled.
73
   // 01 Timer is restarted on ttcr_match.
74
   // 10 Timer stops when ttcr_match is true.
75
   // 11 Timer does not stop when ttcr_match is true
76
   assign ttcr_clear = (spr_ttmr[31:30] == 2'b01) & ttcr_match;
77
   assign ttcr_run = (spr_ttmr[31:30] != 2'b00) & !ttcr_match |
78
                     (spr_ttmr[31:30] == 2'b11);
79
 
80
   always @(posedge clk `OR_ASYNC_RST)
81
     if (rst)
82
       spr_ttcr <= 0;
83
     else if (spr_we_i & spr_ttcr_access)
84
       spr_ttcr <= spr_dat_i[31:0];
85
     else if (ttcr_clear)
86
       spr_ttcr <= 0;
87
     else if (ttcr_run)
88
       spr_ttcr <= spr_ttcr + 1;
89
 
90
endmodule // mor1kx_ticktimer

powered by: WebSVN 2.1.0

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