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看到讀到的數據了