【文章】ZYNQ-AXI總線應(yīng)用-PWM實(shí)現(xiàn)呼吸
一、前言
在實(shí)時(shí)性要求較高的場(chǎng)合中,CPU軟件執(zhí)行的方式顯然不能滿足需求,這時(shí)需要硬件邏輯實(shí)現(xiàn)部分功能。要想使自定義IP核被CPU訪問(wèn),就必須帶有總線接口。ZYNQ采用AXI BUS實(shí)現(xiàn)PS和PL之間的數(shù)據(jù)交互。本文以PWM為例設(shè)計(jì)了自定義AXI總線IP,來(lái)演示如何靈活運(yùn)用ARM+FPGA的架構(gòu)。
功能定義:
在上一篇ZYNQ入門實(shí)例博文講解的系統(tǒng)中添加自定義IP核,其輸出驅(qū)動(dòng)LED等實(shí)現(xiàn)呼吸燈效果。并且軟件通過(guò)配置寄存器方式對(duì)其進(jìn)行使能、打開(kāi)/關(guān)閉配置以及選擇占空比變化步長(zhǎng)。另外,可以按鍵操作完成占空比變化步長(zhǎng)的增減。
平臺(tái):米聯(lián)客 MIZ702N (ZYNQ-7020)
軟件:VIVADO+SDK 2017
注:自定義IP邏輯設(shè)計(jì)采用明德?lián)P至簡(jiǎn)設(shè)計(jì)法
二、PWM IP設(shè)計(jì)
PWM無(wú)非就是通過(guò)控制周期脈沖信號(hào)的占空比,也就是改變高電平在一段固定周期內(nèi)的持續(xù)時(shí)間來(lái)達(dá)到控制目的。脈沖周期需要一個(gè)計(jì)數(shù)器來(lái)定時(shí),占空比由低變高和由高變低兩種模式同樣需要一個(gè)計(jì)數(shù)器來(lái)指示,因此這里使用兩個(gè)嵌套的計(jì)數(shù)器cnt_cyc和cnt_mode。cnt_mode的加一條件除了要等待cnt_cyc計(jì)數(shù)完成,還要考慮占空比的變化。
我們可以使用下降沿位置表示占空比,位置越靠近周期值占空比越高。在模式0中下降沿位置按照步長(zhǎng)增大直至大于等于周期值,模式1中下降沿位置則按照步長(zhǎng)遞減直到小于步長(zhǎng)。使用兩個(gè)信號(hào)up_stage和down_stage分別指示模式0和模式1。至于步長(zhǎng)值,在配置有效時(shí)被更新,否則使用默認(rèn)值。模塊最終的輸出信號(hào)在周期計(jì)數(shù)器小于下降沿位置為1,反之為零。
<PWM IP邏輯代碼>
?VIVADO綜合、布局布線比較慢,且軟硬件級(jí)聯(lián)調(diào)試費(fèi)時(shí)費(fèi)力,所以仿真是極其重要的。編寫一個(gè)簡(jiǎn)單的testbench,定義update_freq_step task更新步長(zhǎng)。這里使用System Verilog語(yǔ)法有一定的好處。首先單驅(qū)動(dòng)信號(hào)可以統(tǒng)一定義為logic變量類型,其次等待時(shí)長(zhǎng)能指定單位。
<testbench代碼>
設(shè)計(jì)較簡(jiǎn)單,直接使用VIVADO仿真器觀察波形即可:

可以看到輸出信號(hào)led的占空比在不斷起伏變化,當(dāng)更新freq_step為50后變化更為減慢。

配置前相鄰兩個(gè)neg_loc數(shù)值差與更新后分別是100和50。以上證明邏輯功能無(wú)誤。
三、硬件系統(tǒng)搭建
?設(shè)計(jì)完P(guān)WM功能模塊還沒(méi)有完,需要再包一層總線Wrapper才能被CPU訪問(wèn)。
創(chuàng)建AXI總線IP

在封裝器中編輯。

最終IP結(jié)構(gòu)如圖:

???
具體操作不過(guò)多講述,直接以代碼呈現(xiàn):
<AXI IP頂層和Slave邏輯代碼>
最后重新封裝

接下來(lái)搭建硬件IP子系統(tǒng)。

和之前相比只是添加了pwm_led_ip_0,并連接在AXI Interconnect的另一個(gè)Master接口上。使用SystemILA抓取總線信號(hào)以備后續(xù)觀察。還是同樣的操作流程:生成輸出文件,生成HDL Wrapper,添加管腳約束文件,綜合,實(shí)現(xiàn),生成比特流并導(dǎo)出硬件,啟動(dòng)SDK軟件環(huán)境。
四、軟件編程與調(diào)試
???
其實(shí)CPU控制自定義IP的方式就是讀寫數(shù)據(jù),寫就是對(duì)指針賦值,讀就是返回指針?biāo)赶虻刂分械臄?shù)據(jù),分別使用Xil_Out32()和Xil_In32()實(shí)現(xiàn)。創(chuàng)建pwm_led_ip.h文件,進(jìn)行地址宏定義并編寫配置函數(shù)。為了更好地實(shí)現(xiàn)軟件庫(kù)的封裝和擴(kuò)展,創(chuàng)建environment.h文件來(lái)include不同的庫(kù)以及宏定義、全局變量定義。
軟件代碼如下:
<軟件程序代碼>
其他文件與上一篇ZYNQ入門實(shí)例博文相同。Run程序后多次按下按鍵,從串口terminal可以看出系統(tǒng)初始化成功,進(jìn)入按鍵中斷回調(diào)函數(shù)。開(kāi)發(fā)板上呼吸燈頻率也隨著按鍵按下在變化。

最后打開(kāi)VIVADO硬件管理器,觀察AXI總線波形:

???按下步長(zhǎng)值增加按鍵后,會(huì)有四次寫數(shù)據(jù)操作,正好對(duì)應(yīng)pwm_led_setFreqStep function中的四次Xil_Out32調(diào)用。每次寫后一個(gè)時(shí)鐘周期寫響應(yīng)通道BVALID拉高一個(gè)時(shí)鐘周期證明寫正確。

???
再來(lái)觀察用于確認(rèn)寫入無(wú)誤的讀操作對(duì)應(yīng)總線波形:

讀取數(shù)據(jù)為40,與寫入一致。到此功能定義、設(shè)計(jì)規(guī)劃、硬件邏輯設(shè)計(jì)仿真、IP封裝、子系統(tǒng)搭建、軟件設(shè)計(jì)、板級(jí)調(diào)試的流程全部走完。
注:代碼未貼出,如果需要,可以找明德?lián)P老師免費(fèi)獲取源工程。