ad_dds_1: Update for CORDIC algorithm integration

Add parameters and the mechanism:
  - to select the sine generator (polynomial/CORDIC)
  - to select the CORDIC data width(default 16)
main
AndreiGrozav 2018-02-07 13:46:08 +02:00 committed by AndreiGrozav
parent 0e114a39e3
commit 4c32b47f6a
1 changed files with 53 additions and 12 deletions

View File

@ -35,7 +35,12 @@
`timescale 1ns/100ps `timescale 1ns/100ps
module ad_dds_1 ( module ad_dds_1 #(
// parameters
parameter DDS_TYPE = 1,
parameter CORDIC_DW = 16) (
// interface // interface
@ -44,27 +49,63 @@ module ad_dds_1 (
input [15:0] scale, input [15:0] scale,
output reg [15:0] dds_data); output reg [15:0] dds_data);
// internal registers // local parameters
localparam DDS_CORDIC_TYPE = 1;
localparam DDS_POLINOMIAL_TYPE = 2;
// internal signals // internal signals
wire [15:0] sine_s; wire [CORDIC_DW-1:0] sine_s;
wire [33:0] s1_data_s; wire [ 15:0] sine16_s;
wire [ 3:0] zeros;
wire [ 33:0] s1_data_s;
assign zeros = 0;
// sine // sine
ad_dds_sine #(.DELAY_DATA_WIDTH(1)) i_dds_sine ( generate
.clk (clk), if (DDS_TYPE == DDS_CORDIC_TYPE) begin
.angle (angle),
.sine (sine_s),
.ddata_in (1'b0),
.ddata_out ());
// scale // the cordic module input angle width must be equal with it's width
wire [CORDIC_DW-1:0] angle_s;
if (CORDIC_DW >= 16) begin
assign angle_s = {angle,zeros[CORDIC_DW-16:0]};
assign sine16_s = sine_s[CORDIC_DW-1:CORDIC_DW-16];
end else begin
assign angle_s = angle[15:16-CORDIC_DW];
assign sine16_s = {sine_s,zeros[15-CORDIC_DW:0]};
end
ad_dds_sine_cordic #(
.CORDIC_DW(CORDIC_DW),
.DELAY_DW(1))
i_dds_sine (
.clk (clk),
.angle (angle_s),
.sine (sine_s),
.ddata_in (1'b0),
.ddata_out ());
end else begin
assign sine16_s = sine_s;
ad_dds_sine i_dds_sine (
.clk (clk),
.angle (angle),
.sine (sine_s),
.ddata_in (1'b0),
.ddata_out ());
end
endgenerate
// scale for a 16 bit sine generator
ad_mul #(.DELAY_DATA_WIDTH(1)) i_dds_scale ( ad_mul #(.DELAY_DATA_WIDTH(1)) i_dds_scale (
.clk (clk), .clk (clk),
.data_a ({sine_s[15], sine_s}), .data_a ({sine16_s[15], sine16_s}),
.data_b ({scale[15], scale}), .data_b ({scale[15], scale}),
.data_p (s1_data_s), .data_p (s1_data_s),
.ddata_in (1'b0), .ddata_in (1'b0),