双非硕士 研一下学期视觉转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
即可得到仿真波形