基于labview和fpga的信号发生器

链接: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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值