<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

454398 ? 來源:csdn ? 作者:ChuanjieZhu ? 2020-12-23 15:32 ? 次閱讀

前面一節我們學會了創建基于AXI總線的IP,但是對于AXI協議各信號的時序還不太了解。這個實驗就是通過SDK和Vivado聯合調試觀察AXI總線的信號。由于我們創建的接口是基于AXI_Lite協議的,所以我們實際觀察到是AXI_Lite協議的信號時序。

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

板子使用的是zc702。

在觀察信號之前我們有必要簡單了解AXI是個什么:

AXI總線是一種高性能、高帶寬、低延遲的片內總線,AXI協議描述了主從設備數據傳輸的方式。主設備和從設備通過握手信號建立連接,握手信號包括主機發送的VALID信號,表示數據有效,從機發送的READY信號,表示從機準備好了接收數據。當VALID和READY都有效的時候傳輸開始。

Zynq使用的是AXI協議的4.0版本,由AMBA3.0協議發展而來:

AXI的三種總線各有各的用途:
AXI4支持突發數據傳輸,主要用于CPU訪問存儲等需要高速數據交互的場合,相當于原來的AHB協議;

AXI_Lite一次傳輸單個數據,主要用于訪問一些低速外設,相當于原來的APB;

AXI_Stream數據傳輸不需要地址,主設備直接連續讀寫數據,主要用于高速流數據的傳輸,使用起來類似FIFO。

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

幫助記憶:
讀地址信號都是以AR開頭(A: address; R: read)
寫地址信號都是以AW開頭(A: address; W: write
讀數據信號都是以R開頭(R: read)
寫數據信號都是以W開頭(W: write)
應答信號都是以B開頭(B: back(answer back))

讀時序:

寫時序:

5個通道都有自己獨立的握手機制,同時又相互協作,地址線分離后,讀/寫可以并行交互數據。而且AXI支持地址pipeline、錯位傳輸等模式,大大提高了數據通路的利用率。

關于AXI Interconnect模塊:

AXI協議可以描述為主/從設備之間的點對點傳輸,可以有多個主機,也可以有多個從機,這是進行數據交互時,需要一個管理中心確保信號發到對應的設備,AXI Interconnect模塊就是這樣一個管理中心,也叫做AXI互聯矩陣。它類似于一個交換機,保證每個外設獨享帶寬,完成數據傳輸。Xilinx公司為我們提供了AXI Interconnect的IP核。

介紹到此,理論部分已經掌握i一二了,下面就開始實際觀察AXI的信號。

創建一個基于AXI_Lite總線的加法器IP

新建Vivado工程,依然,選擇這個:

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

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

添加用戶端口

這里我們沒有要輸出的信號

添加用戶邏輯:

待會我們將兩個加數寫到寄存器0和1中,從寄存器2中讀出和

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

然后在工程里添加zynq核,添加剛才創建的IP,點擊自動連接,然后選中AXI總線,右擊選擇Make Debug,出現兩個綠色的小瓢蟲,將總線加入Debug模式下。

如果你沒有把剛才新建的IP放在該工程目錄下,先要把IP添加進庫里,選擇 Project Settings-->IP。點擊綠色的加號,選擇到你的用戶IP地址 :

o4YBAF9uHVuAKzGUAAERMik5j6o056.png

整個系統搭建完成是這樣的:

o4YBAF9uHV2AYd7qAAE-BadJ_Jo854.png

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

pIYBAF9uHV-AcXdgAAE7sED2oA0079.png

設置采樣深度為1024,

pIYBAF9uHWGAeR9UAACy9TN9Ses728.png

其他默認,然后生成比特流文件。

軟件端的設計

Lanch到SDK,新建一個空的applicaton工程,添加一個c源文件,我們在xparameters.h文件中找到我們添加的加法器AXI_ADD的寄存器首地址,待會我們就是要通過地址對寄存器進行讀、寫:

o4YBAF9uHWKAKgUsAAA5SEoCAqE167.png

這個案例里我們計算16進制下的24+12=36,為了方便SDK端的斷點調試,加了while循環,注釋我寫在后面了:
#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寫入第一個加數
Xil_Out32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG1,0x12); //向寄存器1寫入第二個加數
value = Xil_In32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG2); //從寄存器3中讀出和
xil_printf("value = %x",value);
}
return 0;
}

硬件聯合調試

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

o4YBAF9uHWSAfTZBAAGCKJa-qMc835.png

進入Debug界面后,在AXI總線讀、寫的地方添加斷點:

pIYBAF9uHWWAIGKeAABjsTwjDOo466.png

打開串口:

o4YBAF9uHWaALYTqAAAqc7VvEWA553.png

然后回到Vivado界面,連接到Device,就會自動打開調試界面:

pIYBAF9uHWiAfPy4AAAh6f1uUoo531.png

接下來是設置觸發位置,添加觸發條件:

pIYBAF9uHWyAAhkSAAPUyQ7qy9M583.png

我們的采樣深度是默認的1024,在500的位置觸發,

o4YBAF9uHW2AB6T8AAA2OzZygUQ657.png

觸發條件設置成WVALID信號為高時,AWVALID信號為高時:

o4YBAF9uHW6AW4yzAAAglAGFcak232.png

右鍵邏輯分析儀,選中Enable Auto Re-trigger,設置成自動進入下一次觸發:

pIYBAF9uHXCAJuKNAAA4G07uVOk626.png

點擊運行觸發,點擊完之后ila進入等待觸發狀態:

o4YBAF9uHXGAMdK8AAAjE1P5AGU250.png

在SDK點擊運行:

o4YBAF9uHXKAZvWtAAASvJazISE412.png

首先寫入24:

o4YBAF9uHXOALypYAAB4b4le6c0775.png

有一點要注意,這里的寫地址VALID和READY信號是下一個地址的,這里就是對應WDATA的4,而對應地址0,也就是我們觀察的數據24地址的VALID和READY信號在前面已經有效過了,我們設置寫數據有效時觸發,而地址有效在前面就沒有捕捉到了。

然后寫入12:

o4YBAF9uHXWAV9zvAABvgy2gevk355.png

然后串口打印出36:

o4YBAF9uHXaAJetQAAAsPQEvdL0814.png

等到第二輪寫入的時候,我們看到讀數據通道上出現36:

o4YBAF9uHXiASy5VAACvGhEih8A502.png

我們可以換一下觸發信號,換成讀VALID,讀READY拉高時觸發:

o4YBAF9uHXmAdFrqAAAd3B854Qs447.png

就可以看到,讀VALID和READY信號都高時,讀出36,讀地址線上是8:

o4YBAF9uHXqAPaKWAABsbdOmD-Q617.png

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

大家要注意,觸發設置里,添加的信號默認是AND的,如果你一開始就把讀有效為高,寫有效為高都添加到觸發列表里,會觀察不到信號,因為這兩個信號在本例子;里不會同時出現:

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信號拉高,ILA捕捉不到READY是什么高的,就把之前都顯示為高。

如果沒有按你設置的運行,可以在SDK重新Debug as或者在Vivado重新連接一下Target,或者多點幾次Run Trigger,這軟件有時候不靈敏,比如說你雖然設置了自動進入下一次觸發,但是它不一定就進入,這是手動點一下觸發,進入等待模式,再點擊下一次Debug。

小結

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


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 加法器
    +關注

    關注

    6

    文章

    179

    瀏覽量

    29832
  • AXI
    AXI
    +關注

    關注

    1

    文章

    126

    瀏覽量

    16350
  • Vivado
    +關注

    關注

    18

    文章

    791

    瀏覽量

    65413
收藏 人收藏

    評論

    相關推薦

    運算放大器的同相加法器和反相加法器

      運算放大器構成加法器 可以分為同相加法器和反相加法器
    發表于 08-05 17:17 ?2.5w次閱讀
    運算放大器的同相<b class='flag-5'>加法器</b>和反相<b class='flag-5'>加法器</b>

    加法器

    請問下大家,,進位選擇加法器和進位跳躍加法器的區別是啥???我用Verilog實現16位他們的加法器有什么樣的不同???還請知道的大神告訴我一下。。
    發表于 10-20 20:23

    什么類型的加法器將被合成到?

    嗨,對于下面的代碼片段,合成后會得到哪種類型的加法器?例如:半加法器,全加器,CLA,Ripple加法器?模塊ee(輸入a,e,輸出reg c);總是@(*)c = a + e;end
    發表于 03-19 09:49

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

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

    4位并行的BCD加法器電路圖

       圖二所示為4位并行的BCD加法器電路。其中上面加法器的輸入來自低一級的BCD數字。下
    發表于 03-28 16:35 ?1.3w次閱讀
    4位并行的BCD<b class='flag-5'>加法器</b>電路圖

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

    加法器,加法器是什么意思 加法器 :  加法器是為了實現加法的?! 〖词钱a生數的和的裝置。加數和被加數為輸入,和數與
    發表于 03-08 16:48 ?5245次閱讀

    十進制加法器,十進制加法器工作原理是什么?

    十進制加法器,十進制加法器工作原理是什么?   十進制加法器可由BCD碼(二-十進制碼)來設計,它可以在二進制加法器的基礎上加上適當的“校正”邏輯來實現,該校正邏
    發表于 04-13 10:58 ?1.3w次閱讀

    同相加法器電路原理與同相加法器計算

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

    加法器原理

    加法器是產生數的和的裝置。加數和被加數為輸入,和數與進位為輸出的裝置為半加器。若加數、被加數與低位的進位數為輸入,而和數與進位為輸出則為全加器。常用作計算機算術邏輯部件,執行邏輯操作、移位與指令調用
    的頭像 發表于 06-19 14:20 ?2.5w次閱讀
    <b class='flag-5'>加法器</b>原理

    加法器設計代碼參考

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

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

    有關加法器的知識,加法器是用來做什么的,故名思義,加法器是為了實現加法的,它是一種產生數的和的裝置,那么加法器的工作原理是什么,為什么要采用
    的頭像 發表于 06-09 18:04 ?4285次閱讀

    鏡像加法器的電路結構及仿真設計

    鏡像加法器是一個經過改進的加法器電路,首先,它取消了進位反相門;
    的頭像 發表于 07-07 14:20 ?1714次閱讀
    鏡像<b class='flag-5'>加法器</b>的電路結構及仿真設計

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

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

    串行加法器和并行加法器的區別?

    串行加法器和并行加法器是兩種基本的數字電路設計,用于執行二進制數的加法運算。它們在設計哲學、性能特點以及應用場景上有著明顯的區別。
    的頭像 發表于 05-23 15:06 ?331次閱讀

    請問增益為1的加法器有哪些?

    增益為1的加法器指的是輸出信號的幅度與輸入信號幅度相等的加法器。這類加法器在模擬電路設計中非常重要,因為它們在執行加法運算的同時,不會改變信號的幅度。
    的頭像 發表于 05-23 15:10 ?293次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>