DDS簡(jiǎn)介:
DDS 同 DSP(數(shù)字信號(hào)處理)一樣,是一項(xiàng)關(guān)鍵的數(shù)字化技術(shù)。DDS 是直接數(shù)字式頻率合成器(Direct Digital Synthesizer)的英文縮寫。與傳統(tǒng)的頻率合成器相比,DDS 具有低成本、低功耗、高分辨率和快速轉(zhuǎn)換時(shí)間等優(yōu)點(diǎn),廣泛使用在電信與電子儀器領(lǐng)域,是實(shí)現(xiàn)設(shè)備全數(shù)字化的一個(gè)關(guān)鍵技術(shù)。
DDS 芯片的功能主要包括頻率控制寄存器、高速相位累加器和正弦計(jì)算器三個(gè)部分。頻率控制寄存器可以串行或并行的方式裝載并寄存用戶輸入的頻率控制碼;而相位累加器根據(jù)頻率控制碼在每個(gè)時(shí)鐘周期內(nèi)進(jìn)行相位累加,得到一個(gè)相位值;正弦計(jì)算器則對(duì)該相位值計(jì)算數(shù)字化正弦波幅度(芯片一般通過(guò)查表得到)。
DDS 芯片輸出的一般是數(shù)字化的正弦波,因此還需經(jīng)過(guò)高速 D/A 轉(zhuǎn)換器和低通濾波器才能得到一個(gè)可用的模擬頻率信號(hào)。關(guān)于想了解更多的 DDS 的相關(guān)知識(shí), 大家可以到百度直接搜索。
下面主要來(lái)給大家介紹FPGA 程序的設(shè)計(jì), DDS IP 的配置和調(diào)試。
編寫 dds_wave 的 verilog 程序
`timescale1ns/1ps ////////////////////////////////////////////////////////////////////////////////// //Company: //Engineer: // //CreateDate:103307/17/2018 //DesignName: //ModuleName:dds_wave //ProjectName: //TargetDevices: //Toolversions: //Description: // //Dependencies: // //Revision: //Revision0.01-FileCreated //AdditionalComments: // ////////////////////////////////////////////////////////////////////////////////// moduledds_wave(clk,key1,data,da_clk ); inputclk,key1; output[7:0]data; outputda_clk; reg[15:0]key1_cout; reg[7:0]data_o; regdds_we; reg[28:0]dds_data; reg[3:0]dds_freq=0; regdds_we_req; wire[7:0]sine; assignsine_reg=sine[6:0]; assignda_clk=clk; assigndata=data_o; //有符號(hào)數(shù)轉(zhuǎn)化為無(wú)符號(hào)輸出到DA always@(posedgeclk) begin if(sine[7]==1'b1) data_o<=?sine?-?128; ?else ??data_o?<=?sine?+?128; end //控制DDS輸出不同 always?@(negedge?clk) begin ?dds_we?<=?dds_we_req; ?case(dds_freq) ?4'd0: ??dds_data?<=?29'd107;??//10Hz:(dds_data*2^29/50*1000000) ?4'd1: ??dds_data?<=?29'd1074;?//100Hz:(dds_data*2^29/50*1000000) ?4'd2: ??dds_data?<=?29'd10737;?//1kHz:(dds_data*2^29/50*1000000) ?4'd3: ??dds_data?<=?29'd53687;?//5kHz:(dds_data*2^29/50*1000000) ?4'd4: ??dds_data?<=?29'd107374;?//10kHz:(dds_data*2^29/50*1000000) ?4'd5: ??dds_data?<=?29'd536871;?//50kHz:(dds_data*2^29/50*1000000) ?4'd6: ??dds_data?<=?29'd1073742;?//100Hz:(dds_data*2^29/50*1000000) ?4'd7: ??dds_data?<=?29'd5368709;?//500Hz:(dds_data*2^29/50*1000000) ?4'd8: ??dds_data?<=?29'd10737418;?//1mHz:(dds_data*2^29/50*1000000)?? ?4'd9: ??dds_data?<=?29'd21474836;?//2mHz:(dds_data*2^29/50*1000000) ?4'd10: ??dds_data?<=?29'd32212255;?//3mHz:(dds_data*2^29/50*1000000) ?4'd11: ??dds_data?<=?29'd42949672;?//4mHz:(dds_data*2^29/50*1000000) ?4'd12: ??dds_data?<=?29'd53687091;?//5mHz:(dds_data*2^29/50*1000000) ?4'd13: ??dds_data?<=?29'd64424509;?//6mHz:(dds_data*2^29/50*1000000) ?4'd14: ??dds_data?<=?29'd75161928;?//7mHz:(dds_data*2^29/50*1000000) ?4'd15: ??dds_data?<=?29'd85899346;?//8mHz:(dds_data*2^29/50*1000000) ?default: ??dds_data?<=?29'd107;?//?1kHz:(dds_data*2^29/50*1000000) ?endcase end ? //按鈕處理程序,改變DDS的輸出頻率 always?@(posedge?clk) begin ?if(key1?==?1'b0) ??key1_cout?<=?0; ?else?if((key1?==?1'b1)?&?(key1_cout?<=?16'hc350)) ??key1_cout?<=?key1_cout?+?1'b1; ? ?if(key1_cout?==?16'hc349) ?begin ??dds_freq?<=dds_freq?+?1'b1; ??dds_we_req?<=?1'b1; ?end ?else?begin ??dds_freq?<=dds_freq; ??dds_we_req?<=?1'b0; ?end end? ? //DDS?IP產(chǎn)生sin/cos波形 sin_cos?sin_cos_inst( ?.clk(clk), ?.we(dds_we), ?.data(dds_data), ?.cosine(cosine), ?.sine(sine), ?.phase_out() ); ? endmodule
程序通過(guò)檢測(cè)開(kāi)發(fā)板上按鍵 KEY1 ,如果按鍵 KEY1 每按下一次,寄存器 dds_freq 的值就會(huì)加 1, 程序就會(huì)對(duì) DDS IP 寫入一個(gè) data 數(shù)據(jù)來(lái)改變相位的增加量,從而改變輸出波形的頻率。程序中設(shè)置了 16 種相位的增加量,所以可以讓 DDS 產(chǎn)生 16 個(gè)不同頻率的正弦波。在本實(shí)驗(yàn)的 DDS IP 的配置中,相位增加的數(shù)據(jù)寬度為 29 位,所以最小的頻率輸出為50Mhz/2^29, 約 0.093Hz。如果想讓 DDS 輸出 1Khz 的波形,就需要寫入相位增加值10737 。相位增加值和頻率的計(jì)算公式如下:
相位增加值=( fhz * 2^29 )/( 50 * 1000000)
仿真圖如下:
審核編輯:湯梓紅
-
合成器
+關(guān)注
關(guān)注
0文章
273瀏覽量
25360 -
正弦波發(fā)生器
+關(guān)注
關(guān)注
1文章
26瀏覽量
15661 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110100 -
DDS
+關(guān)注
關(guān)注
21文章
634瀏覽量
152663
原文標(biāo)題:Verilog實(shí)現(xiàn)DDS 正弦波發(fā)生器
文章出處:【微信號(hào):ZYNQ,微信公眾號(hào):ZYNQ】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論