基于TLC5615芯片的DDS波形發生器(FPGA)
1. 前言
前面在我的博客中已經寫過關于TLC5615的FPGA程式驅動以及DDS的原理和代碼實作,這里便不多做介紹,這一次主要是把這兩部分合并起來利用DA芯片實作正弦波輸出,并且用示波器觀察信號的頻率,
2. 模塊示意圖

TLC5615是一款SPI介面的10位高精度DA轉換芯片,因此將DDS模塊整個封裝成SPI介面,ROM根據FPGA提供的地址,將查找表中的資料輸出到CTRL,由DIN輸入到DA芯片TLC5615中,在Quartus中生成的RTL視圖如下所示,

3. 代碼部分
前面的博客中已經由DDS模塊和TLC5615驅動模塊的代碼,這里就不在貼上,有需要的朋友可以查看我前面的博客中的代碼,這里只給出例化這兩個模塊的頂層檔案代碼,如下,
module DDS_TLC5615(
input sys_clk,
input rst,
output cs,
output tlc5615_clk,
output tlc5615_data
);
wire [9:0] DA;
TLC5615_CTRL TLC5615_CTRL(
.sys_clk(sys_clk),
.rst(rst),
.conv_en(1'b1),
.conv_data({DA,2'b00}),
.cs(cs),
.conv_end(),
.tlc5615_clk(tlc5615_clk),
.tlc5615_data(tlc5615_data)
);
DDS u_DDS(
.clk (sys_clk),
.rst_n(rst),
.fword(85910),
.pword(256),
.DA (DA)
);
endmodule
4. ROM初始化mif檔案生成
mif檔案的生成有多種方式,可以用matlab方法生成,也可以用人家做好的波形資料生成器一鍵自動生成,只是沒有matlab方式可以有多種設定和選擇,包括添加直流分量等等,matlab代碼如下所示,
depth =1024;%采樣深度,即采樣個數
widths =10 ;%采樣資料位寬
N=0:depth-1 ;%采樣時刻
s= sin(2*pi*N/1024);%信號生成
fidc = fopen('D:\Quartus\sinx.mif','wt') %創建mif檔案
%寫入mif檔案的開頭
fprintf(fidc,'depth=%d\n',depth);
fprintf(fidc,'width=%d\n',widths);
fprintf(fidc,'address_radix=UNS;\n');%地址格式,UNS表示保持現有格式
fprintf(fidc,'data_radix=UNS;\n');%資料格式
fprintf(fidc,'content begin\n');
%采樣資料的輸出
for(x =1:depth)
fprintf(fidc,'%d:%d;\n',x-1,round(31*sin(2*pi*(x-1)/32)+32));
end;%round(A)將A中的元素按最近的整數取整,即四舍五入;
fprintf(fidc,'end;');
fclose(fidc);
L=31*sin(2*pi*(N-1)/32)+32;
plot(L);
資料深度為1024,位寬為10位(跟DA芯片保持一致);如果要修改,只需要根據需求修改前面四行代碼即可,注意:應用于ROM時,sinx.mif檔案里的第一和第二行后面要加“;” 分號,
在這里我采用的是用波形資料生成器,如下圖所示,

生成的資料部分如下所示,

5.驗證總結
連接好TLC5615模塊各個引腳,將程式全編譯后把sof檔案下載到開發板上,然后將輸出信號接入示波器觀察,得到下圖,

前面我設定的頻率控制字為85910,系統時鐘為50M,根據計算得到輸出信號頻率f=85910*50_000_000/2^32=1000Hz=1KHz,我們可以看到示波器測量顯示的頻率為1KHz,由此證明實驗驗證成功,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/224312.html
標籤:其他
上一篇:抖音、吃雞、王者榮耀:你的自律,是如何被頂級產品經理一步一步毀掉的
下一篇:真讓我受驚了!阿里資深專家居然把內部學習的程式員三門課:技術精進架構修煉、管理探秘檔案給分享出來了?據說,是入職阿里必備!
