日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內不再提示

ARM+FPGA開發(fā):基于AXI總線的GPIO IP創(chuàng)建

454398 ? 來源:CSDN 博主 ? 作者:ChuanjieZhu ? 2020-12-25 14:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

FPGA+ARM是ZYNQ的特點,那么PL部分怎么和ARM通信呢,依靠的就是AXI總線。這個實驗是創(chuàng)建一個基于AXI總線的GPIO IP,利用PL的資源來擴充GPIO資源。通過這個實驗迅速入門開發(fā)基于總線的系統(tǒng)。

使用的板子是zc702。

AXI總線初識:

AXI (Advanced eXtensible Interface),由ARM公司提出的一種總線協(xié)議。總線是一組傳輸通道, 是各種邏輯器件構成的傳輸數(shù)據(jù)的通道, 一般由數(shù)據(jù)線、地址線、 控制線構成。Xilinx從6系列的 FPGA 開始對 AXI 總線提供支持, 此時 AXI 已經(jīng)發(fā)展到了 AXI4 這個版本, Vivado里都是基于AIX4的 IP。

ZYNQ支持三種AXI總線,擁有三種AXI接口,用的都是AXI協(xié)議:
AXI4:(For high-performance memory-mapped requirements)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允許最大256輪的數(shù)據(jù)突發(fā)傳輸。
AXI4-Lite:(For simple, low-throughput memory-mapped communication)是一個輕量級的地址映射單次傳輸接口, 占用很少的邏輯單元。
AXI4-Stream:(For high-speed streaming data)面向高速流數(shù)據(jù)傳輸,去掉了地址項,允許無限制的數(shù)據(jù)突發(fā)傳輸。

數(shù)據(jù)在總線上是遵守協(xié)議定的規(guī)則來傳輸?shù)?,AXI信號傳輸先是傳地址,然后檢測READY+VALID,都為高電平時開始傳數(shù)據(jù),當主機發(fā)送最后一個數(shù)據(jù)時LAST信號拉高,通知從機傳輸結束。

在介紹讀寫如何進行前先介紹握手協(xié)議:

READY,VALID握手通信機制,主機產生 VLAID 信號來指明何時數(shù)據(jù)或控制信息有效。從機產生 READY 信號來指明已經(jīng)準備好接受數(shù)據(jù)或控制信息。傳輸發(fā)生在 VALID和 READY 信號同時為高的時候。(還有一個LAST信號表示什么時候傳到最后一個數(shù)據(jù)了)

讀時序:地址線上發(fā)來地址,地址準備和地址有效都高時,開始發(fā)送要讀的數(shù)據(jù),讀準備和讀有效都高時數(shù)據(jù)被讀取到,發(fā)最后一個數(shù)據(jù)時讀LAST信號拉高。

o4YBAF9uH8WAI1xaAACU82QQce4263.png

寫時序:地址線上發(fā)來地址,地址準備和地址有效都高時,開始發(fā)送要寫的數(shù)據(jù),寫準備和寫有效都高時數(shù)據(jù)寫入,發(fā)最后一個數(shù)據(jù)時寫LAST信號拉高。寫數(shù)據(jù)多了一個反饋信號,反饋給主機,主機接收到這個信號,就知道寫成功了。

pIYBAF9uH8aAAs4gAACJSfEm2fE067.png

這個協(xié)議可以暫時不去理清,知道大致信號關系,后面會通過觀察波形進一步加深印象,這次實驗的重點是學習通過編程操作寄存器完成讀寫!

第一步,創(chuàng)建AXI總線IP

新建一個工程,Tools-->Create and Pacakge IP-->選擇Create AXI4 Peripheral

o4YBAF9uH8iAUsGLAADnuwEpkoo789.png

創(chuàng)建完以后(起個易理解的名字,放到能找到的路徑下),有三項需要設置:接口類型,數(shù)據(jù)類型和寄存器數(shù)量

pIYBAF9uH8qAG5bqAACxI6pURJo494.png

我們按默認這是就好,記住這里的設置:選擇AXI_Lite總線,數(shù)據(jù)位寬是32位,也就是4字節(jié),寄存器4個,實際我們用到的只有一個,但這里最低要求4個,沒關系,多出的不用就是,待會我們就要通過操作寄存器完成對數(shù)據(jù)的讀寫。

然后選擇Edit IP,

打開ip的工程后,先打開這個文件:

o4YBAF9uH8uAVHppAAAu9EZkD6g451.png

這個就是基于AXI_Lite總線協(xié)議的模塊,可以看到我們設置的數(shù)據(jù)位寬和寄存器數(shù)量:

pIYBAF9uH8yAKfI2AABAxU5Dc7A428.png


o4YBAF9uH82Ab-v2AABskE7zank379.png

AXI總線向寄存器寫數(shù)據(jù):

pIYBAF9uH8-AYHHYAACcvF5rkeQ036.png

AXI總線下讀寄存器的數(shù)據(jù):

o4YBAF9uH9CAPZZYAABokX-L-5U914.png

接下來我們添加一個信號,將寄存器綁定到用戶輸出,用這個輸出控制LED燈,這樣可以通過觀察LED的亮滅看有沒有寫入成功。

pIYBAF9uH9KAYrmWAABVKth315I408.png


pIYBAF9uH9OAGvfBAAAP5zqyelE589.png

然后打開頂層文件:

pIYBAF9uH9SAGfq5AAAxw0gZuIo667.png

將添加的信號加上去:

o4YBAF9uH9WAT65uAAAwQMaYLEU644.png


pIYBAF9uH9aADP9XAACLLFD8u9A634.png

保存,Tools-->Create and Package IP:

o4YBAF9uH9iACx97AADMtnuJgAo697.png

overwrite原來的文件。

在IP自己創(chuàng)建的工程文件夾里,打包好的IP就是這個文件夾,可以將其拷貝放到任意地方:

pIYBAF9uH9mAcuJGAABA_HOXRd4348.png

至此,基于AXI_Lite總線的IP就完成了??梢詫⑦@個文件夾拷到你之前建的工程目錄下,我是放在myip文件夾下。

第二步,使用基于AXI總線的IP

將我們自定義的IP添加到庫里:

o4YBAF9uH9uAMovxAADwxIIyvs8728.png

Create Block Design,命名為GPIO_AXI_LED,

添加zynq核,雙擊修改ddr信號,其他默認設置:

o4YBAF9uH96AGn2NAAFiOx2f3dY398.png

添加我們自己創(chuàng)建的IP,然后點擊自動連接:

o4YBAF9uH9-AUV-1AACoeX_AwDs259.png

會自動出現(xiàn)互聯(lián)模塊和復位模塊,互聯(lián)模塊主要是起管理主從設備的作用:

pIYBAF9uH-GAKCksAAEtjEgQGJs852.png

本來我們還應該添加邏輯分析儀觀察AXI總線的各信號波形,但是為了先上手體驗怎么開發(fā)基于AXI的系統(tǒng),我們先略過,放在下一個實驗中。

再點擊Run Block Automatiom:

pIYBAF9uH-OAG3lpAAE20_CPgik910.png

將LED信號也輸出出來,右擊GPIO_LED,Make External。

右擊空白處,選擇Regenerate layout,美化一下排版:

o4YBAF9uH-WAdMCPAAFAWNjWEYw582.png

這樣我們的系統(tǒng)就搭建成功了,下面就是一些例行操作:

檢驗一下我們的設計:

pIYBAF9uH-eAN2c_AACxuQ_PVzQ464.png

保存一下我們的設計:

pIYBAF9uH-mARURiAACF3K_7flY544.png

右鍵bd文件,復位一下系統(tǒng),Reset Output Products:

pIYBAF9uH-qAL5F1AAAh0Tdzl3I817.png

右鍵bd文件,Geberate Output Products,

右鍵bd文件,Create HDL Wrapper。

然后就是添加管腳約束,把GPIO_LED信號連接到LED燈上:

zc702的管教約束如下:

#GPIO PMOD1
set_property PACKAGE_PIN E15 [get_ports {GPIO_LED[7]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[7]}]
set_property PACKAGE_PIN D15 [get_ports {GPIO_LED[6]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[6]}]
set_property PACKAGE_PIN W17 [get_ports {GPIO_LED[5]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[5]}]
set_property PACKAGE_PIN W5 [get_ports {GPIO_LED[4]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[4]}]
#GPIO PMOD2
set_property PACKAGE_PIN V7 [get_ports {GPIO_LED[3]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[3]}]
set_property PACKAGE_PIN W10 [get_ports {GPIO_LED[2]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[2]}]
set_property PACKAGE_PIN P18 [get_ports {GPIO_LED[1]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[1]}]
set_property PACKAGE_PIN P17 [get_ports {GPIO_LED[0]}]
set_property IOSTANDARD LVCMOS25 [get_ports {GPIO_LED[0]}]

添加完先綜合一下,看看連線有沒有錯誤。綜合完成生成比特流文件。
至此,大功告成,下面就到了本實現(xiàn)的重點,進入SDK寫代碼來讀寫寄存器!

將硬件系統(tǒng)信息和bit文件導入SDK:

o4YBAF9uH-uAIEpkAABIrdXdz4g497.png

然后Lanch SDK,新建一個空的工程:

o4YBAF9uH-2ASGTxAAC_s1bXKrQ584.png

在src文件下建一個c文件:

o4YBAF9uH-6AYonwAACW2pwVVlo534.png

c大家都知道,用到什么函數(shù)要將這個函數(shù)所在的文件添加到頭文件,這類先把頭文件添加進去:

#include
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#include "xil_types.h"

Xinlin提供的讀函數(shù)是Xil_Out32((BaseAddr) + (u32)(RegOffset)),寫函數(shù)是Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data)),讀寫都是相對于Master而言的,讀當然是In,寫當然是Out了。

前面我們提到了,讀寫是對我們定義的寄存器操作,我們這里8個led燈,只要用到寄存器0的低8位就可以了。既然要操作寄存器,肯定要知道寄存器的地址,所有設備的地址都放在bsp文件下的include文件里的xparameters.h文件里,并且以宏定義,方便調用:

o4YBAF9uH--ARMLvAAAWt2hh5Ns808.png

例如我們的自定義IP在這里,GPIO_Zhu,第一個是基地址,第二個是最高地址,:

pIYBAF9uH_GABZmoAABVlLGA_Hc177.png

寄存器0所在地址就是基地址,偏移量為0,因為我們定義的位寬是32位,4個字節(jié),寄存器1所在地址就是基地址+4,依次類推。

這里我們讓8個Led燈依次閃爍,1秒移動一次,并讀取寄存器的數(shù)據(jù)打印到串口:
#include
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#include "xil_types.h"

int main(){
u8 i=0;
u8 ledValue=0;
Xil_Out32(XPAR_GPIO_ZHU_V1_0_0_BASEADDR+0*4,0X00);
while(1){
for(i=0;i Xil_Out32(XPAR_GPIO_ZHU_V1_0_0_BASEADDR+0*4,1 ledValue=Xil_In32(XPAR_GPIO_ZHU_V1_0_0_BASEADDR+0*4);
xil_printf("ledValue=%x/r/n",ledValue); //打印到串口
sleep(1); //1s移動一次
}
i=0;
}
}

板子上電,連接好,以Debug方式運行:

o4YBAF9uH_eAeJ28AAaGfUhX_sY455.png

下載好后,打開串口:

o4YBAF9uH_iAVZnFAAAj1vfG5Aw199.png


o4YBAF9uH_qADLLuAABbqvT4jow911.png

點擊開始運行:

pIYBAF9uH_uAaZY5AAB3EupWqSQ056.png

Led開始依次閃爍了!,并且在串口看到打印出的數(shù)據(jù):

pIYBAF9uH_yAK8lHAABT0z28o6o501.png

至此,實驗成功,開啟了我們ARM+FPGA開發(fā)之路!以后可以嘗試開發(fā)更復雜的系統(tǒng)。

編輯:hfy


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

    關注

    73

    文章

    2208

    瀏覽量

    131978
  • AXI
    AXI
    +關注

    關注

    1

    文章

    145

    瀏覽量

    18037
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    使用Python/MyHDL創(chuàng)建自定義FPGA IP

    使用 Python/MyHDL 創(chuàng)建自定義 FPGA IP,與 Vivado 集成,并通過 PYNQ 進行控制——實現(xiàn)軟件上的簡單硬件設計。
    的頭像 發(fā)表于 04-09 09:53 ?290次閱讀
    使用Python/MyHDL<b class='flag-5'>創(chuàng)建</b>自定義<b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b>

    利用開源uart2axi4實現(xiàn)串口訪問axi總線

    microblaze和jtag-to-axi(jtag2axi)雖然也提供了訪問axi總線的能力,但是依賴于xilinx平臺。而uart-to-ax
    的頭像 發(fā)表于 12-02 10:05 ?2289次閱讀
    利用開源uart2<b class='flag-5'>axi</b>4實現(xiàn)串口訪問<b class='flag-5'>axi</b><b class='flag-5'>總線</b>

    使用AXI4接口IP核進行DDR讀寫測試

    本章的實驗任務是在 PL 端自定義一個 AXI4 接口的 IP 核,通過 AXI_HP 接口對 PS 端 DDR3 進行讀寫測試,讀寫的內存大小是 4K 字節(jié)。
    的頭像 發(fā)表于 11-24 09:19 ?3944次閱讀
    使用<b class='flag-5'>AXI</b>4接口<b class='flag-5'>IP</b>核進行DDR讀寫測試

    RDMA設計4:技術需求分析2

    多,因此本數(shù)據(jù)傳輸系統(tǒng)能夠部署在支持 CMAC 集成塊的 FPGA 開發(fā)板上。另一方面,獨立設計 UDP/IP 協(xié)議棧能夠讓本設計具有更高的數(shù)據(jù)傳輸性能并進一步降低資源占用。 (3)采用純邏輯電路
    發(fā)表于 11-24 09:09

    基于瑞芯微 RK3588 的 ARMFPGA 交互通信實戰(zhàn)指南

    及關鍵代碼,實現(xiàn) ARMFPGA BRAM 的數(shù)據(jù)讀寫測試,校驗數(shù)據(jù)準確性并計算傳輸速率,為評估板 ARM+FPGA PCIe 通信應用開發(fā)提供完整指導。
    的頭像 發(fā)表于 11-04 16:09 ?809次閱讀
    基于瑞芯微 RK3588 的 <b class='flag-5'>ARM</b> 與 <b class='flag-5'>FPGA</b> 交互通信實戰(zhàn)指南

    利用蜂鳥E203搭建SoC【1】——AXI總線的配置與板級驗證

    由于Vivado中Block Design的友好的ui界面以及豐富的IP資源,在FPGA上實現(xiàn)SoC大多會采用Block Design進行設計與實現(xiàn)。對于基于蜂鳥e203內核的SoC設計,為了使其
    發(fā)表于 10-30 07:35

    將e203 例化AXI總線接口

    將系統(tǒng)外設總線內部axi接口引出給gpio,注意vivado中gpio地址分配應保證移植 Debug: 通過Xil_Out32函數(shù)給gpio
    發(fā)表于 10-29 06:08

    AXI GPIO擴展e203 IO口簡介

    AXI GPIO簡介 AXI-GPIO是一種Xilinx公司開發(fā)的外設IP,可以連接到AXI
    發(fā)表于 10-22 08:14

    RDMA over RoCE V2設計2:ip 整體框架設計考慮

    設計 UDP/IP 協(xié)議棧。一方面,CMAC 集成塊具有多種版本,并且適用平臺多,因此本數(shù)據(jù)傳輸系統(tǒng)能夠部署在支持 CMAC 集成塊的 FPGA 開發(fā)板上。另一方面,獨立設計 UDP/IP
    發(fā)表于 07-16 08:51

    RDMA簡介8之AXI分析

    AXI4 總線是第四代 AXI 總線,其定義了三種總線接口,分別為:AXI4、
    的頭像 發(fā)表于 06-24 23:22 ?792次閱讀
    RDMA簡介8之<b class='flag-5'>AXI</b>分析

    RDMA簡介8之AXI 總線協(xié)議分析1

    AXI 總線是一種高速片內互連總線,其定義于由 ARM 公司推出的 AMBA 協(xié)議中,主要用于高性能、高帶寬、低延遲、易集成的片內互連需求。AXI
    發(fā)表于 06-24 18:00

    如何使用AMD Vitis HLS創(chuàng)建HLS IP

    本文逐步演示了如何使用 AMD Vitis HLS 來創(chuàng)建一個 HLS IP,通過 AXI4 接口從存儲器讀取數(shù)據(jù)、執(zhí)行簡單的數(shù)學運算,然后將數(shù)據(jù)寫回存儲器。接著會在 AMD Vivado Design Suite 設計中使用此
    的頭像 發(fā)表于 06-13 09:50 ?2294次閱讀
    如何使用AMD Vitis HLS<b class='flag-5'>創(chuàng)建</b>HLS <b class='flag-5'>IP</b>

    NVMe IPAXI4總線分析

    廣泛應用 。隨著時間的推移,AXI4的影響不斷擴大。目前,由Xilinx提供的大部分IP接口都支持AXI4總線,使得系統(tǒng)中不同模塊之間的互連更加高效。這也讓基于這些
    發(fā)表于 06-02 23:05

    NVMe簡介之AXI總線

    NVMe需要用AXI總線進行高速傳輸。而AXI總線ARM公司提出的AMBA(Advanced Microcontroller Bus Ar
    的頭像 發(fā)表于 05-21 09:29 ?920次閱讀
    NVMe簡介之<b class='flag-5'>AXI</b><b class='flag-5'>總線</b>

    NVMe協(xié)議簡介之AXI總線

    NVMe需要用AXI總線進行高速傳輸。這里,AXI總線ARM公司提出的AMBA(Advanced Microcontroller Bus
    發(fā)表于 05-17 10:27
    道真| 阿坝| 桓仁| 屏山县| 滨海县| 肇东市| 建宁县| 定西市| 中牟县| 镇原县| 汉寿县| 北京市| 米泉市| 湘潭县| 壶关县| 樟树市| 江川县| 长白| 永修县| 浏阳市| 斗六市| 莱阳市| 普兰县| 泽库县| 阜康市| 墨玉县| 光泽县| 公安县| 博罗县| 邹城市| 黔东| 仲巴县| 恩施市| 榆社县| 江口县| 云和县| 封开县| 马尔康县| 奈曼旗| 高陵县| 区。|