blob: 652305db20fd5402e00576df7db8b65e6fae2763 [file] [log] [blame]
dineshannayya62e46322022-02-15 14:19:56 +05301//////////////////////////////////////////////////////////////////////////////
2// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15// SPDX-License-Identifier: Apache-2.0
16// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
17//
18//////////////////////////////////////////////////////////////////////
19//// ////
dineshannayya9f6a1512022-08-18 14:11:43 +053020//// Pinmux ////
dineshannayya62e46322022-02-15 14:19:56 +053021//// ////
22//// This file is part of the riscduino cores project ////
23//// https://github.com/dineshannayya/riscduino.git ////
24//// ////
25//// Description ////
dineshannayya9f6a1512022-08-18 14:11:43 +053026//// Manages all the pin multiplexing ////
dineshannayya62e46322022-02-15 14:19:56 +053027//// ////
28//// To Do: ////
29//// nothing ////
30//// ////
31//// Author(s): ////
32//// - Dinesh Annayya, dinesha@opencores.org ////
33//// ////
34//// Revision : ////
dineshannayya9f6a1512022-08-18 14:11:43 +053035//// 0.1 - 16th Aug 2022, Dinesh A ////
36//// Seperated the pinmux from pinmux_top module ////
dineshannayya260499b2022-09-03 21:17:46 +053037//// 0.2 - 21th Aug 2022, Dinesh A ////
38//// uart_master disable option added ////
39//// 0.3 - 28th Aug 2022, Dinesh A ////
40//// Due to caravel io[4:0] reserved on power up, we have////
41//// re-arrange the arduino pins from 5 onward ////
dineshannayya62e46322022-02-15 14:19:56 +053042//////////////////////////////////////////////////////////////////////
dineshannayya62e46322022-02-15 14:19:56 +053043/************************************************
dineshannayya260499b2022-09-03 21:17:46 +053044* Pin Mapping Arduino ATMGE CONFIG
45* ATMEGA328 Port caravel Pin Mapping
46* Pin-1 22 PC6/WS[0]/RESET* digital_io[5]
47* Pin-2 0 PD0/WS[0]/RXD[0] digital_io[6]
48* Pin-3 1 PD1/WS[0]/TXD[0] digital_io[7]
49* Pin-4 2 PD2/WS[0]/RXD[1]/INT0 digital_io[8]
50* Pin-5 3 PD3/WS[1]INT1/OC2B(PWM0) digital_io[9]
51* Pin-6 4 PD4/WS[1]TXD[1] digital_io[10]
52* Pin-7 VCC -
53* Pin-8 GND -
54* Pin-9 20 PB6/WS[1]/XTAL1/TOSC1 digital_io[11]
55* Pin-10 21 PB7/WS[1]/XTAL2/TOSC2 digital_io[12]
56* Pin-11 5 PD5/WS[2]/SS[3]/OC0B(PWM1)/T1 strap[0] digital_io[13]
57* Pin-12 6 PD6/WS[2]/SS[2]/OC0A(PWM2)/AIN0 strap[1] digital_io[14]/analog_io[2]
58* Pin-13 7 PD7/WS[2]/A1N1 strap[2] digital_io[15]/analog_io[3]
59* Pin-14 8 PB0/WS[2]/CLKO/ICP1 strap[3] digital_io[16]
60* Pin-15 9 PB1/WS[3]/SS[1]OC1A(PWM3) strap[4] digital_io[17]
61* Pin-16 10 PB2/WS[3]/SS[0]/OC1B(PWM4) strap[5] digital_io[18]
62* Pin-17 11 PB3/WS[3]/MOSI/OC2A(PWM5) strap[6] digital_io[19]
63* Pin-18 12 PB4/WS[3]/MISO strap[7] digital_io[20]
64* Pin-19 13 PB5/SCK digital_io[21]
65* Pin-20 AVCC -
66* Pin-21 AREF analog_io[10]
67* Pin-22 GND -
68* Pin-23 14 PC0/uartm_rxd/ADC0 digital_io[22]/analog_io[11]
69* Pin-24 15 PC1/uartm_txd/ADC1 digital_io[23]/analog_io[12]
70* Pin-25 16 PC2/usb_dp/ADC2 digital_io[24]/analog_io[13]
71* Pin-26 17 PC3/usb_dn/ADC3 digital_io[25]/analog_io[14]
72* Pin-27 18 PC4/ADC4/SDA digital_io[26]/analog_io[15]
73* Pin-28 19 PC5/ADC5/SCL digital_io[27]/analog_io[16]
dineshannayya62e46322022-02-15 14:19:56 +053074*
75* Additional Pad used for Externam ROM/RAM
dineshannayya260499b2022-09-03 21:17:46 +053076* sflash_sck digital_io[28]
77* sflash_ss[0] strap[8] digital_io[29]
78* sflash_ss[1] strap[9] digital_io[30]
79* sflash_ss[2] strap[10] digital_io[31]
80* sflash_ss[3] strap[11] digital_io[32]
81* sflash_io0 strap[12] digital_io[33]
82* sflash_io1 strap[13] digital_io[34]
83* sflash_io2 strap[14] digital_io[35]
84* sflash_io3 strap[15] digital_io[36]
85* dbg_clk_mon digital_io[37]
86* These port are not available at power up
87* PA0 digital_io[0]
88* PA1 digital_io[1]
89* PA2 digital_io[2]
90* PA3 digital_io[3]
91* PA4 digital_io[4]
dineshannayya62e46322022-02-15 14:19:56 +053092****************************************************************
93* Pin-1 RESET is not supported as there is no suppport for fuse config
dineshannayya260499b2022-09-03 21:17:46 +053094
95
dineshannayya62e46322022-02-15 14:19:56 +053096**************/
97
dineshannayya9f6a1512022-08-18 14:11:43 +053098module pinmux (
dineshannayya260499b2022-09-03 21:17:46 +053099 input logic cfg_strap_pad_ctrl , // 1 - Keep the Pad in input direction
100 output logic [15:0] pad_strap_in , // Strap value
dineshannayya9f6a1512022-08-18 14:11:43 +0530101 // Digital IO
102 output logic [37:0] digital_io_out ,
103 output logic [37:0] digital_io_oen ,
104 input logic [37:0] digital_io_in ,
105
dineshannayya260499b2022-09-03 21:17:46 +0530106 output logic xtal_clk ,
107
dineshannayya9f6a1512022-08-18 14:11:43 +0530108 // Config
dineshannayya260499b2022-09-03 21:17:46 +0530109 input logic [31:0] cfg_gpio_out_type ,// GPIO Type, 1 - WS_281X port
dineshannayya9f6a1512022-08-18 14:11:43 +0530110 input logic [31:0] cfg_gpio_dir_sel ,
111 input logic [31:0] cfg_multi_func_sel ,
112
113 output logic[5:0] cfg_pwm_enb ,
114 input logic [5:0] pwm_wfm ,
115 output logic [1:0] ext_intr_in , // External PAD level interrupt
116 output logic [31:0] pad_gpio_in , // GPIO data input from PAD
117 input logic [31:0] pad_gpio_out , // GPIO Data out towards PAD
118
119 // SFLASH I/F
120 input logic sflash_sck ,
121 input logic [3:0] sflash_ss ,
122 input logic [3:0] sflash_oen ,
123 input logic [3:0] sflash_do ,
124 output logic [3:0] sflash_di ,
125
126 // SSRAM I/F - Temp Masked
127 //input logic ssram_sck,
128 //input logic ssram_ss,
129 //input logic [3:0] ssram_oen,
130 //input logic [3:0] ssram_do,
131 //output logic [3:0] ssram_di,
132
133 // USB I/F
134 input logic usb_dp_o,
135 input logic usb_dn_o,
136 input logic usb_oen,
137 output logic usb_dp_i,
138 output logic usb_dn_i,
139
140 // UART I/F
141 input logic [1:0] uart_txd,
142 output logic [1:0] uart_rxd,
143
144 // I2CM I/F
145 input logic i2cm_clk_o,
146 output logic i2cm_clk_i,
147 input logic i2cm_clk_oen,
148 input logic i2cm_data_oen,
149 input logic i2cm_data_o,
150 output logic i2cm_data_i,
151
152 // SPI MASTER
153 input logic spim_sck,
154 input logic [3:0] spim_ssn,
155 input logic spim_miso,
156 output logic spim_mosi,
157
158 // SPI SLAVE
159 output logic spis_sck,
160 output logic spis_ssn,
161 input logic spis_miso,
162 output logic spis_mosi,
163
164 // UART MASTER I/F
165 output logic uartm_rxd ,
166 input logic uartm_txd ,
167
dineshannayya260499b2022-09-03 21:17:46 +0530168 // WS_281X TXD Port
169 input logic [3:0] ws_txd,
170
dineshannayya9f6a1512022-08-18 14:11:43 +0530171 input logic dbg_clk_mon
172
173 );
174
175
176
177reg [7:0] port_a_in; // PORT A Data In
178reg [7:0] port_b_in; // PORT B Data In
179reg [7:0] port_c_in; // PORT C Data In
180reg [7:0] port_d_in; // PORT D Data In
181
182wire [7:0] port_a_out; // PORT A Data Out
183wire [7:0] port_b_out; // PORT B Data Out
184wire [7:0] port_c_out; // PORT C Data Out
185wire [7:0] port_d_out; // PORT D Data Out
186
dineshannayya260499b2022-09-03 21:17:46 +0530187//--------------------------------------------------
188// Strap Pin Mapping
189//--------------------------------------------------
190assign pad_strap_in = {digital_io_in[36:29],digital_io_in[20:13] };
191
192assign xtal_clk = digital_io_in[11];
193
dineshannayya9f6a1512022-08-18 14:11:43 +0530194// GPIO to PORT Mapping
195assign pad_gpio_in[7:0] = port_a_in;
196assign pad_gpio_in[15:8] = port_b_in;
197assign pad_gpio_in[23:16] = port_c_in;
198assign pad_gpio_in[31:24] = port_d_in;
199
200assign port_a_out = pad_gpio_out[7:0];
201assign port_b_out = pad_gpio_out[15:8];
202assign port_c_out = pad_gpio_out[23:16];
203assign port_d_out = pad_gpio_out[31:24];
204
205
dineshannayya62e46322022-02-15 14:19:56 +0530206assign cfg_pwm_enb = cfg_multi_func_sel[5:0];
207wire [1:0] cfg_int_enb = cfg_multi_func_sel[7:6];
dineshannayyafdfbe7b2022-04-07 21:28:10 +0530208wire [1:0] cfg_uart_enb = cfg_multi_func_sel[9:8];
dineshannayya0080c952022-07-08 22:49:12 +0530209wire cfg_spim_enb = cfg_multi_func_sel[10];
210wire [3:0] cfg_spim_cs_enb = cfg_multi_func_sel[14:11];
211wire cfg_i2cm_enb = cfg_multi_func_sel[15];
dineshannayya260499b2022-09-03 21:17:46 +0530212wire cfg_usb_enb = cfg_multi_func_sel[16];
213wire cfg_muart_enb = cfg_multi_func_sel[31]; // 1 - uart master enable,
dineshannayya62e46322022-02-15 14:19:56 +0530214
215wire [7:0] cfg_port_a_dir_sel = cfg_gpio_dir_sel[7:0];
216wire [7:0] cfg_port_b_dir_sel = cfg_gpio_dir_sel[15:8];
217wire [7:0] cfg_port_c_dir_sel = cfg_gpio_dir_sel[23:16];
218wire [7:0] cfg_port_d_dir_sel = cfg_gpio_dir_sel[31:24];
219
dineshannayya260499b2022-09-03 21:17:46 +0530220wire [7:0] cfg_port_a_port_type = cfg_gpio_out_type[7:0];
221wire [7:0] cfg_port_b_port_type = cfg_gpio_out_type[15:8];
222wire [7:0] cfg_port_c_port_type = cfg_gpio_out_type[23:16];
223wire [7:0] cfg_port_d_port_type = cfg_gpio_out_type[31:24];
dineshannayya62e46322022-02-15 14:19:56 +0530224
dineshannayya9ea4b5b2022-07-21 08:15:06 +0530225// This logic to create spi slave interface
226logic pin_resetn,spis_boot;
227
dineshannayya260499b2022-09-03 21:17:46 +0530228// On Reset internal SPI Master is disabled, If cfg_spim_enb = 0, then we are in
dineshannayya9ea4b5b2022-07-21 08:15:06 +0530229// SPIS Boot Mode
230assign spis_boot = (cfg_spim_enb ) ? 1'b0: !pin_resetn;
231assign spis_ssn = (spis_boot ) ? pin_resetn : 1'b1;
232
dineshannayya62e46322022-02-15 14:19:56 +0530233// datain selection
234always_comb begin
235 port_a_in = 'h0;
236 port_b_in = 'h0;
237 port_c_in = 'h0;
238 port_d_in = 'h0;
239 uart_rxd = 'h0;
240 ext_intr_in= 'h0;
241 spim_mosi = 'h0;
242 i2cm_data_i= 'h0;
243 i2cm_clk_i = 'h0;
244
dineshannayya260499b2022-09-03 21:17:46 +0530245 //Pin-1 PC6/RESET* digital_io[5]
246 port_c_in[6] = digital_io_in[5];
247 pin_resetn = digital_io_in[5];
dineshannayya62e46322022-02-15 14:19:56 +0530248
dineshannayya260499b2022-09-03 21:17:46 +0530249 //Pin-2 PD0/RXD[0] digital_io[6]
250 port_d_in[0] = digital_io_in[6];
251 if(cfg_uart_enb[0]) uart_rxd[0] = digital_io_in[6];
dineshannayya62e46322022-02-15 14:19:56 +0530252
dineshannayya260499b2022-09-03 21:17:46 +0530253 //Pin-3 PD1/TXD[0] digital_io[7]
254 port_d_in[1] = digital_io_in[7];
dineshannayya62e46322022-02-15 14:19:56 +0530255
256
dineshannayya260499b2022-09-03 21:17:46 +0530257 //Pin-4 PD2/RXD[1]/INT0 digital_io[8]
258 port_d_in[2] = digital_io_in[8];
259 if(cfg_uart_enb[1]) uart_rxd[1] = digital_io_in[8];
260 else if(cfg_int_enb[0]) ext_intr_in[0] = digital_io_in[8];
dineshannayya62e46322022-02-15 14:19:56 +0530261
dineshannayya260499b2022-09-03 21:17:46 +0530262 //Pin-5 PD3/INT1/OC2B(PWM0) digital_io[9]
263 port_d_in[3] = digital_io_in[9];
264 if(cfg_int_enb[1]) ext_intr_in[1] = digital_io_in[9];
dineshannayya62e46322022-02-15 14:19:56 +0530265
dineshannayya260499b2022-09-03 21:17:46 +0530266 //Pin-6 PD4/TXD[1] digital_io[10]
267 port_d_in[4] = digital_io_in[10];
dineshannayya62e46322022-02-15 14:19:56 +0530268
dineshannayya260499b2022-09-03 21:17:46 +0530269 //Pin-9 PB6/XTAL1/TOSC1 digital_io[11]
270 port_b_in[6] = digital_io_in[11];
dineshannayya62e46322022-02-15 14:19:56 +0530271
dineshannayya260499b2022-09-03 21:17:46 +0530272 // Pin-10 PB7/XTAL2/TOSC2 digital_io[12]
273 port_b_in[7] = digital_io_in[12];
dineshannayya62e46322022-02-15 14:19:56 +0530274
dineshannayya260499b2022-09-03 21:17:46 +0530275 //Pin-11 PD5/OC0B(PWM1)/T1 digital_io[13]
276 port_d_in[5] = digital_io_in[13];
dineshannayya62e46322022-02-15 14:19:56 +0530277
dineshannayya260499b2022-09-03 21:17:46 +0530278 //Pin-12 PD6/OC0A(PWM2)/AIN0 digital_io[14] /analog_io[2]
279 port_d_in[6] = digital_io_in[14];
dineshannayya62e46322022-02-15 14:19:56 +0530280
dineshannayya260499b2022-09-03 21:17:46 +0530281 //Pin-13 PD7/A1N1 digital_io[15]/analog_io[3]
282 port_d_in[7] = digital_io_in[15];
dineshannayya62e46322022-02-15 14:19:56 +0530283
dineshannayya260499b2022-09-03 21:17:46 +0530284 //Pin-14 PB0/CLKO/ICP1 digital_io[16]
285 port_b_in[0] = digital_io_in[16];
dineshannayya62e46322022-02-15 14:19:56 +0530286
dineshannayya260499b2022-09-03 21:17:46 +0530287 //Pin-15 PB1/OC1A(PWM3) digital_io[17]
288 port_b_in[1] = digital_io_in[17];
dineshannayya62e46322022-02-15 14:19:56 +0530289
dineshannayya260499b2022-09-03 21:17:46 +0530290 //Pin-16 PB2/SS/OC1B(PWM4) digital_io[18]
291 port_b_in[2] = digital_io_in[18];
dineshannayya62e46322022-02-15 14:19:56 +0530292
dineshannayya260499b2022-09-03 21:17:46 +0530293 //Pin-17 PB3/MOSI/OC2A(PWM5) digital_io[19]
294 port_b_in[3] = digital_io_in[19];
295 if(cfg_spim_enb) spim_mosi = digital_io_in[19]; // SPIM MOSI (Input) = SPIS MISO (Output)
dineshannayya62e46322022-02-15 14:19:56 +0530296
dineshannayya260499b2022-09-03 21:17:46 +0530297 //Pin-18 PB4/MISO digital_io[20]
298 port_b_in[4] = digital_io_in[20];
299 spis_mosi = (spis_boot) ? digital_io_in[20] : 1'b0; // SPIM MISO (Output) = SPIS MOSI (Input)
dineshannayya62e46322022-02-15 14:19:56 +0530300
dineshannayya260499b2022-09-03 21:17:46 +0530301 //Pin-19 PB5/SCK digital_io[21]
302 port_b_in[5]= digital_io_in[21];
303 spis_sck = (spis_boot) ? digital_io_in[21] : 1'b1; // SPIM SCK (Output) = SPIS SCK (Input)
dineshannayya62e46322022-02-15 14:19:56 +0530304
dineshannayya260499b2022-09-03 21:17:46 +0530305 //Pin-23 PC0/ADC0 digital_io[22]/uartm_rxd/analog_io[11]
306 uartm_rxd = (cfg_muart_enb) ? digital_io_in[22]: 1'b1;
307 port_c_in[0] = digital_io_in[22];
dineshannayya62e46322022-02-15 14:19:56 +0530308
dineshannayya260499b2022-09-03 21:17:46 +0530309 //Pin-24 PC1/ADC1 digital_io[23]/uartm_txd/analog_io[12]
310 port_c_in[1] = digital_io_in[23];
dineshannayya62e46322022-02-15 14:19:56 +0530311
dineshannayya260499b2022-09-03 21:17:46 +0530312 //Pin-25 PC2/ADC2 digital_io[24]/usb_dp/analog_io[13]
313 usb_dp_i = (cfg_usb_enb) ? digital_io_in[24] : 1'b1;
314 port_c_in[2] = digital_io_in[24];
dineshannayya62e46322022-02-15 14:19:56 +0530315
dineshannayya260499b2022-09-03 21:17:46 +0530316 //Pin-26 PC3/ADC3 digital_io[25]/usb_dn/analog_io[14]
317 usb_dn_i = (cfg_usb_enb) ? digital_io_in[25] : 1'b1;
318 port_c_in[3] = digital_io_in[25];
dineshannayya62e46322022-02-15 14:19:56 +0530319
dineshannayya260499b2022-09-03 21:17:46 +0530320 //Pin-27 PC4/ADC4/SDA digital_io[26]/analog_io[15]
321 port_c_in[4] = digital_io_in[26];
322 if(cfg_i2cm_enb) i2cm_data_i = digital_io_in[26];
dineshannayya62e46322022-02-15 14:19:56 +0530323
dineshannayya260499b2022-09-03 21:17:46 +0530324 //Pin-28 PC5/ADC5/SCL digital_io[27]/analog_io[16]
325 port_c_in[5] = digital_io_in[27];
326 if(cfg_i2cm_enb) i2cm_clk_i = digital_io_in[27];
dineshannayya62e46322022-02-15 14:19:56 +0530327
dineshannayya260499b2022-09-03 21:17:46 +0530328 sflash_di[0] = digital_io_in[33];
329 sflash_di[1] = digital_io_in[34];
330 sflash_di[2] = digital_io_in[35];
331 sflash_di[3] = digital_io_in[36];
332
333 port_a_in[0] = digital_io_in[0];
334 port_a_in[1] = digital_io_in[1];
335 port_a_in[2] = digital_io_in[2];
336 port_a_in[3] = digital_io_in[3];
337 port_a_in[4] = digital_io_in[4];
dineshannayya62e46322022-02-15 14:19:56 +0530338
dineshannayya62e46322022-02-15 14:19:56 +0530339end
340
341// dataout selection
342always_comb begin
343 digital_io_out = 'h0;
dineshannayya260499b2022-09-03 21:17:46 +0530344 //Pin-1 PC6/WS[0]/RESET* digital_io[5]
345 if(cfg_port_c_port_type[6]) digital_io_out[5] = ws_txd[0];
346 else if(cfg_port_c_dir_sel[6]) digital_io_out[5] = port_c_out[6];
dineshannayya62e46322022-02-15 14:19:56 +0530347
dineshannayya260499b2022-09-03 21:17:46 +0530348 //Pin-2 PD0/WS[0]/RXD[0] digital_io[6]
349 if(cfg_port_d_port_type[0]) digital_io_out[6] = ws_txd[0];
350 else if(cfg_port_d_dir_sel[0]) digital_io_out[6] = port_d_out[0];
dineshannayya62e46322022-02-15 14:19:56 +0530351
dineshannayya260499b2022-09-03 21:17:46 +0530352 //Pin-3 PD1/WS[0]/TXD[0] digital_io[7]
353 if (cfg_uart_enb[0]) digital_io_out[7] = uart_txd[0];
354 else if(cfg_port_d_port_type[1]) digital_io_out[7] = ws_txd[0];
355 else if(cfg_port_d_dir_sel[1]) digital_io_out[7] = port_d_out[1];
dineshannayya62e46322022-02-15 14:19:56 +0530356
357
dineshannayya260499b2022-09-03 21:17:46 +0530358 //Pin-4 PD2/WS[0]/RXD[1]/INT0 digital_io[8]
359 if(cfg_port_d_port_type[2]) digital_io_out[8] = ws_txd[0];
360 else if(cfg_port_d_dir_sel[2]) digital_io_out[8] = port_d_out[2];
dineshannayya62e46322022-02-15 14:19:56 +0530361
dineshannayya260499b2022-09-03 21:17:46 +0530362 //Pin-5 PD3/WS[1]INT1/OC2B(PWM0) digital_io[9]
363 if(cfg_pwm_enb[0]) digital_io_out[9] = pwm_wfm[0];
364 else if(cfg_port_d_port_type[3])digital_io_out[9] = ws_txd[1];
365 else if(cfg_port_d_dir_sel[3]) digital_io_out[9] = port_d_out[3];
dineshannayya62e46322022-02-15 14:19:56 +0530366
dineshannayya260499b2022-09-03 21:17:46 +0530367 //Pin-6 PD4/WS[1]/TXD[1] digital_io[10]
368 if (cfg_uart_enb[1]) digital_io_out[10] = uart_txd[1];
369 else if(cfg_port_d_port_type[4]) digital_io_out[10] = ws_txd[1];
370 else if(cfg_port_d_dir_sel[4]) digital_io_out[10] = port_d_out[4];
dineshannayya62e46322022-02-15 14:19:56 +0530371
dineshannayya260499b2022-09-03 21:17:46 +0530372 //Pin-9 PB6/XTAL1/WS[1]/TOSC1 digital_io[11]
373 if(cfg_port_b_port_type[6]) digital_io_out[11] = ws_txd[1];
374 else if(cfg_port_b_dir_sel[6]) digital_io_out[11] = port_b_out[6];
dineshannayya62e46322022-02-15 14:19:56 +0530375
376
dineshannayya260499b2022-09-03 21:17:46 +0530377 // Pin-10 PB7/XTAL2/WS[1]/TOSC2 digital_io[12]
378 if(cfg_port_b_port_type[7]) digital_io_out[12] = ws_txd[1];
379 else if(cfg_port_b_dir_sel[7]) digital_io_out[12] = port_b_out[7];
dineshannayya62e46322022-02-15 14:19:56 +0530380
dineshannayya260499b2022-09-03 21:17:46 +0530381 //Pin-11 PD5/SS[3]/WS[2]/OC0B(PWM1)/T1 digital_io[13]
382 if(cfg_pwm_enb[1]) digital_io_out[13] = pwm_wfm[1];
383 else if(cfg_spim_cs_enb[3]) digital_io_out[13] = spim_ssn[3];
384 else if(cfg_port_d_port_type[5])digital_io_out[13] = ws_txd[2];
385 else if(cfg_port_d_dir_sel[5]) digital_io_out[13] = port_d_out[5];
dineshannayya62e46322022-02-15 14:19:56 +0530386
dineshannayya260499b2022-09-03 21:17:46 +0530387 //Pin-12 PD6/SS[2]/WS[2]/OC0A(PWM2)/AIN0 digital_io[14] /analog_io[2]
388 if(cfg_pwm_enb[2]) digital_io_out[14] = pwm_wfm[2];
389 else if(cfg_spim_cs_enb[2]) digital_io_out[14] = spim_ssn[2];
390 else if(cfg_port_d_port_type[6])digital_io_out[14] = ws_txd[2];
391 else if(cfg_port_d_dir_sel[6]) digital_io_out[14] = port_d_out[6];
dineshannayya62e46322022-02-15 14:19:56 +0530392
393
dineshannayya260499b2022-09-03 21:17:46 +0530394 //Pin-13 PD7/A1N1/WS[2] digital_io[15]/analog_io[3]
395 if(cfg_port_d_port_type[7]) digital_io_out[15] = ws_txd[2];
396 else if(cfg_port_d_dir_sel[7]) digital_io_out[15] = port_d_out[7];
dineshannayya62e46322022-02-15 14:19:56 +0530397
dineshannayya260499b2022-09-03 21:17:46 +0530398 //Pin-14 PB0/CLKO/WS[2]/ICP1 digital_io[16]
399 if(cfg_port_b_port_type[0]) digital_io_out[16] = ws_txd[2];
400 else if(cfg_port_b_dir_sel[0]) digital_io_out[16] = port_b_out[0];
dineshannayya62e46322022-02-15 14:19:56 +0530401
dineshannayya260499b2022-09-03 21:17:46 +0530402 //Pin-15 PB1/SS[1]/WS[3]/OC1A(PWM3) digital_io[17]
403 if(cfg_pwm_enb[3]) digital_io_out[17] = pwm_wfm[3];
404 else if(cfg_spim_cs_enb[1]) digital_io_out[17] = spim_ssn[1];
405 else if(cfg_port_b_port_type[1])digital_io_out[17] = ws_txd[3];
406 else if(cfg_port_b_dir_sel[1]) digital_io_out[17] = port_b_out[1];
dineshannayya62e46322022-02-15 14:19:56 +0530407
dineshannayya260499b2022-09-03 21:17:46 +0530408 //Pin-16 PB2/SS[0]/WS[3]/OC1B(PWM4) digital_io[18]
409 if(cfg_pwm_enb[4]) digital_io_out[18] = pwm_wfm[4];
410 else if(cfg_spim_cs_enb[0]) digital_io_out[18] = spim_ssn[0];
411 else if(cfg_port_b_port_type[2])digital_io_out[18] = ws_txd[3];
412 else if(cfg_port_b_dir_sel[2]) digital_io_out[18] = port_b_out[2];
dineshannayya62e46322022-02-15 14:19:56 +0530413
dineshannayya260499b2022-09-03 21:17:46 +0530414 //Pin-17 PB3/MOSI/WS[3]/OC2A(PWM5) digital_io[19]
415 if(cfg_pwm_enb[5]) digital_io_out[19] = pwm_wfm[5];
416 else if(cfg_port_b_port_type[3]) digital_io_out[19] = ws_txd[3];
417 else if(cfg_port_b_dir_sel[3]) digital_io_out[19] = port_b_out[3];
418 else if(spis_boot) digital_io_out[19] = spis_miso; // SPIM MOSI (Input) = SPIS MISO (Output)
dineshannayya62e46322022-02-15 14:19:56 +0530419
dineshannayya260499b2022-09-03 21:17:46 +0530420 //Pin-18 PB4/WS[3]/MISO digital_io[20]
421 if(cfg_spim_enb) digital_io_out[20] = spim_miso; // SPIM MISO (Output) = SPIS MOSI (Input)
422 else if(cfg_port_b_port_type[4])digital_io_out[20] = ws_txd[3];
423 else if(cfg_port_b_dir_sel[4]) digital_io_out[20] = port_b_out[4];
dineshannayya62e46322022-02-15 14:19:56 +0530424
dineshannayya260499b2022-09-03 21:17:46 +0530425 //Pin-19 PB5/SCK digital_io[21]
426 if(cfg_spim_enb) digital_io_out[21] = spim_sck; // SPIM SCK (Output) = SPIS SCK (Input)
427 else if(cfg_port_b_dir_sel[5]) digital_io_out[21] = port_b_out[5];
dineshannayya62e46322022-02-15 14:19:56 +0530428
dineshannayya260499b2022-09-03 21:17:46 +0530429 //Pin-23 PC0/MRXD/ADC0 digital_io[22]/analog_io[11]
430 if(cfg_muart_enb) digital_io_out[22] = 1'b1;
431 else if(cfg_port_c_dir_sel[0]) digital_io_out[22] = port_c_out[0];
dineshannayya62e46322022-02-15 14:19:56 +0530432
dineshannayya260499b2022-09-03 21:17:46 +0530433 //Pin-24 PC1/MTXD/ADC1 digital_io[23]/analog_io[12]
434 if(cfg_muart_enb) digital_io_out[23] = uartm_txd;
435 else if(cfg_port_c_dir_sel[1]) digital_io_out[23] = port_c_out[1];
dineshannayya62e46322022-02-15 14:19:56 +0530436
dineshannayya260499b2022-09-03 21:17:46 +0530437 //Pin-25 PC2/USB_DP/ADC2 digital_io[24]/analog_io[13]
438 if(cfg_usb_enb) digital_io_out[24] = usb_dp_o;
439 else if(cfg_port_c_dir_sel[2]) digital_io_out[24] = port_c_out[2];
dineshannayya62e46322022-02-15 14:19:56 +0530440
dineshannayya260499b2022-09-03 21:17:46 +0530441 //Pin-26 PC3/USB_DN/ADC3 digital_io[25]/analog_io[14]
442 if(cfg_usb_enb) digital_io_out[25] = usb_dn_o;
443 if(cfg_port_c_dir_sel[3]) digital_io_out[25] = port_c_out[3];
dineshannayya62e46322022-02-15 14:19:56 +0530444
dineshannayya260499b2022-09-03 21:17:46 +0530445 //Pin-27 PC4/ADC4/SDA digital_io[26]/analog_io[15]
446 if(cfg_i2cm_enb) digital_io_out[26] = i2cm_data_o;
447 else if(cfg_port_c_dir_sel[4]) digital_io_out[26] = port_c_out[4];
dineshannayya62e46322022-02-15 14:19:56 +0530448
dineshannayya260499b2022-09-03 21:17:46 +0530449 //Pin-28 PC5/ADC5/SCL digital_io[27]/analog_io[16]
450 if(cfg_i2cm_enb) digital_io_out[27] = i2cm_clk_o;
451 else if(cfg_port_c_dir_sel[5]) digital_io_out[27] = port_c_out[5];
dineshannayya62e46322022-02-15 14:19:56 +0530452
453 // Serial Flash
dineshannayya260499b2022-09-03 21:17:46 +0530454 digital_io_out[28] = sflash_sck ;
455 digital_io_out[29] = sflash_ss[0] ;
456 digital_io_out[30] = sflash_ss[1] ;
457 digital_io_out[31] = sflash_ss[2] ;
458 digital_io_out[32] = sflash_ss[3] ;
459 digital_io_out[33] = sflash_do[0] ;
460 digital_io_out[34] = sflash_do[1] ;
461 digital_io_out[35] = sflash_do[2] ;
462 digital_io_out[36] = sflash_do[3] ;
dineshannayya62e46322022-02-15 14:19:56 +0530463
dineshannayya9be29722022-05-29 19:09:57 +0530464 // dbg_clk_mon - Pll clock output monitor
dineshannayya260499b2022-09-03 21:17:46 +0530465 digital_io_out[37] = dbg_clk_mon;
dineshannayya62e46322022-02-15 14:19:56 +0530466
dineshannayya260499b2022-09-03 21:17:46 +0530467 digital_io_out[0] = port_a_out[0] ;
468 digital_io_out[1] = port_a_out[1] ;
469 digital_io_out[2] = port_a_out[2] ;
470 digital_io_out[3] = port_a_out[3] ;
471 digital_io_out[4] = port_a_out[4] ;
dineshannayya62e46322022-02-15 14:19:56 +0530472end
473
474// dataoen selection
475always_comb begin
476 digital_io_oen = 38'h3F_FFFF_FFFF;
dineshannayya62e46322022-02-15 14:19:56 +0530477
dineshannayya260499b2022-09-03 21:17:46 +0530478 //Pin-1 PC6/WS[0]/RESET* digital_io[5]
479 if(cfg_port_c_port_type[6]) digital_io_oen[5] = 1'b1;
480 else if(cfg_port_c_dir_sel[6]) digital_io_oen[5] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530481
dineshannayya260499b2022-09-03 21:17:46 +0530482 //Pin-2 PD0/WS[0]/RXD[0] digital_io[6]
483 if (cfg_uart_enb[0]) digital_io_oen[6] = 1'b1;
484 else if(cfg_port_d_port_type[0])digital_io_oen[6] = 1'b1;
485 else if(cfg_port_d_dir_sel[0]) digital_io_oen[6] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530486
dineshannayya260499b2022-09-03 21:17:46 +0530487 //Pin-3 PD1/WS[0]/TXD[0] digital_io[7]
488 if (cfg_uart_enb[0]) digital_io_oen[7] = 1'b0;
489 else if(cfg_port_d_port_type[1])digital_io_oen[7] = 1'b1;
490 else if(cfg_port_d_dir_sel[1]) digital_io_oen[7] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530491
dineshannayya260499b2022-09-03 21:17:46 +0530492 //Pin-4 PD2/WS[0]/RXD[1]/INT0 digital_io[8]
493 if(cfg_int_enb[0]) digital_io_oen[8] = 1'b1;
494 else if(cfg_port_d_port_type[2])digital_io_oen[8] = 1'b1;
495 else if(cfg_port_d_dir_sel[2]) digital_io_oen[8] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530496
dineshannayya260499b2022-09-03 21:17:46 +0530497 //Pin-5 PD3/WS[1]/INT1/OC2B(PWM0) digital_io[9]
498 if(cfg_pwm_enb[0]) digital_io_oen[9] = 1'b0;
499 else if(cfg_int_enb[1]) digital_io_oen[9] = 1'b1;
500 else if(cfg_port_d_port_type[3])digital_io_oen[9] = 1'b1;
501 else if(cfg_port_d_dir_sel[3]) digital_io_oen[9] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530502
dineshannayya260499b2022-09-03 21:17:46 +0530503 //Pin-6 PD4/WS[1]/TXD[1] digital_io[10]
504 if (cfg_uart_enb[1]) digital_io_oen[10] = 1'b0;
505 else if(cfg_port_d_port_type[4])digital_io_oen[10] = 1'b1;
506 else if(cfg_port_d_dir_sel[4]) digital_io_oen[10] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530507
dineshannayya260499b2022-09-03 21:17:46 +0530508 //Pin-9 PB6/WS[1]/XTAL1/TOSC1 digital_io[11]
509 if (cfg_uart_enb[1]) digital_io_oen[11] = 1'b1;
510 else if(cfg_port_b_port_type[6]) digital_io_oen[11] = 1'b1;
511 else if(cfg_port_b_dir_sel[6]) digital_io_oen[11] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530512
dineshannayya260499b2022-09-03 21:17:46 +0530513 // Pin-10 PB7/WS[1]/XTAL2/TOSC2 digital_io[12]
514 if(cfg_port_b_port_type[7]) digital_io_oen[12] = 1'b1;
515 else if(cfg_port_b_dir_sel[7]) digital_io_oen[12] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530516
dineshannayya260499b2022-09-03 21:17:46 +0530517 //Pin-11 PD5/WS[2]/SS[3]/OC0B(PWM1)/T1 digital_io[13]
518 if(cfg_strap_pad_ctrl) digital_io_oen[13] = 1'b1;
519 else if(cfg_pwm_enb[1]) digital_io_oen[13] = 1'b0;
520 else if(cfg_spim_cs_enb[3]) digital_io_oen[13] = 1'b0;
521 else if(cfg_port_d_port_type[5])digital_io_oen[13] = 1'b1;
522 else if(cfg_port_d_dir_sel[5]) digital_io_oen[13] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530523
dineshannayya260499b2022-09-03 21:17:46 +0530524 //Pin-12 PD6/SS[2]/OC0A(PWM2)/AIN0 digital_io[14] /analog_io[2]
525 if(cfg_strap_pad_ctrl) digital_io_oen[14] = 1'b1;
526 else if(cfg_pwm_enb[2]) digital_io_oen[14] = 1'b0;
527 else if(cfg_spim_cs_enb[2]) digital_io_oen[14] = 1'b0;
528 else if(cfg_port_d_port_type[6])digital_io_oen[14] = 1'b1;
529 else if(cfg_port_d_dir_sel[6]) digital_io_oen[14] = 1'b0;
530
531 //Pin-13 PD7/WS[2]/A1N1 digital_io[15]/analog_io[3]
532 if(cfg_strap_pad_ctrl) digital_io_oen[15] = 1'b1;
533 else if(cfg_port_d_port_type[7])digital_io_oen[15] = 1'b1;
534 else if(cfg_port_d_dir_sel[7]) digital_io_oen[15] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530535
dineshannayya260499b2022-09-03 21:17:46 +0530536 //Pin-14 PB0/WS[2]/CLKO/ICP1 digital_io[16]
537 if(cfg_strap_pad_ctrl) digital_io_oen[16] = 1'b1;
538 else if(cfg_port_b_port_type[0])digital_io_oen[16] = 1'b1;
539 else if(cfg_port_b_dir_sel[0]) digital_io_oen[16] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530540
dineshannayya260499b2022-09-03 21:17:46 +0530541 //Pin-15 PB1/WS[3]/SS[1]/OC1A(PWM3) digital_io[17]
542 if(cfg_strap_pad_ctrl) digital_io_oen[17] = 1'b1;
543 else if(cfg_pwm_enb[3]) digital_io_oen[17] = 1'b0;
544 else if(cfg_spim_cs_enb[1]) digital_io_oen[17] = 1'b0;
545 else if(cfg_port_b_port_type[1])digital_io_oen[17] = 1'b1;
546 else if(cfg_port_b_dir_sel[1]) digital_io_oen[17] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530547
dineshannayya260499b2022-09-03 21:17:46 +0530548 //Pin-16 PB2/WS[3]/SS[0]/OC1B(PWM4) digital_io[18]
549 if(cfg_strap_pad_ctrl) digital_io_oen[18] = 1'b1;
550 else if(cfg_pwm_enb[4]) digital_io_oen[18] = 1'b0;
551 else if(cfg_spim_cs_enb[0]) digital_io_oen[18] = 1'b0;
552 else if(cfg_port_b_port_type[2])digital_io_oen[18] = 1'b1;
553 else if(cfg_port_b_dir_sel[2]) digital_io_oen[18] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530554
dineshannayya260499b2022-09-03 21:17:46 +0530555 //Pin-17 PB3/WS[3]/MOSI/OC2A(PWM5) digital_io[19]
556 if(cfg_strap_pad_ctrl) digital_io_oen[19] = 1'b1;
557 else if(cfg_spim_enb) digital_io_oen[19] = 1'b1; // SPIM MOSI (Input)
558 else if(cfg_pwm_enb[5]) digital_io_oen[19] = 1'b0;
559 else if(cfg_port_b_port_type[3])digital_io_oen[19] = 1'b1;
560 else if(cfg_port_b_dir_sel[3]) digital_io_oen[19] = 1'b0;
561 else if(spis_boot) digital_io_oen[19] = 1'b0; // SPIS MISO (Output)
dineshannayya62e46322022-02-15 14:19:56 +0530562
dineshannayya260499b2022-09-03 21:17:46 +0530563 //Pin-18 PB4/WS[3]/MISO digital_io[20]
564 if(cfg_strap_pad_ctrl) digital_io_oen[20] = 1'b1;
565 else if(cfg_spim_enb) digital_io_oen[20] = 1'b0; // SPIM MISO (Output)
566 else if(cfg_port_b_port_type[4])digital_io_oen[20] = 1'b1;
567 else if(cfg_port_b_dir_sel[4]) digital_io_oen[20] = 1'b0;
568 else if(spis_boot) digital_io_oen[20] = 1'b1; // SPIS MOSI (Input)
dineshannayya62e46322022-02-15 14:19:56 +0530569
dineshannayya260499b2022-09-03 21:17:46 +0530570 //Pin-19 PB5/SCK digital_io[21]
571 if(cfg_spim_enb) digital_io_oen[21] = 1'b0; // SPIM SCK (Output)
572 else if(cfg_port_b_dir_sel[5]) digital_io_oen[21] = 1'b0;
573 else if(spis_boot) digital_io_oen[21] = 1'b1; // SPIS SCK (Input)
dineshannayya62e46322022-02-15 14:19:56 +0530574
dineshannayya260499b2022-09-03 21:17:46 +0530575 //Pin-23 PC0/MRXD/ADC0 digital_io[22]/analog_io[11]
576 if(cfg_muart_enb) digital_io_oen[22] = 1'b1;
577 else if(cfg_port_c_dir_sel[0]) digital_io_oen[22] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530578
dineshannayya260499b2022-09-03 21:17:46 +0530579 //Pin-24 PC1/MTXD/ADC1 digital_io[23]/analog_io[12]
580 if(cfg_muart_enb) digital_io_oen[23] = 1'b0;
581 if(cfg_port_c_dir_sel[1]) digital_io_oen[23] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530582
dineshannayya260499b2022-09-03 21:17:46 +0530583 //Pin-25 PC2/USB_DP/ADC2 digital_io[24]/analog_io[13]
584 if(cfg_usb_enb) digital_io_oen[24] = usb_oen;
585 else if(cfg_port_c_dir_sel[2]) digital_io_oen[24] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530586
dineshannayya260499b2022-09-03 21:17:46 +0530587 //Pin-26 PC3/USB_DN/ADC3 digital_io[25]/analog_io[14]
588 if(cfg_usb_enb) digital_io_oen[25] = usb_oen;
589 else if(cfg_port_c_dir_sel[3]) digital_io_oen[25] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530590
dineshannayya260499b2022-09-03 21:17:46 +0530591 //Pin-27 PC4/ADC4/SDA digital_io[26]/analog_io[15]
592 if(cfg_i2cm_enb) digital_io_oen[26] = i2cm_data_oen;
593 else if(cfg_port_c_dir_sel[4]) digital_io_oen[26] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530594
dineshannayya260499b2022-09-03 21:17:46 +0530595 //Pin-28 PC5/ADC5/SCL digital_io[27]/analog_io[16]
596 if(cfg_i2cm_enb) digital_io_oen[27] = i2cm_clk_oen;
597 else if(cfg_port_c_dir_sel[5]) digital_io_oen[27] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530598
599 // Serial Flash
dineshannayya260499b2022-09-03 21:17:46 +0530600 if(cfg_strap_pad_ctrl) digital_io_oen[28] = 1'b1;
601 else digital_io_oen[28] = 1'b0;
602 if(cfg_strap_pad_ctrl) digital_io_oen[29] = 1'b1;
603 else digital_io_oen[29] = 1'b0;
604 if(cfg_strap_pad_ctrl) digital_io_oen[30] = 1'b1;
605 else digital_io_oen[30] = 1'b0;
606 if(cfg_strap_pad_ctrl) digital_io_oen[31] = 1'b1;
607 else digital_io_oen[31] = 1'b0;
608 if(cfg_strap_pad_ctrl) digital_io_oen[32] = 1'b1;
609 else digital_io_oen[32] = 1'b0;
610 if(cfg_strap_pad_ctrl) digital_io_oen[33] = 1'b1;
611 else digital_io_oen[33] = sflash_oen[0];
612 if(cfg_strap_pad_ctrl) digital_io_oen[34] = 1'b1;
613 else digital_io_oen[34] = sflash_oen[1];
614 if(cfg_strap_pad_ctrl) digital_io_oen[35] = 1'b1;
615 else digital_io_oen[35] = sflash_oen[2];
616 if(cfg_strap_pad_ctrl) digital_io_oen[36] = 1'b1;
617 else digital_io_oen[36] = sflash_oen[3];
dineshannayya62e46322022-02-15 14:19:56 +0530618
dineshannayya9be29722022-05-29 19:09:57 +0530619 // dbg_clk_mon
dineshannayya260499b2022-09-03 21:17:46 +0530620 if(cfg_strap_pad_ctrl) digital_io_oen[37] = 1'b1;
621 else digital_io_oen[37] = 1'b0 ;
dineshannayya62e46322022-02-15 14:19:56 +0530622
dineshannayya260499b2022-09-03 21:17:46 +0530623 if(cfg_port_a_dir_sel[0]) digital_io_oen[0] = 1'b0;
624 if(cfg_port_a_dir_sel[1]) digital_io_oen[1] = 1'b0;
625 if(cfg_port_a_dir_sel[2]) digital_io_oen[2] = 1'b0;
626 if(cfg_port_a_dir_sel[3]) digital_io_oen[3] = 1'b0;
627 if(cfg_port_a_dir_sel[4]) digital_io_oen[4] = 1'b0;
dineshannayya62e46322022-02-15 14:19:56 +0530628end
629
630
631endmodule
632
633