《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動(dòng)態(tài) > 從小白到專家:網(wǎng)友親身實(shí)踐教您上手 ZYNQ 開發(fā) | Zynq 常用外設(shè)快速上手指南

從小白到專家:網(wǎng)友親身實(shí)踐教您上手 ZYNQ 開發(fā) | Zynq 常用外設(shè)快速上手指南

2019-09-15
關(guān)鍵詞: ZYNQ開發(fā) Zynq

  ZYNQ有專用的DDR Controller接口,如果外部硬件連接了DDR器件,于是在ZYNQ Processing System中正確配置了相應(yīng)的信號(hào)和參數(shù)后,DDR就可以成為ZYNQ的內(nèi)存,在SDK中可以直接使用memcpy、memset以及類似的函數(shù)對(duì)于Memory空間進(jìn)行操作。

  Step1:查看ZYBO的原理圖,找到相應(yīng)的配置。ZYBO原理圖中與DDR相關(guān)的部分如下圖所示。

640.webp.jpg

  于是得到兩個(gè)信息,第一個(gè)所使用的芯片是MT41J128M16JT-125,第二個(gè)是兩片DDR3顆粒是通過位拼接完成的,也就是數(shù)據(jù)位寬為32bit。

  Step2:在Block Design中對(duì)DDR部分的參數(shù)進(jìn)行配置。

640.webp (1).jpg

  Step3:完成Block Design設(shè)計(jì),產(chǎn)生Bitstream,導(dǎo)入SDK。

640.webp (2).jpg

  Step4:在SDK中編寫Memory測(cè)試代碼。

  #include <stdio.h>

  #include <stdlib.h>

  #include "platform.h"

  #include "xil_printf.h"

  #include "xil_types.h"

  #include "xil_io.h"

  int main()

  {

  u32 test_src[100];

  int i;

  int readback;

  init_platform();

  u32 *result = (u32*) malloc(sizeof(u32) * 100);

  if (result) {

  memset(result, 0, sizeof(u32) * 100);

  } else {

  return 0;

  }

  for(i=0;i<99;i++)

  {

  test_src[i]=i;

  }

  memcpy(result,test_src,100 * sizeof(u32));

  for(i=0;i<100;i++)

  {

  readback = Xil_In32(result+i);

  其中特別需要學(xué)習(xí)的就是malloc與memcpy的使用方法。

  貳

  ZYNQ 中 MIO/EMIO GPIO 的使用

  參考工程見“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。

  MIO是PS端的外部引腳,共有54個(gè);EMIO是PL端的外部引腳,共有64個(gè)。ZYNQ支持通過配置將PS的控制器信號(hào)通過EMIO輸出,例如PS自帶的UART Controller,如果正常選擇引腳只能選擇MIO引腳輸出,但是通過設(shè)置可以選擇連接到EMIO引腳。同時(shí)EMIO引腳也可以作為PS端的擴(kuò)展引腳,即經(jīng)過擴(kuò)展PS一共可以控制118個(gè)引腳。

  該例程演示將4個(gè)EMIO設(shè)置為PS的擴(kuò)展引腳,這4個(gè)EMIO連接著LED。于是,與“將用戶邏輯設(shè)計(jì)封裝成IP”中的實(shí)驗(yàn)相比,同樣是控制外部4個(gè)LED,就不需要另外設(shè)計(jì)一個(gè)邏輯模塊,并封裝成IP作為PS的外設(shè)了,可以直接通過SDK的程序進(jìn)行控制。

  注意

  1. 用于擴(kuò)展GPIO的EMIO和用于擴(kuò)展外設(shè)的EMIO是完全獨(dú)立的,GPIO的EMIO共有64個(gè),由2個(gè)bank組成,如下圖所示。

    640.webp (3).jpg

  2. EMIO的內(nèi)部排序按照EMIO54、EMIO55... ... EMIO117,以此類推。有了EMIO的編號(hào)之后就與內(nèi)部控制EMIO的寄存器一一對(duì)應(yīng);而EMIO在外部與外部引腳的對(duì)應(yīng)關(guān)系又是可以通過管腳約束進(jìn)行更改的。于是可以得出:不能通過EMIO的外部引腳的關(guān)系確定其內(nèi)部寄存器的地址。工具對(duì)于EMIO GPIO的連接關(guān)系是按照從EMIO54開始依次向上排列。

  Step1:在Block Design中加入ZYNQ7 Processing System,在ZYNQ7 Processing System配置中添加EMIO GPIO,如下圖所示。通過設(shè)置EMIO GPIO Width來選擇擴(kuò)展EMIO GPIO的個(gè)數(shù),此時(shí)就完成了與內(nèi)部寄存器之間的對(duì)應(yīng)關(guān)系,規(guī)則就是從EMIO54開始向上排列。

640.webp (4).jpg

  Step2:將ZYNQ的EMIO連接到外部引腳。右擊生成的GPIO信號(hào),點(diǎn)擊Make External。

640.webp (5).jpg

  Step3:約束EMIO與外部引腳Pad的對(duì)應(yīng)關(guān)系以及EMIO的電平標(biāo)準(zhǔn)。

  方法有兩種:

  第一種是通過XDC約束文件進(jìn)行約束,需要先將Block Design生成HDL Wrapper,這樣才能知道其引腳名稱。

  set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[3]}]]

  set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[2]}]

  set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[1]}]

  set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[0]}]

  set_property PACKAGE_PIN D18 [get_ports {gpio_0_tri_io[3]}]

  set_property PACKAGE_PIN G14 [get_ports {gpio_0_tri_io[2]}]

  set_property PACKAGE_PIN M15 [get_ports {gpio_0_tri_io[1]}]

  set_property PACKAGE_PIN M14 [get_ports {gpio_0_tri_io[0]}]

  第二種方法就是Open Elaborated Design,在GUI中設(shè)置電平和引腳。

640.webp (6).jpg

  Step4:完成Block Design的綜合、實(shí)現(xiàn)、生成Bitstream并導(dǎo)入SDK。

  Step5:SDK中完成代碼的編寫,EMIO的代碼編寫需要包含的庫文件是"xgpiops.h"。

  #include "xgpiops.h"

  static XGpioPs emio;

  #define EMIO_54   54

  #define EMIO_55   55

  #define EMIO_56   56

  #define EMIO_57   57

  int main()

  {

  //定義GPIOPS型指針,用于初始化時(shí)綁定硬件

  XGpioPs_Config *ConfigPtrPS;

  init_platform();

  //初始化GPIOPS,將ConfigPtrPS與硬件綁定

  ConfigPtrPS = XGpioPs_LookupConfig(0);

  XGpioPs_CfgInitialize(&emio, ConfigPtrPS,

  ConfigPtrPS->BaseAddr);

  //設(shè)置EMIO的方向,并使能EMIO

  XGpioPs_SetDirectionPin(&emio, EMIO_54, 1);

  XGpioPs_SetOutputEnablePin(&emio, EMIO_54, 1);

  XGpioPs_SetDirectionPin(&emio, EMIO_55, 1);

  XGpioPs_SetOutputEnablePin(&emio, EMIO_55, 1);

  XGpioPs_SetDirectionPin(&emio, EMIO_56, 1);

  XGpioPs_SetOutputEnablePin(&emio, EMIO_56, 1);

  XGpioPs_SetDirectionPin(&emio, EMIO_57, 1);

  XGpioPs_SetOutputEnablePin(&emio, EMIO_57, 1);

  while(1)

  {

  // 向EMIO寫入數(shù)據(jù),即驅(qū)動(dòng)EMIO引腳

  XGpioPs_WritePin(&emio, EMIO_54, 0x0);

  XGpioPs_WritePin(&emio, EMIO_55, 0x0);

  XGpioPs_WritePin(&emio, EMIO_56, 0x0);

  XGpioPs_WritePin(&emio, EMIO_57, 0x0);

  usleep(200000);

  XGpioPs_WritePin(&emio, EMIO_54, 0x1);

  XGpioPs_WritePin(&emio, EMIO_55, 0x1);

  XGpioPs_WritePin(&emio, EMIO_56, 0x1);

  XGpioPs_WritePin(&emio, EMIO_57, 0x1);

  usleep(200000);

  }

  cleanup_platform();

  return 0;

  }

  Step6:如果需要將EMIO作為輸入端口,只需要將IO的方向設(shè)置為input。對(duì)于IO,作為輸出的時(shí)候需要Enable,但是作為輸入是永遠(yuǎn)使能的,不需要額外的Enable。具體代碼如下圖所示。

640.webp (7).jpg

  補(bǔ)充說明:

  MIO和EMIO都屬于PS的GPIO,用于指示的變量類型為XGpioPs;而使用AXI_GPIO外設(shè)的GPIO,由于是屬于PL的,所以指示這些IO的變量類型為XGpio。

  MIO和EMIO的控制對(duì)于SDK是完全相同的,其地址偏移量也是排在一起的,MIO從0排到53,EMIO接著從54開始。示例代碼中顯示的是EMIO作為輸出和MIO作為輸入,只需要將引腳編號(hào)的宏定義改為需要的MIO或者EMIO編號(hào)即可使用。

  在硬件配置時(shí)MIO的配置方法與EMIO有所不同,EMIO的配置如“Step1”所示。而MIO由于不像EMIO,外部管腳是確定的,所以可以在ZYNQ7 Processing System配置時(shí)同時(shí)完成屬性以及電平的設(shè)置,如下圖所示。

640.webp (8).jpg

  叁

  ZYNQ 中 Interrupt 使用

  參考工程見“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。

  ZYNQ中的中斷管理是通過Generic Interrupt Controller(GIC)完成的。

  任何的中斷功能都需要兩步,第一步是配置相應(yīng)的中斷,第二步是設(shè)置中斷觸發(fā)之后的服務(wù)函數(shù)。

  配置相應(yīng)中斷分以下幾個(gè)步驟:

  1.   使能相應(yīng)的功能,例如GPIO中斷需要首先使能和配置GPIO;Timer中斷需要首先使能和配置Timer;

  2. 640.webp (9).jpg

  2.  初始化并配置使能GIC,還要使能異常處理。第1步中的操作對(duì)于每個(gè)中斷源來說都不相同,但是這一步的配置對(duì)于不同中斷源而言是類似的。不同之處在于有一個(gè)參數(shù):中斷ID,即例子中的52是變化的,52是GPIO的中斷號(hào),其他中端需要使用不同的ID。該值可以在UG585中斷的相關(guān)章節(jié)查詢到,如下圖所示。

640.webp (10).jpg

640.webp (11).jpg

  另一個(gè)區(qū)別就是XScuGic_Connect時(shí)的服務(wù)子函數(shù)不同。

  3.  編寫中斷服務(wù)函數(shù),需要注意的是進(jìn)入服務(wù)函數(shù)后首先需要禁止中斷,保證在處理中斷時(shí)不會(huì)再次因觸發(fā)中斷而程序跳轉(zhuǎn);另外就是需要清除中斷標(biāo)志位,否則會(huì)不斷觸發(fā)中斷。

640.webp (12).jpg

  ZYNQ CPU內(nèi)部任何有定時(shí)器,在Vivado的ZYNQ配置中無需任何操作就可以在SDK中直接使用。與GPIO中斷類似,Timer的中斷也包含相同的幾步操作,下面給出各個(gè)階段的代碼片段,完整代碼請(qǐng)點(diǎn)擊“閱讀原文”,登錄論壇獲取。

  1.   初始化Timer。

    640.webp (13).jpg

  2.  初始化GIC,設(shè)置中斷服務(wù)函數(shù)入口。

640.webp (14).jpg

  3.  配置Timer工作模式,導(dǎo)入計(jì)數(shù)初值,使能中斷。

640.webp (15).jpg

  4.  編寫中斷服務(wù)函數(shù),進(jìn)入中斷后首先Disable中斷,清楚中斷標(biāo)志位;然后進(jìn)行中斷處理;退出中斷服務(wù)函數(shù)前重新使能中斷。

640.webp (16).jpg

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲欧美一级二级三级| 国产精品丝袜xxxxxxx| 久久国产欧美日韩精品| 国产女主播一区二区三区| 欧美三区美女| 最新精品在线| 亚洲第一久久影院| 麻豆精品精华液| 亚洲精品永久免费| 小辣椒精品导航| 亚洲丁香婷深爱综合| 亚洲一本大道在线| 狠狠色综合色区| 中日韩在线视频| 国产一区在线看| 99在线精品免费视频九九视| 国产精品久久久久永久免费观看| 香蕉精品999视频一区二区| 牛夜精品久久久久久久99黑人| 亚洲乱码日产精品bd| 亚洲欧美在线看| 黑人极品videos精品欧美裸| 亚洲图片欧洲图片日韩av| 国产午夜精品视频| 亚洲午夜激情| 欧美日韩国产精品一区| 亚洲人成网站精品片在线观看| 亚洲综合色自拍一区| 国外精品视频| 午夜精品一区二区在线观看| 亚洲激精日韩激精欧美精品| 欧美在线观看www| 一区二区三区国产盗摄| 亚洲免费观看高清在线观看| 国产精品欧美日韩一区| 亚洲视频在线观看免费| 亚洲黑丝在线| 美乳少妇欧美精品| 欧美一级视频| 国产欧美日韩亚洲一区二区三区| 亚洲一区免费在线观看| 亚洲精品护士| 欧美看片网站| 亚洲欧美激情在线视频| 欧美日韩亚洲综合| 一级成人国产| 一区二区三区免费看| 国产精品草草| 亚洲欧美激情诱惑| 国内外成人在线| 久久久久国产免费免费| 久久精品官网| 亚洲国产中文字幕在线观看| 欧美激情第10页| 亚洲视频免费| 亚洲伊人网站| 激情综合网激情| 欧美久久久久久久| 亚洲一区二区三区免费视频| 亚洲一区亚洲| 一区二区在线免费观看| 欧美大片免费看| 这里只有精品在线播放| 在线国产日韩| 欧美激情在线| 久久国产一区| 亚洲精品视频免费观看| 国产精品99久久久久久久vr | 国产精品永久| 麻豆精品传媒视频| 欧美影院在线播放| 在线精品视频在线观看高清| 欧美日韩一区二区欧美激情 | 亚洲国产日日夜夜| 日韩亚洲精品视频| 国产日韩欧美综合一区| 欧美韩日精品| 久久精品盗摄| 亚洲免费视频一区二区| 亚洲国产欧美一区二区三区久久 | 国模精品一区二区三区色天香 | 亚洲天堂激情| 亚洲欧洲一区二区三区在线观看| 99热在线精品观看| 亚洲电影免费| 蜜臀久久久99精品久久久久久 | 老司机久久99久久精品播放免费| 亚洲天天影视| 亚洲人成网站777色婷婷| 国产一二三精品| 国产一区观看| 一色屋精品视频免费看| 一区免费观看视频| 亚洲国产精品t66y| 亚洲日本国产| 亚洲深夜福利视频| 亚洲欧美日韩国产成人精品影院| 亚洲免费在线视频一区 二区| 欧美一区二区在线播放| 欧美制服丝袜第一页| 亚洲欧洲精品一区二区三区 | 欧美日韩精品伦理作品在线免费观看| 欧美高清成人| 国产伦理一区| 亚洲第一搞黄网站| 国产欧美精品一区二区三区介绍 | 欧美亚洲自偷自偷| 老司机一区二区| 欧美日韩在线一区二区| 国产噜噜噜噜噜久久久久久久久| 国产日韩欧美综合| 亚洲国产一区二区三区高清 | 一本色道久久综合亚洲精品高清| 一二三四社区欧美黄| 午夜日韩av| 亚洲午夜精品一区二区| 久久亚裔精品欧美| 国产精品久久久久影院亚瑟| 国语自产在线不卡| 亚洲色图自拍| 日韩视频一区二区三区在线播放免费观看 | 欧美精品一区二区视频| 久久综合一区二区三区| 欧美日韩午夜| 亚洲成人原创| 性欧美1819sex性高清| 99人久久精品视频最新地址| 久久精品人人做人人爽| 欧美日韩直播| 亚洲国产精品久久人人爱蜜臀| 欧美亚洲视频一区二区| 亚洲综合成人在线| 欧美jizz19性欧美| 国产精品一区二区视频| 亚洲国产日韩欧美| 亚洲第一综合天堂另类专| 久久精品最新地址| 国产日产欧产精品推荐色 | 夜夜嗨一区二区| 欧美大片在线看免费观看| 好男人免费精品视频| 午夜精品久久久久久久蜜桃app| 亚洲手机成人高清视频| 欧美日韩午夜激情| 日韩一级在线观看| 亚洲一区高清| 国产精品最新自拍| 久久精品盗摄| 日韩一区二区精品葵司在线| 老色鬼精品视频在线观看播放| 国内精品模特av私拍在线观看| 久久国产精品99久久久久久老狼| 久久国产精彩视频| 一色屋精品视频在线看| 亚洲精品在线观| 国产精品第一页第二页第三页| 亚洲蜜桃精久久久久久久| 亚洲香蕉视频| 国产私拍一区| 亚洲人成人一区二区在线观看 | 美女免费视频一区| 日韩天堂在线观看| 亚洲一区二区在线观看视频| 国产美女精品人人做人人爽| 亚洲国产精品va| 欧美日韩免费观看一区三区| 欧美午夜一区| 亚洲国产精彩中文乱码av在线播放| 欧美日韩成人在线| 欧美一级免费视频| 欧美黄色小视频| 新狼窝色av性久久久久久| 欧美老女人xx| 亚洲国产免费看| 国产乱肥老妇国产一区二| 亚洲激情第一页| 国产日韩高清一区二区三区在线| 在线亚洲精品福利网址导航| 久久久五月婷婷| 亚洲午夜久久久| 欧美激情在线播放| 欧美在线观看视频| 国产精品日本一区二区| 日韩午夜在线视频| 尤物九九久久国产精品的特点 | 欧美精品在线观看一区二区| 久久精品亚洲精品| 国产精品美女一区二区| 一区二区激情小说| 亚洲人成在线免费观看| 美女主播精品视频一二三四| 午夜精品福利在线| 国产精品欧美日韩一区| 亚洲一区二区三区久久| 99re66热这里只有精品3直播| 欧美激情亚洲精品| 日韩视频精品在线观看| 亚洲国产合集| 欧美高清影院| 99国产一区|