資料介紹
描述
直接數字合成器 (DDS) 是軟件定義無線電和數字通信系統中的關鍵工具,因為它們提供了一種在數字域中生成復雜信號的方法,該信號也是可變的。雖然 DDS 背后的理論相當簡單,但第一次在 FPGA 中實現它可能有點挑戰性,這就是為什么我想創建這個項目作為一個非常簡單的示例,說明如何采用 Xilinx DDS 編譯器 IP 并獲得它在 Ultra96 板的可編程邏輯中運行。
也稱為數控振蕩器 (NCO),DDS 包含一個正弦曲線數據值的查找表,該表采用給定的相位值并輸出正弦曲線的適當數據/幅度值。該輸入值決定了輸出波形的頻率,該值越小,DDS 通過正弦查找表的速度越慢,輸出波形的頻率越低。相反,輸入值越高,DDS 通過查找表的速度越快,輸出波形的頻率越高。這個輸入值通常被稱為調諧字,但在賽靈思 DDS 編譯器 IP 中,它被稱為相位增量。
![pYYBAGOX1LWARV_QAABNVcEHZzg768.jpg](https://file.elecfans.com/web2/M00/83/8C/pYYBAGOX1LWARV_QAABNVcEHZzg768.jpg)
如上圖所示,該相位增量值 (Δθ) 越大,代表復雜波形的單位圓周圍的 DDS 步長越快。當 M 加倍時,產生的復雜波形的頻率也加倍,因為它繞單位圓的速度是原來的兩倍。與該單位圓的相位值相關的數據點存儲在 DDS 的查找表中。
在這一點上,我們可以看到 DDS 的主要優勢之一:我們可以通過改變告訴 DDS 多快通過查找表的輸入值(又名 - 多快繞單位圓移動)。
輸入相位增量值不斷添加到自身 (A1 和 D1) 以生成所需輸出波形的每個瞬時值,從而從查找表 (T1) 中獲取該瞬時相位值的適當數據值/幅度。
![poYBAGOX1LqAK50xAACqPYrOqig591.png](https://file.elecfans.com/web2/M00/83/03/poYBAGOX1LqAK50xAACqPYrOqig591.png)
為了演示 DDS 及其輸出波形頻率變化的容易程度,我決定一個簡單的啁啾波形是合適的。啁啾是正弦曲線以一個頻率開始,然后在一段時間內線性增加或減少(這有時也稱為掃描)。
![pYYBAGOX1MeAdGTJAAN8SsjycK0125.png](https://file.elecfans.com/web2/M00/83/8C/pYYBAGOX1MeAdGTJAAN8SsjycK0125.png)
我決定在 26 微秒內以 1MHz 的步長從 1MHz 到 25MHz 做一個簡單的啁啾(我的結構時鐘是 100MHz,即每個時鐘周期 10 納秒,我隨機選擇讓 DDS 編譯器輸出每個頻率 1 微秒以便在邏輯分析儀窗口中輕松查看)。
![poYBAGOX1NOAE4_2AASGOC9bzbw501.png](https://file.elecfans.com/web2/M00/83/03/poYBAGOX1NOAE4_2AASGOC9bzbw501.png)
通過遞歸地將 1MHz 的相位增量值添加到自身,然后將其作為輸入饋送到 DDS 編譯器,這實現了我的啁啾從 1MHz 到 FPGA 結構時鐘的一半(在 ILA 中采樣時保持奈奎斯特規則)以 1MHz 步長。我選擇只提高到 25MHz,這樣整個啁啾聲就可以立即顯示在我的屏幕上以進行截圖,但是我的結構時鐘設置為 100MHz,所以我可以提高到 50MHz。
我使用來自 PG141 的以下等式計算了 B 列中每個輸出波形頻率的 C 列中的相位增量值:
![pYYBAGOX1NaAWlYrAAAieBAIJxI312.png](https://file.elecfans.com/web2/M00/83/8C/pYYBAGOX1NaAWlYrAAAieBAIJxI312.png)
然后我將 C 列中的相位增量值轉換為十六進制以去掉小數位,因為我是在 Verilog 中編寫這段代碼的。我創建了 E 列和 F 列來表明相位增量的差異確實導致了與 1MHz 相同的十六進制值。
從我在之前的一個項目中為 Ultra96 生成的 Vivado 項目開始,需要將三件事添加到此 DDS 啁啾的頂層包裝器中:
1 - Xilinx DDS 編譯器。2 - 與 DDS 的 AXI Stream slave 和 master 接口的邏輯。3 - 一個集成邏輯分析儀 (ILA) IP,用于查看 DDS 的輸出波形。
在 Vivado 的 Flow Navigator 列下,打開 IP 存儲庫并搜索“DDS”。當 DDS 編譯器 IP 出現在 IP 存儲庫的列表中時,雙擊它后,將彈出一個對話框。單擊“自定義 IP”按鈕,將出現 DDS 編譯器的配置窗口。
![poYBAGOX1NuAVayUAABNhC3iQZg605.png](https://file.elecfans.com/web2/M00/83/03/poYBAGOX1NuAVayUAABNhC3iQZg605.png)
在如上所示的第一個選項卡中,出于我們的目的,所有默認設置都可以保留。
在第二個選項卡下,為相位增量和偏移可編程性選擇流式傳輸。我發現這使得從 AXI Stream 接口變得最簡單。
![poYBAGOX1N6ANcXoAABO5CJ8uP4769.png](https://file.elecfans.com/web2/M00/83/03/poYBAGOX1N6ANcXoAABO5CJ8uP4769.png)
此外,對于 DDS 編譯器的 AXI Stream 接口,在詳細實現選項卡下,選中“輸出 TREADY”框。我發現在處理 AXI Stream 時,TREADY 信號幾乎總是一個必要的信號。
![poYBAGOX1OqAHj6kAABSC4qazAk352.png](https://file.elecfans.com/web2/M00/83/03/poYBAGOX1OqAHj6kAABSC4qazAk352.png)
在添加 ILA 時,我總共添加了 4 個探針,用于監控 DDS 從接口上的輸入相位增量值以及 DDS 在其主接口上的輸出數據和相位值。我將 Ultra96 上的 UltraScale 芯片設置的深度盡可能大,以方便我的設計,即 65536。我建議始終嘗試設置 ILA 以捕獲盡可能多的數據。
![poYBAGOX1PCAZwgEAAIZ6FNmWNA206.png](https://file.elecfans.com/web2/M00/83/03/poYBAGOX1PCAZwgEAAIZ6FNmWNA206.png)
例化 ILA 和 DDS IP 模塊后,我編寫了自己的簡單狀態機來創建 AXI Stream 接口,將相位增量值輸入到 DDS,然后等待 1 微秒,然后將 1MHz 步長添加到相位增量值并輸入到DDS。該狀態機還保持計數,因此在達到 25MHz 的相位增量值后,它會在下一次迭代中回到 1MHz。
我發現這個簡單的 AXI Stream 接口狀態機在許多不同的應用程序中都非常方便。主要的邏輯步驟是:1 - 設置初始值。2 - 將目標 IP 的從接口上的 Tvalid 信號設置為高電平。3 - 設置要在目標 IP 的從接口上輸入的數據值(相位增量值到 DDS 編譯器)。4 - 檢查來自目標 IP 的從接口的 Tready 信號,以驗證它是否已準備好接收下一個數據值。
![poYBAGOX1POABqwtAAHADMMS8xM057.png](https://file.elecfans.com/web2/M00/83/03/poYBAGOX1POABqwtAAHADMMS8xM057.png)
我的所有文件都在鏈接的 Github 存儲庫中,以及這里狀態機的完整代碼。
生成新的比特流后,打開 Ultra96 的電源并連接到其 JTAG 端口(您可以使用飛線完成此操作,但 Ultra96 的 JTAG 到 USB 接口將使您的生活變得更輕松)。
從 Vivado 的 Flow Navigator 中,選擇Open Hardware Manager ,然后選擇Open Target和Autodetect選項。一旦硬件管理器與 Ultra96 建立連接,選擇Program Device選項并指定剛剛使用 DDS 邏輯創建的新比特流。
成功閃光后,ILA 窗口將出現,如果您單擊即時捕捉按鈕(帶有 >> 字符的藍色按鈕),您將看到 DDS 不斷循環的啁啾聲。
![poYBAGOX1Q6ACsn_AAOyukliF1U144.png](https://file.elecfans.com/web2/M00/83/03/poYBAGOX1Q6ACsn_AAOyukliF1U144.png)
ILA 頂部的圖是 DDS 編譯器輸出的實際正弦波形,下圖是其瞬時相位值。向下的第三個圖是輸入到 DDS 編譯器的相位增量值。
底部的十六進制值只是狀態機狀態,用于演示每個狀態如何與 DDS 編譯器的控制相關。
![pYYBAGOX1RyAWevDAAPkKJ4Fyss295.png](https://file.elecfans.com/web2/M00/83/8C/pYYBAGOX1RyAWevDAAPkKJ4Fyss295.png)
我希望這個簡單的 DDS 編譯器示例對您有所幫助。如果您想進一步閱讀,我附上了 Xilinx 的 DDS 編譯器 (PG141) 產品指南,其中深入解釋了其操作理論。
- Ultra96硬件用戶指南
- Ultra96 CSI-2視頻輸出到Raspberry Pi攝像頭輸入
- Ultra96上的實時攝像頭饋送網頁
- 使用PYNQ的Ultra96面部識別鎖栓
- 用于Ultra96的夾層板96AnalogXperience
- Ultra96 FPGA上的Live NYC Subway Monitor應用程序
- 與Ultra96聯網端口轉發
- Ultra96 V2上基于標記的增強現實
- 使用Ultra96 PYNQ測定織物GSM
- Ultra96皮膚癌AI構建
- 設計的帶嵌入式收發器的Gen1×1硬核IP的 PCI Express IP編譯器
- 2018.2 Ultra96:從 Matchbox 桌面關斷 PetaLinux BSP,無法關斷電路板
- 一起玩Ultra96之GPIO操作
- Xilinx Logicore IP直接數字合成器DDS的用戶手冊免費下載 20次下載
- 直接數字綜合器(DDS)編譯器開發指南
- 什么樣的代碼會被編譯器優化 92次閱讀
- Xilinx DDS IP核的使用和參數配置 1257次閱讀
- TVM編譯器的整體架構和基本方法 2506次閱讀
- 領域編譯器發展的前世今生 1748次閱讀
- 交叉編譯器安裝教程 3559次閱讀
- 編譯器優化對函數的影響 2863次閱讀
- 虛擬機:編譯器對C函數的名字修飾 2576次閱讀
- 如何選擇PIC單片機的C編譯器 5429次閱讀
- 詳解Xilinx公司Zynq? UltraScale+?MPSoC產品 3357次閱讀
- 深入編程語言和編譯器是怎樣工作的 4374次閱讀
- 編譯器原理到底是怎樣的帶你簡單的了解編譯器原理 1.1w次閱讀
- 基于Arm技術的16nm MPSoC開發套件Ultra96 6201次閱讀
- verilog編譯指令_verilog編譯器指示語句(數字IC) 1.5w次閱讀
- 編譯器是如何工作的_編譯器的工作過程詳解 1.6w次閱讀
- 編譯器跟編輯器有什么區別 3w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論