信號發生器又稱信號源或振蕩器,在生產實踐和科技領域中有著廣泛的應用。能夠產生多種波形,如三角波、鋸齒波、矩形波(含方波)、正弦波的電路被稱為函數信號發生器。函數信號發生器的實現方法通常是采用分立元件或單片專用集成芯片,但其頻率不高,穩定性較差,且不易調試,開發和使用上都受到較大限制。隨著可編程邏輯器件(FPGA)的不斷發展,直接頻率合成(DDS)技術應用的愈加成熟,利用DDS原理在FPGA平臺上開發高性能的多種波形信號發生器與基于DDS芯片的信號發生器相比,成本更低,操作更加靈活,而且還能根據要求在線更新配置,系統開發趨于軟件化、自定義化。本文研究了基于 FPGA的DDS信號發生器設計,實現了滿足預定指標的多波形輸出。
DDS建立在采樣定理基礎上,首先對需要產生的波形進行采樣,將采樣值數字化后存入存儲器作為查找表,然后通過查表讀取數據,再經D/A轉換器轉換為模擬量,將保存的波形重新合成出來。DDS基本原理框圖如圖1所示。
除了濾波器(LPF)之外,DDS系統都是通過數字集成電路實現的,易于集成和小型化。系統的參考時鐘源通常是一個具有高穩定性的晶體振蕩器,為各組成部分提供同步時鐘。頻率控制字(FSW)實際上是相位增量值(二進制編碼)作為相位累加器的累加值。相位累加器在每一個參考時鐘脈沖輸入時,累加一次頻率字,其輸出相應增加一個步長的相位增量。由于相位累加器的輸出連接在波形存儲器(ROM)的地址線上,因此其輸出的改變就相當于查表。這樣就可以通過查表把存儲在波形存儲器內的波形抽樣值(二進制編碼)查找出來。ROM的輸出送到D/A轉換器,經D/A轉換器轉換成模擬量輸出。
設計功能及端口
1.設計實現的功能
用一個8×128的ROM完成對所要顯示正弦波形數據的存儲,即生成正弦波的波形數據查找表,通過VerilogHDL編寫DDS直接數字頻率合成代碼,在Quartus II與modelsim工具軟件的環境中進行設計和仿真,要求能根據相位累加產生的地址并按照不同的頻率控制信號(freq)讀取ROM波形查找表中的數值做為輸出,并正確顯示波形。同時還可通過改變相移變量(pha)控制程序從不同的位置開始讀取ROM波形查找表中的數據。
2.輸入輸出端口
input wire clk; //時鐘
input wire rst;//復位信號(低電平有效)
input wire [6 : 0] freq;//頻率控制信號
input wire [6 : 0] pha;//相移變量信號
input wire key; //使能開關信號(高電平有效)
output wire [7 : 0] data; //ROM查找表數據
功能介紹
1.設計功能模塊介紹:
本次設計總體實現的是一個能產生正弦波形的DDS信號發生器,該
DDS信號發生器的程序代碼模塊主要有以下內容:
(1)ROM地址產生:
當時鐘的上升沿到來時,如果復位信號有效,則把地址變量addr清零;否則當使能開關信號key有效時,則將頻率控制字寫到內部寄存器里,再將頻率控制字和上一時刻的地址變量進行相加,將加的結果作為地址輸出。另外,還可通過頻率控制信號freq控制讀取頻率,通過相移變量信號pha控制初始讀取位置。
(2)ROM查找表:
當時鐘的上升沿到來時,如果復位信號有效,則把輸出置為零;否則根據ROM地址產生模塊產生的地址讀取ROM中存儲的數值。
另外需通過C語言生成ROM正弦波查找表數據,C語言程序代碼如下: #include “stdio.h”
#include “conio.h”
#include “math.h”
main()
{
int i;
float j;
int y;
FILE *fp;
if((fp = fopen(“rom.mif”, “wa”)) == NULL)
exit(1);
for(i = 0; i 《 128; i++)
{
y = 128 * sin(j) + 128;
fprintf(fp, “%d:%d;\n”, i, y);
j += 2 * 3.1416 / 128;
}
fclose(fp);
printf(“Hello, world\n”);
getch();
}
2.系統結構框圖:
設計源代碼
1.設計源代碼:
module DDS(clk,rst,freq,pha,key,data);
input wire clk; //時鐘 input wire rst; //復位信號(低電平有效) input wire [6 : 0] freq; //頻率控制信號 input wire [6 : 0] pha; //相移變量信號 input wire key; //使能開關信號(高電平有效) output wire [7 : 0] data; //ROM查找表數據
reg [6 : 0] addr; reg [6 : 0] phase; reg [6 : 0] frequency;
always @(posedge clk) begin if(key == 1) begin phase 《= pha; //將相移變量值賦給寄存器phase frequency 《= freq; //將頻率控制變量值賦給frequency end end always @(posedge clk or negedge rst) begin if(!rst) begin addr 《= 0; //復位 end else begin if(key == 1) addr 《= phase; //將寄存器phase存儲的相值賦給addr else addr 《= addr + frequency; //ROM地址產生 end end rom1 rom_1( .address(addr), .clock(clk), .q(data) ); //實例化調用rom1波形查找表endmodule
驗證方案和仿真激勵:
`timescale 1 ns/ 100 ps //設置仿真的時間單位和時間精度
module stimulus;
reg clk,rst;
reg[6:0]freq,pha;
reg key;
wire [7:0] data;
initial
begin
freq=7‘d2;
pha=7’d0;
key=1‘b0;
#20 key=1’b1;
#100 key=1‘b0;
end
initial
begin
clk=1’b0;
rst=1‘b1;
#40 rst=1’b0;
#40 rst=1‘b1;
end
always #10 clk=~clk; //時鐘翻轉
DDS
LXC(.clk(clk),.rst(rst),.freq(freq),.pha(pha),.key(key),.data(data));
endmodule
功能仿真
(1)在ModelSim 中對電路設計進行功能仿真
仿真波形如下:
(2)在Quartus II 中對電路設計進行功能和時序仿真 仿真波形如下:
時序仿真波形如下:
仿真分析:通過觀察在ModelSim和Quartus II中的仿真波形,分析其完成的功能與設計預期一致,說明本設計能較好的完成設計所需達到的目標。
綜合布線與電路圖
綜合與布局布線:
1、下圖為綜合完并且成功后小窗口上生成的報告,報告中顯示出了綜合的工程名、引腳及所用的芯片的類型和型號。
綜合完后生成的電路圖如下:
綜合布局布線報告
綜合完后在Quartus生成了一個名為“DDS.map.rpt”的文件,即為綜合布局布線報告。
下載代碼和引腳分布報告
下載代碼
后仿完后在仿真目錄下的\simulation\modelsim路徑下生成了一個“ DDS_v.sdo”其即為下載代碼文件。
引腳分布
綜合完后在工程目錄下生成了一個“top.pin”文件,其即為引腳分布。
編輯:hfy
-
濾波器
+關注
關注
160文章
7727瀏覽量
177674 -
存儲器
+關注
關注
38文章
7452瀏覽量
163604 -
DDS
+關注
關注
21文章
631瀏覽量
152541 -
信號發生器
+關注
關注
28文章
1452瀏覽量
108652 -
晶體振蕩器
+關注
關注
9文章
616瀏覽量
29058
發布評論請先 登錄
相關推薦
評論