前记
师夷长技以自强
1.基本概念
DDS:Direct Digital Sythesizer数字合成器,与ROM配合,可以通过频率控制字和相位控制字来输出频率和相位不同的正弦波。DDS结构简单,易于编写,常用于信号发生器中。
DDS的结构框图:
其中的N取32位,M取12位,也就是说模型数据表ROM中保存了4093个正弦波数据。
2.模块设计
信号 | 说明 |
Clk | 时钟 |
Rst_n | 复位 |
Fword[31:0] | 频率控制字 |
Pword[11:0] | 相位控制字 |
Rom_Addr[11:0] | ROM地址 |
3.编码
module DDS(
Clk,
Rst_n,
Fword,
Pword,
Rom_Addr
);
input Clk;
input Rst_n;
input [31:0]Fword;
input [11:0]Pword;
output [11:0]Rom_Addr;
reg [31:0]Fword_r;
always@(posedge Clk,negedge Rst_n)
if(!Rst_n)
Fword_r <= 32'd0;
else
Fword_r <= Fword;
reg [31:0]Acc;
always@(posedge Clk,negedge Rst_n)
if(!Rst_n)
Acc <= 32'd0;
else
Acc <= Acc + Fword_r;
assign Rom_Addr = Acc[31:20] + Pword;
endmodule
module top(
Clk,
Rst_n,
Fword,
Pword,
q
);
input Clk;
input Rst_n;
input [31:0]Fword;
input [11:0]Pword;
output [11:0]q;
wire [11:0]Rom_Addr;
DDS DDS(
.Clk(Clk),
.Rst_n(Rst_n),
.Fword(Fword),
.Pword(Pword),
.Rom_Addr(Rom_Addr)
);
rom rom(
.address(Rom_Addr),
.clock(Clk),
.q(q)
);
endmodule
编写仿真的文件
`timescale 1ns/1ns
module DDS_tb;
reg Clk;
reg Rst_n;
reg [31:0]Fword;
reg [11:0]Pword;
wire [11:0]q;
top top(
.Clk(Clk),
.Rst_n(Rst_n),
.Fword(Fword),
.Pword(Pword),
.q(q)
);
initial Clk = 0;
always #10 Clk = ~Clk;
initial begin
Rst_n = 0;
#20;
Rst_n = 1;
Fword = 32'd2097152;
Pword = 0;
#100000;
$stop;
end
endmodule
4.仿真结果
1.
Fword = 32'd1048576;
Pword = 0;
2.
Fword = 32'd1048576;
Pword = 12'd1048;
3.
Fword = 32'd2097152;
Pword = 12'd1048;