《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 業界動態 > 從小白到專家:網友親身實踐教您上手 ZYNQ 開發 | Zynq 常用外設快速上手指南

從小白到專家:網友親身實踐教您上手 ZYNQ 開發 | Zynq 常用外設快速上手指南

2019-09-15
關鍵詞: ZYNQ開發 Zynq

  ZYNQ有專用的DDR Controller接口,如果外部硬件連接了DDR器件,于是在ZYNQ Processing System中正確配置了相應的信號和參數后,DDR就可以成為ZYNQ的內存,在SDK中可以直接使用memcpy、memset以及類似的函數對于Memory空間進行操作。

  Step1:查看ZYBO的原理圖,找到相應的配置。ZYBO原理圖中與DDR相關的部分如下圖所示。

640.webp.jpg

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

  Step2:在Block Design中對DDR部分的參數進行配置。

640.webp (1).jpg

  Step3:完成Block Design設計,產生Bitstream,導入SDK。

640.webp (2).jpg

  Step4:在SDK中編寫Memory測試代碼。

  #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);

  其中特別需要學習的就是malloc與memcpy的使用方法。

  貳

  ZYNQ 中 MIO/EMIO GPIO 的使用

  參考工程見“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。

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

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

  注意

  1. 用于擴展GPIO的EMIO和用于擴展外設的EMIO是完全獨立的,GPIO的EMIO共有64個,由2個bank組成,如下圖所示。

    640.webp (3).jpg

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

  Step1:在Block Design中加入ZYNQ7 Processing System,在ZYNQ7 Processing System配置中添加EMIO GPIO,如下圖所示。通過設置EMIO GPIO Width來選擇擴展EMIO GPIO的個數,此時就完成了與內部寄存器之間的對應關系,規則就是從EMIO54開始向上排列。

640.webp (4).jpg

  Step2:將ZYNQ的EMIO連接到外部引腳。右擊生成的GPIO信號,點擊Make External。

640.webp (5).jpg

  Step3:約束EMIO與外部引腳Pad的對應關系以及EMIO的電平標準。

  方法有兩種:

  第一種是通過XDC約束文件進行約束,需要先將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中設置電平和引腳。

640.webp (6).jpg

  Step4:完成Block Design的綜合、實現、生成Bitstream并導入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型指針,用于初始化時綁定硬件

  XGpioPs_Config *ConfigPtrPS;

  init_platform();

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

  ConfigPtrPS = XGpioPs_LookupConfig(0);

  XGpioPs_CfgInitialize(&emio, ConfigPtrPS,

  ConfigPtrPS->BaseAddr);

  //設置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寫入數據,即驅動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的方向設置為input。對于IO,作為輸出的時候需要Enable,但是作為輸入是永遠使能的,不需要額外的Enable。具體代碼如下圖所示。

640.webp (7).jpg

  補充說明:

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

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

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

640.webp (8).jpg

  叁

  ZYNQ 中 Interrupt 使用

  參考工程見“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。

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

  任何的中斷功能都需要兩步,第一步是配置相應的中斷,第二步是設置中斷觸發之后的服務函數。

  配置相應中斷分以下幾個步驟:

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

  2. 640.webp (9).jpg

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

640.webp (10).jpg

640.webp (11).jpg

  另一個區別就是XScuGic_Connect時的服務子函數不同。

  3.  編寫中斷服務函數,需要注意的是進入服務函數后首先需要禁止中斷,保證在處理中斷時不會再次因觸發中斷而程序跳轉;另外就是需要清除中斷標志位,否則會不斷觸發中斷。

640.webp (12).jpg

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

  1.   初始化Timer。

    640.webp (13).jpg

  2.  初始化GIC,設置中斷服務函數入口。

640.webp (14).jpg

  3.  配置Timer工作模式,導入計數初值,使能中斷。

640.webp (15).jpg

  4.  編寫中斷服務函數,進入中斷后首先Disable中斷,清楚中斷標志位;然后進行中斷處理;退出中斷服務函數前重新使能中斷。

640.webp (16).jpg

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
一二三区精品| 亚洲日本电影| 91久久在线视频| 一区二区视频免费完整版观看| 国产精品久久精品日日| 欧美日韩一区在线观看| 欧美巨乳在线| 欧美黄色aa电影| 欧美激情网友自拍| 欧美激情一区二区| 欧美国产1区2区| 欧美高清在线视频观看不卡| 蜜臀va亚洲va欧美va天堂| 久久精品男女| 久久久久在线| 久久久久久自在自线| 久久免费99精品久久久久久| 久久久999精品免费| 久久国产一二区| 久久久最新网址| 久久久久免费视频| 久久夜色撩人精品| 免费毛片一区二区三区久久久| 久久综合色一综合色88| 乱中年女人伦av一区二区| 暖暖成人免费视频| 欧美经典一区二区| 欧美视频日韩视频在线观看| 国产精品v欧美精品v日韩 | 一区二区三区在线免费播放| 激情综合在线| 亚洲国产婷婷香蕉久久久久久99| 亚洲三级网站| 亚洲私人影院| 欧美一区二区三区免费看| 亚洲国产成人不卡| 日韩一级精品| 午夜精品久久久久久久99樱桃| 久久riav二区三区| 久久女同精品一区二区| 欧美大片一区| 欧美性猛片xxxx免费看久爱| 国产精品专区h在线观看| 国语自产精品视频在线看| 亚洲激情成人网| 亚洲视频在线一区观看| 欧美在线在线| 99国产精品国产精品久久| 亚洲自拍偷拍色片视频| 久久精品国产99国产精品澳门| 欧美v日韩v国产v| 欧美体内she精视频在线观看| 国产欧美日韩亚洲一区二区三区| 狠狠色综合播放一区二区| 亚洲精品男同| 亚洲欧美一区二区三区极速播放| 久久精品论坛| 亚洲性av在线| 久久久久在线观看| 欧美日韩免费网站| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美一区91| 亚洲精品久久7777| 先锋影音国产一区| 老色批av在线精品| 国产精品久久精品日日| 在线播放视频一区| 亚洲伊人观看| 亚洲剧情一区二区| 久久爱www.| 欧美日韩大陆在线| 韩国三级在线一区| 亚洲午夜精品17c| 最新日韩中文字幕| 久久aⅴ国产欧美74aaa| 欧美日韩高清在线| 精东粉嫩av免费一区二区三区| 亚洲天天影视| 日韩午夜在线播放| 久久亚洲高清| 国产精自产拍久久久久久| 亚洲人成啪啪网站| 亚洲第一页在线| 欧美在线播放视频| 欧美天天综合网| 亚洲国产精品久久人人爱蜜臀 | 欧美日韩国语| 在线播放豆国产99亚洲| 一本色道婷婷久久欧美| 91久久午夜| 久久久久久穴| 国产精品一区免费视频| 99精品福利视频| 亚洲欧洲在线看| 久久精品国产99国产精品| 国产精品av免费在线观看| 亚洲激情黄色| 久久精品一区蜜桃臀影院| 午夜亚洲福利在线老司机| 欧美日本在线播放| 亚洲二区在线观看| 久久精品女人| 久久久夜夜夜| 国产最新精品精品你懂的| 亚洲欧美日韩国产成人精品影院| 亚洲天堂第二页| 欧美日产在线观看| 亚洲精品1区2区| 亚洲精品久久久久久久久| 久久婷婷国产麻豆91天堂| 国产伦精品一区二区三区视频孕妇| 一区二区三区色| 亚洲视频一区二区在线观看| 欧美日韩成人综合在线一区二区| 亚洲国产精品久久| 91久久亚洲| 欧美成人一区二区三区| 亚洲电影成人| 亚洲乱码国产乱码精品精98午夜| 男女激情久久| 亚洲国产高清视频| 亚洲精品视频啊美女在线直播| 男人天堂欧美日韩| 1000部精品久久久久久久久| 亚洲国产精品国自产拍av秋霞| 久久视频一区二区| 伊人狠狠色丁香综合尤物| 久久精品国产第一区二区三区最新章节| 久久久91精品| 伊人久久噜噜噜躁狠狠躁| 亚洲国产一区二区视频| 暖暖成人免费视频| 亚洲精品国产精品乱码不99| 一个色综合av| 欧美午夜精品久久久| 亚洲天堂激情| 久久精品国内一区二区三区| 黑丝一区二区三区| 亚洲精品免费在线播放| 欧美日韩aaaaa| 一本大道av伊人久久综合| 亚洲欧美日韩一区| 国产欧美亚洲视频| 亚洲高清123| 欧美精品一区二区三区蜜臀| 亚洲精品孕妇| 亚洲欧美日韩在线综合| 国产主播一区| 亚洲三级电影在线观看| 欧美日韩视频在线一区二区| 亚洲午夜精品网| 久久久久久综合| 亚洲黑丝在线| 亚洲专区一区| 国产午夜亚洲精品不卡| 亚洲国产网站| 欧美午夜电影在线观看| 亚洲欧美日韩一区二区在线| 久久这里只有| 亚洲免费电影在线观看| 欧美与欧洲交xxxx免费观看| 在线播放不卡| 亚洲资源在线观看| 国内在线观看一区二区三区 | 欧美日韩免费精品| 香蕉视频成人在线观看| 乱码第一页成人| 在线视频日韩精品| 久久久久久久一区| 日韩一级片网址| 久久精品99国产精品日本| 最新精品在线| 欧美一区二区三区视频免费| 亚洲福利在线看| 午夜精品久久久久久久| 在线观看欧美一区| 亚洲欧美国产精品专区久久| 在线观看亚洲专区| 午夜视频一区二区| 亚洲电影第三页| 久久成年人视频| 亚洲伦理久久| 久久久久久综合| 99国内精品久久久久久久软件| 久久精选视频| 一区二区三区免费在线观看| 久久亚洲精品欧美| 亚洲一区免费网站| 欧美精品日韩| 欧美专区福利在线| 欧美午夜精品久久久久久人妖| 亚洲高清不卡在线| 国产精品久久久久av免费| 亚洲欧洲三级电影| 国产欧美日韩综合一区在线播放| 99国产精品国产精品久久| 黑丝一区二区| 欧美在线免费一级片| 99在线精品观看| 牛牛影视久久网|