Check in decred_top source files.
diff --git a/verilog/rtl/decred_top/rtl/src/addressalyzer.v b/verilog/rtl/decred_top/rtl/src/addressalyzer.v
new file mode 100644
index 0000000..f0958c6
--- /dev/null
+++ b/verilog/rtl/decred_top/rtl/src/addressalyzer.v
@@ -0,0 +1,203 @@
+`timescale 1ns / 1ps
+
+module addressalyzer (
+  input  wire  RST,
+  input  wire  iCLK,
+
+  input        start_of_transfer,
+  input        end_of_transfer,
+  input [7:0]  data_in_value,
+  input        data_in_ready,
+  input        data_out_request,
+  input        write_enable_mask,
+
+  output wire [14:0] ram_address_out,
+  output reg   address_strobe,
+  output       ram_read_strobe,
+  output       ram_write_strobe
+  );
+
+  wire read_cycle;
+
+  // //////////////////////////////////////////////////////
+  // Address FSM signals 
+  parameter ADDR_SIZE     = 6;
+  parameter ADDR_IDLE     = 6'b000001;
+  parameter ADDR_ADDR1    = 6'b000010;
+  parameter ADDR_ADDR2    = 6'b000100;  
+  parameter ADDR_RD_BYTES = 6'b001000;  
+  parameter ADDR_WR_BYTEQ = 6'b010000;  
+  parameter ADDR_WR_BYTES = 6'b100000;  
+
+  reg [ADDR_SIZE - 1:0]  addr_state;
+
+  reg [15:0] address_local;
+  assign read_cycle = address_local[15];
+  assign ram_address_out = address_local[14:0];
+
+  always @ (posedge iCLK) begin 
+    if(RST) begin 
+      address_local  <= 0;
+      address_strobe <= 0;
+      addr_state     <= ADDR_IDLE;
+    end
+    else begin
+
+      case (addr_state)
+
+        ADDR_IDLE:
+		    begin
+          address_local  <= 0;
+          address_strobe <= 0;
+	  	    if (start_of_transfer == 1'b1) begin
+            addr_state <= ADDR_ADDR1;
+          end
+		    end
+
+        ADDR_ADDR1:
+  		  if (data_in_ready == 1'b1) begin
+
+          address_local <= {data_in_value, data_in_value};
+          addr_state <= ADDR_ADDR2;
+
+        end
+
+        ADDR_ADDR2:
+		    if (data_in_ready == 1'b1) begin
+
+          address_local  <= {address_local[15:8], data_in_value};
+          address_strobe <= 1;
+
+          if (read_cycle == 1'b1) begin
+
+            addr_state <= ADDR_RD_BYTES;
+
+          end else begin
+
+            addr_state <= ADDR_WR_BYTEQ;
+ 
+          end
+        end 
+
+        ADDR_RD_BYTES:
+		    if (data_out_request == 1'b1) begin
+
+          address_local  <= address_local + 1'b1;
+          address_strobe <= 0;
+
+        end else if (end_of_transfer == 1'b1) begin
+
+          addr_state     <= ADDR_IDLE;
+          address_strobe <= 0;
+
+        end
+
+        ADDR_WR_BYTEQ:
+		    if (data_in_ready == 1'b1) begin
+
+          addr_state     <= ADDR_WR_BYTES;
+          address_strobe <= 0;
+
+        end else if (end_of_transfer == 1'b1) begin
+
+          addr_state <= ADDR_IDLE;
+          address_strobe <= 0;
+
+        end
+
+        ADDR_WR_BYTES:
+	      if (data_in_ready == 1'b1) begin
+
+          address_local <= address_local + 1'b1;
+
+        end else if (end_of_transfer == 1'b1) begin
+
+          addr_state <= ADDR_IDLE;
+
+        end
+
+        default: begin
+          addr_state <= ADDR_IDLE;
+        end
+      endcase
+    end
+  end
+
+  // //////////////////////////////////////////////////////
+  // Read/Write FSM signals 
+  parameter RDWR_SIZE       = 4;
+  parameter RDWR_IDLE       = 4'b0001;
+  parameter RDWR_CLK_EN     = 4'b0010;
+  parameter RDWR_STROBE0    = 4'b0100;  
+  parameter RDWR_END        = 4'b1000;  
+
+  reg [RDWR_SIZE - 1:0]  rdwr_state;
+  reg rdwr_read_en;
+  reg rdwr_write_en;
+
+  assign ram_read_strobe = rdwr_read_en;
+  assign ram_write_strobe = rdwr_write_en;
+
+  always @ (posedge iCLK) begin 
+    if(RST) begin 
+      rdwr_state    <= RDWR_IDLE;
+      rdwr_read_en  <= 0;
+      rdwr_write_en <= 0;
+    end
+    else begin
+
+    case (rdwr_state)
+
+      RDWR_IDLE:
+      if (addr_state == ADDR_WR_BYTES) begin
+
+        rdwr_read_en     <= 0;
+        rdwr_write_en    <= write_enable_mask;
+        rdwr_state       <= RDWR_CLK_EN;
+
+      end else if (addr_state == ADDR_RD_BYTES) begin
+
+        rdwr_read_en     <= 0;
+        rdwr_write_en    <= 0;
+        rdwr_state       <= RDWR_CLK_EN;
+		  end
+
+      RDWR_CLK_EN:
+      if (addr_state == ADDR_WR_BYTES) begin
+
+        rdwr_read_en     <= 0;
+        rdwr_write_en    <= 0;
+        rdwr_state       <= RDWR_STROBE0;
+
+      end else if (addr_state == ADDR_RD_BYTES) begin
+
+        rdwr_read_en     <= 1;
+        rdwr_write_en    <= 0;
+        rdwr_state       <= RDWR_STROBE0;
+		  end
+
+      RDWR_STROBE0:
+      begin
+
+        rdwr_read_en     <= 0;
+        rdwr_write_en    <= 0;
+        rdwr_state       <= RDWR_END;
+      end
+
+      RDWR_END:
+      begin
+
+        if (data_in_ready == 1'b1) begin
+
+          rdwr_state <= RDWR_IDLE;
+		    end
+      end
+
+      default:
+      begin
+        rdwr_state <= RDWR_IDLE;
+      end
+      endcase
+     end
+   end
+endmodule // addressalyzer