彻底理解DDS(信号发生器)的fpga实现(verilog设计代码)
DDS(Direct Digital Synthesis)是一種把一系列數(shù)字信號通過D/A轉(zhuǎn)換器轉(zhuǎn)換成模擬信號的數(shù)字合成技術。
它有查表法和計算法兩種基本合成方法。在這里主要記錄DDS查表法的fpga實現(xiàn)。
查表法:由于ROM查詢法結(jié)構(gòu)簡單,只需要在ROM中存放不同相位對應的幅度序列,然后通過相位累加器的輸出對其尋址,經(jīng)過數(shù)/模轉(zhuǎn)換和低通濾波(LPF)輸出便可以得到所需要的模擬信號。
查表法示意圖:
?
設計:
輸入:頻率控制字f,相位控制字,系統(tǒng)時鐘Fclk,復位信號reset
輸出:幅度數(shù)據(jù)dout。
關系:Tout = M * Tclk 即 Fout = Fclk / M 。其中,M為一個波形的離散點數(shù)。
簡單解釋一下:比如我們把一個正弦波形分為16個點,而ROM容量為8,那么我們的點數(shù)間隔就要取16 / 8 = 2 ,即頻率控制字為 2 。
細節(jié):由于在設計時點數(shù)間隔不一定為1,即相位累加器的值可能大于ROM容量,所以我們要取它的高位到ROM中取相位對應的幅度點。如:頻率控制字=4,則相位累加器的值為:0(00000),4(00100),8(01000),12(010100) .......? 也就是說因為步進4(100),后兩位將一直保持不變,高位每次加1(1個4),可以類比十進制理解:每次加10:000,010,020,030...最后一位不變。
?代碼實現(xiàn):
module DDS_Module(clk ,reset ,f_ctrl ,p_ctrl ,dout);input clk ;input reset ;input [2:0]f_ctrl ;//(取值限制為2的倍數(shù))input [9:0]p_ctrl ;output [9:0]dout ;//頻率控制字寄存器(頻率)(大于1的時候,后面相位累加器輸出到實時相位時要砍掉它的位寬)reg [2:0]f_regist ;//(取值限制為2的倍數(shù))always @ (posedge clk)f_regist <= f_ctrl ;//相位累加器 (f * t) reg [12:0]p_add ;always@(posedge clk or negedge reset )if(!reset )p_add <= 0 ;elsep_add <= p_add + f_regist ;//相位控制字寄存器(初始相位)(相位偏移量)reg [9:0]p_regist ;always @ (posedge clk)p_regist <= p_ctrl ;//實時相位reg [9:0]p_now ;always@(posedge clk or negedge reset )if(!reset )p_now <= 0 ;elsep_now <= p_add[12:3] + p_regist ; //取相位累加器的前10位,因為f每次+4,后三位是不變的DDS_ROM DDS_ROM(.clka(clk),.addra(p_now),.douta(dout));endmodule這里是需要引用ROM的IP核的,上節(jié)內(nèi)容。
`timescale 1ns / 1ps module DDS_tb();reg clk ;reg reset ;reg [2:0]f_ctrl1 ;reg [2:0]f_ctrl2 ;reg [9:0]p_ctrl1 ;reg [9:0]p_ctrl2 ;wire [9:0]dout1 ;wire [9:0]dout2 ;DDS_Module DDS_Module1(.clk(clk) ,.reset(reset) ,.f_ctrl(f_ctrl1) ,.p_ctrl(p_ctrl1) ,.dout(dout1));DDS_Module DDS_Module2(.clk(clk) ,.reset(reset) ,.f_ctrl(f_ctrl2) ,.p_ctrl(p_ctrl2) ,.dout(dout2));initial clk = 1 ;always #10 clk = !clk ;initial begin reset = 0 ;f_ctrl1 = 0 ; p_ctrl1 = 0 ;f_ctrl2 = 0 ; p_ctrl2 = 0 ;#201 ;reset = 1 ;#201 ;f_ctrl1 = 3'd4;p_ctrl1 = 10'd0 ;f_ctrl2 = 3'd4;p_ctrl2 = 10'd0 ;#90000 ;#90000 ;#90000 ;#90000 ;f_ctrl1 = 3'd4;p_ctrl1 = 10'd0 ;f_ctrl2 = 3'd4;p_ctrl2 = 10'd256 ;#90000 ;#90000 ;#90000 ;f_ctrl1 = 3'd4;p_ctrl1 = 10'd0 ;f_ctrl2 = 3'd4;p_ctrl2 = 10'd512 ;#90000 ;#90000 ;#90000 ;$stop;end endmodule效果:分別是相位差? 0° ,90 °,180°
總結(jié)
以上是生活随笔為你收集整理的彻底理解DDS(信号发生器)的fpga实现(verilog设计代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交叉熵函数
- 下一篇: KBQA_多轮对话——模型源码解析(一)