1緒論
1.1 背景
信號(hào)發(fā)生器作為一種歷史悠久的測量儀器,早在20年代電子設(shè)備剛出現(xiàn)時(shí)就產(chǎn)生了。隨著通信和雷達(dá)技術(shù)的發(fā)展,40年代出現(xiàn)了主要用于測試各種接收機(jī)的標(biāo)準(zhǔn)信號(hào)發(fā)生器,使得信號(hào)發(fā)生器從定性分析的測試儀器發(fā)展成定量分析的測量儀器。同時(shí)還出現(xiàn)了可用來測量脈沖電路或用作脈沖調(diào)制器的脈沖信號(hào)發(fā)生器。
1.2 FPGA簡介
FPGA(Field-Programmable Gate Array),即現(xiàn)場可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎(chǔ)上進(jìn)一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點(diǎn)。
FPGA一般來說比ASIC(專用集成芯片)的速度要慢,無法完成復(fù)雜的設(shè)計(jì),但是功耗較低。但是他們也有很多的優(yōu)點(diǎn)比如可以快速成品,可以被修改來改正程序中的錯(cuò)誤和更便宜的造價(jià)。廠商也可能會(huì)提供便宜的但是編輯能力差的FPGA。因?yàn)檫@些芯片有比較差的可編輯能力,所以這些設(shè)計(jì)的開發(fā)是在普通的FPGA上完成的,然后將設(shè)計(jì)轉(zhuǎn)移到一個(gè)類似于ASIC的芯片上。
1.3 Quartus II簡介
Quartus II design 是最高級(jí)和復(fù)雜的,用于system-on-a-programmable-chip (SOPC)的設(shè)計(jì)環(huán)境。 Quartus II design 提供完善的 timing closure 和 LogicLock? 基于塊的設(shè)計(jì)流程。Quartus II design是唯一一個(gè)包括以timing closure 和 基于塊的設(shè)計(jì)流為基本特征的programmable logic device (PLD)的軟件。 Quartus II 設(shè)計(jì)軟件改進(jìn)了性能、提升了功能性、解決了潛在的設(shè)計(jì)延遲等,在工業(yè)領(lǐng)域率先提供FPGA與mask-programmed devices開發(fā)的統(tǒng)一工作流程。
Altera的Quartus II可編程邏輯軟件屬于第四代PLD開發(fā)平臺(tái)。該平臺(tái)支持一個(gè)工作組環(huán)境下的設(shè)計(jì)要求,其中包括支持基于Internet的協(xié)作設(shè)計(jì)。Quartus平臺(tái)與Cadence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供應(yīng)商的開發(fā)工具相兼容。改進(jìn)了軟件的LogicLock模塊設(shè)計(jì)功能,增添 了FastFit編譯選項(xiàng),推進(jìn)了網(wǎng)絡(luò)編輯性能,而且提升了調(diào)試能力。
Verilog HDL在Quartus II 中的使用流程如圖1-1所示:
圖1-1 應(yīng)用流程圖
1.4 Modelsim簡介
Mentor公司的ModelSim是業(yè)界最優(yōu)秀的HDL語言仿真軟件,它能提供友好的仿真環(huán)境,是業(yè)界唯一的單內(nèi)核支持VHDL和Verilog混合仿真的仿真器。它采用直接優(yōu)化的編譯技術(shù)、Tcl/Tk技術(shù)、和單一內(nèi)核仿真技術(shù),編譯仿真速度快,編譯的代碼與平臺(tái)無關(guān),便于保護(hù)IP核,個(gè)性化的圖形界面和用戶接口,為用戶加快調(diào)錯(cuò)提供強(qiáng)有力的手段,是FPGA/ASIC設(shè)計(jì)的首選仿真軟件。
2系統(tǒng)設(shè)計(jì)方案
2.1系統(tǒng)總體設(shè)計(jì)
本系統(tǒng)以FPGA芯片為中心,外加輔助電路,選取 DDS技術(shù)。該系統(tǒng)由FPGA 主控電路,D/A轉(zhuǎn)換電路,調(diào)節(jié)按鍵和低通濾波電路,Guagle Wave—任意波形發(fā)生器,設(shè)置我們需要的波形,依次保存為mif文件,在與波形ROM關(guān)聯(lián)起來,然后經(jīng)相位累加器輸出的地址信息不斷尋址從波形ROM輸出波形數(shù)據(jù)從mif文件讀取的是離散的波形數(shù)據(jù),還得經(jīng)由數(shù)模轉(zhuǎn)換器將離散的序列轉(zhuǎn)換成連續(xù)的模擬量,再使用低通濾波器過濾諧波,輸出平滑的函數(shù)波形。課題要求是需要輸出四類波形,由此需要使用四塊ROM儲(chǔ)存器,依次放入四種波形的波形幅度量化數(shù)據(jù),然后使用一個(gè)四選一的波形選擇器,波形選擇模塊控制輸出波形形狀。
圖2-1系統(tǒng)總體設(shè)計(jì)圖
圖2-2 系統(tǒng)總體RTL視圖
2.2按鍵控制模塊
由于開發(fā)板使用的按鍵開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí), 由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)立刻斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動(dòng),為了不產(chǎn)生這種現(xiàn)象而做 的措施就是按鍵消抖。由于按鍵個(gè)數(shù)較多,常用軟件方法去抖,即檢測出按鍵閉合后執(zhí)行一個(gè)延時(shí)程序,根 據(jù)抖動(dòng)的時(shí)間為 5ms~10ms,我們產(chǎn)生一個(gè) 20ms 的延時(shí),讓前沿抖動(dòng)消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。
2.3 DDS模塊
為了使DDS簡易信號(hào)發(fā)生器實(shí)現(xiàn)正弦波、方波、三角波和鋸齒波 4 種波形的 輸出,需要事先在波形數(shù)據(jù)表 ROM 中存入 4 種波形信號(hào)各自的完整周期波形數(shù)據(jù)。ROM 作為只讀存儲(chǔ)器,在進(jìn)行 IP 核設(shè)置時(shí)需要指定初始化文件,我們將波形數(shù)據(jù)作為初始化文 件寫入其中,文件格式為 MIF 文件。 使用 MatLab 繪制 4 種信號(hào)波形,對(duì)波形進(jìn)行等間隔采樣,以采樣次數(shù)作為 ROM 存儲(chǔ) 地址,將采集的波形幅值數(shù)據(jù)做為存儲(chǔ)數(shù)據(jù)寫入存儲(chǔ)地址對(duì)應(yīng)的存儲(chǔ)空間。在本次實(shí)驗(yàn)中 我們對(duì) 4 種信號(hào)波形進(jìn)行分別采樣,采樣次數(shù)為 2 12 = 4096 次,采集的波形幅值數(shù)據(jù)位寬 為 8bit,將采集數(shù)據(jù)保存為 MIF 文件。
2.4數(shù)模轉(zhuǎn)換模塊
由系統(tǒng)設(shè)計(jì)圖可知,要讓信號(hào)發(fā)生器系統(tǒng)輸出波形,還需要使用DA轉(zhuǎn)換模塊,這里我選擇和板卡相配套的外載ADDA模塊,外載 AD/DA 板卡的 DA 部分使用高速 DA 芯片 AD9708,AD9708 由 ANALOG 公司生 產(chǎn),屬于 TxDAC?系列高性能、低功耗 CMOS 數(shù)模轉(zhuǎn)換器(DAC)的 8 位分辨率產(chǎn)品。
AD9708 提供出色的交流和直流性能,同時(shí)支持最高 125 MSPS 的更新速率。具有靈活 的單電源工作電壓范圍(2.7 V 至 5.5 V)和低功耗特性,非常適合便攜式和低功耗應(yīng)用。 通過降低滿量程電流輸出,可以將功耗進(jìn)一步降至 45 mW,而性能不會(huì)明顯下降,
圖2.3 外載ADDA模塊
3各模塊方案驗(yàn)證
頂層模塊包括 4 部分,D/A 轉(zhuǎn)換器交由外部掛載 的高速 AD/DA 板卡處理,其他 3 部分,相位累加器、相位調(diào)制器、波形數(shù)據(jù)表 ROM 由 FPGA 負(fù)責(zé)。所以我們要建立一個(gè)單獨(dú)的模塊對(duì) DDS 部分進(jìn)行處理;實(shí)驗(yàn)?zāi)繕?biāo)還提到要使用按鍵實(shí)現(xiàn) 4 種波形的切換,按鍵消抖模塊必不可少;同時(shí)也要聲明一個(gè)按鍵控制模塊對(duì)4 個(gè)輸入按鍵進(jìn)行控制。
3.1頂層模塊
時(shí)鐘、復(fù)位和代表波形選擇的 4 個(gè)按鍵信號(hào)通過頂層傳入按鍵控制模塊(key_control),
按鍵控制模塊內(nèi)部實(shí)例化 4 個(gè)按鍵消抖模塊,對(duì)輸入的 4 路按鍵信號(hào)分別進(jìn)行消抖處理; 消抖處理后的 4 路按鍵信號(hào)組成波形選擇信號(hào)輸入 dds 模塊(dds), dds 模塊中實(shí)例化一個(gè)ROM IP核,按順序存入了一個(gè)完整周期的正弦波、方波、三角波、鋸齒波的信號(hào)波形,根據(jù)輸入波形選擇信號(hào)對(duì) rom 中對(duì)應(yīng)信號(hào)波形進(jìn)行讀取,將讀出波形的幅度數(shù)字值輸出,傳入外部掛載的高速 AD/DA 板卡的 DA 端,板卡根據(jù)輸入的數(shù)字信號(hào)生成對(duì)應(yīng)波形的模擬信號(hào)。其中,輸出信號(hào)的頻率和相位的調(diào)節(jié)可在 dds 模塊中通過修改參數(shù)實(shí)現(xiàn)。
圖3-1 系統(tǒng)總體RTL視圖
3.2 數(shù)據(jù)選擇模塊
本實(shí)驗(yàn)設(shè)計(jì)的 DDS 信號(hào)發(fā)生器,可以實(shí)現(xiàn) 4 種信號(hào)波形的輸出,使用外部物理按鍵實(shí)現(xiàn)波形的切換,一個(gè)按鍵控制一種波形,共使用 4 個(gè)按鍵。外部物理按鍵的觸發(fā)信號(hào)通過頂層模塊輸入按鍵控制模塊,按鍵控制模塊內(nèi)部實(shí)例化 4 個(gè)按鍵消抖消抖模塊,分別對(duì)4路按鍵信號(hào)做消抖處理。消抖處理后的 4 路按鍵信號(hào)組成位寬為 4bit 的波形選擇信號(hào)并輸出至 DDS 模塊。波形選擇信號(hào)初值為 4’b0000,當(dāng)某一按鍵按下,波形選擇信號(hào)對(duì)應(yīng)位電平拉高。
圖3-2 數(shù)據(jù)選擇模塊RTL視圖
3.3 DDS模塊
我們設(shè)計(jì)的 DDS 簡易信號(hào)發(fā)生器想要實(shí)現(xiàn)正弦波、方波、三角波和鋸齒波 4 種波形的 輸出,需要事先在波形數(shù)據(jù)表 ROM 中存入 4 種波形信號(hào)各自的完整周期波形數(shù)據(jù)。ROM 作為只讀存儲(chǔ)器,在進(jìn)行 IP 核設(shè)置時(shí)需要指定初始化文件,我們將波形數(shù)據(jù)作為初始化文件寫入其中,文件格式為 MIF 文件。
圖3-3 DDS模塊RTL視圖
4系統(tǒng)仿真測試
4.1按鍵消抖仿真
按鍵的抖動(dòng)會(huì)產(chǎn)生抖動(dòng),抖動(dòng)的時(shí)間是小于 10ms 的,而當(dāng)有20ms 的時(shí)間內(nèi)都沒有抖動(dòng)就說明按鍵已經(jīng)處于穩(wěn)定狀態(tài)了。仿真代碼如下:
`timescale 1ns/1ns
module tb_key_control();
parameter CNT_1MS = 20’d19 ,
CNT_11MS = 21’d69 ,
CNT_41MS = 22’d149 ,
CNT_51MS = 22’d199 ,
CNT_60MS = 22’d249 ;
wire [3:0] wave_select ;
//reg define
reg sys_clk ;
reg sys_rst_n ;
reg [21:0] tb_cnt ;
reg key_in ;
reg [1:0] cnt_key ;
reg [3:0] key ;
//defparam define
defparam key_control_inst.CNT_MAX = 24;
//sys_rst_n,sys_clk,key
initial
begin
sys_rst_n = 1’b0;
sys_clk = 1’b0;
key = 4’b0000;
#200;
sys_rst_n = 1’b1;
end
always #10 sys_clk = ~sys_clk;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
tb_cnt <= 22’b0;
else if(tb_cnt == CNT_60MS)
tb_cnt <= 22’b0;
else
tb_cnt <= tb_cnt + 1’b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
key_in <= 1’b1;
else if((tb_cnt >= CNT_1MS && tb_cnt <= CNT_11MS)
|| (tb_cnt >= CNT_41MS && tb_cnt <= CNT_51MS))
key_in <= {$random} % 2;
else if(tb_cnt >= CNT_11MS && tb_cnt <= CNT_41MS)
key_in <= 1’b0;
else
key_in <= 1’b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
cnt_key <= 2’d0;
else if(tb_cnt == CNT_60MS)
cnt_key <= cnt_key + 1’b1;
else
cnt_key <= cnt_key;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
key <= 4’b1111;
else
case(cnt_key)
0: key <= {3’b111,key_in};
1: key <= {2’b11,key_in,1’b1};
2: key <= {1’b1,key_in,2’b11};
3: key <= {key_in,3’b111};
default:key <= 4’b1111;
endcase
key_control key_control_inst
(.sys_clk (sys_clk), //系統(tǒng)時(shí)鐘,50MHz
.sys_rst_n (sys_rst_n ), //復(fù)位信號(hào),低電平有效
.key (key), //輸入4位按鍵
.wave_select (wave_select) //輸出波形選擇
);
endmodule
圖4-1 按鍵消抖模塊仿真波形圖
4.2系統(tǒng)總體仿真
整個(gè)系統(tǒng)是在前幾個(gè)個(gè)模塊的基礎(chǔ)上實(shí)現(xiàn)的,對(duì)于整個(gè)系統(tǒng)來說,輸入端口為初始時(shí)鐘激勵(lì)信號(hào)sys_clk、控制復(fù)位信號(hào)sys_rst_n,數(shù)據(jù)選擇按鍵key,輸出有DAC模塊時(shí)鐘dac_data 和DAC模塊波形數(shù)據(jù)dac_data 。下面代碼中延時(shí)后改變key信號(hào)的值來模擬按鍵的按下,達(dá)到切換波形的效果。仿真結(jié)果如圖4.2所示。仿真代碼如下:
`timescale 1ns/1ns
module tb_top_dds();
parameter CNT_1MS = 20’d19000 ,
CNT_11MS = 21’d69000 ,
CNT_41MS = 22’d149000 ,
CNT_51MS = 22’d199000 ,
CNT_60MS = 22’d249000 ;
wire dac_clk ;
wire [7:0] dac_data ;
reg sys_clk ;
reg sys_rst_n ;
reg [21:0] tb_cnt ;
reg key_in ;
reg [1:0] cnt_key ;
reg [3:0] key ;
defparam top_dds_inst.key_control_inst.CNT_MAX = 24;
initial
begin
sys_clk = 1’b0;
sys_rst_n <= 1’b0;
key <= 4’b0000;
#200;
sys_rst_n <= 1’b1;
end
always #10 sys_clk = ~sys_clk;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
tb_cnt <= 22’b0;
else if(tb_cnt == CNT_60MS)
tb_cnt <= 22’b0;
else
tb_cnt <= tb_cnt + 1’b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
key_in <= 1’b1;
else if((tb_cnt >= CNT_1MS && tb_cnt <= CNT_11MS)
|| (tb_cnt >= CNT_41MS && tb_cnt <= CNT_51MS))
key_in <= {$random} % 2;
else if(tb_cnt >= CNT_11MS && tb_cnt <= CNT_41MS)
key_in <= 1’b0;
else
key_in <= 1’b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
cnt_key <= 2’d0;
else if(tb_cnt == CNT_60MS)
cnt_key <= cnt_key + 1’b1;
else
cnt_key <= cnt_key;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
key <= 4’b1111;
else
case(cnt_key)
0: key <= {3’b111,key_in};
1: key <= {2’b11,key_in,1’b1};
2: key <= {1’b1,key_in,2’b11};
3: key <= {key_in,3’b111};
default:key <= 4’b1111;
endcase
top_dds top_dds_inst
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.key (key ),
.dac_clk (dac_clk ),
.dac_data (dac_data )
);
endmodule
圖4-2 系統(tǒng)整體仿真波形圖
本次的仿真結(jié)果使用 ModelSim 軟件對(duì)頂層模塊進(jìn)行仿真,由圖可知,輸入與輸出信號(hào)額能正常傳入 傳出頂層模塊,并按照要求輸出信號(hào)。
5、程序下載與實(shí)物演示
5.1分頻模塊綜合圖
圖5.1 分頻模塊綜合圖
5.2引腳分配
本次課程設(shè)計(jì)所用的fpga開發(fā)板引腳圖如圖4-1所示:
圖5-2 fpga開發(fā)板引腳圖
5.3實(shí)物測試
將以sof為后綴的文件下載到開發(fā)板中,Quartus II的程序下載界面如圖4-3所示:
圖5-3 程序下載界面
實(shí)物效果圖如圖4-4所示:
5-4 實(shí)物圖
將外載DA模塊和板卡組合,用信號(hào)線連接DA模塊和示波器,上電后,按下按鍵,在示波器上顯示對(duì)應(yīng)的波形。
6、結(jié)論
通過上述仿真結(jié)果可以得出,基本上滿足題目要求的輸出四種波形,并能夠改變輸出波形的頻率以及幅度功能。也側(cè)面說明僅使用八位的相位累加器能夠滿足課題的條件,本系統(tǒng)采用的波形數(shù)據(jù)為8*255的數(shù)據(jù),四片ROM依次放入四種波形的數(shù)據(jù)。當(dāng)然,通過改變波形ROM的波形數(shù)據(jù),我們可以設(shè)計(jì)出輸出任意波形的信號(hào)發(fā)生器,相位累加器也可以進(jìn)行改進(jìn),比如用24位的累加器,增加波形的采樣點(diǎn)數(shù),那么輸出波形的失真度將會(huì)大大降低。
任何事情都不能一蹴而就的,畢業(yè)設(shè)計(jì)也是。在設(shè)計(jì)信號(hào)發(fā)生器的這段時(shí)間遇到了很多難題。首先就是對(duì)仿真軟件的陌生;選擇系統(tǒng)方案是的糾結(jié),起初是想是代碼實(shí)現(xiàn)波形的輸出,三角波、方波等都是線性函數(shù),我們可以編寫函數(shù),在時(shí)鐘的作用下累加,頻率控制字改變時(shí)鐘頻率,進(jìn)而改變輸出波形的頻率;設(shè)置一個(gè)最大值,幅度控制字改變最大值,累加值大于最大值就重新開始,但是最后由于正弦波信號(hào)時(shí)非線性的,而且使用這個(gè)函數(shù)法會(huì)造成比較大的波形失真,選擇放棄。第三就是仿真遇到的問題,在頂層模塊波形仿真時(shí),對(duì)各個(gè)輸入端已經(jīng)設(shè)置好了對(duì)應(yīng)的輸入,但是仿真結(jié)果是沒有輸出,復(fù)查了每個(gè)模塊,沒有找到原因。經(jīng)過不斷的嘗試后,把波形仿真的input 設(shè)置為功能仿真,并創(chuàng)建功能網(wǎng)表,才輸出正確的結(jié)果。最后在鎖定引腳,下載程序后,使用邏輯解析儀顯示設(shè)計(jì)的輸出波形,但是并沒有接觸過signalTapII,在硬件測試過程中產(chǎn)生了種種問題。不得已去論壇找資料自學(xué),終究使signalTapI顯示出正弦波、三角波、方波和鋸齒波。達(dá)到了預(yù)先的目標(biāo),證明了系統(tǒng)的準(zhǔn)確性。
在本次設(shè)計(jì)中也讓我感受到了硬件描述語言覆蓋面廣、描述能力強(qiáng)以及使用方便、便于修改的特點(diǎn),本設(shè)計(jì)也具有一定的實(shí)用價(jià)值。因?yàn)橹饕龅氖擒浖抡?,在具體硬件實(shí)現(xiàn)過程中由于器件本身存在的誤差,影響了波形采樣,致使最后輸出的波形略有失真,也側(cè)面反映了軟件和硬件必須要有良好的結(jié)合。文章來源:http://www.zghlxwxcb.cn/news/detail-752501.html
怎么csdn貼一張圖片這么麻煩啊?。。。。。。。。。。。?!
代碼就不放了,完全適用野火fpga征途開發(fā)板25_DDS
傳送門:https://doc.embedfire.com/products/link/zh/latest/index.html文章來源地址http://www.zghlxwxcb.cn/news/detail-752501.html
到了這里,關(guān)于fpga課設(shè)-多功能信號(hào)發(fā)生器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!