blob: b0ad6533a332e86ad0b0f5ffd28e62a3515633f4 [file] [log] [blame]
//////////////////////////////////////////////////////////////////////////////
// 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>
//
//////////////////////////////////////////////////////////////////////
//// ////
//// Digital To Analog Register ////
//// ////
//// This file is part of the riscduino cores project ////
//// https://github.com/dineshannayya/riscduino.git ////
//// ////
//// Description ////
//// Manages all the analog related config ////
//// ////
//// To Do: ////
//// nothing ////
//// ////
//// Author(s): ////
//// - Dinesh Annayya, dinesha@opencores.org ////
//// ////
//// Revision : ////
//// 0.1 - 29rd Sept 2022, Dinesh A ////
//// initial version ////
//////////////////////////////////////////////////////////////////////
module dig2ana_reg #(
parameter DW = 32, // DATA WIDTH
parameter AW = 4, // ADDRESS WIDTH
parameter BW = 4 // BYTE WIDTH
) (
// 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 [AW-1:0] reg_addr ,
input logic [DW-1:0] reg_wdata ,
input logic [BW-1:0] reg_be ,
// Outputs
output logic [DW-1:0] reg_rdata ,
output logic reg_ack ,
output logic [7:0] cfg_dac0_mux_sel ,
output logic [7:0] cfg_dac1_mux_sel ,
output logic [7:0] cfg_dac2_mux_sel ,
output logic [7:0] cfg_dac3_mux_sel
);
//-----------------------------------------------------------------------
// Internal Wire Declarations
//-----------------------------------------------------------------------
logic sw_rd_en ;
logic sw_wr_en ;
logic [AW-1:0] sw_addr ;
logic [DW-1:0] sw_reg_wdata ;
logic [BW-1:0] sw_be ;
logic [DW-1:0] reg_out ;
logic [DW-1:0] reg_0 ;
logic [DW-1:0] reg_1 ;
logic [DW-1:0] reg_2 ;
logic [DW-1:0] reg_3 ;
assign sw_addr = reg_addr;
assign sw_be = reg_be;
assign sw_rd_en = reg_cs & !reg_wr;
assign sw_wr_en = reg_cs & reg_wr;
assign sw_reg_wdata = reg_wdata;
//-----------------------------------------------------------------------
// register read enable and write enable decoding logic
//-----------------------------------------------------------------------
wire sw_wr_en_0 = sw_wr_en & (sw_addr == 4'h0);
wire sw_wr_en_1 = sw_wr_en & (sw_addr == 4'h1);
wire sw_wr_en_2 = sw_wr_en & (sw_addr == 4'h2);
wire sw_wr_en_3 = sw_wr_en & (sw_addr == 4'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[DW-1:0] ;
reg_ack <= 1'b1;
end else begin
reg_ack <= 1'b0;
end
end
//-----------------------------------------------------------------------
// reg-0
//-----------------------------------------------------------------
assign cfg_dac0_mux_sel = reg_0[7:0];
generic_register #(8,8'h0 ) u_reg0_be0 (
.we ({8{sw_wr_en_0 &
sw_be[0] }} ),
.data_in (sw_reg_wdata[7:0] ),
.reset_n (h_reset_n ),
.clk (mclk ),
//List of Outs
.data_out (reg_0[7:0] )
);
assign reg_0[31:8] = 'h0;
//-----------------------------------------------------------------------
// reg-1
//-----------------------------------------------------------------
assign cfg_dac1_mux_sel = reg_1[7:0];
generic_register #(8,8'h0 ) u_reg1_be0 (
.we ({8{sw_wr_en_1 &
sw_be[0] }} ),
.data_in (sw_reg_wdata[7:0] ),
.reset_n (h_reset_n ),
.clk (mclk ),
//List of Outs
.data_out (reg_1[7:0] )
);
assign reg_1[31:8] = 'h0;
//-----------------------------------------------------------------------
// reg-2
//-----------------------------------------------------------------
assign cfg_dac2_mux_sel = reg_2[7:0];
generic_register #(8,8'h0 ) u_reg2_be0 (
.we ({8{sw_wr_en_2 &
sw_be[0] }} ),
.data_in (sw_reg_wdata[7:0] ),
.reset_n (h_reset_n ),
.clk (mclk ),
//List of Outs
.data_out (reg_2[7:0] )
);
assign reg_2[31:8] = 'h0;
//-----------------------------------------------------------------------
// reg-3
//-----------------------------------------------------------------
assign cfg_dac3_mux_sel = reg_3[7:0];
generic_register #(8,8'h0 ) u_reg3_be0 (
.we ({8{sw_wr_en_3 &
sw_be[0] }} ),
.data_in (sw_reg_wdata[7:0] ),
.reset_n (h_reset_n ),
.clk (mclk ),
//List of Outs
.data_out (reg_3[7:0] )
);
assign reg_3[31:8] = 'h0;
//-----------------------------------------------------------------------
// Register Read Path Multiplexer instantiation
//-----------------------------------------------------------------------
always_comb
begin
reg_out [31:0] = 32'h0;
case (sw_addr [3:0])
4'b0000 : reg_out [31:0] = reg_0 ;
4'b0001 : reg_out [31:0] = reg_1 ;
4'b0010 : reg_out [31:0] = reg_2 ;
4'b0011 : reg_out [31:0] = reg_3 ;
default : reg_out [31:0] = 32'h0;
endcase
end
endmodule