链接:https://pan.baidu.com/s/1JPUTi5nAWVgTLcPWpMde_Q
提取码:1234
基于labview和fpga的信号发生器
要求:
【1】正弦波、方波、锯齿波、三角波。
【2】频率、幅值、相位可调,调节步进值:频率0.1,幅值0.1,相位1;
【3】频率最高:20k;峰值最高:3.3。
【4】波形选择控制字 频率控制字 相位控制字幅值控制字由labbiew产生然后发送给fpga进行控制。
【5】串口9600,数据协议由FPGA进行确定。
module DDS(
clk,
reset_n,
dds_data_out,
set_waveform,
set_f,
set_a,
set_p
);
input clk;//时钟输入
input reset_n;//复位输入
input [1:0] set_waveform;//2比特,占用1帧,由串口的第1帧数据的第1、2比特传入
input [31:0] set_f;//21比特,占用3帧,由串口的第2、3、4帧数据传入,范围为8590~1717987,对应100Hz到20K
input [6:0] set_a;//7比特,占用1帧,由串口的第5帧的前7个比特数据传入,范围为1~100
input [9:0] set_p;//10比特,占用2帧,由串口的第6、7帧数据传入,,范围为1~1023
output [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;
reg [31:0] set_f_reg;
/***********************************/
// assign f32_bus[31:21] = 11'd0;//初始化,高位置低
// assign f32_bus[20:0] = set_f_reg;//低位可以设置DDS的输出频率
assign f32_bus = set_f_reg;//低位可以设置DDS的输出频率
/*********************元件例化************************************/
adder_32 adder_32_1(
.data1(f32_bus),//设置频率值
.data2(reg32_out),
.sum(reg32_in)
);
reg32 reg32_1(
.clk(clk),
.reset(reset_n),
.data_in(reg32_in),
.data_out(reg32_out)
);
/***********************设置相位***************************/
// 功能:设置相位
// 说明:
// set_p设置相位,范围为0~1023,对应的相位范围为0~359,
// 比如设置为1时,对应的相位为0.35,设置为100对应为35,设置为1000,对应350
// ***********************************************************
adder_10 adder_10_1(
.data1(set_p),//设置相位值
.data2(reg32_out[31:23]),
.sum(reg10_in)
);
reg_10 reg_10_1(
.clk(clk),
.reset(reset_n),
.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));//锯齿波
/***********************设置波形***************************/
// 功能:设置波形
// 说明:
//set_waveform设置波形,2比特,占用1帧,由串口的第1帧数据的第1、2比特传入
// 2'b00://正弦波
// 2'b01://三角波
// 2'b10://方波
// 2'b11://锯齿波
// ***********************************************************
/***********************设置频率***************************/
// 功能:设置频率
// 说明:
//set_f设置频率
//设置范围为100Hz到20KHz,对应set_f范围为8590~1717987
// 其他频率值对应文件《频率控制字.xlsx》里面的公式来计算
// M=2^N*Fout/Fclk,
// Fout为要输出频率,Fclk为板子的时钟50M,
// N位相位累加器的位宽32bit,M为频率控制字
// ***********************************************************
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 <= sin_data;// tri_data
set_f_reg <= set_f;设置范围为100Hz到20KHz
end
2'b10://方波
begin
dds_data_reg <= sin_data;//方波 squ_data
set_f_reg <= set_f;设置范围为100Hz到20KHz
end
2'b11://锯齿波
begin
dds_data_reg <= sin_data;//锯齿波 saw_data
set_f_reg <= set_f;设置范围为100Hz到20KHz
end
default:
begin
dds_data_reg <= sin_data;//正弦波
set_f_reg <= set_f;//设置范围为100Hz到20KHz
end
endcase;
end
/***********************设置电压幅值***************************/
// 功能:设置电压幅值
// 说明:
// 设置电压幅值,调节为0.033,比如发送幅值控制字为1,
// 则对应幅值为0.033,但是这个峰值太小了,发送100则对应峰值为3.3V
// ***********************************************************
reg [19:0] dds_data_r1;
always @(posedge clk or negedge reset_n)
begin
if(!reset_n)
begin
dds_data_r1 <= 20'd0;
end
else
begin
dds_data_r1 <= dds_data_reg * 80;//set_a
end
end
assign dds_data_out = dds_data_r1 / 8'd100;
endmodule