日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

彻底理解DDS(信号发生器)的fpga实现(verilog设计代码)

發(fā)布時間:2024/3/24 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 彻底理解DDS(信号发生器)的fpga实现(verilog设计代码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

DDS(Direct Digital Synthesis)是一種把一系列數(shù)字信號通過D/A轉(zhuǎn)換器轉(zhuǎn)換成模擬信號的數(shù)字合成技術(shù)。

它有查表法和計(jì)算法兩種基本合成方法。在這里主要記錄DDS查表法的fpga實(shí)現(xiàn)。

查表法:由于ROM查詢法結(jié)構(gòu)簡單,只需要在ROM中存放不同相位對應(yīng)的幅度序列,然后通過相位累加器的輸出對其尋址,經(jīng)過數(shù)/模轉(zhuǎn)換和低通濾波(LPF)輸出便可以得到所需要的模擬信號。

查表法示意圖:

?

設(shè)計(jì):

  輸入:頻率控制字f,相位控制字,系統(tǒng)時鐘Fclk,復(fù)位信號reset

  輸出:幅度數(shù)據(jù)dout。

  關(guān)系:Tout = M * Tclk 即 Fout = Fclk / M 。其中,M為一個波形的離散點(diǎn)數(shù)。

簡單解釋一下:比如我們把一個正弦波形分為16個點(diǎn),而ROM容量為8,那么我們的點(diǎn)數(shù)間隔就要取16 / 8 = 2 ,即頻率控制字為 2 。

細(xì)節(jié):由于在設(shè)計(jì)時點(diǎn)數(shù)間隔不一定為1,即相位累加器的值可能大于ROM容量,所以我們要取它的高位到ROM中取相位對應(yīng)的幅度點(diǎn)。如:頻率控制字=4,則相位累加器的值為:0(00000),4(00100),8(01000),12(010100) .......? 也就是說因?yàn)椴竭M(jìn)4(100),后兩位將一直保持不變,高位每次加1(1個4),可以類比十進(jìn)制理解:每次加10:000,010,020,030...最后一位不變。

?代碼實(shí)現(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的時候,后面相位累加器輸出到實(shí)時相位時要砍掉它的位寬)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 ;//實(shí)時相位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位,因?yàn)閒每次+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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。