日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DDS与DA

發布時間:2024/3/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DDS与DA 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

信號發生器

信號發生器是一種能提供各種頻率、輸出電平的電信號的設備,又稱信號源或振蕩器。其在各種

電信系統的振幅、頻率、傳輸特性等電參數以及元器件的特性與參數的測量中得到了廣泛的應用。

直接數字式頻率合成器

( Direct Digital Synthesizer,DDS)是一項關鍵的數字化技術,其將先進
的數字處理理論與方法引入頻率合成技術,通過數/模轉換器將一系列數字量形式的信號轉換成模擬
量形式的信號。

DA9709芯片


***DA9709芯片***是雙通道,位寬 8bit 的芯片,速率高達 125MSPS,能夠滿足常用信號發生器、濾波信號輸出等需求。
DAC 芯片與 FPGA 相連的信號為: DA_CLKA、 DA_CLKB、 DAC_DA7-0、 DAC_DB7-0、DA_WRA、 DA_WRB 、 DAC_MODE 和 DAC_SLEEP。如下圖:

DA9709操作時序

注意


輸出電壓與 DAC_DA/B 的值成線性反比例關系,最低電壓為 0.48V,最高為 2.2V。需要注意的是,此范圍的電壓是由于外圍硬件電路特性的原因導致的,不同電路對應的電壓范圍有所
不同。

實驗實現目標

采用采樣率大于 100M 的示波器,將其連接到開發板上,控制 DA 輸出不同頻率的正弦

波,示波器顯示出對應波形。輸出方式如下:

連續輸出 2 個周期為 6.25MHz 的正弦波,每個正弦波輸出 8 個采樣點;
連續輸出 2 個周期為 3.125MHz 的正弦波,每個正弦波輸出 16 個采樣點;
連續輸出 2 個周期為 1.5625MHz 的正弦波,每個正弦波輸出 32 個采樣點;
連續輸出 2 個周期為 781250Hz 的正弦波,每個正弦波輸出 64 個采樣點;
連續輸出 2 個周期為 390625Hz 的正弦波,每個正弦波輸出 128 個采樣點;
連續輸出 2 個周期為 195312.5Hz 的正弦波,每個正弦波輸出 128 個采樣點。

正弦波的最高電壓是 2.2V,最低電壓是 0.48V。

verilog代碼

下面是我自己編寫的,寫法與明德楊的不同,但是大致框架是一樣的。

module dac9709(input wire sys_clk ,input wire sys_rst_n ,output wire dac_clk_a ,output wire dac_mode ,output reg [7:0] dac_data ,output wire dac_sleep ,output wire dac_wr_en );reg [1:0] cnt0 ; reg [7:0] cnt1 ; reg [1:0] cnt2 ; reg [2:0] cnt3 ; reg [7:0] addr ; reg [7:0] sin_data ; reg [2:0] sel_gap ; reg [7:0] sel_point ;wire flag1 ; wire flag2 ; wire flag3 ;assign flag1 = (cnt0 == (sel_gap - 1'b1))?1'b1:1'b0; assign flag2 = (cnt1 == (sel_point - 1'b1))?1'b1:1'b0; assign flag3 = (cnt2 == 1'b1)?1'b1:1'b0;always@ (posedge sys_clk or negedge sys_rst_n)if (sys_rst_n == 1'b0)cnt0 <= 2'd0;else if(flag1)cnt0 <= 2'd0;else cnt0 <= cnt0 + 1'b1;always@ (posedge sys_clk or negedge sys_rst_n)if (sys_rst_n == 1'b0)cnt1 <= 8'd0;else if(flag2)cnt1 <= 8'd0;else if(flag1)cnt1 <= cnt1 + 1'b1;elsecnt1 <= cnt1;always@ (posedge sys_clk or negedge sys_rst_n)if (sys_rst_n == 1'b0)cnt2 <= 2'd0;else if ((flag3)&&(flag2))cnt2 <= 2'd0;else if(flag2)cnt2 <= cnt2 + 1'b1; elsecnt2 <= cnt2;always @ (posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt3 <= 3'd0;else if ((cnt3 == 3'd5)&&(flag3)&&(flag2))cnt3 <= 3'd0;else if ((flag3)&&(flag2))cnt3 <= cnt3 + 1'b1;elsecnt3 <= cnt3;always @ (*)begincase (cnt3)0:beginsel_gap <= 2'd1;sel_point <= 8'd8;end1:beginsel_gap <= 2'd1;sel_point <= 8'd16;end2:beginsel_gap <= 2'd1;sel_point <= 8'd32;end3:beginsel_gap <= 2'd1;sel_point <= 8'd64;end4:beginsel_gap <= 2'd1;sel_point <= 8'd128;end5:beginsel_gap <= 2'd2;sel_point <= 8'd128;enddefault : beginsel_gap <= 2'd1;sel_point <= 8'd8;endendcaseendalways @ (*) begincase (cnt3)0:addr = cnt1 *16;1:addr = cnt1 *8;2:addr = cnt1 *4;3:addr = cnt1 *2;4:addr = cnt1 *1;5:addr = cnt1 *1;default : addr = cnt1 *1;endcase endalways @ (*) begincase(addr)0 :sin_data<= 8'h7f;1 :sin_data<= 8'h85;2 :sin_data<= 8'h8c;3 :sin_data<= 8'h92;4 :sin_data<= 8'h98;5 :sin_data<= 8'h9e;6 :sin_data<= 8'ha4;7 :sin_data<= 8'haa;8 :sin_data<= 8'hb0;9 :sin_data<= 8'hb6;10 :sin_data<= 8'hbb;11 :sin_data<= 8'hc1;12 :sin_data<= 8'hc6;13 :sin_data<= 8'hcb;14 :sin_data<= 8'hd0;15 :sin_data<= 8'hd5;16 :sin_data<= 8'hda;17 :sin_data<= 8'hde;18 :sin_data<= 8'he2;19 :sin_data<= 8'he6;20 :sin_data<= 8'he9;21 :sin_data<= 8'hed;22 :sin_data<= 8'hf0;23 :sin_data<= 8'hf3;24 :sin_data<= 8'hf5;25 :sin_data<= 8'hf8;26 :sin_data<= 8'hf9;27 :sin_data<= 8'hfb;28 :sin_data<= 8'hfd;29 :sin_data<= 8'hfe;30 :sin_data<= 8'hfe;31 :sin_data<= 8'hff;32 :sin_data<= 8'hff;33 :sin_data<= 8'hff;34 :sin_data<= 8'hfe;35 :sin_data<= 8'hfe;36 :sin_data<= 8'hfd;37 :sin_data<= 8'hfb;38 :sin_data<= 8'hf9;39 :sin_data<= 8'hf8;40 :sin_data<= 8'hf5;41 :sin_data<= 8'hf3;42 :sin_data<= 8'hf0;43 :sin_data<= 8'hed;44 :sin_data<= 8'he9;45 :sin_data<= 8'he6;46 :sin_data<= 8'he2;47 :sin_data<= 8'hde;48 :sin_data<= 8'hda;49 :sin_data<= 8'hd5;50 :sin_data<= 8'hd0;51 :sin_data<= 8'hcb;52 :sin_data<= 8'hc6;53 :sin_data<= 8'hc1;54 :sin_data<= 8'hbb;55 :sin_data<= 8'hb6;56 :sin_data<= 8'hb0;57 :sin_data<= 8'haa;58 :sin_data<= 8'ha4;59 :sin_data<= 8'h9e;60 :sin_data<= 8'h98;61 :sin_data<= 8'h92;62 :sin_data<= 8'h8c;63 :sin_data<= 8'h85;64 :sin_data<= 8'h7f;65 :sin_data<= 8'h79;66 :sin_data<= 8'h72;67 :sin_data<= 8'h6c;68 :sin_data<= 8'h66;69 :sin_data<= 8'h60;70 :sin_data<= 8'h5a;71 :sin_data<= 8'h54;72 :sin_data<= 8'h4e;73 :sin_data<= 8'h48;74 :sin_data<= 8'h43;75 :sin_data<= 8'h3d;76 :sin_data<= 8'h38;77 :sin_data<= 8'h33;78 :sin_data<= 8'h2e;79 :sin_data<= 8'h29;80 :sin_data<= 8'h24;81 :sin_data<= 8'h20;82 :sin_data<= 8'h1c;83 :sin_data<= 8'h18;84 :sin_data<= 8'h15;85 :sin_data<= 8'h11;86 :sin_data<= 8'he;87 :sin_data<= 8'hb;88 :sin_data<= 8'h9;89 :sin_data<= 8'h6;90 :sin_data<= 8'h5;91 :sin_data<= 8'h3;92 :sin_data<= 8'h1;93 :sin_data<= 8'h0;94 :sin_data<= 8'h0;95 :sin_data<= 8'h0;96 :sin_data<= 8'h0;97 :sin_data<= 8'h0;98 :sin_data<= 8'h0;99 :sin_data<= 8'h0;100 :sin_data<= 8'h1;101 :sin_data<= 8'h3;102 :sin_data<= 8'h5;103 :sin_data<= 8'h6;104 :sin_data<= 8'h9;105 :sin_data<= 8'hb;106 :sin_data<= 8'he;107 :sin_data<= 8'h11;108 :sin_data<= 8'h15;109 :sin_data<= 8'h18;110 :sin_data<= 8'h1c;111 :sin_data<= 8'h20;112 :sin_data<= 8'h24;113 :sin_data<= 8'h29;114 :sin_data<= 8'h2e;115 :sin_data<= 8'h33;116 :sin_data<= 8'h38;117 :sin_data<= 8'h3d;118 :sin_data<= 8'h43;119 :sin_data<= 8'h48;120 :sin_data<= 8'h4e;121 :sin_data<= 8'h54;122 :sin_data<= 8'h5a;123 :sin_data<= 8'h60;124 :sin_data<= 8'h66;125 :sin_data<= 8'h6c;126 :sin_data<= 8'h72;127 :sin_data<= 8'h79; endcase endalways @ (posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)dac_data <= 8'd0;elsedac_data <= 255 - sin_data;assign dac_mode = 1'b1; assign dac_clk_a = ~ sys_clk; assign dac_sleep = 1'b0; assign dac_wr_en = dac_clk_a;endmodule

仿真測試代碼

`timescale 1ns/1nsmodule dac_9709_tb();reg sys_clk ; reg sys_rst_n ;wire dac_clk_a ; wire dac_mode ; wire[7:0] dac_data ; wire dac_sleep ; wire dac_wr_en ;initial beginsys_clk = 1'b1;sys_rst_n = 1'b0;#21sys_rst_n = 1'b1;#100000$stop; endalways #10 sys_clk = ~sys_clk;dac9709 dac9709_inst( .sys_clk (sys_clk ), .sys_rst_n (sys_rst_n ),.dac_clk_a (dac_clk_a ), .dac_mode (dac_mode ), .dac_data (dac_data ), .dac_sleep (dac_sleep ), .dac_wr_en (dac_wr_en ));endmodule

MATLAB產生波形數據


上圖正弦波的數據可以通過matlab產生:
輸入以下命令:生成文件,復制即可。

clc; %清除命令行命令 clear all; %清除工作區變量,釋放內存空間 F1=1; %信號頻率 Fs=2^7; %采樣頻率 P1=0; %信號初始相位 N=2^7; %采樣點數 t=[0:1/Fs:(N-1)/Fs]; %采樣時刻 ADC=2^7 - 1; %直流分量 A=2^7; %信號幅度 %生成正弦信號 s=A*sin(2*pi*F1*t + pi*P1/180) + ADC; plot(s); %繪制圖形 %創建mif文件 fild = fopen('sin_128.mif','wt'); %寫入mif文件頭 fprintf(fild, '%s\n','WIDTH=7;'); %位寬 fprintf(fild, '%s\n\n','DEPTH=128;'); %深度 fprintf(fild, '%s\n','ADDRESS_RADIX=UNS;'); %地址格式 fprintf(fild, '%s\n\n','DATA_RADIX=UNS;'); %數據格式 fprintf(fild, '%s\t','CONTENT'); %地址 fprintf(fild, '%s\n','BEGIN'); %開始 for i = 1:Ns0(i) = round(s(i)); %對小數四舍五入以取整if s0(i) <0 %負1強制置零s0(i) = 0endfprintf(fild, '\t%g\t',i-1); %地址編碼fprintf(fild, '%s\t',':sin_data<='); %冒號fprintf(fild, '%x',s0(i)); %數據寫入fprintf(fild, '%s\n',';'); %分號,換行 end fprintf(fild, '%s\n','END;'); %結束 fclose(fild);

modelsim仿真結果

大家不懂的可以與我交流!!!

***注:以上內容借鑒了《明德楊至簡設計原理與應用》***

總結

以上是生活随笔為你收集整理的DDS与DA的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。