| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- `timescale 1 ns / 1 ps
- module dds #
- (
- parameter NEGATIVE_SINE = "FALSE"
- )
- (
- input wire aclk,
- input wire aresetn,
- input wire [31:0] pinc,
- output wire [47:0] dout
- );
- reg [31:0] int_cntr_reg;
- reg [23:0] int_cos_reg, int_sin_reg;
- reg [10:0] int_addr_reg;
- reg [1:0] int_sign_reg [2:0];
- wire [47:0] int_p_wire [2:0];
- wire [31:0] int_cntr_wire;
- wire [29:0] int_cos_wire, int_sin_wire;
- wire [22:0] int_lut_wire [1:0];
- wire [17:0] int_corr_wire;
- wire [2:0] int_pbd_wire;
- assign int_cos_wire = int_sign_reg[2][0] ? {7'h7f, -int_lut_wire[0]} : {7'h00, int_lut_wire[0]};
- assign int_sin_wire = int_sign_reg[2][1] ? {7'h7f, -int_lut_wire[1]} : {7'h00, int_lut_wire[1]};
- assign int_corr_wire = {int_p_wire[0][34:18], int_p_wire[0][17] | int_pbd_wire[0]};
- generate
- if(NEGATIVE_SINE == "TRUE")
- begin : NEGATIVE
- assign int_cntr_wire = int_cntr_reg - pinc;
- end
- else
- begin : POSITIVE
- assign int_cntr_wire = int_cntr_reg + pinc;
- end
- endgenerate
- always @(posedge aclk)
- begin
- if(~aresetn)
- begin
- int_cntr_reg <= 32'd0;
- int_cos_reg <= 24'd0;
- int_sin_reg <= 24'd0;
- int_addr_reg <= 11'd0;
- int_sign_reg[0] <= 2'd0;
- int_sign_reg[1] <= 2'd0;
- int_sign_reg[2] <= 2'd0;
- end
- else
- begin
- int_cntr_reg <= int_cntr_wire;
- int_cos_reg <= int_cos_wire[23:0];
- int_sin_reg <= int_sin_wire[23:0];
- int_addr_reg <= int_cntr_reg[29:19];
- int_sign_reg[0] <= {int_cntr_reg[31], int_cntr_reg[30]};
- int_sign_reg[1] <= {int_sign_reg[0][1], int_sign_reg[0][1] ^ int_sign_reg[0][0]};
- int_sign_reg[2] <= int_sign_reg[1];
- end
- end
- xpm_memory_dprom #(
- .MEMORY_PRIMITIVE("block"),
- .MEMORY_SIZE(47104),
- .ADDR_WIDTH_A(11),
- .ADDR_WIDTH_B(11),
- .READ_DATA_WIDTH_A(23),
- .READ_DATA_WIDTH_B(23),
- .READ_LATENCY_A(2),
- .READ_LATENCY_B(2),
- .MEMORY_INIT_PARAM(""),
- .MEMORY_INIT_FILE("dds.mem")
- ) rom_0 (
- .clka(aclk),
- .clkb(aclk),
- .rsta(1'b0),
- .rstb(1'b0),
- .ena(1'b1),
- .enb(1'b1),
- .regcea(1'b1),
- .regceb(1'b1),
- .addra(int_sign_reg[0][0] ? ~int_addr_reg : int_addr_reg),
- .addrb(int_sign_reg[0][0] ? int_addr_reg : ~int_addr_reg),
- .douta(int_lut_wire[0]),
- .doutb(int_lut_wire[1])
- );
- DSP48E1 #(
- .ALUMODEREG(0), .CARRYINSELREG(0), .INMODEREG(0), .OPMODEREG(0),
- .BREG(0), .BCASCREG(0), .CREG(0), .CARRYINREG(0),
- .USE_PATTERN_DETECT("PATDET"), .MASK(48'hfffffffe0000)
- ) dsp_0 (
- .CLK(aclk),
- .RSTA(1'b0), .RSTM(1'b0), .RSTP(1'b0),
- .CEA2(1'b1), .CED(1'b0), .CEAD(1'b0), .CEM(1'b1), .CEP(1'b1),
- .ALUMODE(4'b0000), .CARRYINSEL(3'b000), .INMODE(5'b00000), .OPMODE(7'b0110101),
- .A({{(12){~int_cntr_reg[18]}}, int_cntr_reg[17:0]}),
- .B(18'd3217),
- .C(48'hffff),
- .CARRYIN(1'b0),
- .PATTERNBDETECT(int_pbd_wire[0]),
- .P(int_p_wire[0])
- );
- DSP48E1 #(
- .ALUMODEREG(0), .CARRYINSELREG(0), .INMODEREG(0), .OPMODEREG(0),
- .CARRYINREG(0),
- .USE_PATTERN_DETECT("PATDET"), .MASK(48'hffffff000000)
- ) dsp_1 (
- .CLK(aclk),
- .RSTA(1'b0), .RSTB(1'b0), .RSTC(1'b0), .RSTM(1'b0), .RSTP(1'b0),
- .CEA2(1'b1), .CEB2(1'b1), .CEC(1'b1), .CED(1'b0), .CEAD(1'b0), .CEM(1'b1), .CEP(1'b1),
- .ALUMODE(4'b0011), .CARRYINSEL(3'b000), .INMODE(5'b00000), .OPMODE(7'b0110101),
- .A(int_sin_wire),
- .B(int_corr_wire),
- .C({int_cos_reg, 24'h7fffff}),
- .CARRYIN(1'b0),
- .PATTERNBDETECT(int_pbd_wire[1]),
- .P(int_p_wire[1])
- );
- DSP48E1 #(
- .ALUMODEREG(0), .CARRYINSELREG(0), .INMODEREG(0), .OPMODEREG(0),
- .CARRYINREG(0),
- .USE_PATTERN_DETECT("PATDET"), .MASK(48'hffffff000000)
- ) dsp_2 (
- .CLK(aclk),
- .RSTA(1'b0), .RSTB(1'b0), .RSTC(1'b0), .RSTM(1'b0), .RSTP(1'b0),
- .CEA2(1'b1), .CEB2(1'b1), .CEC(1'b1), .CED(1'b0), .CEAD(1'b0), .CEM(1'b1), .CEP(1'b1),
- .ALUMODE(4'b0000), .CARRYINSEL(3'b000), .INMODE(5'b00000), .OPMODE(7'b0110101),
- .A(int_cos_wire),
- .B(int_corr_wire),
- .C({int_sin_reg, 24'h7fffff}),
- .CARRYIN(1'b0),
- .PATTERNBDETECT(int_pbd_wire[2]),
- .P(int_p_wire[2])
- );
- assign dout = {int_p_wire[2][47:25], int_p_wire[2][24] | int_pbd_wire[2], int_p_wire[1][47:25], int_p_wire[1][24] | int_pbd_wire[1]};
- endmodule
|