Radical Computer Technologies
DSP / entity

raddsp_audio_poly_synth

Documentation version: 0.2.0 / Subpackage: dsp_transform / Source package: raddsp

Time-division polyphonic audio synth for register-controlled board designs. A host writes per-voice configuration through cfg_* while explicit Gowin multipliers are reused for wavetable interpolation, waveform-volume, and envelope scaling. Each waveform page stores a positive half period; the opposite half is reconstructed by sign inversion. Voice control bit 20 enables the per-voice one-pole filter; bits [17:2] carry its unsigned Q1.15 coefficient. Bits 1 and 0 remain voice enable/gate.

Use Cases

Block Diagram

raddsp_audio_poly_synth radhdl entity clk rst sample_ce_i cfg_wr_en_i cfg_addr_i cfg_data_i cfg_rd_en_i cfg_rd_addr_i table_wr_en_i table_wr_addr_i table_wr_data_i cfg_data_o cfg_rd_valid_o cfg_error_o sample_o valid_o table_init_done_o busy_o
VHDL Include And Instantiation Template

File Header

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

library radhdl;
-- Direct entity instantiation below does not require importing the entity name.
use radhdl.dsp.all;
-- Narrower alternative: use radhdl.dsp_transform.all;

Component Declaration

component raddsp_audio_poly_synth is
  generic (
    VOICE_COUNT : positive := 16;
    SAMPLE_WIDTH : positive := 24;
    WAVE_WIDTH : positive := 16;
    PHASE_WIDTH : positive := 24;
    TABLE_ADDR_WIDTH : positive := 8;
    COEFF_WIDTH : positive := 18;
    COEFF_FRAC_BITS : natural := 15;
    RESET_CONFIG_REGS : boolean := true
  );
  port (
    clk : in std_logic;
    rst : in std_logic;
    sample_ce_i : in std_logic;
    cfg_wr_en_i : in std_logic;
    cfg_addr_i : in std_logic_vector(7 downto 0);
    cfg_data_i : in std_logic_vector(31 downto 0);
    cfg_rd_en_i : in std_logic := '0';
    cfg_rd_addr_i : in std_logic_vector(7 downto 0) := (others => '0');
    cfg_data_o : out std_logic_vector(31 downto 0);
    cfg_rd_valid_o : out std_logic;
    cfg_error_o : out std_logic;
    table_wr_en_i : in std_logic;
    table_wr_addr_i : in std_logic_vector(TABLE_ADDR_WIDTH + 1 downto 0);
    table_wr_data_i : in std_logic_vector(WAVE_WIDTH - 1 downto 0);
    sample_o : out std_logic_vector(SAMPLE_WIDTH - 1 downto 0);
    valid_o : out std_logic;
    table_init_done_o : out std_logic;
    busy_o : out std_logic
  );
end component;

Direct Entity Instantiation

u_raddsp_audio_poly_synth : entity radhdl.raddsp_audio_poly_synth
  generic map (
    VOICE_COUNT       => 16,
    SAMPLE_WIDTH      => 24,
    WAVE_WIDTH        => 16,
    PHASE_WIDTH       => 24,
    TABLE_ADDR_WIDTH  => 8,
    COEFF_WIDTH       => 18,
    COEFF_FRAC_BITS   => 15,
    RESET_CONFIG_REGS => true
  )
  port map (
    clk               => <clk_signal>,
    rst               => <rst_signal>,
    sample_ce_i       => <sample_ce_i_signal>,
    cfg_wr_en_i       => <cfg_wr_en_i_signal>,
    cfg_addr_i        => <cfg_addr_i_signal>,
    cfg_data_i        => <cfg_data_i_signal>,
    cfg_rd_en_i       => <cfg_rd_en_i_signal>,
    cfg_rd_addr_i     => <cfg_rd_addr_i_signal>,
    cfg_data_o        => <cfg_data_o_signal>,
    cfg_rd_valid_o    => <cfg_rd_valid_o_signal>,
    cfg_error_o       => <cfg_error_o_signal>,
    table_wr_en_i     => <table_wr_en_i_signal>,
    table_wr_addr_i   => <table_wr_addr_i_signal>,
    table_wr_data_i   => <table_wr_data_i_signal>,
    sample_o          => <sample_o_signal>,
    valid_o           => <valid_o_signal>,
    table_init_done_o => <table_init_done_o_signal>,
    busy_o            => <busy_o_signal>
  );

Generics

NameTypeDefaultDescription
VOICE_COUNTpositive16
SAMPLE_WIDTHpositive24
WAVE_WIDTHpositive16
PHASE_WIDTHpositive24
TABLE_ADDR_WIDTHpositive8
COEFF_WIDTHpositive18
COEFF_FRAC_BITSnatural15
RESET_CONFIG_REGSbooleantrue

Ports

NameDirectionTypeDescription
clkinstd_logic
rstinstd_logic
sample_ce_iinstd_logic
cfg_wr_en_iinstd_logic
cfg_addr_iinstd_logic_vector(7 downto 0)
cfg_data_iinstd_logic_vector(31 downto 0)
cfg_rd_en_iinstd_logic := '0'
cfg_rd_addr_iinstd_logic_vector(7 downto 0) := (others => '0')
cfg_data_ooutstd_logic_vector(31 downto 0)
cfg_rd_valid_ooutstd_logic
cfg_error_ooutstd_logic
table_wr_en_iinstd_logic
table_wr_addr_iinstd_logic_vector(TABLE_ADDR_WIDTH + 1 downto 0)
table_wr_data_iinstd_logic_vector(WAVE_WIDTH - 1 downto 0)
sample_ooutstd_logic_vector(SAMPLE_WIDTH - 1 downto 0)
valid_ooutstd_logic
table_init_done_ooutstd_logic
busy_ooutstd_logic

Register Interfaces

No fixed register map was found; this section documents the exposed register/control interface ports.

InterfaceDirectionsSignalsRepresentative ports
Register control/statusin, out7cfg_wr_en_i, cfg_rd_en_i, cfg_rd_addr_i, cfg_rd_valid_o, table_wr_en_i, table_wr_addr_i, table_wr_data_i

Testbenches

No directly associated testbench was found.

Sources