Add step motor controller
diff --git a/openlane/user_proj_example/config.tcl b/openlane/user_proj_example/config.tcl
index 0809b0e..3d46ede 100755
--- a/openlane/user_proj_example/config.tcl
+++ b/openlane/user_proj_example/config.tcl
@@ -24,9 +24,11 @@
 	$::env(CARAVEL_ROOT)/verilog/rtl/defines.v \
 	$script_dir/../../verilog/rtl/user_proj_example.v \
 	$script_dir/../../verilog/rtl/wishbone_1mst_to_8slv.v \
+	$script_dir/../../verilog/rtl/prescaler.v \
 	$script_dir/../../verilog/rtl/simple_fifo.v \
 	$script_dir/../../verilog/rtl/nec_ir_receiver.v \
-	$script_dir/../../verilog/rtl/pseudorandom.v"
+	$script_dir/../../verilog/rtl/pseudorandom.v \
+	$script_dir/../../verilog/rtl/step_motor_controller.v"
 
 set ::env(DESIGN_IS_CORE) 0
 
diff --git a/verilog/includes/includes.rtl.caravel_user_project b/verilog/includes/includes.rtl.caravel_user_project
index 039a4cd..eb04dc0 100644
--- a/verilog/includes/includes.rtl.caravel_user_project
+++ b/verilog/includes/includes.rtl.caravel_user_project
@@ -2,8 +2,10 @@
 -v $(USER_PROJECT_VERILOG)/rtl/user_project_wrapper.v	     
 -v $(USER_PROJECT_VERILOG)/rtl/user_proj_example.v
 -v $(USER_PROJECT_VERILOG)/rtl/wishbone_1mst_to_8slv.v
+-v $(USER_PROJECT_VERILOG)/rtl/prescaler.v
 -v $(USER_PROJECT_VERILOG)/rtl/simple_fifo.v
 -v $(USER_PROJECT_VERILOG)/rtl/nec_ir_receiver.v
 -v $(USER_PROJECT_VERILOG)/rtl/pseudorandom.v
+-v $(USER_PROJECT_VERILOG)/rtl/step_motor_controller.v
 -v $(USER_PROJECT_VERILOG)/beh/ir_behavioral_driver.v
  
diff --git a/verilog/rtl/nec_ir_receiver.v b/verilog/rtl/nec_ir_receiver.v
index f1df164..26d3f92 100644
--- a/verilog/rtl/nec_ir_receiver.v
+++ b/verilog/rtl/nec_ir_receiver.v
@@ -156,10 +156,10 @@
     .rd_ready(frame_read     )

   );

 

-  registers #(

+  nec_ir_receiver_registers #(

     .PSIZE(PSIZE),

     .DSIZE(DSIZE)

-  ) i_registers (

+  ) i_nec_ir_receiver_registers (

     .rst_n   (rst_n),

     .clk     (clk  ),

 

@@ -199,50 +199,6 @@
 endmodule

 

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

-// Prescaler

-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

-module prescaler #(

-  parameter BITS = 32

-)(

-  input  wire            rst_n      , // Asynchronous reset (active low)

-  input  wire            clk        , // Clock (rising edge)

-  input  wire            clear_n  , // Synchronous reset (active low)

-

-  input  wire [BITS-1:0] multiplier , // frequency multiplier

-  input  wire [BITS-1:0] divider    , // frequency divider

-

-  output reg             tick         // output clock [Ftick=Fclk*(multiplier/divider)] with multiplier <= divider

-

-);

-

-  wire [BITS-1:0] next_counter;

-  reg  [BITS-1:0] counter;

-

-  assign next_counter = counter + multiplier;

-

-  always @(negedge rst_n or posedge clk) begin

-    if (rst_n == 1'b0) begin

-      counter <= 1'b0;

-      tick    <= 1'b0;

-    end else begin

-      if (clear_n == 1'b0) begin

-        counter <= 1'b0;

-        tick    <= 1'b0;

-      end else begin

-        if (next_counter > divider) begin

-          counter <= next_counter - divider;

-          tick    <= 1'b1;

-        end else begin

-          counter <= next_counter;

-          tick    <= 1'b0;

-        end

-      end

-    end

-  end

-

-endmodule

-

-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 // Metastability filter

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 module metastability_filter #(

@@ -559,7 +515,7 @@
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 // Registers

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

-module registers #(

+module nec_ir_receiver_registers #(

   parameter PSIZE = 32          , // Size of prescaler counter(bits)

   parameter DSIZE = 11            // Size of delay counter (bits)

 )(

diff --git a/verilog/rtl/prescaler.v b/verilog/rtl/prescaler.v
new file mode 100644
index 0000000..333f18e
--- /dev/null
+++ b/verilog/rtl/prescaler.v
@@ -0,0 +1,59 @@
+////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2022 , Julien OURY                       
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Julien OURY <julien.oury@outlook.fr>
+//
+////////////////////////////////////////////////////////////////////////////
+
+module prescaler #(
+  parameter BITS = 32
+)(
+  input  wire            rst_n      , // Asynchronous reset (active low)
+  input  wire            clk        , // Clock (rising edge)
+  input  wire            clear_n  , // Synchronous reset (active low)
+
+  input  wire [BITS-1:0] multiplier , // frequency multiplier
+  input  wire [BITS-1:0] divider    , // frequency divider
+
+  output reg             tick         // output clock [Ftick=Fclk*(multiplier/divider)] with multiplier <= divider
+
+);
+
+  wire [BITS-1:0] next_counter;
+  reg  [BITS-1:0] counter;
+
+  assign next_counter = counter + multiplier;
+
+  always @(negedge rst_n or posedge clk) begin
+    if (rst_n == 1'b0) begin
+      counter <= 1'b0;
+      tick    <= 1'b0;
+    end else begin
+      if (clear_n == 1'b0) begin
+        counter <= 1'b0;
+        tick    <= 1'b0;
+      end else begin
+        if (next_counter > divider) begin
+          counter <= next_counter - divider;
+          tick    <= 1'b1;
+        end else begin
+          counter <= next_counter;
+          tick    <= 1'b0;
+        end
+      end
+    end
+  end
+
+endmodule
diff --git a/verilog/rtl/step_motor_controller.v b/verilog/rtl/step_motor_controller.v
new file mode 100644
index 0000000..71a0c50
--- /dev/null
+++ b/verilog/rtl/step_motor_controller.v
@@ -0,0 +1,437 @@
+////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2022 , Julien OURY                       
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Julien OURY <julien.oury@outlook.fr>
+//
+////////////////////////////////////////////////////////////////////////////
+
+module step_motor_controller #(
+  parameter PSIZE     = 32     , // Size of prescaler counter(bits)
+  parameter DSIZE     = 16       // Size of delay counter (bits)
+)(
+
+  input  wire        rst_n     , // Asynchronous reset (active low)
+  input  wire        clk       , // Clock (rising edge)
+
+  // Wishbone bus
+  input  wire        wbs_cyc_i , // Wishbone strobe/request
+  input  wire        wbs_stb_i , // Wishbone strobe/request
+  input  wire [31:0] wbs_adr_i , // Wishbone address
+  input  wire        wbs_we_i  , // Wishbone write (1:write, 0:read)
+  input  wire [31:0] wbs_dat_i , // Wishbone data output
+  input  wire [3:0]  wbs_sel_i , // Wishbone byte enable
+  output wire [31:0] wbs_dat_o , // Wishbone data input
+  output wire        wbs_ack_o , // Wishbone acknowlegement
+
+  // Motor outputs
+  output wire        motor_a1  ,  // A1 moto output
+  output wire        motor_a2  ,  // A2 moto output
+  output wire        motor_b1  ,  // B1 moto output
+  output wire        motor_b2     // B2 moto output
+
+);
+
+  wire             controller_en   ;
+  wire [PSIZE-1:0] multiplier      ;
+  wire [PSIZE-1:0] divider         ;
+  wire             tick            ;
+  wire [7:0]       duty_cycle      ;
+  wire             start           ;
+  wire             pwm             ;
+  wire             ptype           ;
+  wire             mode            ;
+  wire             direction       ;
+  wire [DSIZE-1:0] period          ;
+  wire             run             ;
+  wire             step_strobe     ;
+
+  prescaler #(
+    .BITS(PSIZE)
+  ) i_prescaler (
+    .rst_n      (rst_n         ),
+    .clk        (clk           ),
+    .clear_n    (controller_en ),
+    .multiplier (multiplier    ),
+    .divider    (divider       ),
+    .tick       (tick          )
+  );
+  
+  pwm_generator i_pwm_generator (
+    .rst_n      (rst_n         ),
+    .clk        (clk           ),
+    .clear_n    (controller_en ),
+    .duty_cycle (duty_cycle    ),
+    .tick       (tick          ),
+    .start      (start         ),
+    .pwm        (pwm           )
+  );
+  
+  motor_sequencer #(
+    .DSIZE(DSIZE)
+  )i_motor_sequencer (
+    .rst_n      (rst_n         ),
+    .clk        (clk           ),
+    .clear_n    (controller_en ),
+    .ptype      (ptype         ),
+    .mode       (mode          ),
+    .direction  (direction     ),
+    .period     (period        ),
+    .run        (run           ),
+    .step_strobe(step_strobe   ),
+    .start      (start         ),
+    .pwm        (pwm           ),
+    .motor_a1   (motor_a1      ),
+    .motor_a2   (motor_a2      ),
+    .motor_b1   (motor_b1      ),
+    .motor_b2   (motor_b2      )
+  );
+  
+  step_motor_controller_registers #(
+    .PSIZE(PSIZE),
+    .DSIZE(DSIZE)
+  ) i_step_motor_controller_registers (
+    .rst_n        (rst_n        ),
+    .clk          (clk          ),
+    .controller_en(controller_en),
+    .multiplier   (multiplier   ),
+    .divider      (divider      ),
+    .duty_cycle   (duty_cycle   ),
+    .ptype        (ptype        ),
+    .mode         (mode         ),
+    .direction    (direction    ),
+    .period       (period       ),
+    .run          (run          ),
+    .step_strobe  (step_strobe  ),
+    .wbs_cyc_i    (wbs_cyc_i    ),
+    .wbs_stb_i    (wbs_stb_i    ),
+    .wbs_adr_i    (wbs_adr_i    ),
+    .wbs_we_i     (wbs_we_i     ),
+    .wbs_dat_i    (wbs_dat_i    ),
+    .wbs_sel_i    (wbs_sel_i    ),
+    .wbs_dat_o    (wbs_dat_o    ),
+    .wbs_ack_o    (wbs_ack_o    )
+  );
+
+endmodule
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// PWM generator
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+module pwm_generator (
+  input  wire        rst_n      , // Asynchronous reset (active low)
+  input  wire        clk        , // Clock (rising edge)
+  input  wire        clear_n    , // Synchronous reset (active low)
+  input  wire [7:0]  duty_cycle , // PWM duty cycle
+  input  wire        tick       , // Input tick (PWM resolution)
+  output reg         start      , // Start strobe (One clk pulse at start of PWM period)
+  output reg         pwm          // PWM signal
+);
+
+  wire [7:0] next_counter;
+  reg  [7:0] counter;
+
+  assign next_counter = counter + 1'b1;
+
+  always @(negedge rst_n or posedge clk) begin
+    if (rst_n == 1'b0) begin
+      counter <= 8'h00;
+      start   <= 1'b0;
+      pwm     <= 1'b0;
+    end else begin
+      if (clear_n == 1'b0) begin
+        counter <= 8'h00;
+        start   <= 1'b0;
+        pwm     <= 1'b0;
+      end else begin
+        if (tick == 1'b1) begin
+          counter <= next_counter;
+        end
+        if ((tick == 1'b1) && (counter[7] == 1'b1) && (next_counter[7] == 1'b0)) begin
+          start <= 1'b1;
+        end else begin
+          start <= 1'b0;
+        end
+        if (counter <= duty_cycle) begin
+          pwm <= 1'b1;
+        end else begin
+          pwm <= 1'b0;
+        end
+      end
+    end
+  end
+
+endmodule
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Motor_sequencer
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+module motor_sequencer #(
+  parameter DSIZE = 16 // Number of bits of delay counter
+)(
+  input  wire             rst_n         , // Asynchronous reset (active low)
+  input  wire             clk           , // Clock (rising edge)
+  input  wire             clear_n       , // Synchronous reset (active low)
+  input  wire             ptype         , // Type of motor (1'b0:Unipolar, 1'b1:Bipolar)
+  input  wire             mode          , // Mode of drive (1'b0:FullStep, 1'b1:HalfStep)
+  input  wire             direction     , // Direction of motor
+  input  wire [DSIZE-1:0] period        , // Period of each motor step
+  input  wire             run           , // Motor run
+  output reg              step_strobe   , // Motor step strobe (one clk pulse by step)
+
+  // PWM input
+  input  wire             start         , // Start strobe (One clk pulse at start of PWM period)
+  input  wire             pwm           , // PWM signal
+
+  // Motor outputs
+  output reg              motor_a1      , // A1 motor output
+  output reg              motor_a2      , // A2 motor output
+  output reg              motor_b1      , // B1 motor output
+  output reg              motor_b2        // B2 motor output
+);
+
+  reg  [2:0]       motor_state;
+  reg  [DSIZE-1:0] counter;
+  reg              pwmo;
+  
+  wire [DSIZE-1:0] next_counter;
+  wire [3:0]       motor_values[7:0];
+  
+  assign next_counter = counter + 1'b1;
+  assign motor_values[0] = 4'b1_0_0_1; // b2 b1 a2 a1
+  assign motor_values[1] = 4'b0_0_0_1; // b2 b1 a2 a1
+  assign motor_values[2] = 4'b0_0_1_1; // b2 b1 a2 a1
+  assign motor_values[3] = 4'b0_0_1_0; // b2 b1 a2 a1
+  assign motor_values[4] = 4'b0_1_1_0; // b2 b1 a2 a1
+  assign motor_values[5] = 4'b0_1_0_0; // b2 b1 a2 a1
+  assign motor_values[6] = 4'b1_1_0_0; // b2 b1 a2 a1
+  assign motor_values[7] = 4'b1_0_0_0; // b2 b1 a2 a1
+
+
+  // Frame decoder
+  always @(negedge rst_n or posedge clk) begin
+    if (rst_n == 1'b0) begin
+      counter     <= {(DSIZE){1'b0}};
+      step_strobe <= 1'b0;
+      pwmo        <= 1'b0;
+      motor_state <= 3'b000;
+      motor_a1    <= 1'b0;
+      motor_a2    <= 1'b0;
+      motor_b1    <= 1'b0;
+      motor_b2    <= 1'b0;
+    end else begin
+
+      if (clear_n == 1'b0) begin
+        counter     <= {(DSIZE){1'b0}};
+        step_strobe <= 1'b0;
+        pwmo        <= 1'b0;
+        motor_state <= 3'b000;
+        motor_a1    <= 1'b0;
+        motor_a2    <= 1'b0;
+        motor_b1    <= 1'b0;
+        motor_b2    <= 1'b0;
+      end else begin
+      
+        if (run == 1'b0) begin
+          counter <= {(DSIZE){1'b0}};
+        end else if (start == 1'b1) begin
+          if (counter < period) begin
+            counter <= next_counter;
+          end else begin
+            counter <= {(DSIZE){1'b0}};
+            if (direction == 1'b0) begin
+              motor_state <= motor_state + 1'b1;
+            end else begin
+              motor_state <= motor_state - 1'b1;
+            end
+          end
+        end
+        
+        if ((run == 1'b1) && (start == 1'b1) && (counter >= period)) begin
+          step_strobe <= 1'b1;
+        end else begin
+          step_strobe <= 1'b0;
+        end
+        
+        pwmo <= pwm;
+
+        if (ptype == 1'b0) begin // Unipolar
+          motor_a1 <= motor_values[motor_state & {2'b11, mode}][0] & pwmo ;
+          motor_a2 <= motor_values[motor_state & {2'b11, mode}][1] & pwmo ;
+          motor_b1 <= motor_values[motor_state & {2'b11, mode}][2] & pwmo ;
+          motor_b2 <= motor_values[motor_state & {2'b11, mode}][3] & pwmo ;
+        end else begin // Bipolar
+          motor_a1 <= motor_values[motor_state & {2'b11, mode}][0] & pwmo ;
+          motor_a2 <= motor_values[motor_state & {2'b11, mode}][2] & pwmo ;
+          motor_b1 <= motor_values[motor_state & {2'b11, mode}][1] & pwmo ;
+          motor_b2 <= motor_values[motor_state & {2'b11, mode}][3] & pwmo ;
+        end
+
+      end
+    end
+  end
+
+endmodule
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Registers
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+module step_motor_controller_registers #(
+  parameter PSIZE = 32          , // Size of prescaler counter(bits)
+  parameter DSIZE = 16            // Size of delay counter (bits)
+)(
+
+  input                   rst_n           , // Asynchronous reset (active low)
+  input                   clk             , // Clock (rising edge)
+
+  // Configuration
+  output reg              controller_en   , // Controller enable (active high)
+  output reg  [PSIZE-1:0] multiplier      , // frequency multiplier
+  output reg  [PSIZE-1:0] divider         , // frequency divider
+  output reg  [7:0]       duty_cycle      , // PWM duty cycle
+  output reg              ptype           , // Type of motor (1'b0:Unipolar, 1'b1:Bipolar)
+  output reg              mode            , // Mode of drive (1'b0:FullStep, 1'b1:HalfStep)
+  output reg              direction       , // Direction of motor
+  output reg  [DSIZE-1:0] period          , // Period of each motor step
+  output reg              run             , // Motor run
+  input  wire             step_strobe     , // Motor step strobe (one clk pulse by step)
+
+  // Wishbone bus
+  input  wire             wbs_cyc_i       , // Wishbone strobe/request
+  input  wire             wbs_stb_i       , // Wishbone strobe/request
+  input  wire [31:0]      wbs_adr_i       , // Wishbone address
+  input  wire             wbs_we_i        , // Wishbone write (1:write, 0:read)
+  input  wire [31:0]      wbs_dat_i       , // Wishbone data output
+  input  wire [ 3:0]      wbs_sel_i       , // Wishbone byte enable
+  output reg  [31:0]      wbs_dat_o       , // Wishbone data input
+  output wire             wbs_ack_o         // Wishbone acknowlegement
+
+ );
+
+  localparam
+    config_reg_addr     = 3'b000,
+    multiplier_reg_addr = 3'b001,
+    divider_reg_addr    = 3'b010,
+    period_reg_addr     = 3'b011,
+    step_reg_addr       = 3'b100;
+
+  wire        valid;
+  wire [31:0] wstrb;
+  wire [2:0]  addr;
+  wire [23:0] next_cycles;
+
+  reg         free;
+  reg         ready;
+  reg  [23:0] cycles;
+
+  integer i = 0;
+
+  assign valid     = wbs_cyc_i && wbs_stb_i;
+  assign wstrb     = {{8{wbs_sel_i[3]}}, {8{wbs_sel_i[2]}}, {8{wbs_sel_i[1]}}, {8{wbs_sel_i[0]}}} & {32{wbs_we_i}};
+  assign addr      = wbs_adr_i[4:2];
+  assign wbs_ack_o = ready;
+  
+  assign next_cycles = cycles - 1'b1;
+
+  always @(negedge rst_n or posedge clk) begin
+    if (rst_n == 1'b0) begin
+      ready         <= 1'b0;
+      wbs_dat_o     <= 32'h00000000;
+      controller_en <= 1'b0;
+      ptype         <= 1'b0;
+      mode          <= 1'b0;
+      duty_cycle    <= 8'h00;
+      multiplier    <= {PSIZE{1'b0}};
+      divider       <= {PSIZE{1'b0}};
+      period        <= {DSIZE{1'b0}};
+      run           <= 1'b0;
+      direction     <= 1'b0;
+      free          <= 1'b0;
+      cycles        <= 24'h000000;
+    end else begin
+
+      if (valid && !ready) begin
+
+        //Write
+        case (addr)
+          config_reg_addr : begin
+            wbs_dat_o[31] <= controller_en; if (wstrb[31]) controller_en <= wbs_dat_i[31];
+            wbs_dat_o[30] <= ptype        ; if (wstrb[30]) ptype         <= wbs_dat_i[30];
+            wbs_dat_o[29] <= mode         ; if (wstrb[29]) mode          <= wbs_dat_i[29];
+            wbs_dat_o[ 7] <= duty_cycle[7]; if (wstrb[ 7]) duty_cycle[7] <= wbs_dat_i[ 7];
+            wbs_dat_o[ 6] <= duty_cycle[6]; if (wstrb[ 6]) duty_cycle[6] <= wbs_dat_i[ 6];
+            wbs_dat_o[ 5] <= duty_cycle[5]; if (wstrb[ 5]) duty_cycle[5] <= wbs_dat_i[ 5];
+            wbs_dat_o[ 4] <= duty_cycle[4]; if (wstrb[ 4]) duty_cycle[4] <= wbs_dat_i[ 4];
+            wbs_dat_o[ 3] <= duty_cycle[3]; if (wstrb[ 3]) duty_cycle[3] <= wbs_dat_i[ 3];
+            wbs_dat_o[ 2] <= duty_cycle[2]; if (wstrb[ 2]) duty_cycle[2] <= wbs_dat_i[ 2];
+            wbs_dat_o[ 1] <= duty_cycle[1]; if (wstrb[ 1]) duty_cycle[1] <= wbs_dat_i[ 1];
+            wbs_dat_o[ 0] <= duty_cycle[0]; if (wstrb[ 0]) duty_cycle[0] <= wbs_dat_i[ 0];
+          end
+          multiplier_reg_addr : begin
+            for (i = 0; i < 32; i = i + 1) begin
+              if (i >= PSIZE) begin
+                wbs_dat_o[i] <= 1'b0 ;
+              end else begin
+                wbs_dat_o[i] <= multiplier[i] ; if (wstrb[i]) multiplier[i] <= wbs_dat_i[i];
+              end
+            end
+          end
+          divider_reg_addr : begin
+            for (i = 0; i < 32; i = i + 1) begin
+              if (i >= PSIZE) begin
+                wbs_dat_o[i] <= 1'b0 ;
+              end else begin
+                wbs_dat_o[i] <= divider[i] ; if (wstrb[i]) divider[i] <= wbs_dat_i[i];
+              end
+            end
+          end
+          period_reg_addr : begin
+            for (i = 0; i < 32; i = i + 1) begin
+              if (i >= DSIZE) begin
+                wbs_dat_o[i] <= 1'b0 ;
+              end else begin
+                wbs_dat_o[i] <= period[i] ; if (wstrb[i]) period[i] <= wbs_dat_i[i];
+              end
+            end
+          end
+          step_reg_addr : begin
+            wbs_dat_o[30]   <= direction    ; if (wstrb[30]) direction     <= wbs_dat_i[30];
+            wbs_dat_o[29]   <= free         ; if (wstrb[29]) free          <= wbs_dat_i[29];
+            wbs_dat_o[23:0] <= cycles;
+          end
+        endcase
+
+        ready <= 1'b1;
+      end else begin
+        ready <= 1'b0;
+      end
+      
+      if (valid && !ready && (addr == step_reg_addr) && wstrb[31]) begin
+        run <= wbs_dat_i[31];
+      end else if ((free == 1'b0) && (step_strobe == 1'b1) && (cycles == 24'h000000)) begin
+        run <= 1'b0;
+      end
+      
+      for (i = 0; i < 24; i = i + 1) begin
+        if (valid && !ready && (addr == step_reg_addr) && wstrb[i] && wbs_dat_i[i]) begin
+          cycles[i] <= wbs_dat_i[i];
+        end else if ((run == 1'b1) && (step_strobe == 1'b1) && (cycles != 24'h000000)) begin
+          cycles[i] <= next_cycles[i];
+        end
+      end
+
+    end
+  end
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/uprj_netlists.v b/verilog/rtl/uprj_netlists.v
index 2d55d6e..b8676ad 100644
--- a/verilog/rtl/uprj_netlists.v
+++ b/verilog/rtl/uprj_netlists.v
@@ -25,8 +25,10 @@
 `else
     `include "user_project_wrapper.v"
     `include "user_proj_example.v"
-	`include "wishbone_1mst_to_8slv.v"
+    `include "wishbone_1mst_to_8slv.v"
+    `include "prescaler.v"
     `include "simple_fifo.v"
     `include "nec_ir_receiver.v"
-	`include "pseudorandom.v"
+    `include "pseudorandom.v"
+    `include "step_motor_controller.v"
 `endif
\ No newline at end of file
diff --git a/verilog/rtl/user_proj_example.v b/verilog/rtl/user_proj_example.v
index 7f8a672..5c5299b 100644
--- a/verilog/rtl/user_proj_example.v
+++ b/verilog/rtl/user_proj_example.v
@@ -20,8 +20,8 @@
 module user_proj_example(
 
 `ifdef USE_POWER_PINS
-    inout  wire vccd1,	// User area 1 1.8V supply
-    inout  wire vssd1,	// User area 1 digital ground
+    inout  wire vccd1,  // User area 1 1.8V supply
+    inout  wire vssd1,  // User area 1 digital ground
 `endif
 
     // Wishbone Slave ports (WB MI A)
@@ -50,257 +50,307 @@
     output wire [2:0] irq
 );
 
-    wire rst_n;
-    
+  wire rst_n;
+  
+  // Wishbone SLV 0 interface
+  wire           wbs_s0_cyc_o ;
+  wire           wbs_s0_stb_o ;
+  wire [31:0]    wbs_s0_adr_o ;
+  wire           wbs_s0_we_o  ;
+  wire [31:0]    wbs_s0_dat_o ;
+  wire [3:0]     wbs_s0_sel_o ;
+  wire [31:0]    wbs_s0_dat_i ;
+  wire           wbs_s0_ack_i ;
+  
+  // Wishbone SLV 1 interface
+  wire           wbs_s1_cyc_o ;
+  wire           wbs_s1_stb_o ;
+  wire [31:0]    wbs_s1_adr_o ;
+  wire           wbs_s1_we_o  ;
+  wire [31:0]    wbs_s1_dat_o ;
+  wire [3:0]     wbs_s1_sel_o ;
+  wire [31:0]    wbs_s1_dat_i ;
+  wire           wbs_s1_ack_i ;
+  
+  // Wishbone SLV 2 interface
+  wire           wbs_s2_cyc_o ;
+  wire           wbs_s2_stb_o ;
+  wire [31:0]    wbs_s2_adr_o ;
+  wire           wbs_s2_we_o  ;
+  wire [31:0]    wbs_s2_dat_o ;
+  wire [3:0]     wbs_s2_sel_o ;
+  wire [31:0]    wbs_s2_dat_i ;
+  wire           wbs_s2_ack_i ;
+  
+  // Wishbone SLV 3 interface
+  wire           wbs_s3_cyc_o ;
+  wire           wbs_s3_stb_o ;
+  wire [31:0]    wbs_s3_adr_o ;
+  wire           wbs_s3_we_o  ;
+  wire [31:0]    wbs_s3_dat_o ;
+  wire [3:0]     wbs_s3_sel_o ;
+  wire [31:0]    wbs_s3_dat_i ;
+  wire           wbs_s3_ack_i ;
+  
+  // Wishbone SLV 4 interface
+  wire           wbs_s4_cyc_o ;
+  wire           wbs_s4_stb_o ;
+  wire [31:0]    wbs_s4_adr_o ;
+  wire           wbs_s4_we_o  ;
+  wire [31:0]    wbs_s4_dat_o ;
+  wire [3:0]     wbs_s4_sel_o ;
+  wire [31:0]    wbs_s4_dat_i ;
+  wire           wbs_s4_ack_i ;
+  
+  // Wishbone SLV 5 interface
+  wire           wbs_s5_cyc_o ;
+  wire           wbs_s5_stb_o ;
+  wire [31:0]    wbs_s5_adr_o ;
+  wire           wbs_s5_we_o  ;
+  wire [31:0]    wbs_s5_dat_o ;
+  wire [3:0]     wbs_s5_sel_o ;
+  wire [31:0]    wbs_s5_dat_i ;
+  wire           wbs_s5_ack_i ;
+  
+  // Wishbone SLV 6 interface
+  wire           wbs_s6_cyc_o ;
+  wire           wbs_s6_stb_o ;
+  wire [31:0]    wbs_s6_adr_o ;
+  wire           wbs_s6_we_o  ;
+  wire [31:0]    wbs_s6_dat_o ;
+  wire [3:0]     wbs_s6_sel_o ;
+  wire [31:0]    wbs_s6_dat_i ;
+  wire           wbs_s6_ack_i ;
+  
+  // Wishbone SLV 7 interface
+  wire           wbs_s7_cyc_o ;
+  wire           wbs_s7_stb_o ;
+  wire [31:0]    wbs_s7_adr_o ;
+  wire           wbs_s7_we_o  ;
+  wire [31:0]    wbs_s7_dat_o ;
+  wire [3:0]     wbs_s7_sel_o ;
+  wire [31:0]    wbs_s7_dat_i ;
+  wire           wbs_s7_ack_i ;
+  
+  // IO
+  assign io_oeb[37:32] = {( 6){1'b0}};
+  assign io_oeb[27: 0] = {(28){1'b0}};
+
+  assign io_oeb[37:32] = {( 6){1'b1}};
+  assign io_oeb[31:28] = {( 4){1'b0}}; // MOTOR outputs
+  assign io_oeb[27: 0] = {(28){1'b1}};
+  
+  // IRQ
+  assign irq[2:1] = 2'b00;  // Unused
+  
+  // LA
+  assign la_data_out = {(128){1'b0}};
+  
+  assign rst_n = ~wb_rst_i;
+  
+  wishbone_1mst_to_8slv #(
+    .ADDR_S0(32'h30000000), // Base address of Wishbone SLV 0
+    .MASK_S0(32'hFFFF0000), // Mask address of Wishbone SLV 0
+    .ADDR_S1(32'h30010000), // Base address of Wishbone SLV 1
+    .MASK_S1(32'hFFFF0000), // Mask address of Wishbone SLV 1
+    .ADDR_S2(32'h30020000), // Base address of Wishbone SLV 2
+    .MASK_S2(32'hFFFF0000), // Mask address of Wishbone SLV 2
+    .ADDR_S3(32'h30030000), // Base address of Wishbone SLV 3
+    .MASK_S3(32'hFFFF0000), // Mask address of Wishbone SLV 3
+    .ADDR_S4(32'h30040000), // Base address of Wishbone SLV 4
+    .MASK_S4(32'hFFFF0000), // Mask address of Wishbone SLV 4
+    .ADDR_S5(32'h30050000), // Base address of Wishbone SLV 5
+    .MASK_S5(32'hFFFF0000), // Mask address of Wishbone SLV 5
+    .ADDR_S6(32'h30060000), // Base address of Wishbone SLV 6
+    .MASK_S6(32'hFFFF0000), // Mask address of Wishbone SLV 6
+    .ADDR_S7(32'h30070000), // Base address of Wishbone SLV 7
+    .MASK_S7(32'hFFFF0000)  // Mask address of Wishbone SLV 7
+  ) i_wishbone_1mst_to_8slv (
+  
+    // Wishbone MST interface
+    .wbs_m_cyc_i(wbs_cyc_i),
+    .wbs_m_stb_i(wbs_stb_i),
+    .wbs_m_adr_i(wbs_adr_i),
+    .wbs_m_we_i (wbs_we_i ),
+    .wbs_m_dat_i(wbs_dat_i),
+    .wbs_m_sel_i(wbs_sel_i),
+    .wbs_m_dat_o(wbs_dat_o),
+    .wbs_m_ack_o(wbs_ack_o),
+  
     // Wishbone SLV 0 interface
-    wire           wbs_s0_cyc_o ;
-    wire           wbs_s0_stb_o ;
-    wire [31:0]    wbs_s0_adr_o ;
-    wire           wbs_s0_we_o  ;
-    wire [31:0]    wbs_s0_dat_o ;
-    wire [3:0]     wbs_s0_sel_o ;
-    wire [31:0]    wbs_s0_dat_i ;
-    wire           wbs_s0_ack_i ;
-    
+    .wbs_s0_cyc_o(wbs_s0_cyc_o),
+    .wbs_s0_stb_o(wbs_s0_stb_o),
+    .wbs_s0_adr_o(wbs_s0_adr_o),
+    .wbs_s0_we_o (wbs_s0_we_o ),
+    .wbs_s0_dat_o(wbs_s0_dat_o),
+    .wbs_s0_sel_o(wbs_s0_sel_o),
+    .wbs_s0_dat_i(wbs_s0_dat_i),
+    .wbs_s0_ack_i(wbs_s0_ack_i),
+  
     // Wishbone SLV 1 interface
-    wire           wbs_s1_cyc_o ;
-    wire           wbs_s1_stb_o ;
-    wire [31:0]    wbs_s1_adr_o ;
-    wire           wbs_s1_we_o  ;
-    wire [31:0]    wbs_s1_dat_o ;
-    wire [3:0]     wbs_s1_sel_o ;
-    wire [31:0]    wbs_s1_dat_i ;
-    wire           wbs_s1_ack_i ;
-    
+    .wbs_s1_cyc_o(wbs_s1_cyc_o),
+    .wbs_s1_stb_o(wbs_s1_stb_o),
+    .wbs_s1_adr_o(wbs_s1_adr_o),
+    .wbs_s1_we_o (wbs_s1_we_o ),
+    .wbs_s1_dat_o(wbs_s1_dat_o),
+    .wbs_s1_sel_o(wbs_s1_sel_o),
+    .wbs_s1_dat_i(wbs_s1_dat_i),
+    .wbs_s1_ack_i(wbs_s1_ack_i),
+  
     // Wishbone SLV 2 interface
-    wire           wbs_s2_cyc_o ;
-    wire           wbs_s2_stb_o ;
-    wire [31:0]    wbs_s2_adr_o ;
-    wire           wbs_s2_we_o  ;
-    wire [31:0]    wbs_s2_dat_o ;
-    wire [3:0]     wbs_s2_sel_o ;
-    wire [31:0]    wbs_s2_dat_i ;
-    wire           wbs_s2_ack_i ;
-    
+    .wbs_s2_cyc_o(wbs_s2_cyc_o),
+    .wbs_s2_stb_o(wbs_s2_stb_o),
+    .wbs_s2_adr_o(wbs_s2_adr_o),
+    .wbs_s2_we_o (wbs_s2_we_o ),
+    .wbs_s2_dat_o(wbs_s2_dat_o),
+    .wbs_s2_sel_o(wbs_s2_sel_o),
+    .wbs_s2_dat_i(wbs_s2_dat_i),
+    .wbs_s2_ack_i(wbs_s2_ack_i),
+  
     // Wishbone SLV 3 interface
-    wire           wbs_s3_cyc_o ;
-    wire           wbs_s3_stb_o ;
-    wire [31:0]    wbs_s3_adr_o ;
-    wire           wbs_s3_we_o  ;
-    wire [31:0]    wbs_s3_dat_o ;
-    wire [3:0]     wbs_s3_sel_o ;
-    wire [31:0]    wbs_s3_dat_i ;
-    wire           wbs_s3_ack_i ;
-    
+    .wbs_s3_cyc_o(wbs_s3_cyc_o),
+    .wbs_s3_stb_o(wbs_s3_stb_o),
+    .wbs_s3_adr_o(wbs_s3_adr_o),
+    .wbs_s3_we_o (wbs_s3_we_o ),
+    .wbs_s3_dat_o(wbs_s3_dat_o),
+    .wbs_s3_sel_o(wbs_s3_sel_o),
+    .wbs_s3_dat_i(wbs_s3_dat_i),
+    .wbs_s3_ack_i(wbs_s3_ack_i),
+  
     // Wishbone SLV 4 interface
-    wire           wbs_s4_cyc_o ;
-    wire           wbs_s4_stb_o ;
-    wire [31:0]    wbs_s4_adr_o ;
-    wire           wbs_s4_we_o  ;
-    wire [31:0]    wbs_s4_dat_o ;
-    wire [3:0]     wbs_s4_sel_o ;
-    wire [31:0]    wbs_s4_dat_i ;
-    wire           wbs_s4_ack_i ;
-    
+    .wbs_s4_cyc_o(wbs_s4_cyc_o),
+    .wbs_s4_stb_o(wbs_s4_stb_o),
+    .wbs_s4_adr_o(wbs_s4_adr_o),
+    .wbs_s4_we_o (wbs_s4_we_o ),
+    .wbs_s4_dat_o(wbs_s4_dat_o),
+    .wbs_s4_sel_o(wbs_s4_sel_o),
+    .wbs_s4_dat_i(wbs_s4_dat_i),
+    .wbs_s4_ack_i(wbs_s4_ack_i),
+  
     // Wishbone SLV 5 interface
-    wire           wbs_s5_cyc_o ;
-    wire           wbs_s5_stb_o ;
-    wire [31:0]    wbs_s5_adr_o ;
-    wire           wbs_s5_we_o  ;
-    wire [31:0]    wbs_s5_dat_o ;
-    wire [3:0]     wbs_s5_sel_o ;
-    wire [31:0]    wbs_s5_dat_i ;
-    wire           wbs_s5_ack_i ;
-    
+    .wbs_s5_cyc_o(wbs_s5_cyc_o),
+    .wbs_s5_stb_o(wbs_s5_stb_o),
+    .wbs_s5_adr_o(wbs_s5_adr_o),
+    .wbs_s5_we_o (wbs_s5_we_o ),
+    .wbs_s5_dat_o(wbs_s5_dat_o),
+    .wbs_s5_sel_o(wbs_s5_sel_o),
+    .wbs_s5_dat_i(wbs_s5_dat_i),
+    .wbs_s5_ack_i(wbs_s5_ack_i),
+  
     // Wishbone SLV 6 interface
-    wire           wbs_s6_cyc_o ;
-    wire           wbs_s6_stb_o ;
-    wire [31:0]    wbs_s6_adr_o ;
-    wire           wbs_s6_we_o  ;
-    wire [31:0]    wbs_s6_dat_o ;
-    wire [3:0]     wbs_s6_sel_o ;
-    wire [31:0]    wbs_s6_dat_i ;
-    wire           wbs_s6_ack_i ;
-    
+    .wbs_s6_cyc_o(wbs_s6_cyc_o),
+    .wbs_s6_stb_o(wbs_s6_stb_o),
+    .wbs_s6_adr_o(wbs_s6_adr_o),
+    .wbs_s6_we_o (wbs_s6_we_o ),
+    .wbs_s6_dat_o(wbs_s6_dat_o),
+    .wbs_s6_sel_o(wbs_s6_sel_o),
+    .wbs_s6_dat_i(wbs_s6_dat_i),
+    .wbs_s6_ack_i(wbs_s6_ack_i),
+  
     // Wishbone SLV 7 interface
-    wire           wbs_s7_cyc_o ;
-    wire           wbs_s7_stb_o ;
-    wire [31:0]    wbs_s7_adr_o ;
-    wire           wbs_s7_we_o  ;
-    wire [31:0]    wbs_s7_dat_o ;
-    wire [3:0]     wbs_s7_sel_o ;
-    wire [31:0]    wbs_s7_dat_i ;
-    wire           wbs_s7_ack_i ;
+    .wbs_s7_cyc_o(wbs_s7_cyc_o),
+    .wbs_s7_stb_o(wbs_s7_stb_o),
+    .wbs_s7_adr_o(wbs_s7_adr_o),
+    .wbs_s7_we_o (wbs_s7_we_o ),
+    .wbs_s7_dat_o(wbs_s7_dat_o),
+    .wbs_s7_sel_o(wbs_s7_sel_o),
+    .wbs_s7_dat_i(wbs_s7_dat_i),
+    .wbs_s7_ack_i(wbs_s7_ack_i)
+  
+  );
+  
+  nec_ir_receiver #(
+    .NB_STAGES (10),
+    .PSIZE     (20),
+    .DSIZE     (11),
+    .ASIZE     ( 4)
+  ) i_nec_ir_receiver (
+    .rst_n    (rst_n       ),
+    .clk      (wb_clk_i    ),
+    .wbs_cyc_i(wbs_s0_cyc_o),
+    .wbs_stb_i(wbs_s0_stb_o),
+    .wbs_adr_i(wbs_s0_adr_o),
+    .wbs_we_i (wbs_s0_we_o ),
+    .wbs_dat_i(wbs_s0_dat_o),
+    .wbs_sel_i(wbs_s0_sel_o),
+    .wbs_dat_o(wbs_s0_dat_i),
+    .wbs_ack_o(wbs_s0_ack_i),
+    .ir_in    (io_in[37]   ),
+    .irq      (irq[0]      )
+  );
+  
+  pseudorandom i_pseudorandom (
+    .rst_n     (rst_n       ),
+    .clk       (wb_clk_i    ),
 
-    // IO
-    assign io_out = {(`MPRJ_IO_PADS){1'b0}};
-    assign io_oeb = {(`MPRJ_IO_PADS){1'b1}};
+    // Wishbone bus
+    .wbs_cyc_i (wbs_s1_cyc_o),
+    .wbs_stb_i (wbs_s1_stb_o),
+    .wbs_adr_i (wbs_s1_adr_o),
+    .wbs_we_i  (wbs_s1_we_o ),
+    .wbs_dat_i (wbs_s1_dat_o),
+    .wbs_sel_i (wbs_s1_sel_o),
+    .wbs_dat_o (wbs_s1_dat_i),
+    .wbs_ack_o (wbs_s1_ack_i) 
+  );
+  
+  step_motor_controller #(
+    .PSIZE(16),
+    .DSIZE(16)
+  ) i_step_motor_controller (
+  
+  	.rst_n(rst_n),
+  	.clk(clk),
+  
+    // Wishbone bus
+    .wbs_cyc_i (wbs_s2_cyc_o),
+    .wbs_stb_i (wbs_s2_stb_o),
+    .wbs_adr_i (wbs_s2_adr_o),
+    .wbs_we_i  (wbs_s2_we_o ),
+    .wbs_dat_i (wbs_s2_dat_o),
+    .wbs_sel_i (wbs_s2_sel_o),
+    .wbs_dat_o (wbs_s2_dat_i),
+    .wbs_ack_o (wbs_s2_ack_i),
+  
+    // Motor outputs
+    .motor_a1  (io_out[31]),
+    .motor_a2  (io_out[30]),
+    .motor_b1  (io_out[29]),
+    .motor_b2  (io_out[28])
+  );
+  
+  step_motor_controller #(
+    .PSIZE(16),
+    .DSIZE(16)
+  ) i_step_motor_controller (
+  
+  	.rst_n(rst_n),
+  	.clk(clk),
+  
+    // Wishbone bus
+    .wbs_cyc_i (wbs_s3_cyc_o),
+    .wbs_stb_i (wbs_s3_stb_o),
+    .wbs_adr_i (wbs_s3_adr_o),
+    .wbs_we_i  (wbs_s3_we_o ),
+    .wbs_dat_i (wbs_s3_dat_o),
+    .wbs_sel_i (wbs_s3_sel_o),
+    .wbs_dat_o (wbs_s3_dat_i),
+    .wbs_ack_o (wbs_s3_ack_i),
+  
+    // Motor outputs
+    .motor_a1  (io_out[27]),
+    .motor_a2  (io_out[26]),
+    .motor_b1  (io_out[25]),
+    .motor_b2  (io_out[24])
+  );
 
-    // IRQ
-    assign irq[2:1] = 2'b00;	// Unused
-
-    // LA
-    assign la_data_out = {(128){1'b0}};
-
-    assign rst_n = ~wb_rst_i;
-	
-	wishbone_1mst_to_8slv #(
-      .ADDR_S0(32'h30000000), // Base address of Wishbone SLV 0
-      .MASK_S0(32'hFFFF0000), // Mask address of Wishbone SLV 0
-      .ADDR_S1(32'h30010000), // Base address of Wishbone SLV 1
-      .MASK_S1(32'hFFFF0000), // Mask address of Wishbone SLV 1
-      .ADDR_S2(32'h30020000), // Base address of Wishbone SLV 2
-      .MASK_S2(32'hFFFF0000), // Mask address of Wishbone SLV 2
-      .ADDR_S3(32'h30030000), // Base address of Wishbone SLV 3
-      .MASK_S3(32'hFFFF0000), // Mask address of Wishbone SLV 3
-      .ADDR_S4(32'h30040000), // Base address of Wishbone SLV 4
-      .MASK_S4(32'hFFFF0000), // Mask address of Wishbone SLV 4
-      .ADDR_S5(32'h30050000), // Base address of Wishbone SLV 5
-      .MASK_S5(32'hFFFF0000), // Mask address of Wishbone SLV 5
-      .ADDR_S6(32'h30060000), // Base address of Wishbone SLV 6
-      .MASK_S6(32'hFFFF0000), // Mask address of Wishbone SLV 6
-      .ADDR_S7(32'h30070000), // Base address of Wishbone SLV 7
-      .MASK_S7(32'hFFFF0000)  // Mask address of Wishbone SLV 7
-    ) i_wishbone_1mst_to_8slv (
-    
-      // Wishbone MST interface
-      .wbs_m_cyc_i(wbs_cyc_i),
-      .wbs_m_stb_i(wbs_stb_i),
-      .wbs_m_adr_i(wbs_adr_i),
-      .wbs_m_we_i (wbs_we_i ),
-      .wbs_m_dat_i(wbs_dat_i),
-      .wbs_m_sel_i(wbs_sel_i),
-      .wbs_m_dat_o(wbs_dat_o),
-      .wbs_m_ack_o(wbs_ack_o),
-    
-      // Wishbone SLV 0 interface
-      .wbs_s0_cyc_o(wbs_s0_cyc_o),
-      .wbs_s0_stb_o(wbs_s0_stb_o),
-      .wbs_s0_adr_o(wbs_s0_adr_o),
-      .wbs_s0_we_o (wbs_s0_we_o ),
-      .wbs_s0_dat_o(wbs_s0_dat_o),
-      .wbs_s0_sel_o(wbs_s0_sel_o),
-      .wbs_s0_dat_i(wbs_s0_dat_i),
-      .wbs_s0_ack_i(wbs_s0_ack_i),
-    
-      // Wishbone SLV 1 interface
-      .wbs_s1_cyc_o(wbs_s1_cyc_o),
-      .wbs_s1_stb_o(wbs_s1_stb_o),
-      .wbs_s1_adr_o(wbs_s1_adr_o),
-      .wbs_s1_we_o (wbs_s1_we_o ),
-      .wbs_s1_dat_o(wbs_s1_dat_o),
-      .wbs_s1_sel_o(wbs_s1_sel_o),
-      .wbs_s1_dat_i(wbs_s1_dat_i),
-      .wbs_s1_ack_i(wbs_s1_ack_i),
-    
-      // Wishbone SLV 2 interface
-      .wbs_s2_cyc_o(wbs_s2_cyc_o),
-      .wbs_s2_stb_o(wbs_s2_stb_o),
-      .wbs_s2_adr_o(wbs_s2_adr_o),
-      .wbs_s2_we_o (wbs_s2_we_o ),
-      .wbs_s2_dat_o(wbs_s2_dat_o),
-      .wbs_s2_sel_o(wbs_s2_sel_o),
-      .wbs_s2_dat_i(wbs_s2_dat_i),
-      .wbs_s2_ack_i(wbs_s2_ack_i),
-    
-      // Wishbone SLV 3 interface
-      .wbs_s3_cyc_o(wbs_s3_cyc_o),
-      .wbs_s3_stb_o(wbs_s3_stb_o),
-      .wbs_s3_adr_o(wbs_s3_adr_o),
-      .wbs_s3_we_o (wbs_s3_we_o ),
-      .wbs_s3_dat_o(wbs_s3_dat_o),
-      .wbs_s3_sel_o(wbs_s3_sel_o),
-      .wbs_s3_dat_i(wbs_s3_dat_i),
-      .wbs_s3_ack_i(wbs_s3_ack_i),
-    
-      // Wishbone SLV 4 interface
-      .wbs_s4_cyc_o(wbs_s4_cyc_o),
-      .wbs_s4_stb_o(wbs_s4_stb_o),
-      .wbs_s4_adr_o(wbs_s4_adr_o),
-      .wbs_s4_we_o (wbs_s4_we_o ),
-      .wbs_s4_dat_o(wbs_s4_dat_o),
-      .wbs_s4_sel_o(wbs_s4_sel_o),
-      .wbs_s4_dat_i(wbs_s4_dat_i),
-      .wbs_s4_ack_i(wbs_s4_ack_i),
-    
-      // Wishbone SLV 5 interface
-      .wbs_s5_cyc_o(wbs_s5_cyc_o),
-      .wbs_s5_stb_o(wbs_s5_stb_o),
-      .wbs_s5_adr_o(wbs_s5_adr_o),
-      .wbs_s5_we_o (wbs_s5_we_o ),
-      .wbs_s5_dat_o(wbs_s5_dat_o),
-      .wbs_s5_sel_o(wbs_s5_sel_o),
-      .wbs_s5_dat_i(wbs_s5_dat_i),
-      .wbs_s5_ack_i(wbs_s5_ack_i),
-    
-      // Wishbone SLV 6 interface
-      .wbs_s6_cyc_o(wbs_s6_cyc_o),
-      .wbs_s6_stb_o(wbs_s6_stb_o),
-      .wbs_s6_adr_o(wbs_s6_adr_o),
-      .wbs_s6_we_o (wbs_s6_we_o ),
-      .wbs_s6_dat_o(wbs_s6_dat_o),
-      .wbs_s6_sel_o(wbs_s6_sel_o),
-      .wbs_s6_dat_i(wbs_s6_dat_i),
-      .wbs_s6_ack_i(wbs_s6_ack_i),
-    
-      // Wishbone SLV 7 interface
-      .wbs_s7_cyc_o(wbs_s7_cyc_o),
-      .wbs_s7_stb_o(wbs_s7_stb_o),
-      .wbs_s7_adr_o(wbs_s7_adr_o),
-      .wbs_s7_we_o (wbs_s7_we_o ),
-      .wbs_s7_dat_o(wbs_s7_dat_o),
-      .wbs_s7_sel_o(wbs_s7_sel_o),
-      .wbs_s7_dat_i(wbs_s7_dat_i),
-      .wbs_s7_ack_i(wbs_s7_ack_i)
-    
-    );
-	
-    nec_ir_receiver #(
-      .NB_STAGES (10),
-      .PSIZE     (20),
-      .DSIZE     (11),
-      .ASIZE     ( 4)
-    ) i_nec_ir_receiver (
-      .rst_n    (rst_n       ),
-      .clk      (wb_clk_i    ),
-      .wbs_cyc_i(wbs_s0_cyc_o),
-      .wbs_stb_i(wbs_s0_stb_o),
-      .wbs_adr_i(wbs_s0_adr_o),
-      .wbs_we_i (wbs_s0_we_o ),
-      .wbs_dat_i(wbs_s0_dat_o),
-      .wbs_sel_i(wbs_s0_sel_o),
-      .wbs_dat_o(wbs_s0_dat_i),
-      .wbs_ack_o(wbs_s0_ack_i),
-      .ir_in    (io_in[37]   ),
-      .irq      (irq[0]      )
-    );
-	
-	pseudorandom i_pseudorandom (
-      .rst_n     (rst_n       ),
-      .clk       (wb_clk_i    ),
-
-      // Wishbone bus
-      .wbs_cyc_i (wbs_s1_cyc_o),
-      .wbs_stb_i (wbs_s1_stb_o),
-      .wbs_adr_i (wbs_s1_adr_o),
-      .wbs_we_i  (wbs_s1_we_o ),
-      .wbs_dat_i (wbs_s1_dat_o),
-      .wbs_sel_i (wbs_s1_sel_o),
-      .wbs_dat_o (wbs_s1_dat_i),
-      .wbs_ack_o (wbs_s1_ack_i) 
-    );
-	
-    assign wbs_s2_dat_i = 32'h00000000;
-    assign wbs_s3_dat_i = 32'h00000000;
-    assign wbs_s4_dat_i = 32'h00000000;
-    assign wbs_s5_dat_i = 32'h00000000;
-    assign wbs_s6_dat_i = 32'h00000000;
-    assign wbs_s7_dat_i = 32'h00000000;
-    assign wbs_s2_ack_i = wbs_s2_stb_o;
-    assign wbs_s3_ack_i = wbs_s3_stb_o;
-    assign wbs_s4_ack_i = wbs_s4_stb_o;
-    assign wbs_s5_ack_i = wbs_s5_stb_o;
-    assign wbs_s6_ack_i = wbs_s6_stb_o;
-    assign wbs_s7_ack_i = wbs_s7_stb_o;
+  assign wbs_s4_dat_i = 32'h00000000;
+  assign wbs_s5_dat_i = 32'h00000000;
+  assign wbs_s6_dat_i = 32'h00000000;
+  assign wbs_s7_dat_i = 32'h00000000;
+  assign wbs_s4_ack_i = wbs_s4_stb_o;
+  assign wbs_s5_ack_i = wbs_s5_stb_o;
+  assign wbs_s6_ack_i = wbs_s6_stb_o;
+  assign wbs_s7_ack_i = wbs_s7_stb_o;
 
 endmodule