module ad_dds_1 #(

  // parameters

  parameter   DDS_TYPE = 1,
  parameter   DDS_D_DW = 16,
  parameter   DDS_P_DW = 16) (

  // interface

  input                       clk,
  input       [DDS_P_DW-1:0]  angle,
  input       [        15:0]  scale,
  output  reg [DDS_D_DW-1:0]  dds_data);

  // local parameters

  localparam DDS_CORDIC_TYPE = 1;
  localparam DDS_POLINOMIAL_TYPE = 2;

  // internal signals

  wire    [ DDS_D_DW-1:0] sine_s;
  wire    [DDS_D_DW+17:0] s1_data_s;

  // sine

  generate
    if (DDS_TYPE == DDS_CORDIC_TYPE) begin

      ad_dds_sine_cordic #(
        .CORDIC_DW(DDS_D_DW),
        .PHASE_DW(DDS_P_DW),
        .DELAY_DW(1))
      i_dds_sine (
        .clk (clk),
        .angle (angle),
        .sine (sine_s),
        .cosine (),
        .ddata_in (1'b0),
        .ddata_out ());

    end else begin

      ad_dds_sine i_dds_sine (
        .clk (clk),
        .angle (angle),
        .sine (sine_s),
        .ddata_in (1'b0),
        .ddata_out ());
    end
  endgenerate

  // scale for a sine generator

  ad_mul #(
    .A_DATA_WIDTH(DDS_D_DW + 1),
    .B_DATA_WIDTH(17),
    .DELAY_DATA_WIDTH(1))
  i_dds_scale (
    .clk (clk),
    .data_a ({sine_s[DDS_D_DW-1], sine_s}),
    .data_b ({scale[15], scale}),
    .data_p (s1_data_s),
    .ddata_in (1'b0),
    .ddata_out ());

  // dds data

  always @(posedge clk) begin
    //15'h8000 is the maximum scale
    dds_data <= s1_data_s[DDS_D_DW+13:14];
  end

endmodule