FPGA自学教程 10 DDS模拟 FPGA设计

文章介绍了使用DDS(直接数字频率合成)技术在FPGA中实现频率合成的方法,涉及Vivado软件中的ROMIP核配置,以及如何预加载波形数据到ROM中。通过频率控制字和相位控制字的同步寄存器,结合相位累加器计算波形数据表地址,从而生成所需信号。同时,提供了DDS模块的Verilog代码及仿真过程。
摘要由CSDN通过智能技术生成

双非硕士 研一下学期视觉转FPGA

长路漫漫,但希望前途光明

DDS是一种新型的频率合成技术,由于其较容易实现频率、相位以及幅度的数控调制,故而广泛应用于通信领域。

以下是其工作原理

我们可以使用ROM作为存储波形数据的存储器,首先在vivado软件中定义以下IP核

 双击选定后,进入以下界面,根据箭头操作,将其改名为ROM,并选择最简单的ROM接口

 再修改以下选项,先不要关闭页面!

由于ROM模块是可以提前定义的,我们可以预先存储波形数据到ROM中,这里我们选择小梅哥自己研发的波形产生数据程序,选择并修改为以下选项

将得到的coe文件存放到创建的DDS根目录下

回到刚刚创建IP核的界面 ,根据箭头操作,载入刚刚创建的coe文件。

点击下方的OK代表创建成功

双击ROM.veo文件,copy并例化到DDS模块下即可

 

 根据上述的工程流程图,可以写出代码,内容如下:

module DDS_Module(
    Clk,
    Reset_n,
    Fword,
    Pword,
    Data
);
    input Clk;
    input Reset_n;
    input [31:0]Fword;
    input [11:0]Pword;
    output [13:0]Data;
    
    //频率控制字同步寄存器
    reg [31:0]Fword_r;
    always@(posedge Clk)
        Fword_r <= Fword;
    
    //相位控制字同步寄存器
    reg [11:0]Pword_r;
    always@(posedge Clk)
        Pword_r <= Pword; 
    
    //相位累加器    
    reg [31:0]Freq_ACC;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        Freq_ACC <= 0;
    else
        Freq_ACC <= Fword_r + Freq_ACC;
 
    //波形数据表地址
    wire [11:0]Rom_Addr;      
    assign Rom_Addr = Freq_ACC[31:20] + Pword_r;
    
    rom rom(
      .clka(Clk),
      .addra(Rom_Addr),
      .douta(Data)
    );
    
endmodule

编写仿真文件

`timescale 1ns / 1ps

module DDS_666_tb();
    
    reg Clk;
    reg  Reset_n;
    reg [31:0]FwordA,FwordB;
    reg [11:0]PwordA,PwordB;
    wire [13:0]DataA,DataB;   
    
    DDS_ROM_666 DDS_ROM_666_A(
        Clk,
        Reset_n,
        FwordA,
        PwordA,
        DataA
    );
    
    DDS_ROM_666 DDS_ROM_666_B(
        Clk,
        Reset_n,
        FwordB,
        PwordB,
        DataB
    );
    
    initial Clk = 1;
    always #10 Clk = ~Clk;
    
    initial begin
        Reset_n = 0;
        FwordA = 65536;
        PwordA=0;
        FwordB = 65536;
        PwordB=1024;
        #201;
        Reset_n = 1;
        #5000000;
        FwordA = 65536 *1024;  
        FwordB = 65536 *1024; 
        PwordA=0;
        PwordB=2048;
        #1000000;
        $stop;        
    end
    
    
endmodule

即可得到仿真波形

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值