From bf309981ab1db4d4e98d5740eda3a41363dfbef4 Mon Sep 17 00:00:00 2001 From: vvvictor Date: Sat, 9 Nov 2024 17:02:14 +0500 Subject: [PATCH 1/2] Sound output via sigma-delta DAC --- .../board_specific_top.sv | 1 + .../board_specific_top.sv | 36 +++++++++++++++---- peripherals/lab_specific_board_config.svh | 1 + peripherals/sigma_delta_dac.v | 36 +++++++++++++++++++ 4 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 peripherals/sigma_delta_dac.v diff --git a/boards/tang_nano_9k_hdmi_no_tm1638/board_specific_top.sv b/boards/tang_nano_9k_hdmi_no_tm1638/board_specific_top.sv index b4c29067..684e9426 100644 --- a/boards/tang_nano_9k_hdmi_no_tm1638/board_specific_top.sv +++ b/boards/tang_nano_9k_hdmi_no_tm1638/board_specific_top.sv @@ -1,2 +1,3 @@ `define FORCE_NO_INSTANTIATE_TM1638_BOARD_CONTROLLER_MODULE +`define INSTANTIATE_SOUND_DAC_OUTPUT_INTERFACE_MODULE `include "../tang_nano_9k_hdmi_tm1638/board_specific_top.sv" diff --git a/boards/tang_nano_9k_hdmi_tm1638/board_specific_top.sv b/boards/tang_nano_9k_hdmi_tm1638/board_specific_top.sv index 180cd53f..ff07828e 100644 --- a/boards/tang_nano_9k_hdmi_tm1638/board_specific_top.sv +++ b/boards/tang_nano_9k_hdmi_tm1638/board_specific_top.sv @@ -17,6 +17,8 @@ `define REVERSE_KEY `define REVERSE_LED + +//`define INSTANTIATE_SOUND_DAC_OUTPUT_INTERFACE_MODULE //---------------------------------------------------------------------------- module board_specific_top @@ -428,6 +430,26 @@ module board_specific_top //------------------------------------------------------------------------ + `ifdef INSTANTIATE_SOUND_DAC_OUTPUT_INTERFACE_MODULE + `undef INSTANTIATE_SOUND_OUTPUT_INTERFACE_MODULE + + wire dac_out; + + sigma_delta_dac + #( .MSBI ( 7 ), + .INV ( 1'b0 ) + ) + SD_DAC + ( .DACout( dac_out ), //Average Output feeding analog lowpass + .DACin ( sound[15 -:8] ), //DAC input (excess 2**MSBI) + .CLK ( clk ), + .RESET ( rst ) + ); + assign LARGE_LCD_HS = dac_out; + assign LARGE_LCD_CK = ~dac_out; + + `endif + `ifdef INSTANTIATE_SOUND_OUTPUT_INTERFACE_MODULE i2s_audio_out @@ -436,13 +458,13 @@ module board_specific_top ) inst_audio_out ( - .clk ( clk ), - .reset ( rst ), - .data_in ( sound ), - .mclk ( LARGE_LCD_DE ), - .bclk ( LARGE_LCD_VS ), - .lrclk ( LARGE_LCD_HS ), - .sdata ( LARGE_LCD_CK ) + .clk ( clk ), + .reset ( rst ), + .data_in ( sound ), + .mclk ( LARGE_LCD_DE ), + .bclk ( LARGE_LCD_VS ), + .lrclk ( LARGE_LCD_HS ), + .sdata ( LARGE_LCD_CK ) ); `endif diff --git a/peripherals/lab_specific_board_config.svh b/peripherals/lab_specific_board_config.svh index 0c5e57c6..cf1bbbab 100644 --- a/peripherals/lab_specific_board_config.svh +++ b/peripherals/lab_specific_board_config.svh @@ -14,6 +14,7 @@ `define INSTANTIATE_GRAPHICS_INTERFACE_MODULE `define INSTANTIATE_MICROPHONE_INTERFACE_MODULE `define INSTANTIATE_SOUND_OUTPUT_INTERFACE_MODULE +// `define INSTANTIATE_SOUND_DAC_OUTPUT_INTERFACE_MODULE `endif // `ifndef LAB_SPECIFIC_BOARD_CONFIG_SVH diff --git a/peripherals/sigma_delta_dac.v b/peripherals/sigma_delta_dac.v new file mode 100644 index 00000000..ec562efa --- /dev/null +++ b/peripherals/sigma_delta_dac.v @@ -0,0 +1,36 @@ +// +// PWM DAC +// +// MSBI is the highest bit number. NOT amount of bits! +// +// https://github.com/MiSTer-devel/Genesis_MiSTer/blob/master/sys/sigma_delta_dac.v +// + +module sigma_delta_dac #(parameter MSBI=7, parameter INV=1'b1) +( + output reg DACout, //Average Output feeding analog lowpass + input [MSBI:0] DACin, //DAC input (excess 2**MSBI) + input CLK, + input RESET +); + +reg [MSBI+2:0] DeltaAdder; //Output of Delta Adder +reg [MSBI+2:0] SigmaAdder; //Output of Sigma Adder +reg [MSBI+2:0] SigmaLatch; //Latches output of Sigma Adder +reg [MSBI+2:0] DeltaB; //B input of Delta Adder + +always @(*) DeltaB = {SigmaLatch[MSBI+2], SigmaLatch[MSBI+2]} << (MSBI+1); +always @(*) DeltaAdder = DACin + DeltaB; +always @(*) SigmaAdder = DeltaAdder + SigmaLatch; + +always @(posedge CLK or posedge RESET) begin + if(RESET) begin + SigmaLatch <= 1'b1 << (MSBI+1); + DACout <= INV; + end else begin + SigmaLatch <= SigmaAdder; + DACout <= SigmaLatch[MSBI+2] ^ INV; + end +end + +endmodule From 5a45275dbe7b7e4eb5faee4c68a0c658d5a8d195 Mon Sep 17 00:00:00 2001 From: vvvictor Date: Sat, 9 Nov 2024 17:05:03 +0500 Subject: [PATCH 2/2] Sound output via sigma-delta DAC Use `define INSTANTIATE_SOUND_DAC_OUTPUT_INTERFACE_MODULE In board_specific_top --- boards/tang_nano_9k_hdmi_no_tm1638/board_specific_top.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/tang_nano_9k_hdmi_no_tm1638/board_specific_top.sv b/boards/tang_nano_9k_hdmi_no_tm1638/board_specific_top.sv index 684e9426..0ac25dd0 100644 --- a/boards/tang_nano_9k_hdmi_no_tm1638/board_specific_top.sv +++ b/boards/tang_nano_9k_hdmi_no_tm1638/board_specific_top.sv @@ -1,3 +1,3 @@ `define FORCE_NO_INSTANTIATE_TM1638_BOARD_CONTROLLER_MODULE -`define INSTANTIATE_SOUND_DAC_OUTPUT_INTERFACE_MODULE +//`define INSTANTIATE_SOUND_DAC_OUTPUT_INTERFACE_MODULE `include "../tang_nano_9k_hdmi_tm1638/board_specific_top.sv"