0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于AXI總線的加法器模塊解決方案

454398 ? 來(lái)源:csdn ? 作者:ChuanjieZhu ? 2020-12-23 15:32 ? 次閱讀

前面一節(jié)我們學(xué)會(huì)了創(chuàng)建基于AXI總線的IP,但是對(duì)于AXI協(xié)議各信號(hào)的時(shí)序還不太了解。這個(gè)實(shí)驗(yàn)就是通過SDK和Vivado聯(lián)合調(diào)試觀察AXI總線的信號(hào)。由于我們創(chuàng)建的接口是基于AXI_Lite協(xié)議的,所以我們實(shí)際觀察到是AXI_Lite協(xié)議的信號(hào)時(shí)序。

具體做法是創(chuàng)建一個(gè)基于AXI總線的加法器模塊,在Vivado里將AXI總線添加到debug信號(hào)里,實(shí)際上是用邏輯分析儀探測(cè)信號(hào),在SDK端通過debug方式依次寫入兩個(gè)加數(shù),由PL計(jì)算出和,我們讀出這個(gè)和打印到串口,這樣AXI總線的讀和寫就都能觀察到了。

板子使用的是zc702。

在觀察信號(hào)之前我們有必要簡(jiǎn)單了解AXI是個(gè)什么:

AXI總線是一種高性能、高帶寬、低延遲的片內(nèi)總線,AXI協(xié)議描述了主從設(shè)備數(shù)據(jù)傳輸?shù)姆绞?。主設(shè)備和從設(shè)備通過握手信號(hào)建立連接,握手信號(hào)包括主機(jī)發(fā)送的VALID信號(hào),表示數(shù)據(jù)有效,從機(jī)發(fā)送的READY信號(hào),表示從機(jī)準(zhǔn)備好了接收數(shù)據(jù)。當(dāng)VALID和READY都有效的時(shí)候傳輸開始。

Zynq使用的是AXI協(xié)議的4.0版本,由AMBA3.0協(xié)議發(fā)展而來(lái):

AXI的三種總線各有各的用途:
AXI4支持突發(fā)數(shù)據(jù)傳輸,主要用于CPU訪問存儲(chǔ)等需要高速數(shù)據(jù)交互的場(chǎng)合,相當(dāng)于原來(lái)的AHB協(xié)議;

AXI_Lite一次傳輸單個(gè)數(shù)據(jù),主要用于訪問一些低速外設(shè),相當(dāng)于原來(lái)的APB;

AXI_Stream數(shù)據(jù)傳輸不需要地址,主設(shè)備直接連續(xù)讀寫數(shù)據(jù),主要用于高速流數(shù)據(jù)的傳輸,使用起來(lái)類似FIFO。

AXI4總線和AXI4-Lite總線具有相同的組成部分:
(1) 讀地址通道, 包含ARVALID, ARADDR, ARREADY信號(hào);
(2) 讀數(shù)據(jù)通道, 包含RVALID, RDATA, RREADY, RRESP信號(hào);
(3) 寫地址通道, 包含AWVALID, AWADDR, AWREADY信號(hào);
(4) 寫數(shù)據(jù)通道, 包含WVALID, WDATA, WSTRB, WREADY信號(hào);
(5) 寫應(yīng)答通道, 包含BVALID, BRESP, BREADY信號(hào);
(6) 系統(tǒng)通道, 包含: ACLK, ARESETN信號(hào)。

幫助記憶:
讀地址信號(hào)都是以AR開頭(A: address; R: read)
寫地址信號(hào)都是以AW開頭(A: address; W: write
讀數(shù)據(jù)信號(hào)都是以R開頭(R: read)
寫數(shù)據(jù)信號(hào)都是以W開頭(W: write)
應(yīng)答信號(hào)都是以B開頭(B: back(answer back))

讀時(shí)序:

寫時(shí)序:

5個(gè)通道都有自己獨(dú)立的握手機(jī)制,同時(shí)又相互協(xié)作,地址線分離后,讀/寫可以并行交互數(shù)據(jù)。而且AXI支持地址pipeline、錯(cuò)位傳輸?shù)饶J?,大大提高了?shù)據(jù)通路的利用率。

關(guān)于AXI Interconnect模塊:

AXI協(xié)議可以描述為主/從設(shè)備之間的點(diǎn)對(duì)點(diǎn)傳輸,可以有多個(gè)主機(jī),也可以有多個(gè)從機(jī),這是進(jìn)行數(shù)據(jù)交互時(shí),需要一個(gè)管理中心確保信號(hào)發(fā)到對(duì)應(yīng)的設(shè)備,AXI Interconnect模塊就是這樣一個(gè)管理中心,也叫做AXI互聯(lián)矩陣。它類似于一個(gè)交換機(jī),保證每個(gè)外設(shè)獨(dú)享帶寬,完成數(shù)據(jù)傳輸。Xilinx公司為我們提供了AXI Interconnect的IP核。

介紹到此,理論部分已經(jīng)掌握i一二了,下面就開始實(shí)際觀察AXI的信號(hào)。

創(chuàng)建一個(gè)基于AXI_Lite總線的加法器IP

新建Vivado工程,依然,選擇這個(gè):

修改名字和地址,我命名為AXI_Add,地址最好選擇工程路徑下新建一個(gè)文件夾,這樣就會(huì)自動(dòng)把你創(chuàng)建的IP更新到IP庫(kù)里,其他默認(rèn),最后選擇Edit IP,在Vivado給出的代碼里添加上我們的加法器功能:

注意這些代碼就是定義AXI協(xié)議的工作方式的,里面有注釋,可以去研究一下!

添加用戶端口

這里我們沒有要輸出的信號(hào)

添加用戶邏輯:

待會(huì)我們將兩個(gè)加數(shù)寫到寄存器0和1中,從寄存器2中讀出和

封裝好后回到我們之前建的工程,

然后在工程里添加zynq核,添加剛才創(chuàng)建的IP,點(diǎn)擊自動(dòng)連接,然后選中AXI總線,右擊選擇Make Debug,出現(xiàn)兩個(gè)綠色的小瓢蟲,將總線加入Debug模式下。

如果你沒有把剛才新建的IP放在該工程目錄下,先要把IP添加進(jìn)庫(kù)里,選擇 Project Settings-->IP。點(diǎn)擊綠色的加號(hào),選擇到你的用戶IP地址 :

o4YBAF9uHVuAKzGUAAERMik5j6o056.png

整個(gè)系統(tǒng)搭建完成是這樣的:

o4YBAF9uHV2AYd7qAAE-BadJ_Jo854.png

下面就是例行操作,自動(dòng)排版,檢查,保存,復(fù)位,generate,產(chǎn)生頂層文件。然后先綜合(Synthesis)一下,綜合好后,打開Synthesis Design下的Set Up Debug,將顯示為紅色的無(wú)用信號(hào)刪除(選中,點(diǎn)擊紅色的減號(hào)),

pIYBAF9uHV-AcXdgAAE7sED2oA0079.png

設(shè)置采樣深度為1024,

pIYBAF9uHWGAeR9UAACy9TN9Ses728.png

其他默認(rèn),然后生成比特流文件。

軟件端的設(shè)計(jì)

Lanch到SDK,新建一個(gè)空的applicaton工程,添加一個(gè)c源文件,我們?cè)趚parameters.h文件中找到我們添加的加法器AXI_ADD的寄存器首地址,待會(huì)我們就是要通過地址對(duì)寄存器進(jìn)行讀、寫:

o4YBAF9uHWKAKgUsAAA5SEoCAqE167.png

這個(gè)案例里我們計(jì)算16進(jìn)制下的24+12=36,為了方便SDK端的斷點(diǎn)調(diào)試,加了while循環(huán),注釋我寫在后面了:
#include
#include "xparameters.h"
#include "xil_io.h"
#include "xil_types.h"

#define AXI_ADD_REG0 0 //寄存器0的偏移地址為0
#define AXI_ADD_REG1 4 //寄存器1的偏移地址為4
#define AXI_ADD_REG2 8 //寄存器2的偏移地址為8

int main(){
while(1){
u8 value = 0;
Xil_Out32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG0,0x24); //向寄存器0寫入第一個(gè)加數(shù)
Xil_Out32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG1,0x12); //向寄存器1寫入第二個(gè)加數(shù)
value = Xil_In32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG2); //從寄存器3中讀出和
xil_printf("value = %x",value);
}
return 0;
}

硬件聯(lián)合調(diào)試

右鍵工程 Debug as-->Debug Configrations:

o4YBAF9uHWSAfTZBAAGCKJa-qMc835.png

進(jìn)入Debug界面后,在AXI總線讀、寫的地方添加斷點(diǎn):

pIYBAF9uHWWAIGKeAABjsTwjDOo466.png

打開串口:

o4YBAF9uHWaALYTqAAAqc7VvEWA553.png

然后回到Vivado界面,連接到Device,就會(huì)自動(dòng)打開調(diào)試界面:

pIYBAF9uHWiAfPy4AAAh6f1uUoo531.png

接下來(lái)是設(shè)置觸發(fā)位置,添加觸發(fā)條件:

pIYBAF9uHWyAAhkSAAPUyQ7qy9M583.png

我們的采樣深度是默認(rèn)的1024,在500的位置觸發(fā),

o4YBAF9uHW2AB6T8AAA2OzZygUQ657.png

觸發(fā)條件設(shè)置成WVALID信號(hào)為高時(shí),AWVALID信號(hào)為高時(shí):

o4YBAF9uHW6AW4yzAAAglAGFcak232.png

右鍵邏輯分析儀,選中Enable Auto Re-trigger,設(shè)置成自動(dòng)進(jìn)入下一次觸發(fā):

pIYBAF9uHXCAJuKNAAA4G07uVOk626.png

點(diǎn)擊運(yùn)行觸發(fā),點(diǎn)擊完之后ila進(jìn)入等待觸發(fā)狀態(tài):

o4YBAF9uHXGAMdK8AAAjE1P5AGU250.png

在SDK點(diǎn)擊運(yùn)行:

o4YBAF9uHXKAZvWtAAASvJazISE412.png

首先寫入24:

o4YBAF9uHXOALypYAAB4b4le6c0775.png

有一點(diǎn)要注意,這里的寫地址VALID和READY信號(hào)是下一個(gè)地址的,這里就是對(duì)應(yīng)WDATA的4,而對(duì)應(yīng)地址0,也就是我們觀察的數(shù)據(jù)24地址的VALID和READY信號(hào)在前面已經(jīng)有效過了,我們?cè)O(shè)置寫數(shù)據(jù)有效時(shí)觸發(fā),而地址有效在前面就沒有捕捉到了。

然后寫入12:

o4YBAF9uHXWAV9zvAABvgy2gevk355.png

然后串口打印出36:

o4YBAF9uHXaAJetQAAAsPQEvdL0814.png

等到第二輪寫入的時(shí)候,我們看到讀數(shù)據(jù)通道上出現(xiàn)36:

o4YBAF9uHXiASy5VAACvGhEih8A502.png

我們可以換一下觸發(fā)信號(hào),換成讀VALID,讀READY拉高時(shí)觸發(fā):

o4YBAF9uHXmAdFrqAAAd3B854Qs447.png

就可以看到,讀VALID和READY信號(hào)都高時(shí),讀出36,讀地址線上是8:

o4YBAF9uHXqAPaKWAABsbdOmD-Q617.png

這里可以看到讀READY信號(hào)一直為高,讀VALID信號(hào)拉高時(shí)36讀入。但是由于ILA捕捉的是觸發(fā)時(shí)刻信號(hào),所以它將讀有效之前的讀數(shù)據(jù)都顯示為36了。

大家要注意,觸發(fā)設(shè)置里,添加的信號(hào)默認(rèn)是AND的,如果你一開始就把讀有效為高,寫有效為高都添加到觸發(fā)列表里,會(huì)觀察不到信號(hào),因?yàn)檫@兩個(gè)信號(hào)在本例子;里不會(huì)同時(shí)出現(xiàn):

pIYBAF9uHXuAd47UAAA5hgdI940792.png

我們可以添加讀VALID為1,寫VALID為1,然后選擇OR

pIYBAF9uHXyAZvdJAAAfE9IatCc783.png

SDK那邊一步步Debug,先是寫入24:

o4YBAF9uHX6AQ-lCAABpBPw3INo271.png

然后寫入12:

o4YBAF9uHX-AA59IAABouem-CtE971.png

然后讀到36:

pIYBAF9uHYCADlyoAABxDYm_1M8711.png

這里也是由于RREADY先于RVALID信號(hào)拉高,ILA捕捉不到READY是什么高的,就把之前都顯示為高。

如果沒有按你設(shè)置的運(yùn)行,可以在SDK重新Debug as或者在Vivado重新連接一下Target,或者多點(diǎn)幾次Run Trigger,這軟件有時(shí)候不靈敏,比如說你雖然設(shè)置了自動(dòng)進(jìn)入下一次觸發(fā),但是它不一定就進(jìn)入,這是手動(dòng)點(diǎn)一下觸發(fā),進(jìn)入等待模式,再點(diǎn)擊下一次Debug。

小結(jié)

到這里,AXI信號(hào)讀寫時(shí)序就全部觀察完了,這時(shí)候可以再去看一看AXI協(xié)議的理論部分,把封裝基于AX總線的IP時(shí)生成的例化代碼捋一遍,就能更好的理解AXI總線的工作原理了。提一句,我們目前觀察的都是簡(jiǎn)化版的AXI_Lite協(xié)議的時(shí)序。
編輯:hfy


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 加法器
    +關(guān)注

    關(guān)注

    6

    文章

    183

    瀏覽量

    29969
  • AXI
    AXI
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    16510
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    797

    瀏覽量

    65853
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    運(yùn)算放大器的同相加法器和反相加法器

      運(yùn)算放大器構(gòu)成加法器 可以分為同相加法器和反相加法器
    發(fā)表于 08-05 17:17 ?2.9w次閱讀
    運(yùn)算放大器的同相<b class='flag-5'>加法器</b>和反相<b class='flag-5'>加法器</b>

    加法器

    請(qǐng)問下大家,,進(jìn)位選擇加法器和進(jìn)位跳躍加法器的區(qū)別是啥???我用Verilog實(shí)現(xiàn)16位他們的加法器有什么樣的不同???還請(qǐng)知道的大神告訴我一下。。
    發(fā)表于 10-20 20:23

    什么是加法器?加法器的原理是什么 ?

    什么是加法器?加法器的原理是什么 反相加法器等效原理圖解析
    發(fā)表于 03-11 06:30

    加法器,加法器是什么意思

    加法器,加法器是什么意思 加法器 :  加法器是為了實(shí)現(xiàn)加法的?! 〖词钱a(chǎn)生數(shù)的和的裝置。加數(shù)和被加數(shù)為輸入,和數(shù)與
    發(fā)表于 03-08 16:48 ?5423次閱讀

    十進(jìn)制加法器,十進(jìn)制加法器工作原理是什么?

    十進(jìn)制加法器,十進(jìn)制加法器工作原理是什么?   十進(jìn)制加法器可由BCD碼(二-十進(jìn)制碼)來(lái)設(shè)計(jì),它可以在二進(jìn)制加法器的基礎(chǔ)上加上適當(dāng)?shù)摹靶U边壿媮?lái)實(shí)現(xiàn),該校正邏
    發(fā)表于 04-13 10:58 ?1.3w次閱讀

    FPU加法器的設(shè)計(jì)與實(shí)現(xiàn)

    浮點(diǎn)運(yùn)算器的核心運(yùn)算部件是浮點(diǎn)加法器,它是實(shí)現(xiàn)浮點(diǎn)指令各種運(yùn)算的基礎(chǔ),其設(shè)計(jì)優(yōu)化對(duì)于提高浮點(diǎn)運(yùn)算的速度和精度相當(dāng)關(guān)鍵。文章從浮點(diǎn)加法器算法和電路實(shí)現(xiàn)的角度給出設(shè)計(jì)
    發(fā)表于 07-06 15:05 ?47次下載
    FPU<b class='flag-5'>加法器</b>的設(shè)計(jì)與實(shí)現(xiàn)

    8位加法器和減法器設(shè)計(jì)實(shí)習(xí)報(bào)告

    8位加法器和減法器設(shè)計(jì)實(shí)習(xí)報(bào)告
    發(fā)表于 09-04 14:53 ?134次下載

    同相加法器電路原理與同相加法器計(jì)算

    同相加法器輸入阻抗高,輸出阻抗低 反相加法器輸入阻抗低,輸出阻抗高.加法器是一種數(shù)位電路,其可進(jìn)行數(shù)字的加法計(jì)算。當(dāng)選用同相加法器時(shí),如A輸
    發(fā)表于 09-13 17:23 ?5.7w次閱讀
    同相<b class='flag-5'>加法器</b>電路原理與同相<b class='flag-5'>加法器</b>計(jì)算

    基于Skewtolerant Domino的新型高速加法器

    基于Skewtolerant Domino的新型高速加法器
    發(fā)表于 01-22 20:29 ?8次下載

    加法器設(shè)計(jì)代碼參考

    介紹各種加法器的Verilog代碼和testbench。
    發(fā)表于 05-31 09:23 ?19次下載

    加法器的原理及采用加法器的原因

    有關(guān)加法器的知識(shí),加法器是用來(lái)做什么的,故名思義,加法器是為了實(shí)現(xiàn)加法的,它是一種產(chǎn)生數(shù)的和的裝置,那么加法器的工作原理是什么,為什么要采用
    的頭像 發(fā)表于 06-09 18:04 ?4834次閱讀

    鏡像加法器的電路結(jié)構(gòu)及仿真設(shè)計(jì)

    鏡像加法器是一個(gè)經(jīng)過改進(jìn)的加法器電路,首先,它取消了進(jìn)位反相門;
    的頭像 發(fā)表于 07-07 14:20 ?2214次閱讀
    鏡像<b class='flag-5'>加法器</b>的電路結(jié)構(gòu)及仿真設(shè)計(jì)

    同相加法器和反相加法器的區(qū)別是什么

    同相加法器和反相加法器是運(yùn)算放大器在模擬電路設(shè)計(jì)中常用的兩種基本電路結(jié)構(gòu),它們?cè)谛盘?hào)處理方面有著不同的特性和應(yīng)用場(chǎng)景。
    的頭像 發(fā)表于 05-23 14:35 ?1549次閱讀

    加法器的原理是什么 加法器有什么作用

    加法器是數(shù)字電路中的基本組件之一,用于執(zhí)行數(shù)值的加法運(yùn)算。加法器的基本原理和作用可以從以下幾個(gè)方面進(jìn)行詳細(xì)闡述。
    的頭像 發(fā)表于 05-23 15:01 ?1484次閱讀
    <b class='flag-5'>加法器</b>的原理是什么 <b class='flag-5'>加法器</b>有什么作用

    串行加法器和并行加法器的區(qū)別?

    串行加法器和并行加法器是兩種基本的數(shù)字電路設(shè)計(jì),用于執(zhí)行二進(jìn)制數(shù)的加法運(yùn)算。它們?cè)谠O(shè)計(jì)哲學(xué)、性能特點(diǎn)以及應(yīng)用場(chǎng)景上有著明顯的區(qū)別。
    的頭像 發(fā)表于 05-23 15:06 ?1148次閱讀