Pynq_Z2利用AXI_Lite從PS端讀取PL端的數據

1. 軟件平臺

vivado2019.1

2. 硬件平臺

PYNQ_Z2

3. 具體實現流程

能需要做這一步,證明對vivado和IP核的自定義已經比較熟悉,如果沒有可以看這。自定義IP核流程

操作蠻挺簡單的 ,但是我一開始也踏了好多坑。

首先,編輯一個數據生成器。(第一次操作建議使用一個固定的值,比如:reg [15:0]data_out = 4095;這樣可以避免很多問題)

module data_gen(
    input clk_n,rst_n,
    output reg [15:0]data
    );
    parameter count_end = 8'd100;
    reg [8:0]count;
always @(posedge clk_n or negedge rst_n)
begin
    if(!rst_n)
    begin
        count <= 0;
        data <= 0;
    end
    else
        begin
            count <= count + 1'b1;
            if(count > 8'd99)
             begin
                count <= 0;
                data <= data+1'b1;
                if(data>=16'd65535)
                    data <= 0;
             end
        end
end
endmodule

採用的時鐘爲100Mhz,產生的數據變化率爲1MHz。

現在看到這裏

在這裏添加一個wire變量

在這裏調用剛剛編輯的數據產生模塊

 

如果想了解清楚一點可以好好看看這個文件註釋,這個文件包括讀和寫部分,把目光看到讀數據部分

這裏將slv_reg1替換爲data_out[0](輸出第一位),

將slv_reg2替換爲data_out[15:0](輸出生成的數據)

從這裏不難發現,是根據地址來讀取數據,具體怎麼來的,這裏不做分析。

然後,保存,綜合驗證,查看是否有問題。然後打包IP核(如果有經驗就不用看了自定義IP核流程

這樣一個IP核就弄好了,然後是建立Block design,用SDK讀取數據了

 

這裏沒有用其他的AXI通道口,用的是普通的AXI速度較慢

SDK部分代碼如下


#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
/* Include Files */
#include "xparameters.h"
#include "xil_io.h"
#include "xstatus.h"
/* Definitions */
#define printf xil_printf							/* smaller, optimised printf */
/*
 *
 */
u32 flag0= 4095;
u32 flag1= 32767;

#define  data0 0x43c00000
#define  data1 0x43c00004
#define  data2	0x43c00008    
#define  data3  0x43c0000C
u16 data[8192];
int i=0;
int main()
{
    init_platform();
    print("Hello World\n\r");

    cleanup_platform();
	/* Execute the pwm output. */
    while(1)
    {

    	data[i]=Xil_In32(data2);   
    	i++;
    	if(i>=8192)
    		i=0;
    	 printf("i=%d->->->data=%d\n\r",i,data[i]);

    }

    return 0;
}

data0 -data4對應那AXI_lite的寄存器

下載運行,就可以在windows->view->expresion看到讀到的數據了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章