FPGA學習(五)——DDS信號發生器設計

FPGA學習(五)——DDS信號發生器設計

目錄

  • FPGA學習(五)——DDS信號發生器設計
    • 一、FPGA開發中常用IP核——ROM/RAM/FIFO
      • 1、ROM簡介
      • 2、ROM文件的設置
        • (1)直接編輯法
        • (2)用C語言等軟件生成初始化文件
      • 3、ROM IP核配置調用
    • 二、DDS信號發生器設計
      • 1、相位累加器設計
      • 2、波形存儲器ROM設計
        • (1)方波模塊
        • (2)正弦波形存儲器模塊
      • 3、鎖相環倍頻電路設計
      • 4、頂層電路設計
      • 5、最終實現
      • 6、仿真波形

一、FPGA開發中常用IP核——ROM/RAM/FIFO

常見的FPGA存儲器有3種,RAM(隨機訪問內存)ROM(只讀存儲器)FIFO(先入先出)

這三種存儲器的區別如下

其中RAM通常都是在掉電之后就丟失數據,ROM在系統停止供電的時候仍然可以保持數據

可以向RAM和ROM中的任意位置寫入數據,也可以讀取任意的位置的數據

FIFO的數據先入先出,先進去的數據先出來,只能順序寫入數據,順序的讀出數據,其數據地址由內部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。

這三種存儲器的應用場合

RAM和ROM常用于存儲指令或者中間的數據

FIFO常用于數據傳輸通道中用于緩存數據,避免數據丟失,如不同速率時鐘模塊間的數據傳輸就需要用到異步FIFO

1、ROM簡介

? ROM 是只讀存儲器(Read-Only Memory)的簡稱,是一種只能讀出事先所存數據的固態半導體存儲器。其特性是一旦儲存資料就無法再將之改變或刪除,且資料不會因為電源關閉而消失。而事 實上在 FPGA 中通過 IP 核生成的 ROM 或 RAM(RAM 將在下一節為大家講解)調用的都是FPGA 內部的 RAM 資源,掉電內容都會丟失(這也很容易解釋,FPGA 芯片內部本來就沒有掉電非易失存儲器單元)。用 IP 核生成的 ROM 模塊只是提前添加了數據文件(.coe 格式)(.mif/.hex格式),在 FPGA 運行時通過數據文件給 ROM 模塊初始化,才使得 ROM 模塊像個“真正”的掉電非易失存儲器;也正是這個原因,ROM 模塊的內容必須提前在數據文件中寫死,無法在電路中修改。

最簡單的使用有效時鐘CLKA、有效地址ADDRA和有效使能EA,就可以輸出DOUTA

單端口ROM:只提供一個獨立的地址端口核一個讀數據端口

image-20250420092325595

雙端口ROM:有兩個地址端口,和兩個讀數據端口

image-20250420092337748

2、ROM文件的設置

(1)直接編輯法

image-20250420092750197

image-20250420092853439

image-20250420093128626

在Edit找到Custom Fill Cells

image-20250420093900022

設置完成后,將文件保存,然后用編輯器打開看一下

image-20250420093933152

image-20250420093952032

(2)用C語言等軟件生成初始化文件

當需要初始化的存儲單元變多時,上述手工輸入數據的方法就不太實用了。在了解mif文件的格式的基礎上,可以自己編寫C語言程序或者使用MATLAB程序自動生成mif文件。

image-20250420101818222

以下是產生128X8位正弦波形數據的C語言源程序 :

#include<stdio.h>
#include<math.h>
#define PI 3.141592
#define DEPTH 128 //數據深度,即存儲單元的個數
#define WIDTH 8 //存儲單元的寬度
int main(void)
{ 
int n, temp;
float v;
FILE *fp;
/*建立名為Data_sine.mif的新文件,允許寫入數據*/
fp= fopen("Data_sine.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++)
{
/*周期為128個點的正弦波*/
v= sin(2*PI*n/DEPTH);
/*將-1~1之間的正弦波的值擴展到0~255之間*/
temp=(int)((v+1)*255/2);//v+1將數值平移到lO~2之間
/*以十六進制形式輸出地址和數據*/
fprintf(fp, "%x\t:\t%x;\n",n, temp);
}
fprintf(fp,"END;\n");
fclose(fp);
}
}

編輯上述代碼后生成myimf.exe文件,在資源管理器中雙擊運行exe文件,生成Data_sine.mif文件

image-20250420103042129

image-20250420103342471

3、ROM IP核配置調用

在Tools->IP Catalog->搜索ROM

image-20250420085753544

1-PORT單端口,2-PORT雙端口,此次以單端口為例

image-20250420103637506

How wide should the ‘q’ output bus be?

How many x-bit words of memory?

配置ROM的位寬和深度

What should the memory block type be?

使用什么類型的內存

在官方資料中,有提及什么類型的芯片適合用什么類型的內存

image-20250420091525942

寄存器時鐘和復位信號的設置,設置輸出端q直接輸出,不通過寄存器,設置時鐘使能端(clken)

image-20250420103659046

Create one dock enable signal for each dock signal. Note: All registered ports are controlled by the enable signal(s)

是否創建一個時鐘使能信號

Create an 'adr’asynchronous dear for the registered ports

是否創建一個清零信號

存儲器初始化,并指明初始化ROM的數據文件

image-20250420103853939

使用mif文件對ROM進行初始化,文件名為黑色則為添加成功,紅色則為失敗

image-20250420094801226

ROM子模塊參數設置完成后,為了測試其功能,新建一個頂層文件進行功能測試。代碼如下:

module Sine_Signal(q_sig,address_sig,clock_sig,clken_sig);output [7:0] q_sig;output [7:0]  address_sig;input clken_sig;input clock_sig;IPROM	IPROM_inst (.address ( address_sig ),.clken ( clken_sig ),.clock ( clock_sig ),.q ( q_sig ));endmodule

注意實例化部分應該與生成的_inst.v文件內容一致。

image-20250420104345602

仿真波形如下:

image-20250420105902203

二、DDS信號發生器設計

DDS是直接數字式頻率合成器(Direct Digital Synthesizer)的英文縮寫,是一項關鍵的數字化技術。與傳統的頻率合成器相比,DDS具有低成本、低功耗、高分辨率和快速轉換時間等優點,廣泛使用在電信與電子儀器領域,是實現設備全數字化的一個關鍵技術。作為設計人員,我們習慣稱它為信號發生器,一般用它產生正弦、鋸齒、方波等不同波形或不同頻率的信號波形,在電子設計和測試中得到廣泛應用。
DDS的基本結構主要由相位累加器、相位調制器、波形數據表ROM、D/A轉換器等四大結構組成,其中較多設計還會在數模轉換器之后增加一個低通濾波器。

image-20250420112036224

1、相位累加器設計

//=====相位累加器和數據鎖存器===== 
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) 
begin Address = Address + K; ROMaddr = Address[16:7]; 
end endmodule

2、波形存儲器ROM設計

(1)方波模塊

由于方波的實現算法相對簡單,可以不用ROM表,直接用寄存器來保存方波的輸出值。方波只有高、低電平兩種狀態,因此只需要在一個周期的中間位置翻轉電平即可。其實現原理如下:由于相位累加器的值是線性累加的,因此地址值(Address)也是線性累加的,對地址值Address進行判斷,當地址值的最高位為0時,便將存儲波形幅值的存儲器的每一位賦值為1,否則賦值為0。具體源程序如下:

//=====方波產生模塊:squwave. v ====== 
module squwave(CPi,RSTn, Address, Qsquare); input CPi; //系統基準時鐘(100MHz)input RSTn;//同步清零input [16:0]Address;//17位地址輸入信號output reg[11:0] Qsquare; //輸出方波信號,12位
always @(posedge CPi)
if(!RSTn) Qsquare=12'h000;//同步清零
else beginif(Address<=17'hOFFFF)Qsquare=12'hFFF;//輸出高電平else Qsquare=12'h000;//輸出低電平
end
endmodule
(2)正弦波形存儲器模塊
#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 cr eat file!r\n");else{ printf(" File created successfully!\n");/*生成文件頭,注意不要忘了“;” */fprintf(fp, "DEPTH =%od;\n",DEPTH);fprintf(fp, "WIDTH =%od;\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);//關閉文件} 
} 

3、鎖相環倍頻電路設計

使用QuartusPrime軟件調用宏模塊定制一個100MHz的鎖相環模塊。其過程是:選擇Tool一MegaWizardPlug-InManager命令,啟動MegaWizard工具,選擇左欄I/O項目下的ALTPLL(嵌入式鎖相環),定制一個名稱為PLL100M_CP的時鐘模塊,該模塊的輸入inclk0為50MHz時鐘信號,輸出c0為100MHz的脈沖信號,占空比為50%,帶有相位鎖定指示輸出端locked,模塊符號如圖8.7.9所示。

4、頂層電路設計

將上述各個模塊逐個級聯起來就可以得到波形產生器的頂層模塊,其代碼如下:

//=DDS的頂層模塊:DDS top.V =
module DDS top(CLOCK 50, RSTn, WaveSel,K,WaveValue, LEDG, CLOCK 100);
input CLOCK 5O;
input RSTn;
input [1:0] WaveSel;
input [12:0] K;
output reg [1l:0] WaveValue;
wire [9:0] ROMaddr;
wire [16:0]Address;
wire[11:0]Qsine,Qquar;
output [0:0]LEDG;
output CLOCK_100;
wire CPi = CLOCK_100;
PLL100M_CP PLL100M_CP_inst (.inclk0(CLOCK 50 );
//50MHz時鐘輸入.c0(CLOCK_100),
//100MHz時鐘輸出.locked (LEDG[O])
);
addr_cnt U0_instance(CPi,K,ROMaddr, Address);
SineROM ROM_inst (.adres (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

5、最終實現

使用DE2-115開發板來驗證上述設計。用析出的50MHz晶振作為時鐘輸入,用KEY3控制方波清零,用SW12~SW0設置頻率控制字,SW7、SW6用來選擇輸出波形的各類,用LEDGe作為 PLL的相位鎖定指示。為方便引腳分配,新建一個頂層文件:

module DE2_115_DDS_top(CLOCK_50,KEY,SW,GPIO_0,LEDG);input CLOCK_50;input [3:3] KEY;input [17:0] SW;output [12:0] GPIO_0;output [0:0] LEDG;wire CLOCK_100;assign GPIO_0[12]=CLOCK_100;wire RSTn=KEY[3];wire[1:0] WaveSel=SW[17:16];wire [12:0] K=SW[12:0];wire [11:0] WaveValue;assign GPIO_0[11:0]=WaveValue;DDS_top DE2(CLOCK_50,RSTn,WaveSel,K,WaveValue,LEDG,CLOCK_100);
endmodule

6、仿真波形

image-20250420122810587

image-20250420122821497

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

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

相關文章

【Vue】從 MVC 到 MVVM:前端架構演變與 Vue 的實踐之路

個人博客&#xff1a;haichenyi.com。感謝關注 一. 目錄 一–目錄二–架構模式的演變背景?三–MVC&#xff1a;經典的分層起點?四–MVP&#xff1a;面向接口的解耦嘗試?五–MVVM&#xff1a;數據驅動的終極形態??六–Vue&#xff1a;MVVM 的現代化實踐??? 二. 架構模…

【算法】快速排序、歸并排序(非遞歸版)

目錄 一、快速排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、歸并排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…

CasualLanguage Model和Seq2Seq模型的區別

**問題1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的區別是什么&#xff1f; 因果語言模型(Causal Language Model)&#xff1a; 預測給定文本序列中的下一個字符&#xff0c;一般用于文本生成、補全句子等&#xff0c;模型…

【計算機視覺】三維視覺項目 - Colmap二維圖像重建三維場景

COLMAP 3D重建 項目概述項目功能項目運行方式1. 環境準備2. 編譯 COLMAP3. 數據準備4. 運行 COLMAP 常見問題及解決方法1. **編譯問題**2. **運行問題**3. **數據問題** 項目實戰建議項目參考文獻 項目概述 COLMAP 是一個開源的三維重建軟件&#xff0c;專注于 Structure-from…

狀態管理最佳實踐:Bloc架構實踐

狀態管理最佳實踐&#xff1a;Bloc架構實踐 引言 Bloc (Business Logic Component) 是Flutter中一種強大的狀態管理解決方案&#xff0c;它基于響應式編程思想&#xff0c;通過分離業務邏輯和UI表現層來實現清晰的代碼架構。本文將深入探討Bloc的核心概念、實現原理和最佳實踐…

Python多任務編程:進程全面詳解與實戰指南

1. 進程基礎概念 1.1 什么是進程&#xff1f; 進程(Process)是指正在執行的程序&#xff0c;是程序執行過程中的一次指令、數據集等的集合。簡單來說&#xff0c;進程就是程序的一次執行過程&#xff0c;它是一個動態的概念。 想象你打開電腦上的音樂播放器聽歌&#xff0c;…

Linux 網絡基礎(二) (傳輸協議層:UDP、TCP)

目錄 一、傳輸層的意義 二、端口號 1、五元組標識一個通信 2、端口號范圍劃分 3、知名端口號&#xff08;Well-Know Port Number&#xff09; &#xff08;1&#xff09;查看端口號 4、綁定端口號數目問題 5、pidof & netstat 命令 &#xff08;1&#xff09;ne…

得佳勝哲訊科技 SAP項目啟動會:膠帶智造新起點 數字轉型新征程

在全球制造業加速向數字化、智能化轉型的浪潮中&#xff0c;膠帶制造行業正迎來以“自動化生產、數據化運營、智能化決策”為核心的新變革。工業互聯網、大數據分析與智能裝備的深度融合&#xff0c;正推動膠帶制造從傳統生產模式向“柔性化生產精準質量控制全鏈路追溯”的智慧…

大數據學習棧記——MapReduce技術

本文介紹hadoop中的MapReduce技術的應用&#xff0c;使用java API。操作系統&#xff1a;Ubuntu24.04。 MapReduce概述 MapReduce概念 MapReduce是一個分布式運算程序的編程框架&#xff0c;核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序…

Centos9 離線安裝 MYSQL8

centos 9 離線安裝 mysql 8 參考教程 1. 官網下載mysql 下載地址 2. 將文件傳輸到Centos中解壓 軟件全部安裝到了/opt中 在opt中新建mysql目錄&#xff0c;解壓到mysql目錄中 tar -xvf mysql壓縮文件 mysql[rootcentoshost mysql]# ls mysql-community-client-8.4.5-1.e…

helm的go模板語法學習

1、helm chart 1.0、什么是helm&#xff1f; 介紹&#xff1a;就是個包管理器。理解為java的maven、linux的yum就好。 安裝方法也可參見官網&#xff1a; https://helm.sh/docs/intro/install 通過前面的演示我們知道&#xff0c;有了helm之后應用的安裝、升級、查看、停止都…

display的一些學習記錄

收集的SDM的log&#xff1a; 01-01 00:00:15.311 933 933 I SDM : Creating Display HW Composer HAL 01-01 00:00:15.311 933 933 I SDM : Scheduler priority settings completed 01-01 00:00:15.311 933 933 I SDM : Configuring RPC threadpool 0…

【Rust 精進之路之第2篇-初體驗】安裝、配置與 Hello Cargo:踏出 Rust 開發第一步

系列&#xff1a; Rust 精進之路&#xff1a;構建可靠、高效軟件的底層邏輯 **作者&#xff1a;**碼覺客 發布日期&#xff1a; 2025-04-20 引言&#xff1a;磨刀不誤砍柴工&#xff0c;裝備先行&#xff01; 在上一篇文章中&#xff0c;我們一起探索了 Rust 誕生的緣由&…

【深度學習】計算機視覺(17)——ViT理解與應用

文章目錄 Embedding1 概念2 Q&A &#xff08;1&#xff09;3 Positional Encoding4 Q&A &#xff08;2&#xff09; ViT樣例及Embedding可視化理解1 簡化ViT練習2 CLS Token3 Embedding可視化4 多頭注意力可視化 Embedding技術體系結構參考來源 在研究中對特征的編碼和…

肖特基二極管詳解:原理、作用、應用與選型要點

一、肖特基二極管的基本定義 肖特基二極管&#xff08;Schottky Diode&#xff09; 是一種基于金屬-半導體結&#xff08;肖特基勢壘&#xff09;的二極管&#xff0c;其核心特性是低正向壓降&#xff08;Vf≈0.3V&#xff09;和超快開關速度。 結構特點&#xff1a;陽極采用金…

DeepSeek在數據倉庫的10大應用場景

一、智能數據集成與清洗 多源數據整合&#xff1a;DeepSeek能夠從多種數據源中提取、轉換和加載數據&#xff0c;實現跨系統數據的高效整合。 數據清洗與標準化&#xff1a;通過智能算法自動識別并糾正數據中的錯誤、不一致性和缺失值&#xff0c;提升數據質量。 二、數據倉…

提示詞構成要素對大語言模型跨模態內容生成質量的影響

提示詞構成要素對大語言模型跨模態內容生成質量的影響 提示詞清晰度、具象性與質量正相關 限定指向性要素優于引導指向性要素 大語言模型生成內容保真度偏差 以訊飛星火大模型為實驗平臺,選取100名具備技術素養的人員,從提示詞分類、構成要素和實踐原則歸納出7種提示詞組…

BeautifulSoup 庫的使用——python爬蟲

文章目錄 寫在前面python 爬蟲BeautifulSoup庫是什么BeautifulSoup的安裝解析器對比BeautifulSoup的使用BeautifulSoup 庫中的4種類獲取標簽獲取指定標簽獲取標簽的的子標簽獲取標簽的的父標簽(上行遍歷)獲取標簽的兄弟標簽(平行遍歷)獲取注釋根據條件查找標簽根據CSS選擇器查找…

關于MacOS使用Homebrew的詳細介紹

Homebrew 是 macOS&#xff08;和 Linux&#xff09;上最流行的包管理工具&#xff08;Package Manager&#xff09;&#xff0c;用于快速安裝、更新和管理各種開發工具、命令行程序、開源軟件等。它類似于&#xff1a; Ubuntu/Debian 的 aptCentOS/RHEL 的 yumWindows 的 Cho…

最新扣子空間實操指南

一、首先要先獲取到內部測試的邀請碼&#xff0c; 我們先打開扣子空間官網&#xff1a;https://space.coze.cn/ 輸入邀請碼后進入該頁面&#xff1a; 它這里支持文件上傳&#xff0c;擴展里面有很多插件&#xff0c;頁支持MCP各種插件. 探索模式有兩種&#xff0c;一種是ai自…