FPGA初級項目10——基于SPI的DAC芯片進行數模轉換

FPGA初級項目10——基于SPI的DAC芯片進行數模轉換

DAC芯片介紹


DAC 芯片(數字模擬轉換器)是一種將數字信號轉換為連續模擬信號(如電壓或電流)的集成電路,廣泛應用于電子系統中,連接數字世界與模擬世界。
?

核心功能


數字到模擬轉換:將離散的二進制數字信號(如 0 和 1 的組合)轉換為連續的模擬信號,使計算機、微控制器等數字設備能夠驅動揚聲器、顯示器、傳感器等模擬設備。
應用領域:音頻處理(音樂播放器、手機)、視頻顯示(CRT 顯示器)、通信系統(無線信號調制)、工業控制(執行器驅動)等。

關鍵性能指標


需要明確:輸出電壓由參考電壓決定,輸入的數字量起到一個分壓作用。
分辨率:表示 DAC 能區分的最小電壓變化,通常以位數衡量(如 16 位、24 位)。位數越高,輸出越精細。
精度:包括微分非線性(DNL)和積分非線性(INL),反映輸出與理想值的偏差,精度越高,信號失真越小。
建立時間:從輸入變化到輸出穩定所需的時間,高速應用(如通信)需短建立時間。
動態范圍:最大信號與噪聲的比值,決定 DAC 處理強弱信號的能力(單位:dB)。

典型應用場景


音頻設備:如手機、耳機、Hi-Fi 播放器中的 DAC 芯片(如 AK4490、CS43131),直接影響音質。
工業控制:將數字指令轉換為模擬信號控制電機、閥門等執行器(如 DAC0832)。
通信系統:生成調制信號用于無線傳輸。
醫療設備:控制成像設備或監測儀器的模擬輸出。


選用芯片

這次使用的DAC芯片為TLV5618,其具體參數為:12位的分辨率;1Msps轉換速率;雙通道模擬輸出(可使用兩個通道A,B輸出電壓);最高可達到20M赫茲時鐘輸出
且經過換算關系有:輸出電壓U = 輸入數字量code;



問題分析


1. 該模塊書寫思路與上一篇文章ADC轉換大體上一致,同樣我們寫的是DAC芯片的驅動電路。我們所需明確的學習目標有:學會讀芯片手冊了解相關信息;學習線性序列機LSM的思想;


2. 根據芯片的時序要求,DAC芯片在SCLK的下降沿采樣DIN上的數值(已經穩定),DIN數值在SCLK上升沿變化;值得注意的是:DIN的D15-D12為配置位(配置轉換速率與功率;已經相應的通道選擇);D11-D0才是正常數據位的傳輸。

3. 因為TLV5618芯片為雙通道。那么如果我想要兩個通道同時輸出不同的電壓值該怎么辦呢?例如通道A輸出1V,通道B輸出2V。解決思路就是利用TLV5618芯片內部結構自帶的buffer緩沖器!通過相應的通道選擇模式,第一步先將2V輸入buffer;第二步再將1V輸入通道A,同時buffer輸入給通道B。


4. 再有的就是要嚴格按照芯片的時序要求來設置驅動電路。考慮相關的建立時間與保持時間,例如在開始階段,將CS電平拉低,DIN,SCLK電平拉高,這樣可滿足時序要求;同樣的在結束階段,在SCLK最后一個上升沿來臨時,要保證CS為低電平,否則很有可能采樣不到最后一個數據(芯片手冊要求)。

5. 同時還有一些輔助信號的撰寫(模仿上篇文章的思路),例如使能信號,采樣開始與采樣停止信號的觸發條件等。(詳情看代碼)

好的,解決完上述問題,我們來代碼


代碼展示

//定義端口輸入輸出
module DAC_driver(Clk,Rst_n,DAC_DATA,Set_Go,Set_Done,DAC_CS_N,DAC_SCLK,DAC_DIN
);input Clk;input Rst_n;input [15:0]DAC_DATA;input Set_Go;output reg Set_Done;output reg DAC_CS_N;output reg DAC_SCLK;output reg DAC_DIN;parameter CLOCK_FREQ = 50_000_000;parameter SCLK_EREQ = 12_500_000;parameter MCNT_DIV_CNT = CLOCK_FREQ / (SCLK_EREQ * 2) - 1;reg [7:0]DIV_CNT;reg [5:0]LSM_CNT;reg [15:0]r_DAC_DATA;//一個暫存器,將用戶輸入的數據暫時存儲     
always@(posedge Clk)
if(Set_Go)r_DAC_DATA <= DAC_DATA;
elser_DAC_DATA <= r_DAC_DATA;//使能信號的確立  reg Set_En;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)Set_En <= 1'd0;
else if(Set_Go)Set_En <= 1'd1;
else if((LSM_CNT == 6'd33) && (DIV_CNT == MCNT_DIV_CNT))Set_En <= 1'd0;
elseSet_En <= Set_En;//最小時間單元
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)DIV_CNT <= 0;
else if(Set_En)beginif(DIV_CNT == MCNT_DIV_CNT) DIV_CNT <= 0;else DIV_CNT <= DIV_CNT + 1'd1;end
elseDIV_CNT <= 0;//序列計數器
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)LSM_CNT <= 6'd0;
else if(DIV_CNT == MCNT_DIV_CNT)beginif(LSM_CNT <= 6'd33)LSM_CNT <= 6'd0;elseLSM_CNT <= LSM_CNT + 1'd1;end
elseLSM_CNT <= LSM_CNT;//線性序列機的驅動輸出
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)beginDAC_SCLK <= 1'd1;DAC_DIN <= 1'd1;DAC_CS_N <= 1'd1; end
else if(DIV_CNT == MCNT_DIV_CNT)begincase(LSM_CNT)0 : begin  DAC_CS_N <= 1'd0; DAC_DIN <= r_DAC_DATA[15]; DAC_SCLK <= 1'd1; end1 : begin  DAC_SCLK <= 1'd0; end2 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[14]; end3 : begin  DAC_SCLK <= 1'd0; end4 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[13]; end5 : begin  DAC_SCLK <= 1'd0; end6 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[12]; end7 : begin  DAC_SCLK <= 1'd0; end8 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[11]; end9 : begin  DAC_SCLK <= 1'd0; end10 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[10]; end11 : begin  DAC_SCLK <= 1'd0; end12 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[9]; end13 : begin  DAC_SCLK <= 1'd0; end14 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[8]; end15 : begin  DAC_SCLK <= 1'd0; end16 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[7]; end17 : begin  DAC_SCLK <= 1'd0; end18 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[6]; end19 : begin  DAC_SCLK <= 1'd0; end20 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[5]; end21 : begin  DAC_SCLK <= 1'd0; end22 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[4]; end23 : begin  DAC_SCLK <= 1'd0; end24 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[3]; end25 : begin  DAC_SCLK <= 1'd0; end26 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[2]; end27 : begin  DAC_SCLK <= 1'd0; end28 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[1]; end29 : begin  DAC_SCLK <= 1'd0; end30 : begin  DAC_SCLK <= 1'd1; DAC_DIN <= r_DAC_DATA[0]; end31 : begin  DAC_SCLK <= 1'd0; end32 : begin  DAC_SCLK <= 1'd1; end33 : begin  DAC_CS_N <= 1'd1; enddefault: DAC_CS_N <= 1'd1;endcaseend//產生結束信號 
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)Set_Done <= 0;
else if((LSM_CNT == 6'd33) && (DIV_CNT == MCNT_DIV_CNT))Set_Done <= 1'd1;
elseSet_Done <= 1'd0;endmodule


綜合出來的底層系統邏輯圖schematic如下:


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902656.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902656.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在 Windows上安裝 Python 3.6.5?

Windows 系統安裝步驟 下載安裝包 安裝包下載鏈接&#xff1a;https://pan.quark.cn/s/9294ca0fd46a 運行安裝程序 雙擊下載的 .exe 文件&#xff08;如 python-3.6.5.exe&#xff09;。 勾選 Add Python 3.6 to PATH&#xff08;重要&#xff01;這將自動配置環境變量&…

Cephalon端腦云:神經形態計算+邊緣AI·重定義云端算力

前引&#xff1a;當算力不再是“奢侈品” &#xff0c;在人工智能、3D渲染、科學計算等領域&#xff0c;算力一直是橫亙在個人與企業面前的“高墻”。高性能服務器價格動輒數十萬元&#xff0c;專業設備維護成本高&#xff0c;普通人大多是望而卻步。然而&#xff0c;Cephalon算…

【信息系統項目管理師】高分論文:論進度管理和成本管理(智慧城管平臺項目)

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 論文1、規劃進度管理2、定義活動3、排列活動順序4、估算活動資源5、估算活動持續時間6、制定進度計劃7、控制進度論文 2018年8月,我作為項目經理參與了 XX市智慧城管平臺項目的建設,該項目投資500萬元人民幣…

WebAssembly:開啟高性能Web應用新時代

一、引言 隨著互聯網技術的飛速發展&#xff0c;Web應用的復雜度和性能要求越來越高。傳統的Web開發技術&#xff0c;如JavaScript&#xff0c;雖然功能強大&#xff0c;但在處理復雜計算和高性能需求時仍存在一些局限性。WebAssembly&#xff08;簡稱Wasm&#xff09;作為一種…

操作系統進程管理筆記

1. 進程的基本概念 1.1 進程的定義 進程就是運行中的程序。程序本身是沒有生命周期的&#xff0c;它只是存在磁盤上面的一些指令&#xff08;也可能是一些靜態數據&#xff09;。是操作系統讓這些字節運行起來&#xff0c;讓程序發揮作用。 1.2 CPU的時分共享 操作系統通過…

Python中random庫的應用

文章目錄 一、random 庫常用函數二、條件語句 隨機數示例1&#xff1a;隨機決定程序分支示例2&#xff1a;模擬概率事件 三、循環語句 隨機數示例1&#xff1a;循環直到滿足隨機條件示例2&#xff1a;隨機次數循環 四、隨機操作數據結構示例1&#xff1a;隨機打亂列表順序示例…

密碼學貨幣混幣器詳解及python實現

目錄 一、前言二、混幣器概述2.1 混幣器的工作原理2.2 關鍵特性三、數據生成與預處理四、系統架構與流程五、核心數學公式六、異步任務調度與 GPU 加速七、PyQt6 GUI 設計八、完整代碼實現九、自查測試與總結十、展望摘要 本博客聚焦 “密碼學貨幣混幣器實現”,以 Python + P…

各種各樣的bug合集

一、連不上數據庫db 1.可能是密碼一大包東西不對&#xff1b; 2.可能是里面某個port和數據庫不一樣&#xff08;針對于修改了數據庫但是連不上的情況&#xff09;&#xff1b; 3.可能是git代碼沒拉對&#xff0c;再拉一下代碼。? 二、沒有這個包 可能是可以#注釋掉。? …

面陣相機中M12鏡頭和遠心鏡頭的區別及性能優勢

以下是關于面陣相機中M12鏡頭和遠心鏡頭的區別及性能優勢的詳細分析&#xff0c;結合知識庫內容整理如下&#xff1a; 一、M12鏡頭與遠心鏡頭的核心區別 1. 設計原理與光學特性 特性M12鏡頭遠心鏡頭光學設計標準鏡頭設計&#xff0c;無特殊光學校正&#xff0c;依賴傳統光路。…

從內核到應用層:深度剖析信號捕捉技術棧(含sigaction系統調用/SIGCHLD回收/volatile內存屏障)

Linux系列 文章目錄 Linux系列前言一、進程對信號的捕捉1.1 內核對信號的捕捉1.2 sigaction()函數1.3 信號集的修改時機 二、可重入函數三、volatile關鍵字四、SIGCHLD信號 前言 Linux系統中&#xff0c;信號捕捉是指進程可以通過設置信號處理函數來響應特定信號。通過信號捕捉…

DDD領域驅動與傳統CRUD

DDD 是一套 應對復雜業務系統 的設計方法論&#xff0c;核心是 讓代碼直接映射業務邏輯&#xff0c;避免技術實現與業務需求脫節。 關鍵區別&#xff1a; 傳統開發&#xff1a;根據數據庫表寫 CRUD&#xff08;技術驅動&#xff09;。DDD&#xff1a;根據業務行為建模&#xf…

20. git diff

基本概述 git diff的作用是&#xff1a;比較代碼差異 基本用法 1.工作區 VS 暫存區 git diff [file]2.暫存區 VS 最新提交 git diff --staged [file] # 或 git diff --cached [file]3.工作區 VS 最新提交 git diff HEAD [file]高級用法 1.比較兩個提交間的差異 git dif…

大模型面經 | 春招、秋招算法面試常考八股文附答案(五)

大家好,我是皮先生!! 今天給大家分享一些關于大模型面試常見的面試題,希望對大家的面試有所幫助。 往期回顧: 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題一) 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題二) 大模型面經 | 春招、秋招算法…

Sql刷題日志(day5)

面試&#xff1a; 1、從數據分析角度&#xff0c;推薦模塊怎么用指標衡量&#xff1f; 推薦模塊主要目的是將用戶進行轉化&#xff0c;所以其主指標是推薦的轉化率推薦模塊的指標一般都通過埋點去收集用戶的行為并完成相應的計算而形成相應的指標數據&#xff0c;而這里的驅動…

封裝 element-ui 二次彈框

author 封裝 element-ui 彈框 param text 文本內容 &#xff08;不傳默認顯示 確定執行此操作嗎&#xff1f; &#xff09; param type 彈框類型&#xff08;不傳默認warning類型&#xff09; param title 彈框標題&#xff08;不傳默認顯示 提示 &#xff09; export fun…

【Rust 精進之路之第12篇-生命周期·入門】為何需要與顯式標注 (`‘a`):讓編譯器讀懂引用的“有效期”

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025-04-20 引言:懸垂引用的“幽靈”與編譯器的“偵探” 在前面的章節中,我們深入學習了 Rust 的所有權系統,以及如何通過引用 (& 和 &mut) 進行借用,從而在不轉移所有權的情況下安…

[密碼學實戰]CTF競賽高頻加密與解密技術詳解

CTF競賽高頻加密與解密技術詳解 一、CTF加密體系全景圖 在CTF密碼學挑戰中&#xff0c;加解密技術主要分為四大戰域&#xff1a; #mermaid-svg-lmm07BXqYAGYjymI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lm…

docker.desktop下安裝普羅米修斯prometheus、grafana并看服務器信息

目標 在docker.desktop下先安裝這三種組件,然后顯示當前服務的CPU等指標。各種坑已踩,用的是當前時間最新的鏡像 核心關系概述 組件角色依賴關系Prometheus開源監控系統,負責 數據采集、存儲、查詢及告警。依賴 Node-Exporter 提供的指標數據。Node-Exporter專用的 數據采集…

《MySQL:MySQL表的內外連接》

表的連接分為內連接和外連接。 內連接 內連接實際上就是利用where子句對兩種表形成的笛卡爾積進行篩選&#xff0c;之前的文章中所用的查詢都是內連接&#xff0c;也是開發中使用的最多的連接查詢。 select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件&#xff1…

實現SpringBoot底層機制【Tomcat啟動分析+Spring容器初始化+Tomcat 如何關聯 Spring容器】

下載地址&#xff1a; https://download.csdn.net/download/2401_83418369/90675207 一、搭建環境 創建新項目 在pom.xml文件中導入依賴 &#xff08;一定要刷新Maven&#xff09;排除內嵌的Tomcat&#xff0c;引入自己指定的Tomcat <?xml version"1.0" enco…