327 lines
13 KiB
Verilog

module DDS_Gen #(
parameter OUTPUT_WIDTH = 12,
parameter PHASE_WIDTH = 32
) (
input clk,
input [PHASE_WIDTH - 1 : 0] Fre_word, // (fre*4294967296)/clk/1000000
input [PHASE_WIDTH - 1 : 0] Pha_word, // (fre*4294967296)/clk/1000000
output [OUTPUT_WIDTH - 1 : 0] wave_out_sin,
output [OUTPUT_WIDTH - 1 : 0] wave_out_tri,
output [OUTPUT_WIDTH - 1 : 0] wave_out_saw
);
localparam [OUTPUT_WIDTH - 1 : 0] DC_SUB = 2**(OUTPUT_WIDTH-1);
reg [OUTPUT_WIDTH - 1 : 0] wave_out_sin_r;
reg [OUTPUT_WIDTH - 1 : 0] wave_out_tri_r;
reg [OUTPUT_WIDTH - 1 : 0] wave_out_saw_r;
reg [PHASE_WIDTH - 1 : 0] addr_r0 = 0;
reg [PHASE_WIDTH - 1 : 0] addr_r1 = 0;
always @(posedge clk) begin
addr_r0 <= addr_r0 + Fre_word;
addr_r1 <= addr_r0 + Pha_word;
end
always @(posedge clk ) begin
wave_out_saw_r <= addr_r1[PHASE_WIDTH - 1 : PHASE_WIDTH - OUTPUT_WIDTH];
end
assign wave_out_saw = wave_out_saw_r;
always @(posedge clk ) begin
if (addr_r1[PHASE_WIDTH - 1])
wave_out_tri_r <= (2**(OUTPUT_WIDTH + 1)-1) - addr_r1[PHASE_WIDTH - 1 : PHASE_WIDTH - OUTPUT_WIDTH - 1];
else
wave_out_tri_r <= addr_r1[PHASE_WIDTH - 1 : PHASE_WIDTH - OUTPUT_WIDTH - 1];
end
assign wave_out_tri = wave_out_tri_r - DC_SUB;
reg [9:0] addr_r = 0;
always @(posedge clk) begin
addr_r <= addr_r1[PHASE_WIDTH - 1 : PHASE_WIDTH - 10];
end
reg [7:0] addr;
always @(*) begin
case (addr_r[9:8])
2'b00 : begin addr <= addr_r[7:0]; end
2'b01 : begin addr <= addr_r[7:0] ^ 8'b1111_1111; end
2'b10 : begin addr <= addr_r[7:0]; end
2'b11 : begin addr <= addr_r[7:0] ^ 8'b1111_1111; end
default : begin addr <= 8'd0; end
endcase
end
reg signed [13:0] wave_sin_buf;
always @(*) begin
case (addr)
8'd0 : begin wave_sin_buf <= 0; end
8'd1 : begin wave_sin_buf <= 50; end
8'd2 : begin wave_sin_buf <= 101; end
8'd3 : begin wave_sin_buf <= 151; end
8'd4 : begin wave_sin_buf <= 201; end
8'd5 : begin wave_sin_buf <= 252; end
8'd6 : begin wave_sin_buf <= 302; end
8'd7 : begin wave_sin_buf <= 352; end
8'd8 : begin wave_sin_buf <= 402; end
8'd9 : begin wave_sin_buf <= 453; end
8'd10 : begin wave_sin_buf <= 503; end
8'd11 : begin wave_sin_buf <= 553; end
8'd12 : begin wave_sin_buf <= 603; end
8'd13 : begin wave_sin_buf <= 653; end
8'd14 : begin wave_sin_buf <= 703; end
8'd15 : begin wave_sin_buf <= 754; end
8'd16 : begin wave_sin_buf <= 804; end
8'd17 : begin wave_sin_buf <= 854; end
8'd18 : begin wave_sin_buf <= 904; end
8'd19 : begin wave_sin_buf <= 954; end
8'd20 : begin wave_sin_buf <= 1004; end
8'd21 : begin wave_sin_buf <= 1054; end
8'd22 : begin wave_sin_buf <= 1103; end
8'd23 : begin wave_sin_buf <= 1153; end
8'd24 : begin wave_sin_buf <= 1203; end
8'd25 : begin wave_sin_buf <= 1253; end
8'd26 : begin wave_sin_buf <= 1302; end
8'd27 : begin wave_sin_buf <= 1352; end
8'd28 : begin wave_sin_buf <= 1402; end
8'd29 : begin wave_sin_buf <= 1451; end
8'd30 : begin wave_sin_buf <= 1501; end
8'd31 : begin wave_sin_buf <= 1550; end
8'd32 : begin wave_sin_buf <= 1600; end
8'd33 : begin wave_sin_buf <= 1649; end
8'd34 : begin wave_sin_buf <= 1698; end
8'd35 : begin wave_sin_buf <= 1747; end
8'd36 : begin wave_sin_buf <= 1796; end
8'd37 : begin wave_sin_buf <= 1845; end
8'd38 : begin wave_sin_buf <= 1894; end
8'd39 : begin wave_sin_buf <= 1943; end
8'd40 : begin wave_sin_buf <= 1992; end
8'd41 : begin wave_sin_buf <= 2041; end
8'd42 : begin wave_sin_buf <= 2090; end
8'd43 : begin wave_sin_buf <= 2138; end
8'd44 : begin wave_sin_buf <= 2187; end
8'd45 : begin wave_sin_buf <= 2235; end
8'd46 : begin wave_sin_buf <= 2284; end
8'd47 : begin wave_sin_buf <= 2332; end
8'd48 : begin wave_sin_buf <= 2380; end
8'd49 : begin wave_sin_buf <= 2428; end
8'd50 : begin wave_sin_buf <= 2476; end
8'd51 : begin wave_sin_buf <= 2524; end
8'd52 : begin wave_sin_buf <= 2572; end
8'd53 : begin wave_sin_buf <= 2620; end
8'd54 : begin wave_sin_buf <= 2667; end
8'd55 : begin wave_sin_buf <= 2715; end
8'd56 : begin wave_sin_buf <= 2762; end
8'd57 : begin wave_sin_buf <= 2809; end
8'd58 : begin wave_sin_buf <= 2857; end
8'd59 : begin wave_sin_buf <= 2904; end
8'd60 : begin wave_sin_buf <= 2951; end
8'd61 : begin wave_sin_buf <= 2998; end
8'd62 : begin wave_sin_buf <= 3044; end
8'd63 : begin wave_sin_buf <= 3091; end
8'd64 : begin wave_sin_buf <= 3137; end
8'd65 : begin wave_sin_buf <= 3184; end
8'd66 : begin wave_sin_buf <= 3230; end
8'd67 : begin wave_sin_buf <= 3276; end
8'd68 : begin wave_sin_buf <= 3322; end
8'd69 : begin wave_sin_buf <= 3368; end
8'd70 : begin wave_sin_buf <= 3414; end
8'd71 : begin wave_sin_buf <= 3460; end
8'd72 : begin wave_sin_buf <= 3505; end
8'd73 : begin wave_sin_buf <= 3551; end
8'd74 : begin wave_sin_buf <= 3596; end
8'd75 : begin wave_sin_buf <= 3641; end
8'd76 : begin wave_sin_buf <= 3686; end
8'd77 : begin wave_sin_buf <= 3731; end
8'd78 : begin wave_sin_buf <= 3776; end
8'd79 : begin wave_sin_buf <= 3820; end
8'd80 : begin wave_sin_buf <= 3865; end
8'd81 : begin wave_sin_buf <= 3909; end
8'd82 : begin wave_sin_buf <= 3953; end
8'd83 : begin wave_sin_buf <= 3997; end
8'd84 : begin wave_sin_buf <= 4041; end
8'd85 : begin wave_sin_buf <= 4085; end
8'd86 : begin wave_sin_buf <= 4128; end
8'd87 : begin wave_sin_buf <= 4172; end
8'd88 : begin wave_sin_buf <= 4215; end
8'd89 : begin wave_sin_buf <= 4258; end
8'd90 : begin wave_sin_buf <= 4301; end
8'd91 : begin wave_sin_buf <= 4343; end
8'd92 : begin wave_sin_buf <= 4386; end
8'd93 : begin wave_sin_buf <= 4428; end
8'd94 : begin wave_sin_buf <= 4471; end
8'd95 : begin wave_sin_buf <= 4513; end
8'd96 : begin wave_sin_buf <= 4555; end
8'd97 : begin wave_sin_buf <= 4596; end
8'd98 : begin wave_sin_buf <= 4638; end
8'd99 : begin wave_sin_buf <= 4679; end
8'd100 : begin wave_sin_buf <= 4720; end
8'd101 : begin wave_sin_buf <= 4761; end
8'd102 : begin wave_sin_buf <= 4802; end
8'd103 : begin wave_sin_buf <= 4843; end
8'd104 : begin wave_sin_buf <= 4883; end
8'd105 : begin wave_sin_buf <= 4924; end
8'd106 : begin wave_sin_buf <= 4964; end
8'd107 : begin wave_sin_buf <= 5004; end
8'd108 : begin wave_sin_buf <= 5044; end
8'd109 : begin wave_sin_buf <= 5083; end
8'd110 : begin wave_sin_buf <= 5122; end
8'd111 : begin wave_sin_buf <= 5162; end
8'd112 : begin wave_sin_buf <= 5201; end
8'd113 : begin wave_sin_buf <= 5239; end
8'd114 : begin wave_sin_buf <= 5278; end
8'd115 : begin wave_sin_buf <= 5316; end
8'd116 : begin wave_sin_buf <= 5354; end
8'd117 : begin wave_sin_buf <= 5392; end
8'd118 : begin wave_sin_buf <= 5430; end
8'd119 : begin wave_sin_buf <= 5468; end
8'd120 : begin wave_sin_buf <= 5505; end
8'd121 : begin wave_sin_buf <= 5542; end
8'd122 : begin wave_sin_buf <= 5579; end
8'd123 : begin wave_sin_buf <= 5616; end
8'd124 : begin wave_sin_buf <= 5652; end
8'd125 : begin wave_sin_buf <= 5689; end
8'd126 : begin wave_sin_buf <= 5725; end
8'd127 : begin wave_sin_buf <= 5761; end
8'd128 : begin wave_sin_buf <= 5796; end
8'd129 : begin wave_sin_buf <= 5832; end
8'd130 : begin wave_sin_buf <= 5867; end
8'd131 : begin wave_sin_buf <= 5902; end
8'd132 : begin wave_sin_buf <= 5937; end
8'd133 : begin wave_sin_buf <= 5971; end
8'd134 : begin wave_sin_buf <= 6006; end
8'd135 : begin wave_sin_buf <= 6040; end
8'd136 : begin wave_sin_buf <= 6074; end
8'd137 : begin wave_sin_buf <= 6107; end
8'd138 : begin wave_sin_buf <= 6141; end
8'd139 : begin wave_sin_buf <= 6174; end
8'd140 : begin wave_sin_buf <= 6207; end
8'd141 : begin wave_sin_buf <= 6239; end
8'd142 : begin wave_sin_buf <= 6272; end
8'd143 : begin wave_sin_buf <= 6304; end
8'd144 : begin wave_sin_buf <= 6336; end
8'd145 : begin wave_sin_buf <= 6368; end
8'd146 : begin wave_sin_buf <= 6399; end
8'd147 : begin wave_sin_buf <= 6431; end
8'd148 : begin wave_sin_buf <= 6462; end
8'd149 : begin wave_sin_buf <= 6493; end
8'd150 : begin wave_sin_buf <= 6523; end
8'd151 : begin wave_sin_buf <= 6553; end
8'd152 : begin wave_sin_buf <= 6584; end
8'd153 : begin wave_sin_buf <= 6613; end
8'd154 : begin wave_sin_buf <= 6643; end
8'd155 : begin wave_sin_buf <= 6672; end
8'd156 : begin wave_sin_buf <= 6701; end
8'd157 : begin wave_sin_buf <= 6730; end
8'd158 : begin wave_sin_buf <= 6759; end
8'd159 : begin wave_sin_buf <= 6787; end
8'd160 : begin wave_sin_buf <= 6815; end
8'd161 : begin wave_sin_buf <= 6843; end
8'd162 : begin wave_sin_buf <= 6870; end
8'd163 : begin wave_sin_buf <= 6897; end
8'd164 : begin wave_sin_buf <= 6925; end
8'd165 : begin wave_sin_buf <= 6951; end
8'd166 : begin wave_sin_buf <= 6978; end
8'd167 : begin wave_sin_buf <= 7004; end
8'd168 : begin wave_sin_buf <= 7030; end
8'd169 : begin wave_sin_buf <= 7056; end
8'd170 : begin wave_sin_buf <= 7081; end
8'd171 : begin wave_sin_buf <= 7106; end
8'd172 : begin wave_sin_buf <= 7131; end
8'd173 : begin wave_sin_buf <= 7156; end
8'd174 : begin wave_sin_buf <= 7180; end
8'd175 : begin wave_sin_buf <= 7204; end
8'd176 : begin wave_sin_buf <= 7228; end
8'd177 : begin wave_sin_buf <= 7251; end
8'd178 : begin wave_sin_buf <= 7275; end
8'd179 : begin wave_sin_buf <= 7298; end
8'd180 : begin wave_sin_buf <= 7320; end
8'd181 : begin wave_sin_buf <= 7343; end
8'd182 : begin wave_sin_buf <= 7365; end
8'd183 : begin wave_sin_buf <= 7387; end
8'd184 : begin wave_sin_buf <= 7408; end
8'd185 : begin wave_sin_buf <= 7430; end
8'd186 : begin wave_sin_buf <= 7451; end
8'd187 : begin wave_sin_buf <= 7472; end
8'd188 : begin wave_sin_buf <= 7492; end
8'd189 : begin wave_sin_buf <= 7512; end
8'd190 : begin wave_sin_buf <= 7532; end
8'd191 : begin wave_sin_buf <= 7552; end
8'd192 : begin wave_sin_buf <= 7571; end
8'd193 : begin wave_sin_buf <= 7590; end
8'd194 : begin wave_sin_buf <= 7609; end
8'd195 : begin wave_sin_buf <= 7627; end
8'd196 : begin wave_sin_buf <= 7646; end
8'd197 : begin wave_sin_buf <= 7664; end
8'd198 : begin wave_sin_buf <= 7681; end
8'd199 : begin wave_sin_buf <= 7698; end
8'd200 : begin wave_sin_buf <= 7715; end
8'd201 : begin wave_sin_buf <= 7732; end
8'd202 : begin wave_sin_buf <= 7749; end
8'd203 : begin wave_sin_buf <= 7765; end
8'd204 : begin wave_sin_buf <= 7781; end
8'd205 : begin wave_sin_buf <= 7796; end
8'd206 : begin wave_sin_buf <= 7812; end
8'd207 : begin wave_sin_buf <= 7827; end
8'd208 : begin wave_sin_buf <= 7841; end
8'd209 : begin wave_sin_buf <= 7856; end
8'd210 : begin wave_sin_buf <= 7870; end
8'd211 : begin wave_sin_buf <= 7884; end
8'd212 : begin wave_sin_buf <= 7897; end
8'd213 : begin wave_sin_buf <= 7910; end
8'd214 : begin wave_sin_buf <= 7923; end
8'd215 : begin wave_sin_buf <= 7936; end
8'd216 : begin wave_sin_buf <= 7948; end
8'd217 : begin wave_sin_buf <= 7960; end
8'd218 : begin wave_sin_buf <= 7972; end
8'd219 : begin wave_sin_buf <= 7983; end
8'd220 : begin wave_sin_buf <= 7994; end
8'd221 : begin wave_sin_buf <= 8005; end
8'd222 : begin wave_sin_buf <= 8016; end
8'd223 : begin wave_sin_buf <= 8026; end
8'd224 : begin wave_sin_buf <= 8036; end
8'd225 : begin wave_sin_buf <= 8045; end
8'd226 : begin wave_sin_buf <= 8055; end
8'd227 : begin wave_sin_buf <= 8064; end
8'd228 : begin wave_sin_buf <= 8072; end
8'd229 : begin wave_sin_buf <= 8081; end
8'd230 : begin wave_sin_buf <= 8089; end
8'd231 : begin wave_sin_buf <= 8097; end
8'd232 : begin wave_sin_buf <= 8104; end
8'd233 : begin wave_sin_buf <= 8111; end
8'd234 : begin wave_sin_buf <= 8118; end
8'd235 : begin wave_sin_buf <= 8125; end
8'd236 : begin wave_sin_buf <= 8131; end
8'd237 : begin wave_sin_buf <= 8137; end
8'd238 : begin wave_sin_buf <= 8142; end
8'd239 : begin wave_sin_buf <= 8148; end
8'd240 : begin wave_sin_buf <= 8153; end
8'd241 : begin wave_sin_buf <= 8157; end
8'd242 : begin wave_sin_buf <= 8162; end
8'd243 : begin wave_sin_buf <= 8166; end
8'd244 : begin wave_sin_buf <= 8170; end
8'd245 : begin wave_sin_buf <= 8173; end
8'd246 : begin wave_sin_buf <= 8176; end
8'd247 : begin wave_sin_buf <= 8179; end
8'd248 : begin wave_sin_buf <= 8182; end
8'd249 : begin wave_sin_buf <= 8184; end
8'd250 : begin wave_sin_buf <= 8186; end
8'd251 : begin wave_sin_buf <= 8188; end
8'd252 : begin wave_sin_buf <= 8189; end
8'd253 : begin wave_sin_buf <= 8190; end
8'd254 : begin wave_sin_buf <= 8191; end
8'd255 : begin wave_sin_buf <= 8191; end
default : begin wave_sin_buf <= 0; end
endcase
end
always @(*) begin
case (addr_r[9])
1'b0 : begin wave_out_sin_r <= wave_sin_buf[13 : 14 - OUTPUT_WIDTH]; end
1'b1 : begin wave_out_sin_r <= -wave_sin_buf[13 : 14 - OUTPUT_WIDTH]; end
default : begin wave_out_sin_r <= 14'd0; end
endcase
end
assign wave_out_sin = wave_out_sin_r;
endmodule