Reorganize register offsets and introduce new register to read the system
clock frequency.
---
 boards/milkymist-one/rtl/system.v |    1 +
 cores/sysctl/doc/sysctl.tex       |    7 +++-
 cores/sysctl/rtl/sysctl.v         |   72 +++++++++++++++++++++---------------
 software/include/hw/sysctl.h      |   10 +++--
 4 files changed, 54 insertions(+), 36 deletions(-)

diff --git a/boards/milkymist-one/rtl/system.v 
b/boards/milkymist-one/rtl/system.v
index 07e9e91..2d68ec0 100644
--- a/boards/milkymist-one/rtl/system.v
+++ b/boards/milkymist-one/rtl/system.v
@@ -913,6 +913,7 @@ sysctl #(
        .csr_addr(4'h1),
        .ninputs(7),
        .noutputs(2),
+       .clk_freq(`CLOCK_FREQUENCY),
        .systemid(32'h11004D31) /* 1.1.0 final (0) on M1 */
 ) sysctl (
        .sys_clk(sys_clk),
diff --git a/cores/sysctl/doc/sysctl.tex b/cores/sysctl/doc/sysctl.tex
index 5b18b46..4b01263 100644
--- a/cores/sysctl/doc/sysctl.tex
+++ b/cores/sysctl/doc/sysctl.tex
@@ -68,11 +68,14 @@ This register holds the value to which the counter is 
compared to, in order to s
 This register holds the current value of the timer counter. It can be read or 
written at any time.
 Writing it does not clear the trigger bit (bit 0 of the timer control 
register). The trigger bit should always be manually reset.
 
+\section{System Frequency}
+The system controller provides a 32-bit value defined at synthesis time that 
returns the system frequency of the SoC. It is readable from register 0x74. It 
is defined using the \verb!clk_freq! Verilog parameter.
+
 \section{Capabilities}
-The system controller provides a 32-bit value intended to be used as 
user-defined bit mask that defines the presence of certain peripherals or 
features in the bitstream. It is readable from register 0x38. It is defined  
using the \verb!capabilities! input.
+The system controller provides a 32-bit value intended to be used as 
user-defined bit mask that defines the presence of certain peripherals or 
features in the bitstream. It is readable from register 0x78. It is defined  
using the \verb!capabilities! input.
 
 \section{System identification}
-The system controller provides a 32-bit value defined at synthesis time that 
can be used to identify bitstreams or boards. The value is set by the 
\verb!systemid! Verilog parameter and read using the register 0x3c.
+The system controller provides a 32-bit value defined at synthesis time that 
can be used to identify bitstreams or boards. The value is set by the 
\verb!systemid! Verilog parameter and read using the register 0x7c.
 
 Writing any value to this register sends a hard system reset by asserting the 
\verb!hard_reset! output.
 
diff --git a/cores/sysctl/rtl/sysctl.v b/cores/sysctl/rtl/sysctl.v
index 606085f..3facb99 100644
--- a/cores/sysctl/rtl/sysctl.v
+++ b/cores/sysctl/rtl/sysctl.v
@@ -19,6 +19,7 @@ module sysctl #(
        parameter csr_addr = 4'h0,
        parameter ninputs = 16,
        parameter noutputs = 16,
+       parameter clk_freq = 32'h00000000,
        parameter systemid = 32'habadface
 ) (
        input sys_clk,
@@ -109,7 +110,7 @@ reg [7:0] debug_scratchpad;
 
 wire csr_selected = csr_a[13:10] == csr_addr;
 
-assign icap_we = csr_selected & csr_we & (csr_a[3:0] == 4'b1101);
+assign icap_we = csr_selected & csr_we & (csr_a[4:0] == 4'b10000);
 
 always @(posedge sys_clk) begin
        if(sys_rst) begin
@@ -153,56 +154,67 @@ always @(posedge sys_clk) begin
                if(csr_selected) begin
                        /* CSR Writes */
                        if(csr_we) begin
-                               case(csr_a[3:0])
+                               case(csr_a[4:0])
                                        /* GPIO registers */
-                                       // 0000 is GPIO IN and is read-only
-                                       4'b0001: gpio_outputs <= 
csr_di[noutputs-1:0];
-                                       4'b0010: gpio_irqen <= 
csr_di[ninputs-1:0];
+                                       // 00000 is GPIO IN and is read-only
+                                       5'b00001: gpio_outputs <= 
csr_di[noutputs-1:0];
+                                       5'b00010: gpio_irqen <= 
csr_di[ninputs-1:0];
                                        
                                        /* Timer 0 registers */
-                                       4'b0100: begin
+                                       5'b00100: begin
                                                en0 <= csr_di[0];
                                                ar0 <= csr_di[1];
                                        end
-                                       4'b0101: compare0 <= csr_di;
-                                       4'b0110: counter0 <= csr_di;
+                                       5'b00101: compare0 <= csr_di;
+                                       5'b00110: counter0 <= csr_di;
                                        
                                        /* Timer 1 registers */
-                                       4'b1000: begin
+                                       5'b01000: begin
                                                en1 <= csr_di[0];
                                                ar1 <= csr_di[1];
                                        end
-                                       4'b1001: compare1 <= csr_di;
-                                       4'b1010: counter1 <= csr_di;
+                                       5'b01001: compare1 <= csr_di;
+                                       5'b01010: counter1 <= csr_di;
 
-                                       4'b1100: debug_scratchpad <= 
csr_di[7:0];
-                                       // 1101 is ICAP and is handled 
separately
-                                       // 1110 is capabilities and is read-only
-                                       4'b1111: hard_reset <= 1'b1;
+                                       /* ICAP */
+                                       // 10000 is ICAP and is handled 
separately
+
+                                       /* Debug monitor (gdbstub) */
+                                       5'b10100: debug_scratchpad <= 
csr_di[7:0];
+
+                                       // 11101 is clk_freq and is read-only
+                                       // 11110 is capabilities and is 
read-only
+                                       5'b11111: hard_reset <= 1'b1;
                                endcase
                        end
                
                        /* CSR Reads */
-                       case(csr_a[3:0])
+                       case(csr_a[4:0])
                                /* GPIO registers */
-                               4'b0000: csr_do <= gpio_in;
-                               4'b0001: csr_do <= gpio_outputs;
-                               4'b0010: csr_do <= gpio_irqen;
+                               5'b00000: csr_do <= gpio_in;
+                               5'b00001: csr_do <= gpio_outputs;
+                               5'b00010: csr_do <= gpio_irqen;
                                
                                /* Timer 0 registers */
-                               4'b0100: csr_do <= {ar0, en0};
-                               4'b0101: csr_do <= compare0;
-                               4'b0110: csr_do <= counter0;
+                               5'b00100: csr_do <= {ar0, en0};
+                               5'b00101: csr_do <= compare0;
+                               5'b00110: csr_do <= counter0;
                                
                                /* Timer 1 registers */
-                               4'b1000: csr_do <= {ar1, en1};
-                               4'b1001: csr_do <= compare1;
-                               4'b1010: csr_do <= counter1;
-
-                               4'b1100: csr_do <= debug_scratchpad;
-                               4'b1101: csr_do <= icap_ready;
-                               4'b1110: csr_do <= capabilities;
-                               4'b1111: csr_do <= systemid;
+                               5'b01000: csr_do <= {ar1, en1};
+                               5'b01001: csr_do <= compare1;
+                               5'b01010: csr_do <= counter1;
+
+                               /* ICAP */
+                               5'b10000: csr_do <= icap_ready;
+
+                               /* Debug monitor (gdbstub) */
+                               5'b10100: csr_do <= debug_scratchpad;
+
+                               /* Read only SoC properties */
+                               5'b11101: csr_do <= clk_freq;
+                               5'b11110: csr_do <= capabilities;
+                               5'b11111: csr_do <= systemid;
                        endcase
                end
        end
diff --git a/software/include/hw/sysctl.h b/software/include/hw/sysctl.h
index 8c2dd9e..58529b0 100644
--- a/software/include/hw/sysctl.h
+++ b/software/include/hw/sysctl.h
@@ -35,15 +35,17 @@
 #define TIMER_ENABLE           (0x01)
 #define TIMER_AUTORESTART      (0x02)
 
-#define CSR_DBG_SCRATCHPAD     MMPTR(0xe0001030)
-#define CSR_ICAP               MMPTR(0xe0001034)
+#define CSR_ICAP               MMPTR(0xe0001040)
 
 #define ICAP_READY             (0x01)
 
 #define ICAP_CE                        (0x10000)
 #define ICAP_WRITE             (0x20000)
 
-#define CSR_CAPABILITIES       MMPTR(0xe0001038)
-#define CSR_SYSTEM_ID          MMPTR(0xe000103c)
+#define CSR_DBG_SCRATCHPAD     MMPTR(0xe0001050)
+
+#define CSR_FREQUENCY          MMPTR(0xe0001074)
+#define CSR_CAPABILITIES       MMPTR(0xe0001078)
+#define CSR_SYSTEM_ID          MMPTR(0xe000107c)
 
 #endif /* __HW_SYSCTL_H */
-- 
1.7.2.5

_______________________________________________
http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org
IRC: #milkymist@Freenode

Reply via email to