|
37 | 37 |
|
38 | 38 | module ad_dds #(
|
39 | 39 |
|
40 |
| - // data path disable |
41 |
| - |
| 40 | + // Disable DDS |
42 | 41 | parameter DISABLE = 0,
|
| 42 | + // Range = 8-24 |
| 43 | + parameter DDS_DW = 16, |
| 44 | + // Set 1 for CORDIC or 2 for Polynomial |
43 | 45 | parameter DDS_TYPE = 1,
|
| 46 | + // Range = 8-24 |
44 | 47 | parameter CORDIC_DW = 16,
|
| 48 | + // Range = 8-24 ( make sure CORDIC_PHASE_DW < CORDIC_DW) |
45 | 49 | parameter CORDIC_PHASE_DW = 16) (
|
46 | 50 |
|
47 | 51 | // interface
|
48 | 52 |
|
49 |
| - input clk, |
50 |
| - input dds_format, |
51 |
| - input [15:0] dds_phase_0, |
52 |
| - input [15:0] dds_scale_0, |
53 |
| - input [15:0] dds_phase_1, |
54 |
| - input [15:0] dds_scale_1, |
55 |
| - output [15:0] dds_data); |
| 53 | + input clk, |
| 54 | + input dds_format, |
| 55 | + input [ 15:0] dds_phase_0, |
| 56 | + input [ 15:0] dds_scale_0, |
| 57 | + input [ 15:0] dds_phase_1, |
| 58 | + input [ 15:0] dds_scale_1, |
| 59 | + output [DDS_DW-1:0] dds_data); |
| 60 | + |
| 61 | + // Local parameters |
| 62 | + |
| 63 | + localparam CORDIC = 1; |
| 64 | + localparam POLYNOMIAL = 2; |
| 65 | + |
| 66 | + // The width for Polynomial DDS is fixed (16) |
| 67 | + localparam DDS_D_DW = (DDS_TYPE == CORDIC) ? CORDIC_DW : 16; |
| 68 | + localparam DDS_P_DW = (DDS_TYPE == CORDIC) ? CORDIC_PHASE_DW : 16; |
| 69 | + // concatenation or truncation width |
| 70 | + localparam C_T_WIDTH = (DDS_D_DW > DDS_DW) ? (DDS_D_DW - DDS_DW) : (DDS_DW - DDS_D_DW); |
56 | 71 |
|
57 | 72 | // internal registers
|
58 | 73 |
|
59 |
| - reg [15:0] dds_data_int = 'd0; |
60 |
| - reg [15:0] dds_data_out = 'd0; |
61 |
| - reg [15:0] dds_scale_0_d = 'd0; |
62 |
| - reg [15:0] dds_scale_1_d = 'd0; |
| 74 | + reg [ DDS_DW-1:0] dds_data_width = 0; |
| 75 | + reg [DDS_D_DW-1:0] dds_data_rownd = 0; |
| 76 | + reg [DDS_D_DW-1:0] dds_data_int = 0; |
| 77 | + reg [ 15:0] dds_scale_0_d = 0; |
| 78 | + reg [ 15:0] dds_scale_1_d = 0; |
| 79 | + reg [ DDS_DW-1:0] dds_data_out = 0; |
63 | 80 |
|
64 | 81 | // internal signals
|
65 | 82 |
|
66 | 83 | wire [15:0] dds_data_0_s;
|
67 | 84 | wire [15:0] dds_data_1_s;
|
68 | 85 |
|
69 |
| - // disable |
70 |
| - |
| 86 | + // disable DDS |
71 | 87 | generate
|
72 | 88 | if (DISABLE == 1) begin
|
73 |
| - assign dds_data = 16'd0; |
| 89 | + // assign 0 for the exact buss width to avoid warnings |
| 90 | + assign dds_data = {DDS_DW{1'b0}}; |
74 | 91 | end else begin
|
75 | 92 |
|
| 93 | + // dds channel output |
76 | 94 | assign dds_data = dds_data_out;
|
77 | 95 |
|
78 |
| - // dds channel output |
79 |
| - |
80 |
| - always @(posedge clk) begin |
81 |
| - dds_data_int <= dds_data_0_s + dds_data_1_s; |
82 |
| - dds_data_out[15:15] <= dds_data_int[15] ^ dds_format; |
83 |
| - dds_data_out[14: 0] <= dds_data_int[14:0]; |
84 |
| - end |
| 96 | + // output data format |
| 97 | + always @(posedge clk) begin |
| 98 | + dds_data_out[DDS_DW-1] <= dds_data_width[DDS_DW-1] ^ dds_format; |
| 99 | + dds_data_out[DDS_DW-2: 0] <= dds_data_width[DDS_DW-2: 0]; |
| 100 | + end |
| 101 | + |
| 102 | + // set desired data width |
| 103 | + always @(posedge clk) begin |
| 104 | + if (DDS_DW <= DDS_D_DW) begin // truncation |
| 105 | + // fair rownding |
| 106 | + dds_data_rownd <= dds_data_int + {(C_T_WIDTH){dds_data_int[DDS_D_DW-1]}}; |
| 107 | + dds_data_width <= dds_data_rownd[DDS_D_DW-1:DDS_D_DW-DDS_DW]; |
| 108 | + end else begin // concatenation |
| 109 | + dds_data_width <= dds_data_int << C_T_WIDTH; |
| 110 | + end |
| 111 | + end |
| 112 | + |
| 113 | + // dual tone |
| 114 | + always @(posedge clk) begin |
| 115 | + dds_data_int <= dds_data_0_s + dds_data_1_s; |
| 116 | + end |
85 | 117 |
|
86 | 118 | always @(posedge clk) begin
|
87 | 119 | dds_scale_0_d <= dds_scale_0;
|
|
0 commit comments