tdraudio: add noise generator

This commit is contained in:
slederer 2025-09-28 02:21:58 +02:00
parent 2342683836
commit 57430a4df6
2 changed files with 59 additions and 12 deletions

View file

@ -18,6 +18,19 @@ module wavegen #(DATA_WIDTH=32, CLOCK_DIV_WIDTH=22, AMP_WIDTH=16) (
localparam TDRAU_REG_CLK = 1; /* clock divider register */ localparam TDRAU_REG_CLK = 1; /* clock divider register */
localparam TDRAU_REG_AMP = 2; /* amplitude (volume) register */ localparam TDRAU_REG_AMP = 2; /* amplitude (volume) register */
// localparam LFSR_WIDTH = 15;
// localparam LFSR_TAP_IDX_1 = 3;
// localparam LFSR_TAP_IDX_2 = 0;
// localparam LFSR_INIT = 'h7672;
// localparam LFSR_WIDTH = 18;
// localparam LFSR_TAP_IDX_1 = 17;
// localparam LFSR_TAP_IDX_2 = 10;
// localparam LFSR_INIT = 'h3CBE6;
localparam LFSR_WIDTH = 23;
localparam LFSR_INIT = 'h1;
reg channel_enable; reg channel_enable;
reg [CLOCK_DIV_WIDTH-1:0] clock_div; reg [CLOCK_DIV_WIDTH-1:0] clock_div;
reg [CLOCK_DIV_WIDTH-1:0] div_count; reg [CLOCK_DIV_WIDTH-1:0] div_count;
@ -25,8 +38,12 @@ module wavegen #(DATA_WIDTH=32, CLOCK_DIV_WIDTH=22, AMP_WIDTH=16) (
reg [AMP_WIDTH-1:0] amp_start; reg [AMP_WIDTH-1:0] amp_start;
reg [AMP_WIDTH-1:0] amp_out; reg [AMP_WIDTH-1:0] amp_out;
reg noise_enable;
reg [LFSR_WIDTH-1:0] lfsr;
wire [AMP_WIDTH-1:0] noise_out;
//assign rd_data = {{DATA_WIDTH-8-CLOCK_DIV_WIDTH{1'b0}}, div_count, {7{1'b0}}, channel_enable}; //assign rd_data = {{DATA_WIDTH-8-CLOCK_DIV_WIDTH{1'b0}}, div_count, {7{1'b0}}, channel_enable};
assign rd_data = {8'b0, amp_start, {7{1'b0}}, channel_enable}; assign rd_data = {8'b0, amp_start, {6{1'b0}}, noise_enable, channel_enable};
assign amp_val = amp_out; assign amp_val = amp_out;
assign running = channel_enable; assign running = channel_enable;
@ -70,10 +87,38 @@ module wavegen #(DATA_WIDTH=32, CLOCK_DIV_WIDTH=22, AMP_WIDTH=16) (
div_count <= div_count - 1; // else just decrement it div_count <= div_count - 1; // else just decrement it
end end
else else
if (wr_en && (reg_sel == TDRAU_REG_CLK)) if (wr_en && (reg_sel == TDRAU_REG_CLK)) // when setting divider,
div_count <= 1; // start cycle in next clock tick div_count <= 1; // start cycle on next clock tick
end end
/* noise enable flag */
always @(posedge clk)
begin
if(reset)
noise_enable <= 0;
else if (wr_en && (reg_sel == TDRAU_REG_CTL))
noise_enable <= wr_data[1];
end
/* noise generator (Linear Feedback Shift Register) */
always @(posedge clk)
begin
if (reset)
lfsr <= LFSR_INIT;
else
if (wr_en && (reg_sel == TDRAU_REG_CTL) && wr_data[1])
lfsr <= LFSR_INIT;
else
if (channel_enable && noise_enable)
if (div_count == 0)
//lfsr <= { lfsr[LFSR_TAP_IDX_1] ^ lfsr[LFSR_TAP_IDX_2], lfsr[LFSR_WIDTH-1:1] };
// shift width and tap bits taken from https://github.com/jotego/jtopl
lfsr <= { lfsr[LFSR_WIDTH-2:0], lfsr[22] ^ lfsr[9] ^ lfsr[8] ^ lfsr[0]};
end
assign noise_out = lfsr[0] ? amp_start : ~amp_start;
/* amplitude out */ /* amplitude out */
always @(posedge clk) always @(posedge clk)
begin begin
@ -83,11 +128,17 @@ module wavegen #(DATA_WIDTH=32, CLOCK_DIV_WIDTH=22, AMP_WIDTH=16) (
amp_phase <= 1; amp_phase <= 1;
end end
else else
if (channel_enable && (div_count == 0)) // invert amplitude on clock tick if (channel_enable)
begin begin
amp_out <= amp_phase ? amp_start : ~amp_start; if (div_count == 0) // invert amplitude on clock tick
amp_phase <= ~amp_phase; begin
amp_out <= noise_enable ? noise_out :
amp_phase ? amp_start : ~amp_start;
amp_phase <= ~amp_phase;
end
end end
else
amp_out <= 0;
// reset phase bit when enabling the channel // reset phase bit when enabling the channel
if (wr_en && (reg_sel == TDRAU_REG_CTL) && wr_data[0]) if (wr_en && (reg_sel == TDRAU_REG_CTL) && wr_data[0])

View file

@ -358,9 +358,7 @@
<Runs Version="1" Minor="22"> <Runs Version="1" Minor="22">
<Run Id="synth_1" Type="Ft3:Synth" SrcSet="sources_1" Part="xc7a35ticsg324-1L" ConstrsSet="constrs_1" Description="Performs general area optimizations including changing the threshold for control set optimizations, forcing ternary adder implementation, lowering multiplier threshold of inference into DSP blocks, moving shift register into BRAM, applying lower thresholds for use of carry chain in comparators and also area optimized mux optimizations" AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/synth_1" ParallelReportGen="true"> <Run Id="synth_1" Type="Ft3:Synth" SrcSet="sources_1" Part="xc7a35ticsg324-1L" ConstrsSet="constrs_1" Description="Performs general area optimizations including changing the threshold for control set optimizations, forcing ternary adder implementation, lowering multiplier threshold of inference into DSP blocks, moving shift register into BRAM, applying lower thresholds for use of carry chain in comparators and also area optimized mux optimizations" AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/synth_1" ParallelReportGen="true">
<Strategy Version="1" Minor="2"> <Strategy Version="1" Minor="2">
<StratHandle Name="Flow_AreaOptimized_medium" Flow="Vivado Synthesis 2024"> <StratHandle Name="Flow_AreaOptimized_medium" Flow="Vivado Synthesis 2024"/>
<Desc>Performs general area optimizations including changing the threshold for control set optimizations, forcing ternary adder implementation, lowering multiplier threshold of inference into DSP blocks, moving shift register into BRAM, applying lower thresholds for use of carry chain in comparators and also area optimized mux optimizations</Desc>
</StratHandle>
<Step Id="synth_design"> <Step Id="synth_design">
<Option Id="ControlSetOptThreshold">1</Option> <Option Id="ControlSetOptThreshold">1</Option>
<Option Id="Directive">2</Option> <Option Id="Directive">2</Option>
@ -383,9 +381,7 @@
</Run> </Run>
<Run Id="impl_1" Type="Ft2:EntireDesign" Part="xc7a35ticsg324-1L" ConstrsSet="constrs_1" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/impl_1" SynthRun="synth_1" IncludeInArchive="true" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/impl_1" LaunchOptions="-jobs 6 " AutoRQSDir="$PSRCDIR/utils_1/imports/impl_1" ParallelReportGen="true"> <Run Id="impl_1" Type="Ft2:EntireDesign" Part="xc7a35ticsg324-1L" ConstrsSet="constrs_1" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/impl_1" SynthRun="synth_1" IncludeInArchive="true" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/impl_1" LaunchOptions="-jobs 6 " AutoRQSDir="$PSRCDIR/utils_1/imports/impl_1" ParallelReportGen="true">
<Strategy Version="1" Minor="2"> <Strategy Version="1" Minor="2">
<StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2024"> <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2024"/>
<Desc>Default settings for Implementation.</Desc>
</StratHandle>
<Step Id="init_design"/> <Step Id="init_design"/>
<Step Id="opt_design"/> <Step Id="opt_design"/>
<Step Id="power_opt_design"/> <Step Id="power_opt_design"/>