Radical Computer Technologies
DSP / entity

raddsp_audio_quad_lfo_wavetable

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

Four TDM LFOs sharing one 4-page, 512-point half-period wavetable. The table uses two explicit Gowin DPB blocks, reconstructs the opposite half by sign inversion, and linearly interpolates between adjacent points.

Use Cases

Block Diagram

raddsp_audio_quad_lfo_wavetable radhdl entity clk rst sample_ce_i phase_inc0_i phase_inc1_i phase_inc2_i phase_inc3_i wave_select_i depth0_i depth1_i depth2_i depth3_i table_wr_en_i table_wr_addr_i table_wr_data_i lfo0_o lfo1_o lfo2_o lfo3_o valid_o 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_quad_lfo_wavetable is
  generic (
    SAMPLE_WIDTH : positive := 24;
    WAVE_WIDTH : positive := 16;
    PHASE_WIDTH : positive := 24;
    TABLE_ADDR_WIDTH : positive := 9;
    COEFF_WIDTH : positive := 18;
    COEFF_FRAC_BITS : natural := 15
  );
  port (
    clk : in std_logic;
    rst : in std_logic;
    sample_ce_i : in std_logic;
    phase_inc0_i : in std_logic_vector(PHASE_WIDTH - 1 downto 0);
    phase_inc1_i : in std_logic_vector(PHASE_WIDTH - 1 downto 0);
    phase_inc2_i : in std_logic_vector(PHASE_WIDTH - 1 downto 0);
    phase_inc3_i : in std_logic_vector(PHASE_WIDTH - 1 downto 0);
    wave_select_i : in std_logic_vector(7 downto 0);
    depth0_i : in std_logic_vector(COEFF_WIDTH - 1 downto 0);
    depth1_i : in std_logic_vector(COEFF_WIDTH - 1 downto 0);
    depth2_i : in std_logic_vector(COEFF_WIDTH - 1 downto 0);
    depth3_i : in std_logic_vector(COEFF_WIDTH - 1 downto 0);
    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);
    lfo0_o : out std_logic_vector(SAMPLE_WIDTH - 1 downto 0);
    lfo1_o : out std_logic_vector(SAMPLE_WIDTH - 1 downto 0);
    lfo2_o : out std_logic_vector(SAMPLE_WIDTH - 1 downto 0);
    lfo3_o : out std_logic_vector(SAMPLE_WIDTH - 1 downto 0);
    valid_o : out std_logic;
    init_done_o : out std_logic;
    busy_o : out std_logic
  );
end component;

Direct Entity Instantiation

u_raddsp_audio_quad_lfo_wavetable : entity radhdl.raddsp_audio_quad_lfo_wavetable
  generic map (
    SAMPLE_WIDTH     => 24,
    WAVE_WIDTH       => 16,
    PHASE_WIDTH      => 24,
    TABLE_ADDR_WIDTH => 9,
    COEFF_WIDTH      => 18,
    COEFF_FRAC_BITS  => 15
  )
  port map (
    clk             => <clk_signal>,
    rst             => <rst_signal>,
    sample_ce_i     => <sample_ce_i_signal>,
    phase_inc0_i    => <phase_inc0_i_signal>,
    phase_inc1_i    => <phase_inc1_i_signal>,
    phase_inc2_i    => <phase_inc2_i_signal>,
    phase_inc3_i    => <phase_inc3_i_signal>,
    wave_select_i   => <wave_select_i_signal>,
    depth0_i        => <depth0_i_signal>,
    depth1_i        => <depth1_i_signal>,
    depth2_i        => <depth2_i_signal>,
    depth3_i        => <depth3_i_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>,
    lfo0_o          => <lfo0_o_signal>,
    lfo1_o          => <lfo1_o_signal>,
    lfo2_o          => <lfo2_o_signal>,
    lfo3_o          => <lfo3_o_signal>,
    valid_o         => <valid_o_signal>,
    init_done_o     => <init_done_o_signal>,
    busy_o          => <busy_o_signal>
  );

Generics

NameTypeDefaultDescription
SAMPLE_WIDTHpositive24
WAVE_WIDTHpositive16
PHASE_WIDTHpositive24
TABLE_ADDR_WIDTHpositive9
COEFF_WIDTHpositive18
COEFF_FRAC_BITSnatural15

Ports

NameDirectionTypeDescription
clkinstd_logic
rstinstd_logic
sample_ce_iinstd_logic
phase_inc0_iinstd_logic_vector(PHASE_WIDTH - 1 downto 0)
phase_inc1_iinstd_logic_vector(PHASE_WIDTH - 1 downto 0)
phase_inc2_iinstd_logic_vector(PHASE_WIDTH - 1 downto 0)
phase_inc3_iinstd_logic_vector(PHASE_WIDTH - 1 downto 0)
wave_select_iinstd_logic_vector(7 downto 0)
depth0_iinstd_logic_vector(COEFF_WIDTH - 1 downto 0)
depth1_iinstd_logic_vector(COEFF_WIDTH - 1 downto 0)
depth2_iinstd_logic_vector(COEFF_WIDTH - 1 downto 0)
depth3_iinstd_logic_vector(COEFF_WIDTH - 1 downto 0)
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)
lfo0_ooutstd_logic_vector(SAMPLE_WIDTH - 1 downto 0)
lfo1_ooutstd_logic_vector(SAMPLE_WIDTH - 1 downto 0)
lfo2_ooutstd_logic_vector(SAMPLE_WIDTH - 1 downto 0)
lfo3_ooutstd_logic_vector(SAMPLE_WIDTH - 1 downto 0)
valid_ooutstd_logic
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/statusin3table_wr_en_i, table_wr_addr_i, table_wr_data_i

Testbenches

No directly associated testbench was found.

Sources