pwm new rtl update
diff --git a/verilog/dv/uart_master/Makefile b/verilog/dv/uart_master_test1/Makefile
similarity index 100%
rename from verilog/dv/uart_master/Makefile
rename to verilog/dv/uart_master_test1/Makefile
diff --git a/verilog/dv/uart_master/run_verilog b/verilog/dv/uart_master_test1/run_verilog
similarity index 100%
rename from verilog/dv/uart_master/run_verilog
rename to verilog/dv/uart_master_test1/run_verilog
diff --git a/verilog/dv/uart_master/uart_master.c b/verilog/dv/uart_master_test1/uart_master_test1.c
similarity index 100%
rename from verilog/dv/uart_master/uart_master.c
rename to verilog/dv/uart_master_test1/uart_master_test1.c
diff --git a/verilog/dv/uart_master/uart_master_tb.v b/verilog/dv/uart_master_test1/uart_master_test1_tb.v
similarity index 100%
rename from verilog/dv/uart_master/uart_master_tb.v
rename to verilog/dv/uart_master_test1/uart_master_test1_tb.v
diff --git a/verilog/rtl/gpio/src/gpio_dglicth.sv b/verilog/rtl/gpio/src/gpio_dglicth.sv
new file mode 100644
index 0000000..e843057
--- /dev/null
+++ b/verilog/rtl/gpio/src/gpio_dglicth.sv
@@ -0,0 +1,72 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// 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 Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// GPIO De-Glitch ////
+//// ////
+//// This file is part of the riscduino cores project ////
+//// https://github.com/dineshannayya/riscduino.git ////
+//// ////
+//// Description ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesh.annayya@gmail.com ////
+//// ////
+//// Revision : ////
+//// 0.1 - 13th Sept 2022, Dinesh A ////
+//// initial version ////
+//////////////////////////////////////////////////////////////////////
+//
+
+
+module gpio_dglitch (
+ input logic reset_n,
+ input logic mclk,
+ input logic pulse_1us,
+ input logic cfg_mode, // 0 - 1 us, 1 - every system clock
+ input logic gpio_in,
+ output logic gpio_out
+ );
+
+logic [3:0] gpio_ss;
+logic gpio_reg;
+
+// Pass the input data , if there is no transition, else send old data
+assign gpio_out = ((gpio_ss[3] == gpio_ss[2]) && (gpio_ss[2] == gpio_ss[1])) ? gpio_ss[3] : gpio_reg;
+
+
+always@(negedge reset_n or posedge mclk)
+begin
+ if(reset_n == 1'b0) begin
+ gpio_ss <= 'h0;
+ gpio_reg <= 'h0;
+ end else begin
+ gpio_reg <= gpio_out;
+ if(cfg_mode == 1'b0) begin // De-glitch sampling at 1us pulse
+ if(pulse_1us) gpio_ss <= {gpio_ss[2:0],gpio_in};
+ end else begin // De-glitch on on every system clock
+ gpio_ss <= {gpio_ss[2:0],gpio_in};
+ end
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/pinmux/src/gpio_intr.sv b/verilog/rtl/gpio/src/gpio_intr.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/gpio_intr.sv
rename to verilog/rtl/gpio/src/gpio_intr.sv
diff --git a/verilog/rtl/pinmux/src/gpio_reg.sv b/verilog/rtl/gpio/src/gpio_reg.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/gpio_reg.sv
rename to verilog/rtl/gpio/src/gpio_reg.sv
diff --git a/verilog/rtl/pinmux/src/gpio_top.sv b/verilog/rtl/gpio/src/gpio_top.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/gpio_top.sv
rename to verilog/rtl/gpio/src/gpio_top.sv
diff --git a/verilog/rtl/pinmux/src/pwm_reg.sv b/verilog/rtl/pinmux/src/pwm_blk_reg.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/pwm_reg.sv
rename to verilog/rtl/pinmux/src/pwm_blk_reg.sv
diff --git a/verilog/rtl/pwm/src/pwm.sv b/verilog/rtl/pwm/src/pwm.sv
new file mode 100644
index 0000000..df9cf3a
--- /dev/null
+++ b/verilog/rtl/pwm/src/pwm.sv
@@ -0,0 +1,271 @@
+
+//-------------------------------------------------------------------
+// PWM waveform period: 1000/((cfg_pwm_high+1) + (cfg_pwm_low+1))
+// For 1 Second with Duty cycle 50 = 1000/((499+1) + (499+1))
+// For 1 Second with 1ms On and 999ms Off = 1000/((0+1) + (998+1))
+// Timing Run's with 1 Milisecond pulse
+//-------------------------------------------------------------------
+
+module pwm(
+
+ input logic h_reset_n ,
+ input logic mclk ,
+
+ output logic pwm_wfm_o ,
+ output logic pwm_os_done ,
+ output logic pwm_ovflow_pe ,
+ output logic gpio_tgr ,
+
+ input logic [7:0] pad_gpio ,
+
+ input logic cfg_pwm_enb , // pwm operation enable
+ input logic [3:0] cfg_pwm_scale , // pwm clock scaling
+ input logic cfg_pwm_oneshot , // pwm OneShot mode
+ input logic cfg_pwm_frun , // pwm is free running
+ input logic cfg_pwm_gpio_enb , // pwm gpio based trigger
+ input logic cfg_pwm_gpio_edge , // pwm gpio based trigger edge
+ input logic [2:0] cfg_pwm_gpio_sel , // gpio Selection
+ input logic cfg_pwm_hold , // Hold data pwm data During pwm Disable
+ input logic cfg_pwm_inv , // invert output
+ input logic cfg_pwm_zeropd , // Reset on pmw_cnt match to period
+ input logic [1:0] cfg_pwm_mode , // pwm Pulse Generation mode
+ input logic cfg_comp0_center , // Compare cnt at comp0 center
+ input logic cfg_comp1_center , // Compare cnt at comp1 center
+ input logic cfg_comp2_center , // Compare cnt at comp2 center
+ input logic cfg_comp3_center , // Compare cnt at comp3 center
+ input logic [15:0] cfg_pwm_period , // pwm period
+ input logic [15:0] cfg_pwm_comp0 , // compare0
+ input logic [15:0] cfg_pwm_comp1 , // compare1
+ input logic [15:0] cfg_pwm_comp2 , // compare2
+ input logic [15:0] cfg_pwm_comp3 // compare3
+);
+
+logic [14:0] pwm_scnt ; // PWM Scaling counter
+logic [15:0] pwm_cnt ; // PWM counter
+logic cnt_trg ;
+logic pwm_wfm_i ;
+logic pwm_wfm_hold;
+logic comp0_match ;
+logic comp1_match ;
+logic comp2_match ;
+logic comp3_match ;
+logic gpio_fedge ; // GPIO first edge detection
+//--------------------------------
+// Counter Scaling
+// In GPIO mode, wait for first GPIO transition
+//--------------------------------
+
+always @(posedge mclk or negedge h_reset_n)
+begin
+ if ( ~h_reset_n ) begin
+ pwm_scnt <= 15'h0;
+ end else begin
+ if(cfg_pwm_enb) begin
+ if(gpio_tgr || (cfg_pwm_gpio_enb && !gpio_fedge)) begin
+ pwm_scnt <= 15'h0;
+ end else begin
+ pwm_scnt <= pwm_scnt + 1;
+ end
+ end else begin
+ pwm_scnt <= 15'h0;
+ end
+ end
+end
+
+//-----------------------------------------------------------------------------
+// pwm_scaling used to decide on the trigger event for the pwm_cnt
+// 0 ==> pwm_cnt increment every system cycle
+// 1 ==> 2^0 => pmw_cnt increase once in two system cycle
+// 15 ==>a 2^15 => pwm_cnt increase once in 32768 system cycle
+//-----------------------------------------------------------------------------
+
+always_comb
+begin
+ cnt_trg = 0;
+ case(cfg_pwm_scale)
+ 4'b0000: cnt_trg = 1;
+ 4'b0001: cnt_trg = pwm_scnt[0];
+ 4'b0010: cnt_trg = &pwm_scnt[1:0];
+ 4'b0011: cnt_trg = &pwm_scnt[2:0];
+ 4'b0100: cnt_trg = &pwm_scnt[3:0];
+ 4'b0101: cnt_trg = &pwm_scnt[4:0];
+ 4'b0110: cnt_trg = &pwm_scnt[5:0];
+ 4'b0111: cnt_trg = &pwm_scnt[6:0];
+ 4'b1000: cnt_trg = &pwm_scnt[7:0];
+ 4'b1001: cnt_trg = &pwm_scnt[8:0];
+ 4'b1010: cnt_trg = &pwm_scnt[9:0];
+ 4'b1011: cnt_trg = &pwm_scnt[10:0];
+ 4'b1100: cnt_trg = &pwm_scnt[11:0];
+ 4'b1101: cnt_trg = &pwm_scnt[12:0];
+ 4'b1110: cnt_trg = &pwm_scnt[13:0];
+ 4'b1111: cnt_trg = &pwm_scnt[14:0];
+ default: cnt_trg = 0;
+ endcase
+end
+
+//----------------------------------------------------------
+//Counter Overflow condition
+// 1. At Roll Over
+// 2. If compare on period enable, then at period
+//----------------------------------------------------------
+logic pwm_ovflow_l;
+wire pwm_ovflow = ((&pwm_cnt) | (cfg_pwm_zeropd && (pwm_cnt == cfg_pwm_period))) & cfg_pwm_enb;
+
+
+// overflow single cycle pos edge pulse
+assign pwm_ovflow_pe = (!pwm_ovflow_l & pwm_ovflow);
+
+// Don't generate PWM done at exact clash at gpio trigger, higer priority to gpio trigger
+assign pwm_os_done = (cfg_pwm_oneshot && !gpio_tgr) ? pwm_ovflow_pe : 1'b0;
+
+always @(posedge mclk or negedge h_reset_n)
+begin
+ if ( ~h_reset_n ) begin
+ pwm_cnt <= 16'h0;
+ pwm_ovflow_l <= 1'b0;
+ end else begin
+ pwm_ovflow_l <= pwm_ovflow;
+ if(cfg_pwm_enb) begin
+ if(gpio_tgr || (cfg_pwm_gpio_enb && !gpio_fedge)) begin
+ pwm_cnt <= 'h0;
+ end else if(cnt_trg) begin
+ if(pwm_ovflow) begin
+ pwm_cnt <= 'h0;
+ end else begin
+ pwm_cnt <= pwm_cnt + 1;
+ end
+ end
+ end else begin
+ pwm_cnt <= 16'h0;
+ end
+ end
+end
+
+//-----------------------------
+// compare-0 match logic generation
+//------------------------------
+
+always_comb begin
+ comp0_match = 0;
+ if(cfg_comp0_center)begin
+ comp0_match = (({16{pwm_cnt[15]}} ^ pwm_cnt) >= cfg_pwm_comp0);
+ end else begin
+ comp0_match = (pwm_cnt >= cfg_pwm_comp0);
+ end
+end
+
+//-----------------------------
+// compare-1 match logic generation
+//------------------------------
+always_comb begin
+ comp1_match = 0;
+ if(cfg_comp1_center)begin
+ comp1_match = (({16{pwm_cnt[15]}}^ pwm_cnt) >= cfg_pwm_comp1);
+ end else begin
+ comp1_match = (pwm_cnt >= cfg_pwm_comp1);
+ end
+end
+
+//-----------------------------
+// compare-2 match logic generation
+//------------------------------
+always_comb begin
+ comp2_match = 0;
+ if(cfg_comp2_center)begin
+ comp2_match = (({16{pwm_cnt[15]}} ^ pwm_cnt) >= cfg_pwm_comp2);
+ end else begin
+ comp2_match = (pwm_cnt >= cfg_pwm_comp2);
+ end
+end
+
+//-----------------------------
+// compare-3 match logic generation
+//------------------------------
+always_comb begin
+ comp3_match = 0;
+ if(cfg_comp3_center) begin
+ comp3_match = (({16{pwm_cnt[15]}} ^ pwm_cnt) >= cfg_pwm_comp3);
+ end else begin
+ comp3_match = (pwm_cnt >= cfg_pwm_comp3);
+ end
+end
+
+//---------------------------------------------
+// Consolidated pwm waform generation
+// based on pwm mode
+//---------------------------------------------
+
+always_comb begin
+ pwm_wfm_i = 0;
+ case(cfg_pwm_mode)
+ 2'b00: pwm_wfm_i = comp0_match;
+ 2'b01: pwm_wfm_i = comp0_match ^ comp1_match;
+ 2'b10: pwm_wfm_i = comp0_match ^ comp1_match ^ comp2_match;
+ 2'b11: pwm_wfm_i = comp0_match ^ comp1_match ^ comp2_match ^ comp3_match;
+ default: pwm_wfm_i=0;
+ endcase
+end
+
+//-----------------------------------------------
+// Holding the pwm waveform in active region
+//------------------------------------------------
+always @(posedge mclk or negedge h_reset_n)
+begin
+ if ( ~h_reset_n ) begin
+ pwm_wfm_hold <= 1'b0;
+ end else if(cfg_pwm_enb) begin
+ pwm_wfm_hold <= pwm_wfm_i;
+ end
+end
+
+//--------------------------------------------
+// Final Waveform output generation based
+// on pwm_hold and pwm_inv combination
+//--------------------------------------------
+always_comb begin
+ pwm_wfm_o = 0;
+ if(!cfg_pwm_enb && cfg_pwm_hold) begin
+ if(cfg_pwm_inv) pwm_wfm_o = !pwm_wfm_hold;
+ else pwm_wfm_o = pwm_wfm_hold;
+ end else begin
+ if(cfg_pwm_inv) pwm_wfm_o = !pwm_wfm_i;
+ pwm_wfm_o = pwm_wfm_i;
+ end
+end
+
+//----------------------------------------
+// GPIO Trigger Generation
+//----------------------------------------
+logic gpio_l;
+wire gpio = pad_gpio[cfg_pwm_gpio_sel];
+
+// GPIO Pos and Neg Edge Selection
+wire gpio_pe = (gpio & !gpio_l);
+wire gpio_ne = (!gpio & gpio_l);
+
+always @(posedge mclk or negedge h_reset_n)
+begin
+ if ( ~h_reset_n ) begin
+ gpio_l <= 1'b0;
+ gpio_fedge <= 1'b0;
+ gpio_tgr <= 1'b0;
+ end else begin
+ gpio_l <= gpio;
+ if(cfg_pwm_enb && cfg_pwm_gpio_enb) begin
+ if(cfg_pwm_gpio_edge) begin
+ gpio_tgr <= gpio_ne;
+ gpio_fedge <= 1'b1; // gpio first edge detect
+ end else begin
+ gpio_tgr <= gpio_pe;
+ gpio_fedge <= 1'b1;
+ end
+ end else begin
+ gpio_l <= 1'b0;
+ gpio_fedge <= 1'b0;
+ gpio_tgr <= 1'b0;
+ end
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/pwm/src/pwm_blk_reg.sv b/verilog/rtl/pwm/src/pwm_blk_reg.sv
new file mode 100644
index 0000000..450b580
--- /dev/null
+++ b/verilog/rtl/pwm/src/pwm_blk_reg.sv
@@ -0,0 +1,285 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// 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 Dinesh Annayya <dinesh.annayya@gmail.com>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// PWM Register ////
+//// ////
+//// This file is part of the riscduino cores project ////
+//// https://github.com/dineshannayya/riscduino.git ////
+//// ////
+//// Description ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 15th Aug 2022, Dinesh A ////
+//// initial version ////
+//// 0.2 - 13th Sept 2022, Dinesh A ////
+//// Change Register to PWM Based ////
+//////////////////////////////////////////////////////////////////////
+//
+module pwm_blk_reg (
+ // System Signals
+ // Inputs
+ input logic mclk ,
+ input logic h_reset_n ,
+
+ // Reg Bus Interface Signal
+ input logic reg_cs ,
+ input logic reg_wr ,
+ input logic [1:0] reg_addr ,
+ input logic [31:0] reg_wdata ,
+ input logic [3:0] reg_be ,
+
+ // Outputs
+ output logic [31:0] reg_rdata ,
+ output logic reg_ack ,
+
+ input logic cfg_pwm_enb , // PWM operation enable
+ input logic cfg_pwm_dupdate , // Disable Config update
+ input logic pwm_cfg_update , // Update the pwm config on roll-over or completion
+
+ output logic [3:0] cfg_pwm_scale , // clock scaling
+ output logic cfg_pwm_oneshot , // PWM OneShot mode
+ output logic cfg_pwm_frun , // PWM is free running
+ output logic cfg_pwm_gpio_enb , // PWM GPIO based trigger enable
+ output logic cfg_pwm_gpio_edge , // PWM GPIO based trigger edge
+ output logic [2:0] cfg_pwm_gpio_sel , // GPIO Selection
+ output logic cfg_pwm_hold , // Hold data PWM data During PWM Disable
+ output logic cfg_pwm_inv , // invert output
+ output logic cfg_pwm_zeropd , // Reset on pmw_cnt match to period
+ output logic [1:0] cfg_pwm_mode , // PWM Pulse Generation mode
+ output logic cfg_comp0_center , // Compare cnt at comp0 center
+ output logic cfg_comp1_center , // Compare cnt at comp1 center
+ output logic cfg_comp2_center , // Compare cnt at comp2 center
+ output logic cfg_comp3_center , // Compare cnt at comp3 center
+ output logic [15:0] cfg_pwm_period , // PWM period
+ output logic [15:0] cfg_pwm_comp0 , // compare0
+ output logic [15:0] cfg_pwm_comp1 , // compare1
+ output logic [15:0] cfg_pwm_comp2 , // compare2
+ output logic [15:0] cfg_pwm_comp3 // compare3
+
+ );
+
+//-----------------------------------------------------------------------
+// Internal Wire Declarations
+//-----------------------------------------------------------------------
+
+logic sw_rd_en ;
+logic sw_wr_en ;
+logic [1:0] sw_addr ; // addressing 16 registers
+logic [31:0] sw_reg_wdata ;
+logic [3:0] sw_be ;
+
+logic [31:0] reg_out ;
+logic [31:0] reg_0 ; // CONFIG - Unused
+logic [31:0] reg_1 ; // PWM-REG-0
+logic [31:0] reg_2 ; // PWM-REG-1
+logic [31:0] reg_3 ; // PWM-REG-2
+logic [31:0] reg_4 ; // PWM-REG-3
+logic [31:0] reg_5 ; // PWM-REG-4
+logic [31:0] reg_6 ; // PWM-REG-5
+
+assign sw_addr = reg_addr;
+assign sw_rd_en = reg_cs & !reg_wr;
+assign sw_wr_en = reg_cs & reg_wr;
+assign sw_be = reg_be;
+assign sw_reg_wdata = reg_wdata;
+
+//-----------------------------------------------------------------------
+// register read enable and write enable decoding logic
+//-----------------------------------------------------------------------
+wire sw_wr_en_0 = sw_wr_en & (sw_addr == 2'h0);
+wire sw_wr_en_1 = sw_wr_en & (sw_addr == 2'h1);
+wire sw_wr_en_2 = sw_wr_en & (sw_addr == 2'h2);
+wire sw_wr_en_3 = sw_wr_en & (sw_addr == 2'h3);
+
+wire sw_rd_en_0 = sw_rd_en & (sw_addr == 2'h0);
+wire sw_rd_en_1 = sw_rd_en & (sw_addr == 2'h1);
+wire sw_rd_en_2 = sw_rd_en & (sw_addr == 2'h2);
+wire sw_rd_en_3 = sw_rd_en & (sw_addr == 2'h3);
+
+
+always @ (posedge mclk or negedge h_reset_n)
+begin : preg_out_Seq
+ if (h_reset_n == 1'b0) begin
+ reg_rdata <= 'h0;
+ reg_ack <= 1'b0;
+ end else if (reg_cs && !reg_ack) begin
+ reg_rdata <= reg_out;
+ reg_ack <= 1'b1;
+ end else begin
+ reg_ack <= 1'b0;
+ end
+end
+
+//--------------------------------------------
+// PWM-0 Config
+//---------------------------------------------
+logic [31:0] pwm_cfg0;
+
+assign cfg_pwm_scale = pwm_cfg0[3:0];
+assign cfg_pwm_oneshot = pwm_cfg0[4];
+assign cfg_pwm_frun = pwm_cfg0[5];
+assign cfg_pwm_gpio_enb = pwm_cfg0[6];
+assign cfg_pwm_gpio_edge = pwm_cfg0[7];
+assign cfg_pwm_gpio_sel = pwm_cfg0[10:8];
+assign cfg_pwm_hold = pwm_cfg0[11];
+assign cfg_pwm_mode = pwm_cfg0[13:12];
+assign cfg_pwm_inv = pwm_cfg0[14];
+assign cfg_pwm_zeropd = pwm_cfg0[15]; // Reset on Matching Period
+assign cfg_comp0_center = pwm_cfg0[16];
+assign cfg_comp1_center = pwm_cfg0[17];
+assign cfg_comp2_center = pwm_cfg0[18];
+assign cfg_comp3_center = pwm_cfg0[19];
+
+gen_32b_reg #(32'h0) u_reg_0 (
+ //List of Inputs
+ .reset_n (h_reset_n ),
+ .clk (mclk ),
+ .cs (sw_wr_en_0 ),
+ .we (sw_be ),
+ .data_in (sw_reg_wdata ),
+
+ //List of Outs
+ .data_out (reg_0 )
+ );
+
+pwm_cfg_dglitch u_dglitch_0 (
+ .mclk (mclk ),
+ .h_reset_n (h_reset_n ),
+
+ .enb (cfg_pwm_enb ),
+ .cfg_update (pwm_cfg_update ),
+ .cfg_dupdate (cfg_pwm_dupdate ),
+ .reg_in (reg_0 ),
+ .reg_out (pwm_cfg0 )
+
+
+ );
+//-----------------------------------------------------------------------
+// Logic for PWM-1 Config
+//-----------------------------------------------------------------------
+logic [31:0] pwm_cfg1;
+assign cfg_pwm_period = pwm_cfg1[15:0];
+
+gen_32b_reg #(32'h0) u_reg_1 (
+ //List of Inputs
+ .reset_n (h_reset_n ),
+ .clk (mclk ),
+ .cs (sw_wr_en_1 ),
+ .we (sw_be ),
+ .data_in (sw_reg_wdata ),
+
+ //List of Outs
+ .data_out (reg_1 )
+ );
+
+pwm_cfg_dglitch u_dglitch_1 (
+ .mclk (mclk ),
+ .h_reset_n (h_reset_n ),
+
+ .enb (cfg_pwm_enb ),
+ .cfg_update (pwm_cfg_update ),
+ .cfg_dupdate (cfg_pwm_dupdate ),
+ .reg_in (reg_1 ),
+ .reg_out (pwm_cfg1 )
+
+
+ );
+
+//-----------------------------------------------------------------------
+// Logic for PWM-2 Config
+//-----------------------------------------------------------------------
+logic [31:0] pwm_cfg2;
+assign cfg_pwm_comp0 = pwm_cfg2[15:0]; // Comparator-0
+assign cfg_pwm_comp1 = pwm_cfg2[31:16]; // Comparator-1
+gen_32b_reg #(32'h0) u_reg_2 (
+ //List of Inputs
+ .reset_n (h_reset_n ),
+ .clk (mclk ),
+ .cs (sw_wr_en_2 ),
+ .we (sw_be ),
+ .data_in (sw_reg_wdata ),
+
+ //List of Outs
+ .data_out (reg_2 )
+ );
+
+pwm_cfg_dglitch u_dglitch_2 (
+ .mclk (mclk ),
+ .h_reset_n (h_reset_n ),
+
+ .enb (cfg_pwm_enb ),
+ .cfg_update (pwm_cfg_update ),
+ .cfg_dupdate (cfg_pwm_dupdate ),
+ .reg_in (reg_2 ),
+ .reg_out (pwm_cfg2 )
+
+
+ );
+//-----------------------------------------------------------------------
+// Logic for PWM-3 Config
+//-----------------------------------------------------------------------
+logic [31:0] pwm_cfg3;
+assign cfg_pwm_comp2 = reg_3[15:0]; // Comparator-2
+assign cfg_pwm_comp3 = reg_3[31:16]; // Comparator-3
+gen_32b_reg #(32'h0) u_reg_3 (
+ //List of Inputs
+ .reset_n (h_reset_n ),
+ .clk (mclk ),
+ .cs (sw_wr_en_3 ),
+ .we (sw_be ),
+ .data_in (sw_reg_wdata ),
+
+ //List of Outs
+ .data_out (reg_3 )
+ );
+
+
+pwm_cfg_dglitch u_dglitch_3 (
+ .mclk (mclk ),
+ .h_reset_n (h_reset_n ),
+
+ .enb (cfg_pwm_enb ),
+ .cfg_update (pwm_cfg_update ),
+ .cfg_dupdate (cfg_pwm_dupdate ),
+ .reg_in (reg_3 ),
+ .reg_out (pwm_cfg3 )
+
+
+ );
+
+always_comb
+begin
+ reg_out [31:0] = 32'h0;
+
+ case (sw_addr [1:0])
+ 2'b00 : reg_out [31:0] = reg_0 [31:0];
+ 2'b01 : reg_out [31:0] = reg_1 [31:0];
+ 2'b10 : reg_out [31:0] = reg_2 [31:0];
+ 2'b11 : reg_out [31:0] = reg_3 [31:0];
+ default : reg_out [31:0] = 32'h0;
+ endcase
+end
+
+endmodule
diff --git a/verilog/rtl/pwm/src/pwm_cfg_dglitch.sv b/verilog/rtl/pwm/src/pwm_cfg_dglitch.sv
new file mode 100644
index 0000000..87d536b
--- /dev/null
+++ b/verilog/rtl/pwm/src/pwm_cfg_dglitch.sv
@@ -0,0 +1,37 @@
+
+/*************************************************************
+ This block added to block abort changing of config during PWM config.
+ pwm config will be update only in following condition
+ 1. When pwm is in disable condition
+ 2. When disable_update = 0 and cfg_update = 1
+*************************************************************/
+
+
+module pwm_cfg_dglitch (
+ // System Signals
+ // Inputs
+ input logic mclk ,
+ input logic h_reset_n ,
+ input logic enb , // Operation Enable
+ input logic cfg_update , // Update config
+ input logic cfg_dupdate , // Disable config update
+ input logic [31:0] reg_in ,
+ output logic [31:0] reg_out
+
+ );
+
+
+
+always @(posedge mclk or negedge h_reset_n) begin
+ if ( ~h_reset_n ) begin
+ reg_out <= 'h0;
+ end else begin
+ if(!cfg_dupdate) begin
+ if(!enb || cfg_update) begin
+ reg_out <= reg_in;
+ end
+ end
+ end
+end
+
+endmodule
diff --git a/verilog/rtl/pwm/src/pwm_core.sv b/verilog/rtl/pwm/src/pwm_core.sv
new file mode 100644
index 0000000..9c708db
--- /dev/null
+++ b/verilog/rtl/pwm/src/pwm_core.sv
@@ -0,0 +1,144 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// 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 Dinesh Annayya <dinesh.annayya@gmail.com>
+//
+//////////////////////////////////////////////////////////////////////
+module pwm_core (
+
+ input logic h_reset_n ,
+ input logic mclk ,
+
+// Reg Bus Interface Signal
+ input logic reg_cs ,
+ input logic reg_wr ,
+ input logic [1:0] reg_addr ,
+ input logic [31:0] reg_wdata ,
+ input logic [3:0] reg_be ,
+
+ // Outputs
+ output logic [31:0] reg_rdata ,
+ output logic reg_ack ,
+
+ input logic cfg_pwm_enb , // pwm operation enable
+ input logic cfg_pwm_dupdate , // Disable Config update
+ input logic [7:0] pad_gpio ,
+ output logic pwm_wfm_o ,
+ output logic pwm_os_done ,
+ output logic pwm_ovflow ,
+ output logic gpio_tgr
+
+
+
+);
+
+logic [3:0] cfg_pwm_scale ; // pwm clock scaling
+logic cfg_pwm_oneshot ; // pwm OneShot mode
+logic cfg_pwm_frun ; // pwm is free running
+logic cfg_pwm_gpio_enb ; // pwm gpio based trigger
+logic cfg_pwm_gpio_edge ; // pwm gpio based trigger edge
+logic [2:0] cfg_pwm_gpio_sel ; // gpio Selection
+logic cfg_pwm_hold ; // Hold data pwm data During pwm Disable
+logic cfg_pwm_inv ; // invert output
+logic cfg_pwm_zeropd ; // Reset on pmw_cnt match to period
+logic [1:0] cfg_pwm_mode ; // pwm Pulse Generation mode
+logic cfg_comp0_center ; // Compare cnt at comp0 center
+logic cfg_comp1_center ; // Compare cnt at comp1 center
+logic cfg_comp2_center ; // Compare cnt at comp2 center
+logic cfg_comp3_center ; // Compare cnt at comp3 center
+logic [15:0] cfg_pwm_period ; // pwm period
+logic [15:0] cfg_pwm_comp0 ; // compare0
+logic [15:0] cfg_pwm_comp1 ; // compare1
+logic [15:0] cfg_pwm_comp2 ; // compare2
+logic [15:0] cfg_pwm_comp3 ; // compare3
+
+
+
+
+pwm_blk_reg u_reg (
+ .mclk (mclk ),
+ .h_reset_n (h_reset_n ),
+
+ .reg_cs (reg_cs ),
+ .reg_wr (reg_wr ),
+ .reg_addr (reg_addr ),
+ .reg_wdata (reg_wdata ),
+ .reg_be (reg_be ),
+
+ .reg_rdata (reg_rdata ),
+ .reg_ack (reg_ack ),
+
+ .cfg_pwm_enb (cfg_pwm_enb ), // PWM operation enable
+ .cfg_pwm_dupdate (cfg_pwm_dupdate ), // Disable Config update
+ .pwm_cfg_update (pwm_ovflow ), // Update the pwm config on roll-over or completion
+
+ .cfg_pwm_scale (cfg_pwm_scale ), // clock scaling
+ .cfg_pwm_oneshot (cfg_pwm_oneshot ), // PWM OneShot mode
+ .cfg_pwm_frun (cfg_pwm_frun ), // PWM is free running
+ .cfg_pwm_gpio_enb (cfg_pwm_gpio_enb ), // PWM GPIO based trigger enable
+ .cfg_pwm_gpio_edge (cfg_pwm_gpio_edge ), // PWM GPIO based trigger edge
+ .cfg_pwm_gpio_sel (cfg_pwm_gpio_sel ), // GPIO Selection
+ .cfg_pwm_hold (cfg_pwm_hold ), // Hold data PWM data During PWM Disable
+ .cfg_pwm_inv (cfg_pwm_inv ), // invert output
+ .cfg_pwm_zeropd (cfg_pwm_zeropd ), // Reset on pmw_cnt match to period
+ .cfg_pwm_mode (cfg_pwm_mode ), // PWM Pulse Generation mode
+ .cfg_comp0_center (cfg_comp0_center ), // Compare cnt at comp0 center
+ .cfg_comp1_center (cfg_comp1_center ), // Compare cnt at comp1 center
+ .cfg_comp2_center (cfg_comp2_center ), // Compare cnt at comp2 center
+ .cfg_comp3_center (cfg_comp3_center ), // Compare cnt at comp3 center
+ .cfg_pwm_period (cfg_pwm_period ), // PWM period
+ .cfg_pwm_comp0 (cfg_pwm_comp0 ), // compare0
+ .cfg_pwm_comp1 (cfg_pwm_comp1 ), // compare1
+ .cfg_pwm_comp2 (cfg_pwm_comp2 ), // compare2
+ .cfg_pwm_comp3 (cfg_pwm_comp3 ) // compare3
+
+ );
+
+
+
+pwm u_pwm (
+ .h_reset_n (h_reset_n ),
+ .mclk (mclk ),
+
+ .pwm_wfm_o (pwm_wfm_o ),
+ .pwm_os_done (pwm_os_done ),
+ .pwm_ovflow_pe (pwm_ovflow ),
+ .gpio_tgr (gpio_tgr ),
+
+ .pad_gpio (pad_gpio ),
+
+ .cfg_pwm_enb (cfg_pwm_enb ),
+ .cfg_pwm_scale (cfg_pwm_scale ),
+ .cfg_pwm_oneshot (cfg_pwm_oneshot ),
+ .cfg_pwm_frun (cfg_pwm_frun ),
+ .cfg_pwm_gpio_enb (cfg_pwm_gpio_enb ),
+ .cfg_pwm_gpio_edge (cfg_pwm_gpio_edge ),
+ .cfg_pwm_gpio_sel (cfg_pwm_gpio_sel ),
+ .cfg_pwm_hold (cfg_pwm_hold ),
+ .cfg_pwm_inv (cfg_pwm_inv ),
+ .cfg_pwm_zeropd (cfg_pwm_zeropd ),
+ .cfg_pwm_mode (cfg_pwm_mode ),
+ .cfg_comp0_center (cfg_comp0_center ),
+ .cfg_comp1_center (cfg_comp1_center ),
+ .cfg_comp2_center (cfg_comp2_center ),
+ .cfg_comp3_center (cfg_comp3_center ),
+ .cfg_pwm_period (cfg_pwm_period ),
+ .cfg_pwm_comp0 (cfg_pwm_comp0 ),
+ .cfg_pwm_comp1 (cfg_pwm_comp1 ),
+ .cfg_pwm_comp2 (cfg_pwm_comp2 ),
+ .cfg_pwm_comp3 (cfg_pwm_comp3 )
+ );
+
+endmodule
diff --git a/verilog/rtl/pwm/src/pwm_glbl_reg.sv b/verilog/rtl/pwm/src/pwm_glbl_reg.sv
new file mode 100644
index 0000000..3868a78
--- /dev/null
+++ b/verilog/rtl/pwm/src/pwm_glbl_reg.sv
@@ -0,0 +1,212 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// 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 Dinesh Annayya <dinesh.annayya@gmail.com>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// PWM Register ////
+//// ////
+//// This file is part of the riscduino cores project ////
+//// https://github.com/dineshannayya/riscduino.git ////
+//// ////
+//// Description ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 15th Aug 2022, Dinesh A ////
+//// initial version ////
+//// 0.2 - 13th Sept 2022, Dinesh A ////
+//// Change Register to PWM Based ////
+//////////////////////////////////////////////////////////////////////
+//
+module pwm_glbl_reg (
+ // System Signals
+ // Inputs
+ input logic mclk ,
+ input logic h_reset_n ,
+
+ // Reg Bus Interface Signal
+ input logic reg_cs ,
+ input logic reg_wr ,
+ input logic [1:0] reg_addr ,
+ input logic [31:0] reg_wdata ,
+ input logic [3:0] reg_be ,
+
+ // Outputs
+ output logic [31:0] reg_rdata ,
+ output logic reg_ack ,
+
+ output logic [5:0] cfg_pwm_enb , // PWM operation enable
+ output logic [5:0] cfg_pwm_dupdate , // Disable Config update
+
+ input logic [5:0] pwm_os_done , // Indicate oneshot sequence over
+ input logic [5:0] pwm_ovflow , // pwm sequence cross over
+ input logic [5:0] gpio_tgr , // Enable PWM based on trigger
+
+ output logic pwm_intr
+
+
+ );
+
+//-----------------------------------------------------------------------
+// Internal Wire Declarations
+//-----------------------------------------------------------------------
+
+logic sw_rd_en ;
+logic sw_wr_en ;
+logic [1:0] sw_addr ; // addressing 16 registers
+logic [31:0] sw_reg_wdata ;
+logic [3:0] sw_be ;
+
+logic [31:0] reg_out ;
+logic [5:0] reg_0 ; // CONFIG - Unused
+logic [31:0] reg_1 ; // PWM-REG-0
+logic [31:0] reg_2 ; // PWM-REG-1
+logic [31:0] reg_3 ; // PWM-REG-2
+
+assign sw_addr = reg_addr;
+assign sw_rd_en = reg_cs & !reg_wr;
+assign sw_wr_en = reg_cs & reg_wr;
+assign sw_be = reg_be;
+assign sw_reg_wdata = reg_wdata;
+
+//-----------------------------------------------------------------------
+// register read enable and write enable decoding logic
+//-----------------------------------------------------------------------
+wire sw_wr_en_0 = sw_wr_en & (sw_addr == 2'h0);
+wire sw_wr_en_1 = sw_wr_en & (sw_addr == 2'h1);
+wire sw_wr_en_2 = sw_wr_en & (sw_addr == 2'h2);
+wire sw_wr_en_3 = sw_wr_en & (sw_addr == 2'h3);
+
+wire sw_rd_en_0 = sw_rd_en & (sw_addr == 2'h0);
+wire sw_rd_en_1 = sw_rd_en & (sw_addr == 2'h1);
+wire sw_rd_en_2 = sw_rd_en & (sw_addr == 2'h2);
+wire sw_rd_en_3 = sw_rd_en & (sw_addr == 2'h3);
+
+
+always @ (posedge mclk or negedge h_reset_n)
+begin : preg_out_Seq
+ if (h_reset_n == 1'b0) begin
+ reg_rdata <= 'h0;
+ reg_ack <= 1'b0;
+ end else if (reg_cs && !reg_ack) begin
+ reg_rdata <= reg_out;
+ reg_ack <= 1'b1;
+ end else begin
+ reg_ack <= 1'b0;
+ end
+end
+
+
+//-----------------------------------------
+// PWM Enable Generation
+//----------------------------------------
+
+assign cfg_pwm_enb = reg_0[5:0];
+
+//------------------------------------------------------------------------
+// Design wise has avoided the pwm_os_done & gpio_tgr occur at same cycle
+//------------------------------------------------------------------------
+always @ (posedge mclk or negedge h_reset_n)
+begin
+ if (h_reset_n == 1'b0) begin
+ reg_0[5:0] <= 'h0;
+ end else if (reg_cs && sw_wr_en_0 && sw_be[0]) begin
+ reg_0[5:0] <= sw_reg_wdata[5:0] | gpio_tgr;
+ end else begin
+ reg_0[5:0] <= (reg_0[5:0] | gpio_tgr) ^ pwm_os_done;
+ end
+end
+
+
+//-----------------------------------------------------------------------
+// Logic for PWM-1 Config
+//-----------------------------------------------------------------------
+assign cfg_pwm_dupdate = reg_1[5:0];
+
+generic_register #(6,6'h0 ) u_reg_1 (
+ .we ({6{sw_wr_en_1 &
+ reg_ack &
+ sw_be[0] }} ),
+ .data_in (sw_reg_wdata[5:0] ),
+ .reset_n (h_reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_1[5:0] )
+ );
+
+assign reg_1[31:6] = 'h0;
+
+//-----------------------------------------------------------------------
+// Reg-2: Interrupt Mask
+//-----------------------------------------------------------------------
+
+generic_register #(6,6'h0 ) u_reg_2 (
+ .we ({6{sw_wr_en_2 &
+ reg_ack &
+ sw_be[0] }} ),
+ .data_in (sw_reg_wdata[5:0] ),
+ .reset_n (h_reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_2[5:0] )
+ );
+
+assign reg_2[31:6] = 'h0;
+//-----------------------------------------------------------------------
+// Reg-3: Interrupt Status
+//-----------------------------------------------------------------------
+
+assign pwm_intr = |(reg_2[5:0] & reg_3[5:0]);
+
+generic_intr_stat_reg #(.WD(6),
+ .RESET_DEFAULT(0)) u_reg4 (
+ //inputs
+ .clk (mclk ),
+ .reset_n (h_reset_n ),
+ .reg_we ({6{sw_wr_en_3 &
+ reg_ack &
+ sw_be[0]}}),
+ .reg_din ( sw_reg_wdata[5:0] ),
+ .hware_req ( pwm_ovflow ),
+
+ //outputs
+ .data_out ( reg_3[5:0] )
+ );
+
+assign reg_3[31:6] = 'h0;
+
+always_comb
+begin
+ reg_out [31:0] = 32'h0;
+
+ case (sw_addr [1:0])
+ 2'b00 : reg_out [31:0] = {26'h0,reg_0 [5:0]};
+ 2'b01 : reg_out [31:0] = reg_1 [31:0];
+ 2'b10 : reg_out [31:0] = reg_2 [31:0];
+ 2'b11 : reg_out [31:0] = reg_3 [31:0];
+ default : reg_out [31:0] = 32'h0;
+ endcase
+end
+
+endmodule
diff --git a/verilog/rtl/pwm/src/pwm_top.sv b/verilog/rtl/pwm/src/pwm_top.sv
new file mode 100644
index 0000000..e097c93
--- /dev/null
+++ b/verilog/rtl/pwm/src/pwm_top.sv
@@ -0,0 +1,295 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// 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 Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// PWM Top ////
+//// ////
+//// This file is part of the riscduino cores project ////
+//// https://github.com/dineshannayya/riscduino.git ////
+//// ////
+//// Description ////
+/// Includes 6 PWM ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 15th Aug 2022, Dinesh A ////
+//// initial version ////
+//// 0.2 - 14th Sept 2022, Dinesh A ////
+//// Improved PWM logic ////
+//////////////////////////////////////////////////////////////////////
+
+module pwm_top (
+ // System Signals
+ // Inputs
+ input logic mclk,
+ input logic h_reset_n,
+
+ // Reg Bus Interface Signal
+ input logic reg_cs,
+ input logic reg_wr,
+ input logic [4:0] reg_addr,
+ input logic [31:0] reg_wdata,
+ input logic [3:0] reg_be,
+
+ // Outputs
+ output logic [31:0] reg_rdata,
+ output logic reg_ack,
+
+ input logic [7:0] pad_gpio,
+ output logic [5:0] pwm_wfm ,
+ output logic pwm_intr
+
+ );
+
+//---------------------------------------------------
+// 6 PWM variabled
+//---------------------------------------------------
+
+logic [5:0] cfg_pwm_enb ;
+logic [5:0] cfg_pwm_dupdate ;
+logic [5:0] pwm_os_done ;
+logic [5:0] pwm_ovflow ;
+logic [5:0] gpio_tgr ;
+logic reg_cs_glbl ;
+logic [5:0] reg_cs_pwm ;
+logic reg_ack_glbl ;
+logic [31:0] reg_rdata_glbl ;
+logic reg_ack_pwm0 ;
+logic [31:0] reg_rdata_pwm0 ;
+logic reg_ack_pwm1 ;
+logic [31:0] reg_rdata_pwm1 ;
+logic reg_ack_pwm2 ;
+logic [31:0] reg_rdata_pwm2 ;
+logic reg_ack_pwm3 ;
+logic [31:0] reg_rdata_pwm3 ;
+logic reg_ack_pwm4 ;
+logic [31:0] reg_rdata_pwm4 ;
+logic reg_ack_pwm5 ;
+logic [31:0] reg_rdata_pwm5 ;
+
+//------------------------------------------------------
+// Register Map Decoding
+
+`define SEL_GLBL 3'b000 // GLOBAL REGISTER
+`define SEL_PWM0 3'b001 // PWM-0
+`define SEL_PWM1 3'b010 // PWM-1
+`define SEL_PWM2 3'b011 // PWM-2
+`define SEL_PWM3 3'b100 // PWM-3
+`define SEL_PWM4 3'b101 // PWM-4
+`define SEL_PWM5 3'b110 // PWM-5
+
+assign reg_rdata = (reg_addr[4:2] == `SEL_GLBL) ? {reg_rdata_glbl} :
+ (reg_addr[4:2] == `SEL_PWM0) ? {reg_rdata_pwm0} :
+ (reg_addr[4:2] == `SEL_PWM1) ? {reg_rdata_pwm1} :
+ (reg_addr[4:2] == `SEL_PWM2) ? {reg_rdata_pwm2} :
+ (reg_addr[4:2] == `SEL_PWM3) ? {reg_rdata_pwm3} :
+ (reg_addr[4:2] == `SEL_PWM4) ? {reg_rdata_pwm4} :
+ (reg_addr[4:2] == `SEL_PWM5) ? {reg_rdata_pwm5} : 'h0;
+
+assign reg_ack = (reg_addr[4:2] == `SEL_GLBL) ? reg_ack_glbl :
+ (reg_addr[4:2] == `SEL_PWM0) ? reg_ack_pwm0 :
+ (reg_addr[4:2] == `SEL_PWM1) ? reg_ack_pwm1 :
+ (reg_addr[4:2] == `SEL_PWM2) ? reg_ack_pwm2 :
+ (reg_addr[4:2] == `SEL_PWM3) ? reg_ack_pwm3 :
+ (reg_addr[4:2] == `SEL_PWM4) ? reg_ack_pwm4 :
+ (reg_addr[4:2] == `SEL_PWM5) ? reg_ack_pwm5 : 'h0;
+
+assign reg_cs_glbl = (reg_addr[4:2] == `SEL_GLBL) ? reg_cs : 1'b0;
+assign reg_cs_pwm[0] = (reg_addr[4:2] == `SEL_PWM0) ? reg_cs : 1'b0;
+assign reg_cs_pwm[1] = (reg_addr[4:2] == `SEL_PWM1) ? reg_cs : 1'b0;
+assign reg_cs_pwm[2] = (reg_addr[4:2] == `SEL_PWM2) ? reg_cs : 1'b0;
+assign reg_cs_pwm[3] = (reg_addr[4:2] == `SEL_PWM3) ? reg_cs : 1'b0;
+assign reg_cs_pwm[4] = (reg_addr[4:2] == `SEL_PWM4) ? reg_cs : 1'b0;
+assign reg_cs_pwm[5] = (reg_addr[4:2] == `SEL_PWM5) ? reg_cs : 1'b0;
+
+pwm_glbl_reg u_glbl_reg (
+ .mclk (mclk ),
+ .h_reset_n (h_reset_n ),
+
+ // Reg Bus Interface Signal
+ .reg_cs (reg_cs_glbl ),
+ .reg_wr (reg_wr ),
+ .reg_addr (reg_addr[1:0] ),
+ .reg_wdata (reg_wdata ),
+ .reg_be (reg_be ),
+
+ // Outputs
+ .reg_rdata (reg_rdata_glbl ),
+ .reg_ack (reg_ack_glbl ),
+
+ .cfg_pwm_enb (cfg_pwm_enb ),
+ .cfg_pwm_dupdate (cfg_pwm_dupdate ),
+
+ .pwm_os_done (pwm_os_done ),
+ .pwm_ovflow (pwm_ovflow ),
+ .gpio_tgr (gpio_tgr ),
+
+ .pwm_intr (pwm_intr )
+
+
+ );
+
+
+// 6 PWM Waveform Generator
+
+pwm_core u_pwm_0(
+
+ .h_reset_n (h_reset_n ),
+ .mclk (mclk ),
+
+ .reg_cs (reg_cs_pwm[0] ),
+ .reg_wr (reg_wr ),
+ .reg_addr (reg_addr[1:0] ),
+ .reg_wdata (reg_wdata ),
+ .reg_be (reg_be ),
+
+ .reg_rdata (reg_rdata_pwm0 ),
+ .reg_ack (reg_ack_pwm0 ),
+
+ .cfg_pwm_enb (cfg_pwm_enb[0] ), // pwm operation enable
+ .cfg_pwm_dupdate (cfg_pwm_dupdate[0] ), // Disable Config update
+ .pad_gpio (pad_gpio ),
+ .pwm_os_done (pwm_os_done[0] ),
+ .pwm_ovflow (pwm_ovflow[0] ),
+ .gpio_tgr (gpio_tgr[0] ),
+ .pwm_wfm_o (pwm_wfm[0] )
+
+);
+
+pwm_core u_pwm_1(
+
+ .h_reset_n (h_reset_n ),
+ .mclk (mclk ),
+
+ .reg_cs (reg_cs_pwm[1] ),
+ .reg_wr (reg_wr ),
+ .reg_addr (reg_addr[1:0] ),
+ .reg_wdata (reg_wdata ),
+ .reg_be (reg_be ),
+
+ .reg_rdata (reg_rdata_pwm1 ),
+ .reg_ack (reg_ack_pwm1 ),
+
+ .cfg_pwm_enb (cfg_pwm_enb[1] ), // pwm operation enable
+ .cfg_pwm_dupdate (cfg_pwm_dupdate[1] ), // Disable Config update
+ .pad_gpio (pad_gpio ),
+ .pwm_os_done (pwm_os_done[1] ),
+ .pwm_ovflow (pwm_ovflow[1] ),
+ .gpio_tgr (gpio_tgr[1] ),
+ .pwm_wfm_o (pwm_wfm[1] )
+
+);
+pwm_core u_pwm_2(
+
+ .h_reset_n (h_reset_n ),
+ .mclk (mclk ),
+
+ .reg_cs (reg_cs_pwm[2] ),
+ .reg_wr (reg_wr ),
+ .reg_addr (reg_addr[1:0] ),
+ .reg_wdata (reg_wdata ),
+ .reg_be (reg_be ),
+
+ .reg_rdata (reg_rdata_pwm2 ),
+ .reg_ack (reg_ack_pwm2 ),
+
+ .cfg_pwm_enb (cfg_pwm_enb[2] ), // pwm operation enable
+ .cfg_pwm_dupdate (cfg_pwm_dupdate[2] ), // Disable Config update
+ .pad_gpio (pad_gpio ),
+ .pwm_os_done (pwm_os_done[2] ),
+ .pwm_ovflow (pwm_ovflow[2] ),
+ .gpio_tgr (gpio_tgr[2] ),
+ .pwm_wfm_o (pwm_wfm[2] )
+
+);
+pwm_core u_pwm_3(
+
+ .h_reset_n (h_reset_n ),
+ .mclk (mclk ),
+
+ .reg_cs (reg_cs_pwm[3] ),
+ .reg_wr (reg_wr ),
+ .reg_addr (reg_addr[1:0] ),
+ .reg_wdata (reg_wdata ),
+ .reg_be (reg_be ),
+
+ .reg_rdata (reg_rdata_pwm3 ),
+ .reg_ack (reg_ack_pwm3 ),
+
+ .cfg_pwm_enb (cfg_pwm_enb[3] ), // pwm operation enable
+ .cfg_pwm_dupdate (cfg_pwm_dupdate[3] ), // Disable Config update
+ .pad_gpio (pad_gpio ),
+ .pwm_os_done (pwm_os_done[3] ),
+ .pwm_ovflow (pwm_ovflow[3] ),
+ .gpio_tgr (gpio_tgr[3] ),
+ .pwm_wfm_o (pwm_wfm[3] )
+
+);
+pwm_core u_pwm_4(
+
+ .h_reset_n (h_reset_n ),
+ .mclk (mclk ),
+
+ .reg_cs (reg_cs_pwm[4] ),
+ .reg_wr (reg_wr ),
+ .reg_addr (reg_addr[1:0] ),
+ .reg_wdata (reg_wdata ),
+ .reg_be (reg_be ),
+
+ .reg_rdata (reg_rdata_pwm4 ),
+ .reg_ack (reg_ack_pwm4 ),
+
+ .cfg_pwm_enb (cfg_pwm_enb[4] ), // pwm operation enable
+ .cfg_pwm_dupdate (cfg_pwm_dupdate[4] ), // Disable Config update
+ .pad_gpio (pad_gpio ),
+ .pwm_os_done (pwm_os_done[4] ),
+ .pwm_ovflow (pwm_ovflow[4] ),
+ .gpio_tgr (gpio_tgr[4] ),
+ .pwm_wfm_o (pwm_wfm[4] )
+
+);
+pwm_core u_pwm_5(
+
+ .h_reset_n (h_reset_n ),
+ .mclk (mclk ),
+
+ .reg_cs (reg_cs_pwm[5] ),
+ .reg_wr (reg_wr ),
+ .reg_addr (reg_addr[1:0] ),
+ .reg_wdata (reg_wdata ),
+ .reg_be (reg_be ),
+
+ .reg_rdata (reg_rdata_pwm5 ),
+ .reg_ack (reg_ack_pwm5 ),
+
+ .cfg_pwm_enb (cfg_pwm_enb[5] ), // pwm operation enable
+ .cfg_pwm_dupdate (cfg_pwm_dupdate[5] ), // Disable Config update
+ .pad_gpio (pad_gpio ),
+ .pwm_os_done (pwm_os_done[5] ),
+ .pwm_ovflow (pwm_ovflow[5] ),
+ .gpio_tgr (gpio_tgr[5] ),
+ .pwm_wfm_o (pwm_wfm[5] )
+
+);
+
+endmodule
diff --git a/verilog/rtl/pinmux/src/timer.sv b/verilog/rtl/timer/src/timer.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/timer.sv
rename to verilog/rtl/timer/src/timer.sv
diff --git a/verilog/rtl/pinmux/src/timer_reg.sv b/verilog/rtl/timer/src/timer_reg.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/timer_reg.sv
rename to verilog/rtl/timer/src/timer_reg.sv
diff --git a/verilog/rtl/pinmux/src/timer_top.sv b/verilog/rtl/timer/src/timer_top.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/timer_top.sv
rename to verilog/rtl/timer/src/timer_top.sv
diff --git a/verilog/rtl/pinmux/src/ws281x_driver.sv b/verilog/rtl/ws281x/src/ws281x_driver.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/ws281x_driver.sv
rename to verilog/rtl/ws281x/src/ws281x_driver.sv
diff --git a/verilog/rtl/pinmux/src/ws281x_reg.sv b/verilog/rtl/ws281x/src/ws281x_reg.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/ws281x_reg.sv
rename to verilog/rtl/ws281x/src/ws281x_reg.sv
diff --git a/verilog/rtl/pinmux/src/ws281x_top.sv b/verilog/rtl/ws281x/src/ws281x_top.sv
similarity index 100%
rename from verilog/rtl/pinmux/src/ws281x_top.sv
rename to verilog/rtl/ws281x/src/ws281x_top.sv