基于FPGA的信号发生器

闭关半年,学习FPGA,其中学到了很多东西。使用的Verilog,学过VHDL,但是不熟悉。接下来的几篇文章都是关于FPGA的。转眼就到大四了。以后准备找FPGA的工作。开始正题,先看效果:基于FPGA的信号发生器_第1张图片
基于FPGA的信号发生器_第2张图片
基于FPGA的信号发生器_第3张图片
基于FPGA的信号发生器_第4张图片
上面图片中第一排是FPGA输出到DA的数字信号,第二排是用AD采集到DA输出的数据。可调幅调频调波形,现在的波形只有正弦波,三角波,方波,可以在添加其他波形。调幅,是用硬件滑动变阻器调节。调频,是利用时钟分频,但是不能称作DDS,因为不能调到已知频率(因为我们按键每次分频系数加一),但可以自己计算分频系数,调到已知频率,频率按键控制。调波形,用的三个ROM存储各种波形的数据,按键来控制切换。

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
    FREQ_ADJ <= 8'd0;
    cnt <= 2'd0;
    end
    else 
    case(key)
    4'b0001:
            if(cnt < 2'd2)
            cnt <= cnt + 1'b1;
            else
            cnt <= 2'd0;
    4'b0011:
            if(FREQ_ADJ < 8'd255)
            FREQ_ADJ <= FREQ_ADJ + 1'b1;
            else 
            FREQ_ADJ <= FREQ_ADJ;
    4'b0100:
            if(FREQ_ADJ > 8'd0)
            FREQ_ADJ <= FREQ_ADJ - 1'b1;
            else 
            FREQ_ADJ <= FREQ_ADJ;
    default: FREQ_ADJ <= FREQ_ADJ;
    endcase
end 

上述代码用来判断按键的值。

//频率调节计数器
always @(posedge clk or negedge rst_n) begin
    if(rst_n == 1'b0)
        freq_cnt <= 8'd0;
    else if(freq_cnt == FREQ_ADJ)    
        freq_cnt <= 8'd0;
    else         
        freq_cnt <= freq_cnt + 8'd1;
end

上述代码是用来分频的。

always @(posedge clk or negedge rst_n) begin
    if(rst_n == 1'b0)
        begin
        address_sin <= 8'd0;
        address_square <= 8'd0;
        address_triangle <= 8'd0;
        end 
    else begin
        case(cnt)
        2'd0:
             if(freq_cnt == FREQ_ADJ)
             begin
             address_sin <=  address_sin + 1'b1;
             rd_data <= data_sin;
             end
             else
             begin
             address_sin <=  address_sin;
             rd_data <= data_sin;
             end
        2'd1:
            if(freq_cnt == FREQ_ADJ)
             begin
             address_square <=  address_square + 1'b1;
             rd_data <= data_square;
             end
             else
             begin
             address_square <=  address_square;
             rd_data <= data_square;
             end
        2'd2:
            if(freq_cnt == FREQ_ADJ)
             begin
             address_triangle <=  address_triangle + 1'b1;
             rd_data <= data_triangle;
             end
             else
             begin
             address_triangle <=  address_triangle;
             rd_data <= data_triangle;
             end
        endcase   
    end            
end

上述是用来调节波形。
原理我就不细讲了,很简单,不懂的找我。后面一定要做一个DDS来玩,这个东西比较理想,可能只能用于毕设或者自己玩。我使用的AD9708。我买的正点原子的AD/DA高速模块,我还做了一个数字示波器,刚好把这个模块功能榨干了。下一篇介绍。源码,今天上传不了,后面会留在评论区。可以私聊我,免费。QQ:1757334763

你可能感兴趣的:(FPGA)