`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: dds_wave
//////////////////////////////////////////////////////////////////////////////////
module dds_wave
(
input clk,
input key1,
output [7 : 0] dadata,
output da_clk
);
reg [15:0] key1_counter; //按键检测寄存器
reg [7:0] dadata_o;
reg dds_we=0;
reg [28:0] dds_data;
reg [1:0] dds_freq=0;
reg dds_we_req;
reg [14:0] timer=13'd0;
reg timer_trig=1'd0;
wire [7 : 0] sine;
assign sine_reg=sine[6:0];
assign da_clk=clk;
assign dadata=dadata_o;
//有符号数转化为无符号数输出到DA
always @(posedge clk)
begin
if(sine[7]==1'b1)
dadata_o<=sine-128;
else
dadata_o<=sine+128;
end
//控制DDS输出不同的频率
always @(posedge clk)
begin
//dds_we<=dds_we_req;
case(dds_freq)
2'b11:begin
//timer_trig <= 1'd1;
if (timer<11'd2046)
begin
dds_we<=1'd1;
dds_data <= 29'd53687091; //5MHz: (dds_data*2^29)/(50*1000000)
timer <= timer +1'd1;
end
else if (timer == 11'd2046)
begin
dds_we<=1'd0;
timer<=11'd2046;
end
end
default begin
// dds_we<=1'd0;
// timer<=11'd2046;
// dds_we<=dds_we_req;
end
endcase;
end
//按钮处理程序, 改变DDS的输出频率
always @(posedge clk)
begin
if (key1==1'b1) //如果按钮没有按下,寄存器为0
key1_counter<=0;
// dds_freq<=1'b0;
// dds_we_req<=1'b0;
// dds_freq<=dds_freq;
else if ((key1==1'b0)&& (key1_counter<=16'hc350)) //如果按钮按下并按下时间少于1ms,计数
key1_counter<=key1_counter+1'b1;
if (key1_counter==16'hc349) begin //一次按钮有效,改变DDS频率
dds_freq<=2'b11;
//dds_we_req<=1'b1;
end
else begin
dds_freq<= 2'd0;
//dds_we_req<=1'b0;
end
end
//DDS IP产生sin/cos波形
sin_cos sin_cos_inst (
.clk(clk), // input clk
.we(dds_we), // input we
.data(dds_data), // input [28 : 0] data
.cosine(cosine), // output [7 : 0] cosine
.sine(sine), // output [7 : 0] sine
.phase_out() // output [28 : 0] phase_out
);
endmodule
上面的程序老是有问题!大家可以帮我看看么? 0是按键按下 1是不按
|