链接:https://pan.baidu.com/s/1ehgg5bm-ir3oE2ggLflZ1A
提取码:1234
功能说明
采用FPGA实现正弦波、三角波、矩形波生成,
频率分别为100Hz~25k,实现频率步进调节;
输出信号幅度为0V~3.3V,并能步进调节;
实时显示波形类型、频率值、输出电压有效值等。
原理图设计:
部分代码:
module DDS(
clk,
reset,
dds_data_out,
set_waveform,
set_f,
set_a,
set_p
);
input clk;//时钟输入
input reset;//复位输入
input [1:0] set_waveform;
input [20:0] set_f;
input [4:0] set_a;
input [8:0] set_p;
output [9:0] dds_data_out;
wire clk;
wire [1:0] set_waveform;
wire [20:0] set_f;
wire [4:0] set_a;
wire [9:0] set_p;
wire [9:0] dds_data_out;
/**************连接线***************/
wire [31:0] f32_bus;//AC频率控制字输入
wire [31:0] reg32_out;//32位寄存器输出
wire [31:0] reg32_in;//32位寄存器输入
wire [8:0] reg10_in;
wire [8:0] reg10_out_address;
/**************缓存寄存器******************/
wire [9:0] sin_data;
wire [9:0] tri_data;
wire [9:0] squ_data;
//wire [9:0] saw_data;
reg [9:0] dds_data_reg;
reg [20:0] set_f_reg;
/***********************************/
assign f32_bus[31:21] = 11'd0;//初始化,高位置低
assign f32_bus[20:0] = set_f_reg;//低位可以设置DDS的输出频率
/*********************元件例化************************************/
adder_32 adder_32_1(.data1(f32_bus),.data2(reg32_out),.sum(reg32_in));//相位累加器
reg32 reg32_1(.clk(clk),.data_in(reg32_in),.data_out(reg32_out));//相位累加器
adder_10 adder_10_1(.data1(set_p),.data2(reg32_out[31:23]),.sum(reg10_in));//
reg_10 reg_10_1(.clk(clk),.data_in(reg10_in),.data_out(reg10_out_address));//
/*****************波形选择*******************************************/
sin_rom sin_rom_1(.address(reg10_out_address),.clock(clk),.q(sin_data));//正弦
tri_rom tri_rom_1(.address(reg10_out_address),.clock(clk),.q(tri_data));//三角
squ_rom squ_rom_1(.address(reg10_out_address),.clock(clk),.q(squ_data));//矩形
// saw_rom saw_rom_1(.address(reg10_out_address),.clock(clk),.q(saw_data));
/***********************设置波形和设置频率***************************/
always @(*)
begin
case (set_waveform)
2'b00://正弦波
begin
dds_data_reg <= sin_data;
set_f_reg <= set_f;//设置范围为100Hz到20KHz
end
2'b01://三角波
begin
dds_data_reg <= tri_data;
set_f_reg <= set_f;//固定为1KHz
end
2'b10:
begin
dds_data_reg <= squ_data;//方波
set_f_reg <= set_f;//固定为1KHz
end
default:
begin
dds_data_reg <= sin_data;//正弦波
set_f_reg <= set_f;//设置范围为100Hz到20KHz
end
endcase;
end
/***********************设置电压幅值***************************/
reg [19:0] dds_data_r1;
always @(posedge clk or negedge reset)
begin
if(!reset)
begin
dds_data_r1 <= 20'd0;
end
else
begin
dds_data_r1 <= dds_data_reg*set_a;
end
end
assign dds_data_out = dds_data_r1/10;//设置电压幅值
endmodule