日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

ZYNQ-XADC使用

學(xué)習(xí)內(nèi)容

本文首先介紹了ZYNQ的XADC的相關(guān)內(nèi)容,并學(xué)習(xí)使用ZYNQ芯片中的XADC測(cè)量芯片內(nèi)部的溫度電壓等參數(shù),然后進(jìn)行串口打印輸出。

開(kāi)發(fā)環(huán)境

vivado 18.3&SDK,PYNQ-Z2開(kāi)發(fā)板。

XADC介紹

簡(jiǎn)介

Xilinx模擬信號(hào)轉(zhuǎn)換模塊,稱為XADC,是一個(gè)硬核。它具有JTAG和DRP接口用于訪問(wèn)7系列FPGA中的XADC狀態(tài)和控制寄存器。Zynq-7000 SoC器件添加了第三個(gè)接口,即PS-XADC接口,用于PS軟件進(jìn)行控制XADC。ZYNQ器件將XADC與可編程邏輯融合,解決了對(duì)模擬數(shù)據(jù)采集和監(jiān)視要求。

XADC具有兩個(gè)12位的ADC,具有獨(dú)立的跟蹤和保持放大器,模擬多路復(fù)用器(最多17個(gè)外部模擬輸入通道)以及片上散熱和片上電壓傳感器??梢詫蓚€(gè)ADC配置為同時(shí)采樣兩個(gè)外部輸入模擬通道。采樣保持放大器支持一系列模擬輸入信號(hào)類型,包括單端輸入,雙端輸入和差分輸入。模擬輸入可以支持信號(hào)帶寬在1M SPS的采樣率下為500 KHz??梢允褂猛獠磕M多路復(fù)用器來(lái)增加支持的外部通道數(shù)量,無(wú)需額外的封裝引腳。XADC可選地使用片上參考電路,從而無(wú)需外部有源元件,用于溫度和電源軌的基本片上監(jiān)控。實(shí)現(xiàn)12位的ADC的全部性能,建議使用外部1.25V作為參考電壓。最新的測(cè)量結(jié)果(連同最大和最小讀數(shù))存儲(chǔ)在專用寄存器。用戶可以根據(jù)自己的需要進(jìn)行自定義的警報(bào)閾值(例如80°C),可以自動(dòng)指示溫度過(guò)高事件和不可接受的電源變化,并啟動(dòng)軟件控制的系統(tǒng)掉電。

控制方式

PS端可以通過(guò)以下兩種方式之一與XADC通信:

  1. PS-XADC接口:PS互連上的32位APB從接口,該接口使用FIFO,并進(jìn)行了串行化。
  2. 通過(guò)PS to PL AXI的主接口,此時(shí)要使用AXI XADC Logic IP核來(lái)控制XADC。

需要注意的是,對(duì)PS端控制ADC對(duì)性能要求較高的程序,要使用相關(guān)連接的邏輯IP連接到M_AXI_GP接口(并行數(shù)據(jù)路徑)。使用PS_XADC接口時(shí),F(xiàn)IFO用于命令和讀取數(shù)據(jù),以允許軟件快速排隊(duì)命令,而不必等待序列化,但是對(duì)于PS to PL AXI主接口訪問(wèn),數(shù)據(jù)像PL-JTAG一樣被序列化到XADC 中(串行數(shù)據(jù)路徑),相對(duì)來(lái)說(shuō)速度慢得多。

系統(tǒng)框圖

PL-JTAG接口和內(nèi)部PS-XADC接口不能同時(shí)使用。這些接口之間的選擇由devcfg.XADCIF_CFG [ENABLE]位控制。XADC可以進(jìn)行接口選擇,即對(duì)(PL-JTAG或PS-XADC)和DRP接口之間進(jìn)行仲裁選擇。下圖為XADC的系統(tǒng)框圖。

由上圖可知,XADC是通過(guò)硬邏輯實(shí)現(xiàn)的,并且位于PL電源域中。PS-XADC接口是PS的一部分,所以無(wú)需編程PL就可以由PS APU訪問(wèn)。但是必須打開(kāi)PL的電源以配置PS-XADC接口,使用PL-JTAG或DRP接口以及操作XADC。同時(shí)由圖上可以清楚看出對(duì)于PL-JTAG或PS-XADC這兩個(gè)接口經(jīng)過(guò)了一個(gè)二選一選擇器,所以這兩個(gè)不能同時(shí)進(jìn)行驅(qū)動(dòng)。

接口說(shuō)明

XADC在DRP接口與PS-XADC或PL-JTAG接口之間進(jìn)行仲裁。

PS-XADC Interface: PS-XADC接口是PS中運(yùn)行的軟件使用devcfg寄存器配置接口。軟件將命令寫入接口,然后將其推入命令FIFO。這些由DRP命令,地址和數(shù)據(jù)組成的32位寫入被串行化,并以回送路徑發(fā)送到XADC,該回送路徑填充了軟件讀取的返回讀取數(shù)據(jù)FIFO。

DRP Interface: DRP接口是一個(gè)并行的16位雙向接口,可以使用AXI4-Lite接口通過(guò)AXI XADC IP核連接到主機(jī)上,以使處理器能夠控制XADC。IP內(nèi)核通過(guò)每個(gè)AXI4-Lite讀/寫事務(wù)接收16位數(shù)據(jù)。

PL JTAG Interface: XADC使用完整的JTAG接口擴(kuò)展到DRP接口。這允許通過(guò)現(xiàn)有的片上JTAG基礎(chǔ)結(jié)構(gòu)對(duì)XADC DRP進(jìn)行讀/寫訪問(wèn)。通過(guò)JTAG訪問(wèn)DRP接口不需要實(shí)例化。邊界掃描指令(6位指令= 110111)稱為XADC_DRP,已添加到7系列FPGA中,允許通過(guò)JTAG TAP訪問(wèn)DRP。所有XADC JTAG指令均為32位寬。

PS-XADC接口編程指南

本文主要使用的是PS-XADC接口對(duì)XADC進(jìn)行編程控制,下面給出相關(guān)操作的編程指導(dǎo)步驟。

通過(guò)PS-XADC接口初始化XADC

對(duì)通道和XADC進(jìn)行復(fù)位操作,并刷新FIFO,操作順序如下:

  1. 復(fù)位串行通訊通道。  先后把1和0到devcfg.XADCIF_MCTL[RESET]寄存器位中;
  2. 復(fù)位XADC。 把16位任意值寫入DRP地址0x03(復(fù)位寄存器)。接著寫08030000h到devcfg.XADCIF_CMDFIFO寄存器中;
  3. 刷新FIFO。 這里刷新FIFO沒(méi)有復(fù)位信號(hào),而是將15個(gè)NOOP寫入到FIFO;然后等待命令FIFO清空。最后一個(gè)命令應(yīng)該是NOOP(虛擬寫入),最后讀取讀取數(shù)據(jù)FIFO,直到為空。

命令準(zhǔn)備

準(zhǔn)備要寫入XADC寄存器的數(shù)據(jù)配置順序:本示例格式化了用于寫入XADC配置寄存器1的數(shù)據(jù),以將XADC設(shè)置為獨(dú)立模式。

  1. DRP數(shù)據(jù)。將XADC設(shè)置為獨(dú)立模式的數(shù)據(jù)為8000h。
  2. DRP地址。XADC配置寄存器1的地址為0x41。
  3. 編寫命令。寫入操作的命令為0010b。在XADC配置寄存器1(0x41)中寫入8000h的命令為08418000h。

準(zhǔn)備從XADC寄存器讀取的數(shù)據(jù)配置順序:本示例格式化了用于讀取XADC VCCPAUX狀態(tài)寄存器0x0E的數(shù)據(jù)。

  1. DRP數(shù)據(jù)。數(shù)據(jù)可以是用于讀取操作(0)的任何任意數(shù)據(jù)。
  2. DRP地址。XADC VCCPAUX狀態(tài)寄存器的地址為0x0E。
  3. 編寫命令。讀取操作的命令為0001b。讀取XADC VCCPAUX狀態(tài)寄存器0x0E的命令為040E0000h。

讀寫FIFO數(shù)據(jù)

向XADC寫入命令以下編程順序?yàn)閷懭隭ADC 電壓警報(bào)上限閾值寄存器。

  1. 準(zhǔn)備命令。執(zhí)行上面的命令準(zhǔn)備的部分,寫入具有所需閾值的XADC VCCPAUX警報(bào)上限閾值寄存器(0x5A)。
  2. 用數(shù)據(jù)填充命令FIFO。將步驟1中格式化的數(shù)據(jù)寫入devcfg.XADCIF_CMDFIFO寄存器。
  3. 等待命令FIFO變空。等待,直到devcfg.XADCIF_MSTS [CFIFOE] = 1。

從XADC讀取VCCPAUX值:從XADC VCCPAUX狀態(tài)寄存器讀取當(dāng)前VCCPAUX值順序如下:

  1. 準(zhǔn)備命令。執(zhí)行上面的命令準(zhǔn)備的部分,讀取XADC VCCPAUX狀態(tài)寄存器(0x0E)。
  2. 將數(shù)據(jù)寫入命令FIFO。將步驟1中格式化的數(shù)據(jù)寫入devcfg.XADCIF_CMDFIFO寄存器。
  3. 等待命令FIFO變空。等待,直到devcfg.XADCIF_MSTS [CFIFOE] = 1。
  4. 從讀取數(shù)據(jù)FIFO讀取偽數(shù)據(jù)。讀取devcfg.XADCIF_RDFIFO寄存器。
  5. 格式化數(shù)據(jù)。執(zhí)行上面的命令準(zhǔn)備的部分,以使其不進(jìn)行任何操作。
  6. 將數(shù)據(jù)寫入命令FIFO。將步驟5中的格式化數(shù)據(jù)寫入devcfg.XADCIF_CMDFIFO寄存器。
  7. 讀取讀取數(shù)據(jù)FIFO。讀取devcfg.XADCIF_RDFIFO寄存器。

中斷

配置和管理Alarm5(VCCPAUX)本示例將XADC寄存器配置為設(shè)置警報(bào)閾值,操作模式并啟用 PS-XADC接口中的警報(bào)5(VCCPAUX)中斷。

  1. 準(zhǔn)備命令。執(zhí)行上面的命令準(zhǔn)備的部分,寫入XADC硬宏警報(bào)閾值寄存器(VCCPAUX Upper-0x5A和VCCPAUX具有所需閾值的低0x5E)和XADC Config_Reg1(0x41)來(lái)將XADC設(shè)置為獨(dú)立模式。
  2. 將命令寫入命令FIFO。將步驟1中準(zhǔn)備的命令寫到devcfg.XADCIF_CMDFIFO寄存器。
  3. 在PS-XADC接口中啟用Alarm5中斷。寫devcfg.XADCIF_INT_MASK[M_ALM] = 7Eh。
  4. 檢查是否觸發(fā)了Alarm5。devcfg.XADCIF_INT_STS [M_ALM] = 1的輪詢。
  5. 清除Alarm5中斷。寫入devcfg.XADCIF_INT_STS [M_ALM] = 1。
  6. 禁用Alarm0中斷。寫入devcfg.XADCIF_INT_MASK [M_ALM] = 7Fh

通過(guò)PS-XADC接口的啟動(dòng)順序

通過(guò)PS-XADC接口的啟動(dòng)并設(shè)置各種接口參數(shù),并包括中斷和數(shù)據(jù)傳輸?shù)牟襟E如下。

  1. 完成初始化XADC;
  2. 配置PS-XADC接口:對(duì)配置寄存器進(jìn)行編程。將80001114h寫入devcfg.XADCIF_CFG寄存器:使用默認(rèn)的最小空閑間隙,[IGAP] = 14h(20個(gè)串行時(shí)鐘)。使用默認(rèn)的XADC串行時(shí)鐘頻率為PCAP_2x時(shí)鐘頻率的1/4,[TCKRATE] = 01。使用默認(rèn)的FIFO串行讀取捕獲邊沿(上升),[REDGE] = 1。使用默認(rèn)的FIFO串行寫啟動(dòng)邊沿(下降),[WEDGE] = 0。使用默認(rèn)的讀取數(shù)據(jù)FIFO閾值級(jí)別,[DFIFOTH] = 0x0。使用默認(rèn)的命令FIFO閾值級(jí)別,[CFIFOTH] = 0。啟用XADC的PS訪問(wèn)。將0x1寫入devcfg.XADCIF_CFG [ENABLE]。
  3. 配置中斷:中斷用于管理來(lái)自XADC和操作FIFO/讀取FIFO數(shù)據(jù);
  4. 數(shù)據(jù)傳輸?shù)絏ADC。

系統(tǒng)框圖

根據(jù)本次工程,畫出相應(yīng)的系統(tǒng)框圖,如下圖所示:

本次工程,使用了UART和XADC部分,使用XADC對(duì)芯片內(nèi)部的電壓和溫度進(jìn)行檢測(cè),并用串口打印輸出。

硬件平臺(tái)搭建

因?yàn)椴恍枰褂闷渌Y源,可以在原來(lái)的UART測(cè)試工程下進(jìn)行開(kāi)發(fā)搭建,直接保存即可。新建步驟如下,首先新建工程,創(chuàng)建 block design。添加ZYNQ7 ip,根據(jù)本次工程需要對(duì)IP進(jìn)行配置。勾選本次工程使用的資源。

這里只要勾選UART資源即可,取消多余資源,然后點(diǎn)擊OK。硬件系統(tǒng)構(gòu)建完成如下:

然后我們進(jìn)行g(shù)enerate output product 然后生成HDL封裝。這里用到了UART,是MIO引腳,所以不需要進(jìn)行管腳分配,XADC測(cè)量是內(nèi)部的電壓信息,并且使用的是PS_XADC接口。點(diǎn)擊導(dǎo)出硬件資源(可以不包含bit流文件,因?yàn)橹挥玫搅薖S資源),接著launch SDK。

SDK軟件部分

打開(kāi)SDK后,新建application project。在system.mss中可以打開(kāi)相關(guān)參考文檔輔助設(shè)計(jì)。

參考給出的示例,在main.c中寫入以下代碼:

#include "xparameters.h"
#include "xadcps.h"
#include "stdio.h"
#include "xil_printf.h"
#include "sleep.h"
#define XADC_DEVICE_ID	XPAR_XADCPS_0_DEVICE_ID
static XAdcPs XAdc_Inst;
u32 Temp_RawData;
//芯片溫度、最大、最小溫度
float TempData;
float TempmaxData;
float TempminData;
//內(nèi)核各部分電壓值
float VccPintData;
float VccPauxData;
float VccPdroData;
float VccBramData;
void Xadc_init();
void Xadc_test();
int main(){
	//初始化XADC
	Xadc_init();
	while(1){
		Xadc_test();
		sleep(2);
	}
	return0;
}

void Xadc_init(){
	int status;
	XAdcPs_Config *ConfigPtr;
	ConfigPtr = XAdcPs_LookupConfig(XADC_DEVICE_ID);
	XAdcPs_CfgInitialize(&XAdc_Inst, ConfigPtr,ConfigPtr->BaseAddress);
	//自測(cè)
	status = XAdcPs_SelfTest(&XAdc_Inst);
	if (status != XST_SUCCESS) {
		xil_printf("xadc selftest failed!\n");
	}
	//設(shè)置啟動(dòng)模式
	XAdcPs_SetSequencerMode(&XAdc_Inst, XADCPS_SEQ_MODE_SAFE);
}
void Xadc_test(){

	Temp_RawData = XAdcPs_GetAdcData(&XAdc_Inst, XADCPS_CH_TEMP);
	TempData = XAdcPs_RawToTemperature(Temp_RawData);
	Temp_RawData = XAdcPs_GetMinMaxMeasurement(&XAdc_Inst, XADCPS_MAX_TEMP);
	TempmaxData = XAdcPs_RawToTemperature(Temp_RawData);
	Temp_RawData = XAdcPs_GetMinMaxMeasurement(&XAdc_Inst, XADCPS_MIN_TEMP);
	TempminData = XAdcPs_RawToTemperature(Temp_RawData);

	Temp_RawData = XAdcPs_GetAdcData(&XAdc_Inst, XADCPS_CH_VCCPINT);
	VccPintData = XAdcPs_RawToVoltage(Temp_RawData);
	Temp_RawData = XAdcPs_GetAdcData(&XAdc_Inst, XADCPS_CH_VCCPAUX);
	VccPauxData = XAdcPs_RawToVoltage(Temp_RawData);
	Temp_RawData = XAdcPs_GetAdcData(&XAdc_Inst, XADCPS_CH_VCCPDRO);
	VccPdroData = XAdcPs_RawToVoltage(Temp_RawData);
	Temp_RawData = XAdcPs_GetAdcData(&XAdc_Inst, XADCPS_CH_VBRAM);
	VccBramData = XAdcPs_RawToVoltage(Temp_RawData);
	printf("============================\n");
	printf("Current Temperature:%0.4fC\n",TempData);
	printf("Maximum Temperature:%0.4fC\n",TempmaxData);
	printf("Minimum Temperature:%0.4fC\n",TempminData);
	printf("           VccPSint:%0.4fV\n",VccPintData);
	printf("           VccPSaux:%0.4fV\n",VccPauxData);
	printf("           VccPSdro:%0.4fV\n",VccPdroData);
	printf("          VccPSBram:%0.4fV\n",VccBramData);
	printf("============================\n");
}

整體代碼比較簡(jiǎn)單,主要還是使用相關(guān)的函數(shù)進(jìn)行開(kāi)發(fā)設(shè)計(jì),這里打印了相關(guān)溫度和電壓信息。

運(yùn)行效果

在SDK的串口終端中正確顯示各個(gè)參數(shù)信息。

Reference

  1. UG585
  2. 正點(diǎn)原子開(kāi)發(fā)視頻教程
聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 1
收藏 2
關(guān)注 15
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧