Added some utility modules for use with peripherals.
diff --git a/verilog/rtl/Peripherals/Registers/ConfigurationRegister.v b/verilog/rtl/Peripherals/Registers/ConfigurationRegister.v
new file mode 100644
index 0000000..4fc64e0
--- /dev/null
+++ b/verilog/rtl/Peripherals/Registers/ConfigurationRegister.v
@@ -0,0 +1,44 @@
+module ConfigurationRegister #(
+ parameter WIDTH = 32,
+ parameter ADDRESS = 12'b0,
+ parameter DEFAULT = 32'b0
+ )(
+ input wire clk,
+ input wire rst,
+
+ // Peripheral Bus
+ input wire enable,
+ input wire peripheralBus_we,
+ input wire peripheralBus_oe,
+ input wire[11:0] peripheralBus_address,
+ inout wire[31:0] peripheralBus_data,
+
+ output wire[WIDTH-1:0] currentValue
+ );
+
+reg[WIDTH-1:0] registerValue;
+
+wire registerSelect = enable && (peripheralBus_address == ADDRESS);
+wire we = registerSelect && peripheralBus_we && !peripheralBus_oe;
+wire oe = registerSelect && peripheralBus_oe && !peripheralBus_we;
+
+always @(posedge clk) begin
+ if (rst) begin
+ registerValue <= DEFAULT;
+ end else begin
+ if (we) registerValue <= peripheralBus_data[WIDTH-1:0];
+ end
+end
+
+generate
+ if (WIDTH == 32) begin
+ assign peripheralBus_data = oe ? registerValue : 32'bz;
+ end else begin
+ wire[32-WIDTH-1:0] zeroPadding = 'b0;
+ assign peripheralBus_data = oe ? { zeroPadding, registerValue } : 32'bz;
+ end
+endgenerate
+
+assign currentValue = registerValue;
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/Peripherals/Registers/DataRegister.v b/verilog/rtl/Peripherals/Registers/DataRegister.v
new file mode 100644
index 0000000..491b56e
--- /dev/null
+++ b/verilog/rtl/Peripherals/Registers/DataRegister.v
@@ -0,0 +1,44 @@
+module DataRegister #(
+ parameter WIDTH = 32,
+ parameter ADDRESS = 12'b0
+ )(
+ input wire clk,
+ input wire rst,
+
+ // Peripheral Bus
+ input wire enable,
+ input wire peripheralBus_we,
+ input wire peripheralBus_oe,
+ output wire peripheralBus_busy,
+ input wire[11:0] peripheralBus_address,
+ inout wire[31:0] peripheralBus_data,
+
+ input wire[WIDTH-1:0] writeData,
+ output wire writeData_en,
+ input wire writeData_busy,
+ output wire[WIDTH-1:0] readData,
+ output wire readData_en,
+ input wire readData_busy
+ );
+
+wire registerSelect = enable && (peripheralBus_address == ADDRESS);
+wire we = registerSelect && peripheralBus_we && !peripheralBus_oe;
+wire oe = registerSelect && peripheralBus_oe && !peripheralBus_we;
+
+assign writeData = we ? peripheralBus_data[WIDTH-1:0] : 'b0;
+assign writeData_en = we;
+
+generate
+ if (WIDTH == 32) begin
+ assign peripheralBus_data = oe ? readData : 32'bz;
+ end else begin
+ wire[32-WIDTH-1:0] zeroPadding = 'b0;
+ assign peripheralBus_data = oe ? { zeroPadding, readData } : 32'bz;
+ end
+endgenerate
+
+assign readData_en = oe;
+
+assign peripheralBus_busy = registerSelect && ((we && writeData_busy) | (oe && readData_busy));
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/Peripherals/Registers/DeviceSelect.v b/verilog/rtl/Peripherals/Registers/DeviceSelect.v
new file mode 100644
index 0000000..83dbea7
--- /dev/null
+++ b/verilog/rtl/Peripherals/Registers/DeviceSelect.v
@@ -0,0 +1,13 @@
+module DeviceSelect #(
+ parameter ID = 4'h0
+ )(
+ input wire peripheralEnable,
+ input wire[15:0] peripheralBus_address,
+ output wire[11:0] localAddress,
+ output wire deviceEnable
+ );
+
+assign deviceEnable = peripheralEnable && (peripheralBus_address[15:12] == ID);
+assign localAddress = peripheralBus_address[11:0];
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/Peripherals/Registers/PeripheralSelect.v b/verilog/rtl/Peripherals/Registers/PeripheralSelect.v
new file mode 100644
index 0000000..97de0f3
--- /dev/null
+++ b/verilog/rtl/Peripherals/Registers/PeripheralSelect.v
@@ -0,0 +1,12 @@
+module PeripheralSelect #(
+ parameter ID = 8'h00
+ )(
+ input wire[23:0] peripheralBus_address,
+ output wire[15:0] localAddress,
+ output wire peripheralEnable
+ );
+
+assign peripheralEnable = peripheralBus_address[23:16] == ID;
+assign localAddress = peripheralBus_address[15:0];
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/Utility/ConfigurationRegister.v b/verilog/rtl/Utility/ConfigurationRegister.v
deleted file mode 100644
index 1dc4ef5..0000000
--- a/verilog/rtl/Utility/ConfigurationRegister.v
+++ /dev/null
@@ -1,32 +0,0 @@
-module ConfigurationRegister #(
- parameter WIDTH = 32,
- parameter ADDRESS = 32'b0
- )(
- input wire clk,
- input wire rst,
-
- // RW interface
- input wire we,
- input wire oe,
- input wire[31:0] interfaceAddress,
- inout wire[31:0] interfaceData,
-
- output wire[WIDTH-1:0] currentValue
- );
-
-reg[WIDTH-1:0] registerValue;
-
-wire registerSelect = interfaceAddress == ADDRESS;
-
-always @(posedge clk) begin
- if (rst) begin
- registerValue <= 'b0;
- end else begin
- if (registerSelect && we && !oe) registerValue <= WIDTH'(interfaceData);
- end
-end
-
-assign interfaceData = registerSelect && oe && !we ? 32'(registerValue) : 32'bz;
-assign currentValue = registerValue;
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/Utility/counter.v b/verilog/rtl/Utility/counter.v
index 5989927..a2c078b 100644
--- a/verilog/rtl/Utility/counter.v
+++ b/verilog/rtl/Utility/counter.v
@@ -1,4 +1,4 @@
-module counter #(
+module Counter #(
parameter WIDTH = 8, // Width of the output
parameter DIV = 0, // number of bits to use as divisor
parameter TOP = 0, // max value, 0 = none