久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

FPGA學(xué)習(xí).7...

 流浪gh80mtbd93 2021-12-17

DDS是直接數(shù)字式頻率合成器(Direct Digital Synthesizer)的英文縮寫,,是一項(xiàng)關(guān)鍵的數(shù)字化技術(shù),。與傳統(tǒng)的頻率合成器相比,DDS具有低成本,、低功耗,、高分辨率和快速轉(zhuǎn)換時(shí)間等優(yōu)點(diǎn),廣泛使用在電信與電子儀器領(lǐng)域,,是實(shí)現(xiàn)設(shè)備全數(shù)字化的一個(gè)關(guān)鍵技術(shù),。作為設(shè)計(jì)人員,我們習(xí)慣稱它為信號(hào)發(fā)生器,,一般用它產(chǎn)生正弦,、鋸齒、方波等不同波形或不同頻率的信號(hào)波形,,在電子設(shè)計(jì)和測(cè)試中得到廣泛應(yīng)用,。

DDS的基本結(jié)構(gòu)主要由相位累加器、相位調(diào)制器,、波形數(shù)據(jù)表ROM,、D/A轉(zhuǎn)換器等四大結(jié)構(gòu)組成,其中較多設(shè)計(jì)還會(huì)在數(shù)模轉(zhuǎn)換器之后增加一個(gè)低通濾波器,。

系統(tǒng)時(shí)鐘CLK為整個(gè)系統(tǒng)的工作時(shí)鐘,,頻率為fCLK;頻率字輸入F_WORD,,一般為整數(shù),,數(shù)值大小控制輸出信號(hào)的頻率大小,數(shù)值越大輸出信號(hào)頻率越高,,反之,,輸出信號(hào)頻率越低,后文中用K表示,;相位字輸入P_WORD,,為整數(shù),數(shù)值大小控制輸出信號(hào)的相位偏移,,主要用于相位的信號(hào)調(diào)制,,后文用P表示;設(shè)輸出信號(hào)為CLK_OUT,,頻率為fOUT,。

圖中所展示的四大結(jié)構(gòu)中,相位累加器是整個(gè)DDS的核心,在這里完成相位累加,,生成相位碼,。相位累加器的輸入為頻率字輸入K,表示相位增量,,設(shè)其位寬為N,,滿足等式K = 2N * fOUT / fCLK 。其在輸入相位累加器之前,,在系統(tǒng)時(shí)鐘同步下做數(shù)據(jù)寄存,,數(shù)據(jù)改變時(shí)不會(huì)干擾相位累加器的正常工作。

相位調(diào)制器接收相位累加器輸出的相位碼,, 在這里加上一個(gè)相位偏移值P,,主要用于信號(hào)的相位調(diào)制,如應(yīng)用于通信方面的相移鍵控等,,不使用此部分時(shí)可以去掉,,或者將其設(shè)為一個(gè)常數(shù)輸入,同樣相位字輸入也要做寄存,。

波形數(shù)據(jù)表ROM中存有一個(gè)完整周期的正弦波信號(hào),。假設(shè)波形數(shù)據(jù)ROM的地址位寬為12位,存儲(chǔ)數(shù)據(jù)位寬為8位,,即ROM有212 = 4096個(gè)存儲(chǔ)空間,,每個(gè)存儲(chǔ)空間可存儲(chǔ)1字節(jié)數(shù)據(jù)。將一個(gè)周期的正弦波信號(hào),,沿橫軸等間隔采樣212 = 4096次,,每次采集的信號(hào)幅度用1字節(jié)數(shù)據(jù)表示,最大值為255,,最小值為0,。將4096次采樣結(jié)果按順序?qū)懭隦OM的4096個(gè)存儲(chǔ)單元,一個(gè)完整周期正弦波的數(shù)字幅度信號(hào)寫入了波形數(shù)據(jù)表ROM中,。波形數(shù)據(jù)表ROM以相位調(diào)制器傳入的相位碼為ROM讀地址,,將地址對(duì)應(yīng)存儲(chǔ)單元中的電壓幅值數(shù)字量輸出。

D/A轉(zhuǎn)換器將輸入的電壓幅值數(shù)字量轉(zhuǎn)換為模擬量輸出,,就得到輸出信號(hào)CLK_OUT,。

輸出信號(hào)CLK_OUT的信號(hào)頻率fOUT = K * fCLK / 2N。當(dāng)K = 1時(shí),,可得DDS最小分辨率為:fOUT = fCLK / 2N,,此時(shí)輸出信號(hào)頻率最低。根據(jù)采樣定理,,K的最大值應(yīng)小于2N / 2,。

講到這里,你可能會(huì)心存疑慮,相位累加器得到的相位碼是如何實(shí)現(xiàn)ROM尋址的呢,?

對(duì)于N位的相位累加器,,它對(duì)應(yīng)的相位累加值為2N,如果正弦ROM中存儲(chǔ)單元的個(gè)數(shù)也是2N的話,,這個(gè)問(wèn)題就很好解決,,但是這對(duì)ROM的對(duì)存儲(chǔ)容量的要求較高。在實(shí)際操作中,,我們使用相位累加值的高幾位對(duì)ROM進(jìn)行尋址,,也就是說(shuō)并不是每個(gè)系統(tǒng)時(shí)鐘都對(duì)ROM進(jìn)行數(shù)據(jù)讀取,而是多個(gè)時(shí)鐘讀取一次,,因?yàn)檫@樣能保證相位累加器溢出時(shí),從正弦ROM表中取出正好一個(gè)正弦周期的樣點(diǎn),。

因此,,相位累加器每計(jì)數(shù)2N次,對(duì)應(yīng)一個(gè)正弦周期,。而相位累加器1秒鐘計(jì)數(shù)fCLK次,,在k=1時(shí),DDS輸出的時(shí)鐘頻率就是頻率分辨率,。頻率控制字K增加時(shí),,相位累加器溢出的頻率增加,對(duì)應(yīng)DDS輸出信號(hào)CLK_OUT頻率變?yōu)镵倍的DDS頻率分辨率,。

舉個(gè)例子:

設(shè):ROM存儲(chǔ)單元個(gè)數(shù)為4096,,每個(gè)存儲(chǔ)數(shù)據(jù)用8位二進(jìn)制表示。即,,ROM地址線寬度為12,,數(shù)據(jù)線寬度為8;相位累加器位寬N = 32,。

根據(jù)上述條件可以知道,,相位調(diào)制器位寬M = 12,那么根據(jù)DDS原理,。那么在相位調(diào)制器中與相位控制字進(jìn)行累加時(shí),,應(yīng)用相位累加器的高12位累加。而相位累加器的低20位只與頻率控制字累加,。

我們以頻率控制字K = 1為例,,相位累加器的低20位一直會(huì)加1,直到低20位溢出向高12位進(jìn)位,,此時(shí)ROM為0,,也就是說(shuō),ROM的0地址中的數(shù)據(jù)被讀了220次,繼續(xù)下去,,ROM中的4096個(gè)點(diǎn),,每個(gè)點(diǎn)都將會(huì)被讀220次,最終輸出的波形頻率應(yīng)該是參考時(shí)鐘頻率的1 / 220,,周期被擴(kuò)大了220 倍,。同樣當(dāng)頻率控制字為100時(shí),相位累加器的低20位一直會(huì)加100,,那么,,相位累加器的低20位溢出的時(shí)間比上面會(huì)快100倍,則ROM中的每個(gè)點(diǎn)相比于上面會(huì)少讀100次,,所以最終輸出頻率是上述的10倍,。

自波形數(shù)據(jù)表ROM輸出的波形數(shù)據(jù)傳入D/A轉(zhuǎn)換器轉(zhuǎn)換為模擬信號(hào)。D/A轉(zhuǎn)換器即數(shù)/模轉(zhuǎn)換器,,簡(jiǎn)稱DAC(Digital to Analog Conver),,是指將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)的電子元件或電路。

DAC內(nèi)部電路構(gòu)造無(wú)太大差異,,大多數(shù)DAC由電阻陣列和n個(gè)電流開關(guān)(或電壓開關(guān))構(gòu)成,,按照輸入的數(shù)字值進(jìn)行開關(guān)切換,輸出對(duì)應(yīng)電流或電壓,。因此,,按照輸出信號(hào)類型可分為電壓型和電流型,也可以按照DAC能否做乘法運(yùn)算進(jìn)行分類,。若將DAC分為電壓型和電流型兩大類,,電壓型DAC中又有權(quán)電阻網(wǎng)絡(luò)、T形電阻網(wǎng)絡(luò),、樹形開關(guān)網(wǎng)絡(luò)等分別,;電流型DAC中又有權(quán)電流型電阻網(wǎng)絡(luò)和倒T形電阻網(wǎng)絡(luò)等。

電壓輸出型DAC一般采用內(nèi)置輸出放大器以低阻抗輸出,,少部分直接通過(guò)電阻陣列進(jìn)行電壓輸出,。直接輸出電壓的DAC僅用于高阻抗負(fù)載,由于無(wú)輸出放大器部分的延遲,,故常作為高速DAC使用,。

電流輸出型DAC很少直接利用電流輸出,大多外接電流 - 電壓轉(zhuǎn)換電路進(jìn)行電壓輸出,。實(shí)現(xiàn)電流 - 電壓轉(zhuǎn)換,,方法有二:一是只在輸出引腳上接負(fù)載電阻而進(jìn)行電流- 電壓轉(zhuǎn)換,二是外接運(yùn)算放大器,。

DAC的主要技術(shù)指標(biāo)包括分辨率,、線性度,、轉(zhuǎn)換精度和轉(zhuǎn)換速度。

分辨率指輸出模擬電壓的最小增量,,即表明DAC輸入一個(gè)最低有效位(LSB)而在輸出端上模擬電壓的變化量,。

線性度在理想情況下,DAC的數(shù)字輸入量作等量增加時(shí),,其模擬輸出電壓也應(yīng)作等量增加,,但是實(shí)際輸出往往有偏離。

D/A轉(zhuǎn)換器的轉(zhuǎn)換精度與D/A轉(zhuǎn)換器的集成芯片的結(jié)構(gòu)和接口電路配置有關(guān),。如果不考慮其他D/A轉(zhuǎn)換誤差時(shí),,D/A的轉(zhuǎn)換精度就是分辨率的大小,因此要獲得高精度的D/A轉(zhuǎn)換結(jié)果,,首先要保證選擇有足夠分辨率的D/A轉(zhuǎn)換器,。同時(shí)D/A轉(zhuǎn)換精度還與外接電路的配置有關(guān),當(dāng)外部電路器件或電源誤差較大時(shí),,會(huì)造成較大的D/A轉(zhuǎn)換誤差,,當(dāng)這些誤差超過(guò)一定程度時(shí),D/A轉(zhuǎn)換就產(chǎn)生錯(cuò)誤,。

轉(zhuǎn)換速度一般由建立時(shí)間決定。建立時(shí)間是將一個(gè)數(shù)字量轉(zhuǎn)換為穩(wěn)定模擬信號(hào)所需的時(shí)間,,也可以認(rèn)為是轉(zhuǎn)換時(shí)間,。DA中常用建立時(shí)間來(lái)描述其速度,而不是AD中常用的轉(zhuǎn)換速率,。一般地,,電流輸出DA建立時(shí)間較短,電壓輸出DA則較長(zhǎng),。

開始實(shí)操,,我們需要一塊FPGA開發(fā)板和一塊DAC轉(zhuǎn)換模塊。這里我是使用Altera EP4CE10+AD9708

工程整體框圖:.

時(shí)鐘,、復(fù)位和代表波形選擇的4個(gè)按鍵信號(hào)通過(guò)頂層傳入按鍵控制模塊(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模塊中通過(guò)修改參數(shù)實(shí)現(xiàn)。

ROM內(nèi)波形數(shù)據(jù)寫入

我們?cè)O(shè)計(jì)的DDS簡(jiǎn)易信號(hào)發(fā)生器想要實(shí)現(xiàn)正弦波,、方波,、三角波和鋸齒波4種波形的輸出,需要事先在波形數(shù)據(jù)表ROM中存入4種波形信號(hào)各自的完整周期波形數(shù)據(jù),。ROM作為只讀存儲(chǔ)器,,在進(jìn)行IP核設(shè)置時(shí)需要指定初始化文件,我們將波形數(shù)據(jù)作為初始化文件寫入其中,,文件格式為COE文件,。

使用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ù)為212 = 4096次,,采集的波形幅值數(shù)據(jù)位寬為8bit,將采集數(shù)據(jù)保存為MIF文件,。

以下為matlab代碼

正弦信號(hào)波形采集參考代碼:

  1. clc; %清除命令行命令
  2. clear all; %清除工作區(qū)變量,釋放內(nèi)存空間
  3. F1=1; %信號(hào)頻率
  4. Fs=2^12; %采樣頻率
  5. P1=0; %信號(hào)初始相位
  6. N=2^12; %采樣點(diǎn)數(shù)
  7. t=[0:1/Fs:(N-1)/Fs]; %采樣時(shí)刻
  8. ADC=2^7 - 1; %直流分量
  9. A=2^7; %信號(hào)幅度
  10. %生成正弦信號(hào)
  11. s=A*sin(2*pi*F1*t + pi*P1/180) + ADC;
  12. plot(s); %繪制圖形
  13. %創(chuàng)建coe文件
  14. fild = fopen('sin_wave_4096x8.coe','wt');
  15. %寫入coe文件頭
  16. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_RADIX=10;'); %10進(jìn)制數(shù)
  17. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_VECTOR=');
  18. for i = 1:N
  19. s0(i) = round(s(i)); %對(duì)小數(shù)四舍五入以取整
  20. if s0(i) <0 %負(fù)1強(qiáng)制置零
  21. s0(i) = 0
  22. end
  23. if i == N
  24. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  25. fprintf(fild, '%s',';'); %最后一個(gè)數(shù)據(jù)使用分號(hào)
  26. else
  27. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  28. fprintf(fild, '%s\n',','); %逗號(hào),,換行
  29. end
  30. end
  31. fclose(fild);

方波信號(hào)波形采集參考代碼:

  1. clc; %清除命令行命令
  2. clear all; %清除工作區(qū)變量,釋放內(nèi)存空間
  3. F1=1; %信號(hào)頻率
  4. Fs=2^12; %采樣頻率
  5. P1=0; %信號(hào)初始相位
  6. N=2^12; %采樣點(diǎn)數(shù)
  7. t=[0:1/Fs:(N-1)/Fs]; %采樣時(shí)刻
  8. ADC=2^7 - 1; %直流分量
  9. A=2^7; %信號(hào)幅度
  10. %生成方波信號(hào)
  11. s=A*square(2*pi*F1*t + pi*P1/180) + ADC;
  12. plot(s); %繪制圖形
  13. %創(chuàng)建coe文件
  14. fild = fopen('squ_wave_4096x8.coe','wt');
  15. %寫入coe文件頭
  16. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_RADIX=10;'); %10進(jìn)制數(shù)
  17. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_VECTOR=');
  18. for i = 1:N
  19. s0(i) = round(s(i)); %對(duì)小數(shù)四舍五入以取整
  20. if s0(i) <0 %負(fù)1強(qiáng)制置零
  21. s0(i) = 0
  22. end
  23. if i == N
  24. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  25. fprintf(fild, '%s',';'); %最后一個(gè)數(shù)據(jù)使用分號(hào)結(jié)束
  26. else
  27. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  28. fprintf(fild, '%s\n',','); %逗號(hào),換行
  29. end
  30. end
  31. fclose(fild);

三角波信號(hào)波形采集參考代碼:

  1. clc; %清除命令行命令
  2. clear all; %清除工作區(qū)變量,釋放內(nèi)存空間
  3. F1=1; %信號(hào)頻率
  4. Fs=2^12; %采樣頻率
  5. P1=0; %信號(hào)初始相位
  6. N=2^12; %采樣點(diǎn)數(shù)
  7. t=[0:1/Fs:(N-1)/Fs]; %采樣時(shí)刻
  8. ADC=2^7 - 1; %直流分量
  9. A=2^7; %信號(hào)幅度
  10. %生成三角波信號(hào)
  11. s=A*sawtooth(2*pi*F1*t + pi*P1/180,0.5) + ADC;
  12. plot(s); %繪制圖形
  13. %創(chuàng)建coe文件
  14. fild = fopen('tri_wave_4096x8.coe','wt');
  15. %寫入coe文件頭
  16. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_RADIX=10;'); %10進(jìn)制數(shù)
  17. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_VECTOR=');
  18. for i = 1:N
  19. s0(i) = round(s(i)); %對(duì)小數(shù)四舍五入以取整
  20. if s0(i) <0 %負(fù)1強(qiáng)制置零
  21. s0(i) = 0
  22. end
  23. if i == N
  24. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  25. fprintf(fild, '%s',';'); %最后一個(gè)數(shù)據(jù)使用分號(hào)結(jié)束
  26. else
  27. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  28. fprintf(fild, '%s\n',','); %逗號(hào),,換行
  29. end
  30. end
  31. fclose(fild);

鋸齒波信號(hào)波形采集參考代碼:

  1. clc; %清除命令行命令
  2. clear all; %清除工作區(qū)變量,釋放內(nèi)存空間
  3. F1=1; %信號(hào)頻率
  4. Fs=2^12; %采樣頻率
  5. P1=0; %信號(hào)初始相位
  6. N=2^12; %采樣點(diǎn)數(shù)
  7. t=[0:1/Fs:(N-1)/Fs]; %采樣時(shí)刻
  8. ADC=2^7 - 1; %直流分量
  9. A=2^7; %信號(hào)幅度
  10. %生成鋸齒波信號(hào)
  11. s=A*sawtooth(2*pi*F1*t + pi*P1/180) + ADC;
  12. plot(s); %繪制圖形
  13. %創(chuàng)建coe文件
  14. fild = fopen('saw_wave_4096x8.coe','wt');
  15. %寫入coe文件頭
  16. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_RADIX=10;'); %10進(jìn)制數(shù)
  17. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_VECTOR=');
  18. for i = 1:N
  19. s0(i) = round(s(i)); %對(duì)小數(shù)四舍五入以取整
  20. if s0(i) <0 %負(fù)1強(qiáng)制置零
  21. s0(i) = 0
  22. end
  23. if i == N
  24. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  25. fprintf(fild, '%s',';'); %最后一個(gè)數(shù)據(jù)使用分號(hào)結(jié)束
  26. else
  27. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  28. fprintf(fild, '%s\n',','); %逗號(hào),,換行
  29. end
  30. end
  31. fclose(fild);

使用MatLab對(duì)4種波形進(jìn)行采樣后,生成4個(gè)MIF文件,,分別對(duì)應(yīng)4種波形,,我們可以調(diào)用4個(gè)深度為4096,位寬為8bit的ROM IP核,,將4種波形對(duì)應(yīng)的COE文件分別寫入,,生成4個(gè)波形數(shù)據(jù)表ROM。

也可以調(diào)用一個(gè)深度為4096*4,,位寬為8bit的ROM,,生成一個(gè)COE文件,這個(gè)COE文件位上述4個(gè)COE文件的集合波形數(shù)據(jù)按照正弦波,、方波,、三角波、鋸齒波的順序?qū)懭???偟腃OE文件生成代碼如下所示,。

  1. clc; %清除命令行命令
  2. clear all; %清除工作區(qū)變量,釋放內(nèi)存空間
  3. F1=1; %信號(hào)頻率
  4. Fs=2^12; %采樣頻率
  5. P1=0; %信號(hào)初始相位
  6. N=2^12; %采樣點(diǎn)數(shù)
  7. t=[0:1/Fs:(N-1)/Fs]; %采樣時(shí)刻
  8. ADC=2^7 - 1; %直流分量
  9. A=2^7; %信號(hào)幅度
  10. s1=A*sin(2*pi*F1*t + pi*P1/180) + ADC; %正弦波信號(hào)
  11. s2=A*square(2*pi*F1*t + pi*P1/180) + ADC; %方波信號(hào)
  12. s3=A*sawtooth(2*pi*F1*t + pi*P1/180,0.5) + ADC; %三角波信號(hào)
  13. s4=A*sawtooth(2*pi*F1*t + pi*P1/180) + ADC; %鋸齒波信號(hào)
  14. %創(chuàng)建coe文件
  15. fild = fopen('wave_16384x8.coe','wt');
  16. %寫入coe文件頭
  17. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_RADIX=10;'); %10進(jìn)制數(shù)
  18. fprintf(fild, '%s\n','MEMORY_INITIALIZATION_VECTOR=');
  19. for j = 1:4
  20. for i = 1:N
  21. if j == 1 %打印正弦信號(hào)數(shù)據(jù)
  22. s0(i) = round(s1(i)); %對(duì)小數(shù)四舍五入以取整
  23. end
  24. if j == 2 %打印方波信號(hào)數(shù)據(jù)
  25. s0(i) = round(s2(i)); %對(duì)小數(shù)四舍五入以取整
  26. end
  27. if j == 3 %打印三角波信號(hào)數(shù)據(jù)
  28. s0(i) = round(s3(i)); %對(duì)小數(shù)四舍五入以取整
  29. end
  30. if j == 4 %打印鋸齒波信號(hào)數(shù)據(jù)
  31. s0(i) = round(s4(i)); %對(duì)小數(shù)四舍五入以取整
  32. end
  33. if s0(i) <0 %負(fù)1強(qiáng)制置零
  34. s0(i) = 0
  35. end
  36. if j == 4 && i == N
  37. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  38. fprintf(fild, '%s',';'); %最后一個(gè)數(shù)使用分號(hào)結(jié)束
  39. else
  40. fprintf(fild, '%d',s0(i)); %數(shù)據(jù)寫入
  41. fprintf(fild, '%s\n',','); %逗號(hào),換行
  42. end
  43. end
  44. end
  45. fclose(fild);

DDS模塊

DDS模塊有3路輸入信號(hào),,1路輸出信號(hào),,其內(nèi)部例化了前面生成的波形數(shù)據(jù)表ROM;輸入信號(hào)中有時(shí)鐘sys_clk,、復(fù)位sys_rst_n和按鍵控制模塊輸入的波形選擇信號(hào)wave_select,。輸入的波形選擇信號(hào)有4種狀態(tài),分別對(duì)應(yīng)4中波形,,根據(jù)輸入的波形選擇信號(hào)的不同,,對(duì)ROM中波形選擇信號(hào)對(duì)應(yīng)波形的存儲(chǔ)位置進(jìn)行數(shù)據(jù)讀取,將讀出波形幅值數(shù)據(jù)通過(guò)輸出信號(hào)data_out輸出到外部掛載DA板塊,,進(jìn)行數(shù)模轉(zhuǎn)換,。

本模塊包含3路輸入信號(hào),1路輸出信號(hào),,內(nèi)部聲明3個(gè)寄存器變量,。輸入信號(hào)包括時(shí)鐘、復(fù)位和輸出波形選擇信號(hào)wave_select,。波形選擇信號(hào)有4個(gè)狀態(tài),,對(duì)應(yīng)4種波形。

內(nèi)部聲明3個(gè)寄存器變量,。其中fre_add表示相位累加器輸出值,,位寬為32位,系統(tǒng)上電后,,fre_add信號(hào)一直執(zhí)行自加操作,每個(gè)時(shí)鐘周期自加參數(shù)FREQ_CTRL,,參數(shù)FREQ_CTRL就是在之前理論知識(shí)部分提到的頻率字輸入K,,它的具體數(shù)值可通過(guò)公式計(jì)算得到,前面我們也講到過(guò),。

寄存器變量rom_addr_reg表示相位調(diào)制器輸出值,,將相位累加器輸出值的高12位與相位偏移量PHASE_CTRL相加,參數(shù)PHASE_CTRL就是我們之前提到過(guò)的相位字輸入P,。之所以使用高12位,,與存儲(chǔ)波形的ROM深度有關(guān)。按理論講,,將得到的變量rom_addr_reg,,可直接作為ROM讀地址輸入波形數(shù)據(jù)表進(jìn)行數(shù)據(jù)讀取,但是我們將4中波形存儲(chǔ)在了同一ROM中,,所以還需要對(duì)讀數(shù)據(jù)地址做進(jìn)一步計(jì)算,。

ROM讀地址rom_addr是輸入波形數(shù)據(jù)表的ROM讀地址,,是在rom_addr_reg的基礎(chǔ)上計(jì)算得到。我們之前將4種信號(hào)波形數(shù)據(jù)按照正弦波,、方波,、三角波、鋸齒波的順序?qū)懭隦OM,。若需要讀取正弦波波形數(shù)據(jù),,rom_addr_reg可直接賦值給rom_addr;但是要進(jìn)行方波波形數(shù)據(jù)的讀取,,rom_addr_reg需要再加上正弦波存儲(chǔ)單元個(gè)數(shù)才能賦值給rom_addr,;剩余兩信號(hào)同理。

對(duì)于參數(shù)FREQ_CTRL和PHASE_CTRL,,我們可以修改其參數(shù)值,,實(shí)現(xiàn)不同頻率、不同初相位波形的輸出,。

本實(shí)驗(yàn),,我們希望輸出一個(gè)頻率為500Hz,初相位為π/2的正弦波信號(hào),。

計(jì)算參數(shù)FREQ_CTRL,,即頻率輸入字K。

FREQ_CTRL = K  = 2N * fOUT / fCLK,,其中N = 32(相位累加器輸出值fre_add的位寬),、fOUT = 500Hz,fCLK = 50MHz,,帶入公式,,F(xiàn)REQ_CTRL = K = 42949.67296 ,取整數(shù)部分為42949,;

計(jì)算參數(shù)PHASE_CTRL,,即相位輸入字P。

PHASE_CTRL = P = q / (2π / 2M),,其中M =12(輸入ROM地址位寬),、q = π / 2,帶入公式,,PHASE_CTRL = P = 1024,。

ROM讀地址rom_addr寫入波形數(shù)據(jù)表ROM中,讀出地址對(duì)應(yīng)波形波形數(shù)據(jù),,通過(guò)輸出端口data_out輸入到外部掛載板卡數(shù)模轉(zhuǎn)換部分,。

上代碼:

  1. module dds
  2. (
  3. input wire sys_clk , //系統(tǒng)時(shí)鐘,50MHz
  4. input wire sys_rst_n , //復(fù)位信號(hào),低電平有效
  5. input wire [3:0] wave_select , //輸出波形選擇
  6. output wire [7:0] data_out //波形輸出
  7. );
  8. //********************************************************************//
  9. //****************** Parameter and Internal Signal *******************//
  10. //********************************************************************//
  11. //parameter define
  12. parameter sin_wave = 4'b0001 , //正弦波
  13. squ_wave = 4'b0010 , //方波
  14. tri_wave = 4'b0100 , //三角波
  15. saw_wave = 4'b1000 ; //鋸齒波
  16. parameter FREQ_CTRL = 32'd42949 , //相位累加器單次累加值
  17. PHASE_CTRL = 12'd1024 ; //相位偏移量
  18. //reg define
  19. reg [31:0] fre_add ; //相位累加器
  20. reg [11:0] rom_addr_reg; //相位調(diào)制后的相位碼
  21. reg [13:0] rom_addr ; //ROM讀地址
  22. //********************************************************************//
  23. //***************************** Main Code ****************************//
  24. //********************************************************************//
  25. //fre_add:相位累加器
  26. always@(posedge sys_clk or negedge sys_rst_n)
  27. if(sys_rst_n == 1'b0)
  28. fre_add <= 32'd0;
  29. else
  30. fre_add <= fre_add + FREQ_CTRL;
  31. //rom_addr:ROM讀地址
  32. always@(posedge sys_clk or negedge sys_rst_n)
  33. if(sys_rst_n == 1'b0)
  34. begin
  35. rom_addr <= 14'd0;
  36. rom_addr_reg <= 11'd0;
  37. end
  38. else
  39. case(wave_select)
  40. sin_wave:
  41. begin
  42. rom_addr_reg <= fre_add[31:20] + PHASE_CTRL;
  43. rom_addr <= rom_addr_reg;
  44. end //正弦波
  45. squ_wave:
  46. begin
  47. rom_addr_reg <= fre_add[31:20] + PHASE_CTRL;
  48. rom_addr <= rom_addr_reg + 14'd4096;
  49. end //方波
  50. tri_wave:
  51. begin
  52. rom_addr_reg <= fre_add[31:20] + PHASE_CTRL;
  53. rom_addr <= rom_addr_reg + 14'd8192;
  54. end //三角波
  55. saw_wave:
  56. begin
  57. rom_addr_reg <= fre_add[31:20] + PHASE_CTRL;
  58. rom_addr <= rom_addr_reg + 14'd12288;
  59. end //鋸齒波
  60. default:
  61. begin
  62. rom_addr_reg <= fre_add[31:20] + PHASE_CTRL;
  63. rom_addr <= rom_addr_reg;
  64. end //正弦波
  65. endcase
  66. //********************************************************************//
  67. //*************************** Instantiation **************************//
  68. //********************************************************************//
  69. //------------------------- rom_wave_inst ------------------------
  70. rom_wave rom_wave_inst
  71. (
  72. .clka(sys_clk), // input clka
  73. .addra(rom_addr), // input [13 : 0] addra
  74. .douta(data_out) // output [7 : 0] douta
  75. );
  76. endmodule

代碼里調(diào)用了一個(gè)ROM IP核,我們的ROM文件也要在生成IP時(shí)寫進(jìn)去,。

 

頂層:

  1. module top_dds
  2. (
  3. input wire sys_clk , //系統(tǒng)時(shí)鐘,50MHz
  4. input wire sys_rst_n , //復(fù)位信號(hào),低電平有效
  5. input wire [3:0] key , //輸入4位按鍵
  6. output wire dac_clk , //輸入DAC模塊時(shí)鐘
  7. output wire [7:0] dac_data //輸入DAC模塊波形數(shù)據(jù)
  8. );
  9. //********************************************************************//
  10. //****************** Parameter and Internal Signal *******************//
  11. //********************************************************************//
  12. //wire define
  13. wire [3:0] wave_select ; //波形選擇
  14. //dac_clka:DAC模塊時(shí)鐘
  15. assign dac_clk = ~sys_clk;
  16. //********************************************************************//
  17. //*************************** Instantiation **************************//
  18. //********************************************************************//
  19. //-------------------------- dds_inst -----------------------------
  20. dds dds_inst
  21. (
  22. .sys_clk (sys_clk ), //系統(tǒng)時(shí)鐘,50MHz
  23. .sys_rst_n (sys_rst_n ), //復(fù)位信號(hào),低電平有效
  24. .wave_select (wave_select), //輸出波形選擇
  25. .data_out (dac_data ) //波形輸出
  26. );
  27. //----------------------- key_control_inst ------------------------
  28. key_control key_control_inst
  29. (
  30. .sys_clk (sys_clk ), //系統(tǒng)時(shí)鐘,50MHz
  31. .sys_rst_n (sys_rst_n ), //復(fù)位信號(hào),低電平有效
  32. .key (key ), //輸入4位按鍵
  33. .wave_select (wave_select) //輸出波形選擇
  34. );
  35. endmodule

頂層代碼很簡(jiǎn)單,,就例化一個(gè)按鍵模塊和DDS模塊,,按不同的按鍵,輸出不同的波形,,按鍵模塊很簡(jiǎn)單就不說(shuō)了,。

結(jié)果如下:

 

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多