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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

它有查表法和計算法兩種基本合成方法。在這里主要記錄DDS查表法的fpga實現。

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

查表法示意圖:

?

設計:

  輸入:頻率控制字f,相位控制字,系統時鐘Fclk,復位信號reset

  輸出:幅度數據dout。

  關系:Tout = M * Tclk 即 Fout = Fclk / M 。其中,M為一個波形的離散點數。

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

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

?代碼實現:

module DDS_Module(clk ,reset ,f_ctrl ,p_ctrl ,dout);input clk ;input reset ;input [2:0]f_ctrl ;//(取值限制為2的倍數)input [9:0]p_ctrl ;output [9:0]dout ;//頻率控制字寄存器(頻率)(大于1的時候,后面相位累加器輸出到實時相位時要砍掉它的位寬)reg [2:0]f_regist ;//(取值限制為2的倍數)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核的,上節內容。

`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°

總結

以上是生活随笔為你收集整理的彻底理解DDS(信号发生器)的fpga实现(verilog设计代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。