FPGA系列之DDS信號發生器設計(DE2-115開發板)

一、IP核

IP(Intellectual Property)原指知識產權、著作權等,在IC設計領域通常被理解為實現某種功能的設計。IP模塊則是完成某種比較復雜算法或功能(如FIR濾波器、FFT、SDRAM控制器、PCIe接口、CPU核等)并且參數可修改的電路模塊,又稱為IP核(IP Core)。隨著CPLD/FPGA器件的集成度越來越高,設計越來越復雜,使用IP核是EDA設計的發展趨勢。根據實現方式的不同,IP核可以分為軟核(soft core)、固核(firm core)和硬核(hard core)。

Intel公司以及第三方合作伙伴提供的IP模塊可以分為兩類:可修改參數的IP核(Library of Parameterized Modules, LPM)和需要授權才能在生產設計中使用的IP核(功能更復雜的模塊,也稱為MegaCore)?。這些模塊專門針對不同的器件結構進行了優化,在設計數字系統時,我們可以充分利用這些IP模塊,加快設計進度,同時提高器件資源的利用率。

注:該內容引用自Verilog HDL與FGPGA數字系統設計(第二版)

二、DDS信號發生器設計

1.DDS信號發生器

(1)概念

直接數字頻率合成(Direct Digital Frequency Synthesis,簡稱DDS或DDFS)是一種應用數字技術產生信號波形的方法,它是由美國學者J. Tierncy、C.M. Rader和B. Gold在1971年提出的,他們以數字信號處理理論為基礎,從相位概念出發提出了一種新的直接合成所需波形的全數字頻率合成方法。

DDS系統通常包含以下模塊:
相位累加器(Phase Accumulator)
波形查找表(Waveform ROM/LUT)
數模轉換器(DAC)
??抗混疊濾波器(Anti-Aliasing Filter)

(2)DDS工作流程

2.?DDS信號發生器設計

使用Quartus Prime?Lite創建工程,頂層文件名為DDS_top,芯片選擇EP4CE115F29C7(詳細步驟看其余FPGA文章)。

(1)相位累加器的設計

新建Verilog HDL File文件,文件名為addr_cnt.v(如果與VS Code連用代碼寫好后另存為就好)

//=====相位累加器和數據鎖存器=====
module addr_cnt(CPi,K,ROMaddr,Address);input CPi;                     //系統基準時鐘(100MHz)input [12:0] K;                //13位頻率控制字output reg [9:0] ROMaddr;      //10位ROM地址output reg [16:0] Address;     //17位相位累加器地址信號always @(posedge CPi)beginAddress = Address + K;ROMaddr = Address[16:7];end
endmodule

在項目中添加addr_cnt.v文件,選擇Files,右鍵點擊Files,點擊添加

找到剛才保存的文件添加

選擇Set as Top-Level Entity將其設為頂層文件,點擊編譯

右鍵點擊addr_cnt.v文件,選擇CreateSymbol Files for Current File命令,生成該模塊的符號

在Quartus中打開生成的addr_cnt.bsf文件,生成的該模塊的符號如圖

(2)波形存儲器ROM的設計
A.方波模塊

步驟跟上面的一樣,文件名為squwave.v,其代碼如下

//=====方波產生模塊:squwave.v ======
module squwave(CPi,RSTn,Address,Qsquare);input CPi;                          //系統基準時鐘(100MHz)input RSTn;                         //同步清零input [16:0] Address;               //17位地址輸入信號output reg [11:0] Qsquare;          //輸出方波信號,12位寬,送至DACalways @(posedge CPi)        if(!RSTn) Qsquare=12'h000;          //同步清零else begin                   if(Address<=17'h0FFFF)  Qsquare=12'hFFF;            //輸出高電平else Qsquare=12'h000;           //輸出低電平end
endmodule

打開生成的squwave.bsf文件后該模塊的符號如圖

B.正弦波形存儲器模塊

Quartus Prime軟件接受兩種格式的初始化文件MemoryInitialization File(.mif)和Hexadecimal(Intel-Format)File(.hex)。使用時,將初始化文件放在當前工程項目子目錄中,在配置LPM_ROM時會對其進行初始化。而建立.mif格式文件有兩種方法,一種是直接編輯法,另一種是用C語言等軟件生成初始化文件(初始化儲存單元較多時更加實用)

打開c語言編譯器,建立sinewave.c文件,代碼如下

#include <stdio.h>
#include <math.h>
#define PI 3.141592
#define DEPTH 1024     //數據深度,即存儲單元的個數
#define WIDTH 12       //存儲單元的寬度
int main(void)
{int n,temp;float v;FILE *fp;
/*建立文件名為Sine1024.mif的新文件,允許寫入數據,對文件名沒有特殊要求,但擴展名必須為.mif*/fp=fopen("Sine1024.mif","w+");if(NULL==fp)printf("Can not creat file!\r\n");else{printf("File created successfully!\n");/*生成文件頭,注意不要忘了“;” */fprintf(fp,"DEPTH =%d;\n",DEPTH);fprintf(fp,"WIDTH =%d;\n",WIDTH);fprintf(fp,"ADDRESS_RADIX=HEX;\n");fprintf(fp,"DATA_RADIX=HEX;\n");fprintf(fp,"CONTENT\n");fprintf(fp,"BEGIN\n");/*以十六進制輸出地址和數據*/for(n=0;n<DEPTH;n++){/*周期為1024個點的正弦波*/v=sin(2*PI*n/DEPTH);/*將-1~1之間的正弦波的值擴展到0~4095之間*/temp=(int)((v+1)*4095/2); //v+1將數值平移到0~2之間/*以十六進制輸出地址和數據*/fprintf(fp,"%x\t:\t%x;\n",n,temp);}fprintf(fp,"END;\n");fclose(fp);    //關閉文件}
}

運行此文件后會生成sinewave.exe文件,雙擊運行就會生成Sine1024.mif文件

接著,驗證生成的數據是否正確。用記事本打開生成的mif文件,同時用Quartus Prime軟件打開mif文件,若能成功導入數據且數據一致,則說明生成文件正確,將其添加到工程文件中。

在Quartus Prime主界面選擇Tool→IP Catalog

在查找框內輸入ROM, IP核目錄(IP Catalog)欄中會列出相關的IP核,選擇ROM:1-PORT并雙擊

彈出如圖所示的保存IP設置界面,輸入文件名SineROM.v,并選中Verilog,單擊OK按鈕

設置ROM的數據位寬為12,存儲容量(字數)為1024,單擊Next按鈕

點擊Next,配置如下

點擊Browse...選擇生成的Sine1024.mif文件,這是指明初始化ROM所使用的數據文件名

然后Next直到最后一頁,彈出如圖所示的選擇輸出文件的對話框(最重要的是.v文件,其余文件按需要勾選,.bsf文件也可以選上),選擇好后點擊Finish

SineROM.v等相關文件就生成好了

該模塊的符號如下圖所示:

3.鎖相環倍頻電路設計

定制一個名稱為PLL100M_CP的時鐘模塊,該模塊的輸入inclk0為50MHz時鐘信號,輸出c0為100MHz的脈沖信號,占空比為50%,帶有相位鎖定指示輸出端locked。

在右側查找框內輸入ALTPLL(嵌入式鎖相環)?

雙擊打開,輸入文件名PLL100M_CP.v,并選中Verilog,單擊OK按鈕

設置輸入時鐘(inclk0)頻率為50MHz

其余的按如下圖片設置?

最后選擇需要生成的文件

4.頂層電路設計

代碼如下

//========DDS的頂層模塊:DDS_top.v ======
module DDS_top(CLOCK_50, RSTn, WaveSel, K,
WaveValue, LEDG, CLOCK_100);input CLOCK_50;                           //50MHz時鐘input RSTn;                               //控制方波清零,低電平有效input [1:0] WaveSel;                      //波形選擇:SW[17:16]=10時為方波;SW//[17:16]=01時為正弦波input [12:0] K;                           //頻率控制字SW12..SW0output reg [11:0] WaveValue;              //輸出波形數據wire [9:0] ROMaddr;                       //波形存儲器地址wire [16:0] Address;                      //17位相位累加器地址wire [11:0] Qsine, Qsquare;               //正弦、方波數據輸出output [0:0]LEDG;                         //鎖相環相位鎖定指示燈,亮表示鎖定output CLOCK_100;                         //鎖相環輸出時鐘,頻率為100MHzwire CPi =CLOCK_100;PLL100M_CP PLL100M_CP_inst (              //實例引用鎖相環子模塊.inclk0 ( CLOCK_50 ),                     //50MHz時鐘輸入.c0 ( CLOCK_100 ),                        //100MHz時鐘輸出.locked ( LEDG[0] )                       //相位鎖定指示
);addr_cnt U0_instance(CPi,K,ROMaddr,Address);//實例引用地址累加器SineROM ROM_inst (                        //實例引用正弦LPM_ROM子模塊.address (ROMaddr),.clock ( CPi ),.q ( Qsine )
);squwave U1(CPi,RSTn, Address,Qsquare);    //實例引用方波子模塊always @(posedge CPi)
begincase(WaveSel)                             //選擇輸出波形2'b01:WaveValue=Qsine;                //輸出正弦波2'b10:WaveValue=Qsquare;              //輸出方波default:WaveValue=Qsine;endcase
end
endmodule

寫好后添加到工程中,將此文件設為頂層模塊并進行編譯。

三、設計實現

使用DE2-115開發板來驗證上述設計。用板上的50MHz晶振作為時鐘輸入,用KEY3控制方波清零,用SW12~SW0設置頻率控制字,SW17、SW16用來選擇輸出波形的種類,用LEDG0作為PLL的相位鎖定指示。

有DE2_115_pin_assignments.csv文件可以直接導入不用手動配置引腳,沒有的話參考DE2-115文檔配置。為了方便導入文件DE2_115_pin_assignments.csv進行引腳分配,將使用該文件中的端口名稱代替上述DDS_top.v(代碼如下)中的信號名稱。為此再編寫一個頂層文件DE2_DDS_top.v代碼如下:

//=====在開發板上運行的DDS的頂層模塊:DE2_115_DDS_top.v ======
module DE2_115_DDS_top(CLOCK_50, KEY, SW, GPIO_0, LEDG);input CLOCK_50;                          //50MHz時鐘input[3:3] KEY;                          //按鍵KEY3,控制方波清零input[17:0] SW;                          //撥動開關output [12:0] GPIO_0;                    //擴展接口,送出波形數據給DACoutput [0:0]LEDG;                        //綠色LED指示相位是否鎖定wire CLOCK_100;                          //100MHz時鐘assign GPIO_0[12]=CLOCK_100;             //送給DAC的時鐘wire RSTn = KEY[3];                      //控制方波清零,低電平有效wire [1:0] WaveSel = SW[17:16];          //選擇輸出波形wire [12:0] K = SW[12:0];                //設置頻率控制字,最小值必須為1wire [11:0] WaveValue;assign GPIO_0[11:0] = WaveValue;         //輸出波形數據DDS_top DE2(CLOCK_50, RSTn, WaveSel, K, WaveValue, LEDG, CLOCK_100);
endmodule

對其進行全編譯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76938.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76938.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76938.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java單例模式詳解:實現線程安全的全局訪問點

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 一、什么是單例模式&#xff1f; 單例模式&#xff08;Singleton Pattern&#xff09;是一種創建型設計模式&#xff0c;它保證一個類僅有一個實例&#xff…

JVM 生產環境問題定位與解決實戰(七):實戰篇——OSSClient泄漏引發的FullGC風暴

本文已收錄于《JVM生產環境問題定位與解決實戰》專欄&#xff0c;完整系列見文末目錄 引言 在前六篇博客中&#xff0c;我們系統性地學習了 JVM 生產環境問題定位與解決的全套工具鏈&#xff0c;涵蓋jps、jmap、jstat、jstack、jcmd 等基礎工具的使用技巧&#xff0c;深入剖析…

Spark集群搭建-spark-local

&#xff08;一&#xff09;安裝Spark 安裝Spark的過程就是下載和解壓的過程。接下來的操作&#xff0c;我們把它上傳到集群中的節點&#xff0c;并解壓運行。 1.啟動虛擬機 2.通過finalshell連接虛擬機&#xff0c;并上傳安裝文件到 /opt/software下 3.解壓spark安裝文件到/op…

Java 異常 SSLException: fatal alert: protocol_version 全解析與解決方案

在 Java 網絡通信中&#xff0c;SSLException: fatal alert: protocol_version 是典型的 TLS/SSL 協議版本不兼容異常。本文結合 Java 官方規范、TLS 協議標準及實戰經驗&#xff0c;提供體系化解決方案&#xff0c;幫助開發者快速定位并解決協議版本沖突問題。 一、異常本質&…

虛擬列表技術深度解析:原理、實現與性能優化實戰

虛擬列表技術深度解析&#xff1a;原理、實現與性能優化實戰 引言 在當今數據驅動的互聯網應用中&#xff0c;長列表渲染已成為前端開發的核心挑戰。傳統的一次性全量渲染方式在數據量超過千條時&#xff0c;往往導致頁面卡頓、內存飆升等問題。虛擬列表&#xff08;Virtual L…

2025-04-20 李沐深度學習4 —— 自動求導

文章目錄 1 導數拓展1.1 標量導數1.2 梯度&#xff1a;向量的導數1.3 擴展到矩陣1.4 鏈式法則 2 自動求導2.1 計算圖2.2 正向模式2.3 反向模式 3 實戰&#xff1a;自動求導3.1 簡單示例3.2 非標量的反向傳播3.3 分離計算3.4 Python 控制流 硬件配置&#xff1a; Windows 11Inte…

Redis的使用總結

Redis 核心使用場景 緩存加速 高頻訪問數據緩存&#xff08;如商品信息、用戶信息&#xff09; 緩解數據庫壓力&#xff0c;提升響應速度 會話存儲 分布式系統共享 Session&#xff08;替代 Tomcat Session&#xff09; 支持 TTL 自動過期 排行榜/計數器 實時排序&#x…

富文本編輯器實現

&#x1f3a8; 富文本編輯器實現原理全解析 &#x1f4dd; 基本實現路徑圖 #mermaid-svg-MO1B8a6kAOmD8B6Y {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MO1B8a6kAOmD8B6Y .error-icon{fill:#552222;}#mermaid-s…

LeetCode熱題100——283. 移動零

給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,12,0,0] 示例 2: 輸入: nums [0] 輸出:…

與Ubuntu相關命令

windows將文件傳輸到Ubuntu 傳輸文件夾或文件 scp -r 本地文件夾或文件 ubuntu用戶名IP地址:要傳輸到的文件夾路徑 例如&#xff1a; scp -r .\04.py gao192.168.248.129:/home/gao 如果傳輸文件也可以去掉-r 安裝軟件 sudo apt-get update 更新軟件包列表 sudo apt insta…

Kafka 在小流量和大流量場景下的順序消費問題

一、低流量系統 特點 消息量較少&#xff0c;吞吐量要求低。系統資源&#xff08;如 CPU、內存、網絡&#xff09;相對充足。對延遲容忍度較高。 保證順序消費的方案 單分區 單消費者 將消息發送到單個分區&#xff08;例如固定 Partition 0&#xff09;&#xff0c;由單個…

小程序 GET 接口兩種傳值方式

前言 一般 GET 接口只有兩種URL 參數和路徑參數 一&#xff1a;URL 參數&#xff08;推薦方式&#xff09; 你希望請求&#xff1a; https://serve.zimeinew.com/wx/products/info?id5124接口應該寫成這樣&#xff0c;用 req.query.id 取 ?id5124&#xff1a; app.get(&…

小白學習java第14天(中):數據庫

1.DML data manage language數據庫管理語言 外鍵:外鍵是什么&#xff1f;就是對其進行表與表之間的聯系&#xff0c;就是使用的鍵進行關聯&#xff01; 方法一&#xff1a;我們在數據庫里面就對其進行表與表之間的連接【這種是不建議的&#xff0c;我不太喜歡就是將數據里面弄…

NO.95十六屆藍橋杯備戰|圖論基礎-單源最短路|負環|BF判斷負環|SPFA判斷負環|郵遞員送信|采購特價產品|拉近距離|最短路計數(C++)

P3385 【模板】負環 - 洛谷 如果圖中存在負環&#xff0c;那么有可能不存在最短路。 BF算法判斷負環 執?n輪松弛操作&#xff0c;如果第n輪還存在松弛操作&#xff0c;那么就有負環。 #include <bits/stdc.h> using namespace std;const int N 2e3 10, M 3e3 1…

K8s pod 應用

/** 個人學習筆記&#xff0c;如有問題歡迎交流&#xff0c;文章編排和格式等問題見諒&#xff01; */ &#xff08;1&#xff09;編寫 pod.yaml 文件 pod 是 kubernetes 中最小的編排單位&#xff0c;一個 pod 里包含一個或多個容器。 apiVersion: v1 # 指定api版本 kind…

Oracle創建觸發器實例

一 創建DML 觸發器 DML觸發器基本要點&#xff1a; 觸發時機&#xff1a;指定觸發器的觸發時間。如果指定為BEFORE&#xff0c;則表示在執行DML操作之前觸發&#xff0c;以便防止某些錯誤操作發生或實現某些業務規則&#xff1b;如果指定為AFTER&#xff0c;則表示在執行DML操作…

Filename too long 錯誤

Filename too long 錯誤表明文件名超出了文件系統或版本控制系統允許的最大長度。 可能的原因 文件系統限制 不同的文件系統對文件名長度有不同的限制。例如&#xff0c;FAT32 文件名最長為 255 個字符&#xff0c;而 NTFS 雖然支持較長的文件名&#xff0c;但在某些情況下也…

網絡不可達network unreachable問題解決過程

問題&#xff1a;訪問一個環境中的路由器172.16.1.1&#xff0c;發現ssh無法訪問&#xff0c;ping發現回網絡不可達 C:\Windows\System32>ping 172.16.1.1 正在 Ping 172.16.1.1 具有 32 字節的數據: 來自 172.16.81.1 的回復: 無法訪問目標網。 來自 172.16.81.1 的回復:…

Python設計模式:備忘錄模式

1. 什么是備忘錄模式&#xff1f; 備忘錄模式是一種行為設計模式&#xff0c;它允許在不暴露對象內部狀態的情況下&#xff0c;保存和恢復對象的狀態。備忘錄模式的核心思想是將對象的狀態保存到一個備忘錄對象中&#xff0c;以便在需要時可以恢復到之前的狀態。這種模式通常用…

Python基礎語法3

目錄 1、函數 1.1、語法格式 1.2、函數返回值 1.3、變量作用域 1.4、執行過程 1.5、鏈式調用 1.6、嵌套調用 1.7、函數遞歸 1.8、參數默認值 1.9、關鍵字參數 2、列表 2.1、創建列表 2.2、下標訪問 2.3、切片操作 2.4、遍歷列表元素 2.5、新增元素 2.6、查找元…