/*
* SPDX-FileCopyrightText: 2022 Harald Pretl
* Johannes Kepler University, Institute for Integrated Circuits
*
* 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
*
* AUDIODAC -- 16b Delta-Sigma Modulator with Single-Bit Output
*
* This delta-sigma modulator includes an input-side FIFO for easy connection
* to a host system, volume control in 6dB steps, and configurable OSR
* (32/64/128/256). The modulator can be configured to first or second order.
*
* The clock for the modulator is required to be clk = audio_sample_rate * OSR
* e.g. for 44.1kHz and OSR=128 then clk=5.6448MHz
*
* The audio input data must be 16b UINT!
*
* In order to write into the FIFO
* 	(1) assert the data at fifo_i[15:0] (fifo_rdy_i=0)
* 	(2) signal that data is ready with transition fifo_rdy_i=0->1
* 	(3) wait that data is accepted by waiting for fifo_ack_o=0->1
* 	(4) de-assert fifo_rdy_i=1->0 (this is followed by fifo_ack_o=1->0)
*
* Data is only accepted if the FIFO is not full (fifo_full_o=0). Using fifo_full_o
* and fifo_empty_o an interrupt service routine can be constructed:
* 	(1) fifo_empty_o=0->1 triggers the ISR
* 	(2) the ISR writes data into the FIFO until it is full (fifo_full_o=0->1)
* 	(3) exit the ISR
* 
* Ideas for future extension:
* 	-- Implement a higher-order (e.g. 5th order) modulator.
*	-- Potentially substitute register-based FIFO by a dual-port RAM.
*/

`default_nettype none
`ifndef __AUDIODAC
`define __AUDIODAC

module audiodac (
`ifdef USE_POWER_PINS
	inout 			vccd1,
	inout 			vssd1,
`endif
	// FIFO interface
	input		[15:0]	fifo_i,
	input			fifo_rdy_i,
	output 			fifo_ack_o,
	output			fifo_full_o,
	output			fifo_empty_o,
	// housekeeping
	input			rst_n_i,
	input			clk_i,
	// configuration bits
	input			mode_i, 	// 0 = 1st, 1 = 2nd order SD-mod
	input 		[3:0]	volume_i,	// 0 = off, 1 = min volume, 15 = max volume
	input		[1:0]	osr_i, 		// 0 = 32; 1 = 64, 2 = 128, 3 = 256
	// ds-modulator outputs
	output			ds_o,		// single-bit SD-modulator output
	output 			ds_n_o,		//  plus the complementary output
	// test modes
	input			tst_sinegen_en_i,
	input		[3:0]	tst_sinegen_step_i,
	input			tst_fifo_loop_i
);

	wire		[15:0]	data_audio, data_sine;
	wire			audio_rd;

	wire [15:0] data = tst_sinegen_en_i ? data_sine : data_audio;

	audiodac_fifo fifo (
		.fifo_data_i(fifo_i),
		.fifo_rdy_i(fifo_rdy_i),
		.fifo_ack_o(fifo_ack_o),
		.fifo_full_o(fifo_full_o),
		.fifo_empty_o(fifo_empty_o),
		.audio_data_o(data_audio),
		.audio_rd_i(audio_rd),
		.rst_n_i(rst_n_i),
		.clk_i(clk_i),
		.tst_fifo_loop_i(tst_fifo_loop_i)
	);

	audiodac_dsmod dsmod (	
		.audio_i(data),
		.audio_rd_o(audio_rd),
		.rst_n_i(rst_n_i),
		.clk_i(clk_i),
		.mode_i(mode_i),
		.volume_i(volume_i),
		.osr_i(osr_i),
		.ds_o(ds_o),
		.ds_n_o(ds_n_o)
	);

	audiodac_sinegen sinegen (
		.data_o(data_sine),
		.data_rd_i(audio_rd),
		.rst_n_i(rst_n_i),
		.clk_i(clk_i),
		.tst_sinegen_en_i(tst_sinegen_en_i),
		.tst_sinegen_step_i(tst_sinegen_step_i)
	);


endmodule // audiodac

`endif
`default_nettype wire
