DDS生成任意波形的方法及Verilog代碼實例(1)- 準備工作

2020-12-15 電子工程專輯

DDS很重要,為此蘇老師專門開設了一門「DDS信號源設計」的直播課程,並花了3個月的時間精心打造了一系列可用於DDS設計訓練的硬體套件,目標是以非常低的成本製作頻率高達10MHz的任意波形信號源,並從中深刻學習數字邏輯、模擬電路、信號與系統、電路仿真工具等技術基礎。從今天的文章開始,分5次由淺入深地帶領大家了解DDS的原理及信號源製作中的關鍵要點。



DDS是一種用於通過單個固定頻率的參考時鐘信號生成任意波形的頻率合成器,被廣泛用於測試測量儀表和通信系統中。也是學習FPGA、大學生電子設計競賽備賽必學的原理性技能,在這裡我們通過FPGA Verilog代碼編程示例一步步讓大家理解一下DDS的基本概念、構成以及各項指標的含義。


用以學習和體驗DDS的開源平臺

硬禾學堂專門設計了兩款用以學習DDS的平臺:

  • 任意波形信號源/可編程直流電源的開源學習平臺

  • 小腳丫FPGA綜合技能訓練平臺

任意波形信號源/可編程直流電源的開源學習平臺



這兩款平臺可以支持任意一款的小腳丫FPGA核心板,它們的DAC部分都是由R-2R網絡構成的,DDS部分的代碼也是通用的,不同的是輸出電平的調節方式以及對應於每個電阻節點的管腳順序。

它們都能通過FPGA中的Verilog邏輯編程實現以下的功能並能達到相應的性能:

  • DDS的主時鐘選擇為12M(案例中前面的例子)和120MHz(案例中後面的例子,由小腳丫外部的12MHz輸入時鐘,通過內部PLL倍頻到120MHz),使用120MHz的時鐘能夠生成0 - 15MHz(用8個點構成一個周期波形),甚至更高頻率的正弦波波形,輸出的信號波形可以是正弦波、三角波、鋸齒波、方波等;

  • 由於R-2R後面的運算放大器的性能限制,為保證在不同的頻率上實現恆定的信號幅度,這兩款板子的最高輸出頻率做了一定的限制,其中:

  • 兩款板子都可以通過UART同PC連接,通過PC上的軟體(比如LabView或用QT等自編)對FPGA中的參數進行設置,進而調節DDS輸出信號的波形、頻率、幅度和直流偏移等,第一款板子還可以調節雙通道直流電壓的輸出。


下面我們來看看在這兩款平臺上通過DDS能夠實現的任意波形及實現方法、相關的Verilog代碼。


DAC的選用說明


將數字波形錶轉換為模擬電信號需要數模轉換器 - DAC

DDS需要一個DAC將數字合成的波形轉化為模擬電信號,DAC的構成可以有多種形式:

  • 高速並行的DAC;

  • 低速串行的DAC;

  • R-2R構成的低成本DAC;

  • 通過PWM + RC構成的簡易DAC。


無論使用任何一種DAC,DDS的內核 - 邏輯構成代碼都是一樣的,差別在於最終驅動DAC時需要不同的時序邏輯、不同的DAC方式能夠支持的輸出信號頻率上限不同。

在我們推薦的兩款平臺上,都使用了R-2R的10位並行DAC,主要是成本低、速度高、連接簡單,R-2R的DAC和商用的高速並行DAC的區別主要有兩點:

  • R-2R無需與並行數據同步的時鐘,直接將FPGA內部的**被時鐘同步好的並行數據**輸出到10個電阻節點上就可以,因此PCB的布線以及電阻值的偏差會影響到輸出波形,這個在高速轉換的時候一定要注意,R-2R上的10個數據節點到FPGA管腳的長度不同也就意味著每個節點發生電壓變換的時間點是有差異的,這也就導致了波形上出現一定的失真(可能用肉眼觀察示波器的波形是分辨不出來的);

  • 基準電壓為FPGA晶片I/O的電壓,比如3.3V,因此在R-2R上得到的模擬波形的峰峰值也就是3.3Vpp,商用的DAC晶片一般都有專門的參考電壓管腳,比如自帶的1.024V或2V的參考電壓,或者連接外部的更高質量的參考電壓源,使用起來相對更靈活。

R-2R DAC的工作原理示意圖

在我們的兩款平臺上,通過R-2R模擬輸出信號頻率在內部主時鐘為120MHz時可以達到15MHz並能夠得到比較好的波形,實際測試在主時鐘216MHz的情況下R-2R也能正常運行,完美得到25MHz的正弦波波形,只是在這兩個平臺上沒有對末級的運算放大器做更複雜的設計,簡單的一階低通濾波以及所選器件的帶寬限制了其頻率上限,25MHz的正弦波經過末級的調理後幅度變小。

無論採用任何一款DAC,第一步就是要驗證從FPGA的邏輯到DAC是否正常工作(尤其是FPGA和R-2R網絡連接時管腳的分配),最簡單的就是輸出固定的數字,看輸出的直流電壓是否是你換算出來應該得到的模擬量,如下圖所示:


產生直流電壓用來驗證FPGA到DAC的鏈路是否能夠正常工作


細心的朋友可能觀察到了,上面的圖中用到了反向放大器且為單電源供電的結構。

FPGA到DAC的連接工作正常,下一步就可以開始各種波形的輸出了。

關於DDS的具體實現及Verilog的代碼示例,參見明天的「一個簡單的DDS」。


直播課程的二維碼如下:


相關焦點

  • 波形發生器設計,單片機、CPLD控制的任意波形發生器設計實例
    電路設計中充分利用MATLAB的仿真功能,將希望得到的波形信號在MATLAB中完成信號的產生、抽樣和模數轉換,並將得到的數字波形數據存放在數據存儲器中,通過單片機和CPLD控制,將波形數據讀出,送入後向通道進行A/D轉換和放大處理後得到所需的模擬信號波形。利用上述方法設計的任意波形發生器,信號產生靈活方便、功能擴展靈活、信號參數可調,實現了硬體電路的軟體化設計。
  • 國儀量子推出任意波形發生器AWG4100
    1開發背景在量子計算、量子精密測量、通信雷達、核磁共振光譜、半導體測試和納米技術等領域,任意波形發生器 (AWG)憑藉其出色的解析度和帶寬等性能有著非常普遍和廣泛的應用。為了更好地滿足客戶需求,任意波形發生器AWG4100設計有4個通道,每個通道可以獨立產生高達1.2 GSa/s採樣率、16位垂直解析度的單端波形輸出。每個通道還擁有最大512 MSa的存儲深度,同時提供獨立和組合播放兩種模式,能夠輕鬆應對各種不同場景的複雜波形需求。
  • 波形發生器進階篇,在LabVIEW中控制Analog Discover波形發生器
    波形發生器的使用已司空見慣,而本文對于波形發生器的講解,在於介紹如何在LabVIEW中控制Analog Discovery波形發生器。步驟1:材料必備條件:您必須已完成上一個項目中的步驟2。必須遵循上一個項目的選件2.1(即安裝LabVIEW)。
  • JavaScript用Math.random()生成隨機數
    1. 基本概念顧名思義,Math.random()方法就是用於生成隨機數的,因為單詞random的意思正是「隨機的」。該方法生成的結果是 [0, 1) 範圍內的浮點數,注意這是一個左閉右開的區間,即該區間包含0而不包含1。
  • AFG-303x/AFG-302x任意波形發生器的特點及應用範圍
    打開APP AFG-303x/AFG-302x任意波形發生器的特點及應用範圍 海洋興業科技 發表於 2021-01-06 09:38:34
  • 課程設計指導——如何應用Java反射技術靈活地創建程序類對象實例
    但要注意加載屬性文件的兩種不同的形式:(1)利用Class類中的getResourceAsStream方法Class類中的getResourceAsStream方法是查找具有給定名稱的資源,返回 InputStream類型的對象實例。
  • 近乎完美的DDS正弦波信號音生成器 上
    Webb1提出了數位訊號生成器頻率合成器的專利申請,其中描述了有關DDS生成包括正弦波等各種模擬波形的考慮因素,只需使用數個數字邏輯模塊即可實現。之後,Tierney等人2在1971年初發表了論文(後來成為大家頻繁引用的參考文獻),闡述了通過深化DDS操作進行正交生成來實現直接數字頻率生成,以及採樣系統理論相關局限性(字詞截斷[HJ1] 和頻率規劃)問題。
  • 十個生成模型(GANs)的最佳案例和原理 | 代碼+論文
    王小新 編譯原文作者:Sumeet Agrawal量子位 出品 | 公眾號 QbitAI生成對抗網絡(GANs)是一種能「教會」計算機勝任人類工作的有趣方法。一個好的對手能讓你成長更快,而GANs背後就是「從競爭中學習」的思路。
  • CVPR 2020論文開源項目一頁看盡,附代碼論文
    Shot Instance Segmentation with Polar Representation本文提出了PolarMask方法,是一種single shot的實例分割框架。PolarMask基於FCOS,把實例分割統一到了FCN的框架下。FCOS本質上是一種FCN的dense prediction的檢測框架,可以在性能上不輸anchor based的目標檢測方法。貢獻在於,把更複雜的實例分割問題,轉化成在網絡設計和計算量複雜度上和物體檢測一樣複雜的任務,把對實例分割的建模變得簡單和高效。
  • 極客DIY實例:自動按YubiKeys
    今天我們就通過一個實例來學習該過程——打造一個自動按YubiKeys機。緣起從事技術工作的小夥伴們可能很多人都知道YubiKey,比如下面的這個YubiKey 5C Nano。YubiKeys主要用來充當兩因素身份驗證。
  • 代碼也能預訓練,微軟&哈工大最新提出 CodeBERT 模型,支持自然...
    具體來說,CodeBERT抓住了自然語言和程式語言之間的語義聯繫,能夠支持自然語言代碼搜索等NL-PL理解任務以及一系列像代碼生成這樣的生成任務。例如在自然語言代碼搜索中,會使用與預訓練階段相同的輸入方式。而在代碼到文本的生成中,使用編碼器-解碼器框架,並使用CodeBERT初始化生成模型的編碼器。
  • Adobe改良圖像生成方法 | 已開源
    去年穀歌就提出了SinGAN,是第一個拿GAN在單幅自然圖像學習的非條件生成模型(ICCV 2019最佳論文)。  而最近,來自Adobe和漢堡大學的研究人員,對這個方法做了改進,探討了幾種讓GAN在單幅圖像提高訓練和生成能力的機制。  研究人員將改進的模型稱作ConSinGAN。
  • C sharp編程基礎實現多態的方法之二抽象類實例解析
    首先需要聲明一個父類(抽象類)Animal,然後在Animal類中聲明一個抽象方法Bark。第二步,分別聲明兩個子類Dog,Cat,重寫Animal類Bark方法。示例代碼如下:實現多態的示例代碼三、抽象類實現多態的實例練習要求:使用多態求矩形的面積和周長:
  • JavaScript:對象都是這樣生成的!
    1.1 構造函數的特點構造函數首先是一個函數,也就是說是 function 開頭的函數。其次函數體內部使用了 this 關鍵字,代表了所要生成的對象實例。在使用構造函數的時候,必需用 new 命令,調用 Book 函數。
  • java流程控制實例代碼演示for、while、break、return、switch等
    Java數據轉換和越界實例展示-附帶整個Java知識圖譜-建議收藏)通過關係操作符和邏輯操作符得出的結果就差強人意下面看一下實例代碼演示效果:java流程控制實例代碼演示圖上述案例演示的不夠全面
  • 和大家分享JS編程知識之JS的異常捕獲、事件實例詳解
    異常拋出描述的就是,當異常產生時候,可以將這個異常生成一個錯誤信息。這就是異常拋出。為了對onClick單擊事件有一個更進一步的了解,下面通過一個實例來說明onClick單擊事件的用法。示例代碼如下:為了對onMouseOver事件有一個更進一步的了解,下面通過一個實例來說明onMouseOver事件的用法。示例代碼如下:
  • 《部落與彎刀》控制臺作弊碼及使用方法的介紹 秘籍代碼有哪些?
    部落與彎刀秘籍代碼有哪些?遊戲中可以使用mod或是控制臺修改和獲得一些裝備,有些玩家不知道具體的作弊碼,小編這裡給大家帶來了部落與彎刀控制臺作弊碼及使用方法的介紹,詳情一起來看下文中介紹吧。
  • 《我的世界》生成別墅指令介紹 生成別墅方法
    我的世界生成別墅指令是什麼?在我的世界這款遊戲中,有著超多各不相同的指令在其中,每條指令都有獨屬於自己的效果,可以幫助玩家們更加方便的進行遊戲體驗,並且能夠讓玩家們的遊戲更舒爽,那麼在我的世界中又該如何生成別墅呢?就讓小編來帶領大家一同領略吧!
  • Verilog HDL簡明教程(2)
    本書中的所有實例都遵守這一規範。以下為建模一個半加器電路的模塊的簡單實例。>A3 (T1, A, Cin),orO1 (Cout, T1, T2, T3);endmodule在這一實例中,模塊包含門的實例語句,也就是說包含內置門xor、and和or 的實例語句。
  • 如何正確地創建和銷毀軟體應用系統中網絡通訊中的Socket對象實例
    (2)客戶/伺服器端通訊的工作原理如下示圖所示4、正確地應用Socket類的構造方法創建出Socket類的對象實例如下示圖為JDK API幫助文檔中所提供的Socket類的各種構造方法的定義,但在Socket類中兩個常用的構造方法分別是 Socket(InetAddress