日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > ZYNQ
		


ZYNQ_PS讀寫PL資源_base_on_pynqZ2

前言

最近比較系統(tǒng)的學(xué)習(xí)了zynq,內(nèi)容還是很多的,不過它的架構(gòu)我還是很熟悉的,所以一些嵌入式知識很快就過了,我的時間主要花在AXI總線和操作系統(tǒng);

1、AXI總線:

由于Xilinx是將雙核ARM與7系列FPGA集成于一塊硅片構(gòu)成SoC,所以比較重要的一個模塊就是硬核處理器(PS)與可編程邏輯(PL)之間的通信,傳統(tǒng)的有SPI總線、IFC總線的方式,zynq使用的是ARM和Xilinx共同制定的總線協(xié)議AMBA AXI4(Advanced Microcontroller Bus Architec),根據(jù)使用場景不同它有三種標(biāo)準(zhǔn)Lite、Stream、Full,F(xiàn)ull即總線結(jié)構(gòu)最完整的AXI4,4代表第4代,所以要是想和之前第三代總線模塊互聯(lián)的話,之間必須添加總線轉(zhuǎn)換IP,它的總線結(jié)構(gòu)和時序需要好好看看,《Xilinx AP Z-7000 SoC 設(shè)計指南》中有很詳細(xì)介紹,其中有一段關(guān)于交易通道握手信號關(guān)系很重要:

2、操作系統(tǒng):

這里的操作系統(tǒng)主要是指嵌入式linux,需要掌握peta-linux、uboot、內(nèi)核、設(shè)備樹、文件系統(tǒng)等,好多,不過幸運的是,在導(dǎo)入硬件文件后Vivado SDK會自動生成一些庫,如頭文件和BSP,最大的意義在于完成了硬件資源的映射,軟件可以通過對地址的調(diào)用完成對硬件的操作。

AXI總線寄存器模塊

在Tools中選擇生成AXI總線接口的模塊(IP),然后需求是PS可以讀寫32個位寬為32的寄存器,所以我選擇的深度是32,其實打開代碼就會發(fā)現(xiàn),代碼中的示例邏輯本身就是一個寄存器模塊,PS和PL都可以對這32個寄存器讀寫操作,它們的W/R屬性也是可以修改的

 1//讀操作  2assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;  3 always @(*)  4 begin  5 // Address decoding for reading registers  6 case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )  7 5'h00   : reg_data_out <= slv_reg0;  8 5'h01 : reg_data_out <= slv_reg1;  9 5'h02 : reg_data_out <= slv_reg2; 10 5'h03 : reg_data_out <= slv_reg3; 11 5'h04 : reg_data_out <= slv_reg4; 12 5'h05 : reg_data_out <= slv_reg5; 13 5'h06 : reg_data_out <= slv_reg6; 14 5'h07 : reg_data_out <= slv_reg7; 15 5'h08 : reg_data_out <= slv_reg8; 16 5'h09 : reg_data_out <= slv_reg9; 17 5'h0A : reg_data_out <= slv_reg10; 18 5'h0B : reg_data_out <= slv_reg11; 19 5'h0C : reg_data_out <= slv_reg12; 20 5'h0D : reg_data_out <= slv_reg13; 21 5'h0E : reg_data_out <= slv_reg14; 22 5'h0F : reg_data_out <= slv_reg15; 23 5'h10 : reg_data_out <= slv_reg16; 24 5'h11 : reg_data_out <= slv_reg17; 25 5'h12 : reg_data_out <= slv_reg18; 26 5'h13 : reg_data_out <= slv_reg19; 27 5'h14 : reg_data_out <= slv_reg20; 28 5'h15 : reg_data_out <= slv_reg21; 29 5'h16 : reg_data_out <= slv_reg22; 30 5'h17 : reg_data_out <= slv_reg23; 31 5'h18 : reg_data_out <= slv_reg24; 32 5'h19 : reg_data_out <= slv_reg25; 33 5'h1A : reg_data_out <= slv_reg26; 34 5'h1B : reg_data_out <= slv_reg27; 35 5'h1C : reg_data_out <= slv_reg28; 36 5'h1D : reg_data_out <= slv_reg29; 37 5'h1E : reg_data_out <= slv_reg30; 38 5'h1F : reg_data_out <= slv_reg31; 39 default : reg_data_out <= 0; 40 endcase 41 end 42 
 1//寫操作片段  2 if (slv_reg_wren)  3 begin  4 case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )  5 5'h00:  6 for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )  7 if ( S_AXI_WSTRB[byte_index] == 1 ) begin  8 // Respective byte enables are asserted as per write strobes  9 // Slave register 0 10 slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8]; 11 end 12 5'h01: 13 for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) 14 if ( S_AXI_WSTRB[byte_index] == 1 ) begin 15 // Respective byte enables are asserted as per write strobes  16 // Slave register 1 17 slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8]; 18 end 19 5'h02: 20 for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) 21 if ( S_AXI_WSTRB[byte_index] == 1 ) begin 22 // Respective byte enables are asserted as per write strobes 23 // Slave register 2 24 slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8]; 25 end 26 5'h03: 27 for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) 28 if ( S_AXI_WSTRB[byte_index] == 1 ) begin 29 // Respective byte enables are asserted as per write strobes  30 // Slave register 3 31 slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8]; 32 end 

硬件連接

把Zynq PS和上述生成的寄存器IP PL連接起來,其實很簡單,兩次自動連線就可以了,這里需要強調(diào)的是,需要檢查DDR的配置、MIO的配置和PL時鐘,由于需要串口打印,所以將串口和PS連接起來,具體管腳需要看原理圖,可以看到是14 15,點擊與之對應(yīng)的UART0就可以了。

然后是將原理圖設(shè)計轉(zhuǎn)換成代碼,再完成綜合、實現(xiàn)和最終的bit文件,燒錄進pynq Z2,硬件方面的設(shè)計就結(jié)束了。

軟件設(shè)計

在File菜單先Export Hardware,然后 Launch SDK,就進入Xilinx軟件開發(fā)環(huán)境,可以在Hello World模板上直接操作。
源碼來源于米聯(lián)客的教程,我根據(jù)自己的工程有改動:

 1#include   2#include "platform.h"  3#include "xil_printf.h"  4#include "xil_io.h" //Xil_In32 Xil_Out32函數(shù)的頭文件  5#include "xparameters.h" //硬件映射的地址信息,XPAR_MYIP_REGS_0_S00_AXI_BASEADDR 即PL IP核中寄存器的起始偏移地址  6  7int main()  8{  9 init_platform(); 10 print("Hello World\n\r"); 11 12 13 int num; 14 int rev; 15 16 xil_printf("------The test is start...------\n\r"); 17 18 19 for( num=0; num<32; num++ )//寫入 20 21 { 22 xil_printf("%x",num); 23 Xil_Out32(XPAR_MYIP_REGS_0_S00_AXI_BASEADDR + num*4, 0x10000000+num); // 24 } 25 26 27 28 for( num=0; num<32; num++ )//讀出 29 30 { 31 32 rev = Xil_In32(XPAR_MYIP_REGS_0_S00_AXI_BASEADDR + num*4); 33 xil_printf( "The data at %x is %x \n\r",XPAR_MYIP_REGS_0_S00_AXI_BASEADDR + num*4,rev); 34 35 } 36 37 xil_printf("------The test is end!------\n\r"); 38 39 int test; 40 test = Xil_In32( XPAR_MYIP_REGS_0_S00_AXI_BASEADDR + 4); 41 xil_printf("%x",test); 42 43 //cleanup_platform(); 44 return 0; 45}

總結(jié)

調(diào)試時遇到一個錯誤,現(xiàn)象是PL能正常燒錄,PS能正常編譯但是不能下載RUN,反復(fù)一直報錯:

AP transaction error, DAP status f0000021
我在網(wǎng)上查找了一下,其他不同廠商的開發(fā)板也有遇到類似問題,大致原因是軟件通過jtag找不到ARM處理器,我聯(lián)系了開發(fā)板的FAE,他給的解釋是可能供電電壓不穩(wěn),換一種供電方式,但是我并沒有適配器,但是我看到開發(fā)板上ARM的指示燈(DONE)是亮起的,于是重啟了電腦和開發(fā)板后就恢復(fù)正常了,我覺得這很可能是硬件上的缺陷,也有可能是我筆記本USB接口電壓不穩(wěn)?希望能給有同樣遭遇的同學(xué)一個思路。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉