1、大家好,今天給大家?guī)?lái)的內(nèi)容是,基于AXI4協(xié)議的采用AXI-HP通道完成PL側(cè)數(shù)據(jù)發(fā)送至PS側(cè)(PS側(cè)數(shù)據(jù)發(fā)送至PL側(cè)并沒(méi)有實(shí)現(xiàn),但是保留了PL讀取PS測(cè)數(shù)據(jù)的接口)
2、如果大家用到SoC這種高級(jí)功能,那大家應(yīng)該對(duì)于AXI4協(xié)議已經(jīng)很熟悉了,但本文側(cè)重點(diǎn)為初學(xué)者直接提供可以上手的硬件實(shí)驗(yàn),大佬請(qǐng)忽略。
3、AXI4協(xié)議的基礎(chǔ)內(nèi)容:
之前對(duì)于AXI4協(xié)議已經(jīng)做過(guò)一些總結(jié),但是總結(jié)的不好,下面重新進(jìn)行總結(jié)。
(1)關(guān)于AXI4協(xié)議的視頻課以及博客
FPGA-ZCU106-PL側(cè)讀寫ddr4(全網(wǎng)唯一)_發(fā)光的沙子的博客-CSDN博客本次給大帶來(lái)了ZCU106的PL側(cè)讀寫ddr4的教程,本教程是全網(wǎng)唯一ZCU106教程。本教程采用的是xilinx的ddr4的IP核的AXI4接口開(kāi)發(fā)的,因此需要先了解AXI4總線協(xié)議。https://blog.csdn.net/qq_37912811/article/details/125952512?spm=1001.2014.3001.5502這是我之前對(duì)AXI4協(xié)議的總結(jié)nullSDK篇_58~62_AXI接口簡(jiǎn)介【Xilinx】+【Vivado】+【AXI4總線】+【FPGA】共計(jì)5條視頻,包括:58_AXI接口簡(jiǎn)介(第一講)、59_AXI接口簡(jiǎn)介(第二講)、60_AXI接口簡(jiǎn)介(第三講)等,UP主更多精彩視頻,請(qǐng)關(guān)注UP賬號(hào)。https://www.bilibili.com/video/BV1gy4y1Y7zr/?spm_id_from=333.337.search-card.all.click&vd_source=6b401d1c7af4d19ac1a956340ac80699這是b站的課程,看完之后會(huì)對(duì)AXI4有更深的了解。
(2)AXI4協(xié)議的總結(jié)
①寫時(shí)序
?寫時(shí)序,主機(jī)向從機(jī)寫入數(shù)據(jù)。
一:aw開(kāi)頭的信號(hào)是寫地址協(xié)議。主機(jī)告訴從機(jī),我要向awaddr這個(gè)地址寫數(shù)據(jù)。
二:w開(kāi)頭的信號(hào)是寫數(shù)據(jù)協(xié)議。主機(jī)告訴從機(jī),我要向awaddr這個(gè)地址寫入wdata這個(gè)數(shù)據(jù)。
三:b開(kāi)頭的寫響應(yīng)協(xié)議。從機(jī)高速主機(jī),你寫的操作是否成功。
以上三個(gè)步驟,均需要ready以及valid雙握手,這兩個(gè)信號(hào)同時(shí)高電平時(shí),協(xié)議才能正常傳輸。
注意:M_AXI_WR_awlen這個(gè)信號(hào)代表了每組數(shù)據(jù)需要傳輸?shù)拇螖?shù),在最后一次傳輸時(shí),M_AXI_WR_wlas信號(hào)置為高電平。M_AXI_WR_awsize代表每次傳輸?shù)淖止?jié)數(shù)大小。例如,1024bit數(shù)據(jù)傳輸,通道最大傳輸為128bit;則需要傳輸1024bit/128bit=8次,128bit/8=16byte。
②讀時(shí)序
?讀時(shí)序,從機(jī)向主機(jī)請(qǐng)求數(shù)據(jù)。
一:ar開(kāi)頭的信號(hào)是讀地址協(xié)議。從機(jī)告訴主機(jī),我要向araddr這個(gè)地址讀數(shù)據(jù)。
二:r開(kāi)頭的信號(hào)是讀數(shù)據(jù)協(xié)議。從機(jī)告訴主機(jī),我要讀取araddr這個(gè)地址對(duì)應(yīng)的rdata這個(gè)數(shù)據(jù)。
三:沒(méi)有讀數(shù)據(jù)相應(yīng),rresp信號(hào)被包含在讀數(shù)據(jù)協(xié)議中,用以指示讀響應(yīng),表明讀傳輸?shù)臓顟B(tài)。
4、PL側(cè)向PS側(cè)通過(guò)AXI-HP通道寫入數(shù)據(jù)實(shí)驗(yàn)
(1)實(shí)驗(yàn)任務(wù):PL側(cè)生成數(shù)據(jù),通過(guò)AXI-HP通道寫入PS側(cè)的ddr中。PS側(cè)完成軟件設(shè)計(jì),完成對(duì)PL側(cè)寫來(lái)的數(shù)據(jù)處理。
(2)實(shí)驗(yàn)軟硬件:Vivado 2019.1、ZCU106
(3)實(shí)驗(yàn)過(guò)程:
①建立工程:embedded_axi_hp,選擇ZCU106器件
②進(jìn)行PS側(cè)設(shè)計(jì):僅針對(duì)ZCU106
一、搜索ZYNQ添加器件后,點(diǎn)擊紅框自動(dòng)布線
?二、設(shè)置ddr,經(jīng)本人親測(cè),我的ddr只能用這個(gè)設(shè)置,大家自己多調(diào)一下看看吧,這兒挺坑的。
FPGA學(xué)習(xí)之路-ZCU106板子點(diǎn)亮PS側(cè)LED_發(fā)光的沙子的博客-CSDN博客_zcu1061、本文章借鑒了ZCU106--PL+PS點(diǎn)燈_Junluoyu的博客-CSDN博客_zcu106、ZCU106開(kāi)發(fā)之PS側(cè)MIO閃燈_lixiaolin126的博客-CSDN博客https://blog.csdn.net/qq_37912811/article/details/121953910?spm=1001.2014.3001.5502三、去掉無(wú)用端口
四、添加HP0端口,位寬選擇128位(HP支持32/64/128位,PG201)?。右鍵各個(gè)端口,點(diǎn)擊Make External,變成下面這樣。
五、添加地址,容量自己設(shè)定,我直接用的就是系統(tǒng)直接給分配好的。
?六、添加debug,等待一會(huì),點(diǎn)擊左上角的即可。
?
?七、設(shè)置復(fù)位模塊,并點(diǎn)擊右上角的自動(dòng)布線按鈕。最終變成下圖。
?
?點(diǎn)擊紅框,彈出成功表示設(shè)計(jì)無(wú)誤。
?
?八、輸出產(chǎn)品,生成HDL
?九,編寫PL側(cè)數(shù)據(jù)生成代碼以及AXI4讀寫協(xié)議,整個(gè)項(xiàng)目目錄如下所示。
這里給出data_gen.v代碼,其余代碼請(qǐng)聯(lián)系作者
`timescale 1ns / 1ps
//
// Company: 東北電力大學(xué)
// Engineer: Yang Zheng
//
// Create Date: 2022/11/27 14:18:57
// Design Name:
// Module Name: data_gen
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module data_gen(
input sys_clk, //系統(tǒng)時(shí)鐘
input sys_rst_n, //系統(tǒng)復(fù)位,低電平有效
//寫
output reg wr_en, //寫使能
output reg [1023:0] wr_data, //寫數(shù)據(jù)
output read_enable, //寫完成,開(kāi)始讀
//讀
output reg rd_en, //讀使能
input [1023:0] rd_data, //讀數(shù)據(jù)
input rd_fifo_valid, //讀出數(shù)據(jù)時(shí)為高電平,由于ddr是512位的,因此我們需要計(jì)數(shù)4次,即每次讀回4條數(shù)據(jù);512/128=4
input rd_fifo_wr_ack, //寫入數(shù)據(jù)為高電平
//開(kāi)始寫入數(shù)據(jù)物理按鈕
input start_bnt
);
//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//parameter define
parameter COUTER_MAX = 30'd5_000_000;//0.2s的時(shí)間計(jì)數(shù)器
reg [29:0] time_counter = 'd0;
//reg define
reg [29:0] count = 'd0; //寫入計(jì)數(shù)器
reg wr_flag = 'd0; //寫標(biāo)志
//********************************************************************//
//***************************** Main Code ****************************//
//********************************************************************//
assign read_enable = wr_flag;
//生成64個(gè)32位的數(shù)據(jù)并且寫入PS側(cè)
//這里的 wr_data是輸入到ddr的數(shù)據(jù),wr_en是使能端口
//這里的 wr_flag是可以ddr存有數(shù)據(jù),因此可讀標(biāo)志
always@(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0) begin
wr_data <= 1024'd0;
wr_en <= 1'd0;
wr_flag <= 1'b0;
count <= 'd0;
end
else begin
if (wr_flag == 1'b0 && count < 'd4 && start_bnt == 1'b0) begin
//wr_en <= 1'd1;
count <= count + 1'b1;// 1
end
else if(start_bnt == 1'b1) begin
if (wr_flag == 1'b0 && count == 'd4) begin
wr_data <= {
32'd1 ,32'd2 ,32'd3 ,32'd4 ,32'd5 ,32'd6 ,32'd7 ,32'd8 ,
32'd9 ,32'd10,32'd11,32'd12,32'd13,32'd14,32'd15,32'd15,
32'd17,32'd18,32'd19,32'd20,32'd21,32'd22,32'd23,32'd24,
32'd25,32'd26,32'd27,32'd28,32'd29,32'd30,32'd31,32'd32
};
wr_en <= 1'd1;
count <= count + 1'b1;// 2
end
else if (wr_flag == 1'b0 && count == 'd5) begin
wr_data <= {
32'd33,32'd34,32'd35,32'd36,32'd37,32'd38,32'd39,32'd40,
32'd41,32'd42,32'd43,32'd44,32'd45,32'd46,32'd47,32'd48,
32'd49,32'd50,32'd51,32'd52,32'd53,32'd54,32'd55,32'd56,
32'd57,32'd58,32'd59,32'd60,32'd61,32'd62,32'd63,32'd64
};
wr_en <= 1'd1;
count <= count + 1'b1;// 3
end
else if (wr_flag == 1'b0 && count == 'd6) begin
wr_data <= {
32'd1 ,32'd2 ,32'd3 ,32'd4 ,32'd5 ,32'd6 ,32'd7 ,32'd8 ,
32'd9 ,32'd10,32'd11,32'd12,32'd13,32'd14,32'd15,32'd15,
32'd17,32'd18,32'd19,32'd20,32'd21,32'd22,32'd23,32'd24,
32'd25,32'd26,32'd27,32'd28,32'd29,32'd30,32'd31,32'd32
};
wr_en <= 1'd1;
count <= count + 1'b1;// 3
end
else if (wr_flag == 1'b0 && count == 'd7) begin
wr_flag <= 1'b1;
wr_en <= 1'd0;
end
end
end
end
always@(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
time_counter <= 30'd0;
end
else begin
if (wr_flag) begin
time_counter <= time_counter + 1;
if(time_counter == COUTER_MAX) begin
time_counter <= 30'd0;
end
end
end
end
//根據(jù)寫完成拉高讀使能數(shù)據(jù)
//這里的rd_en可以控制是否讀取ddr,因此每次讀取給出一個(gè)周期的高電平即可
//一直讀取
always@(posedge sys_clk or negedge sys_rst_n) begin
if (~sys_rst_n) begin
rd_en <= 1'd0;
end
//寫完后等待0.2s開(kāi)始讀取數(shù)據(jù)
else begin
if(wr_flag == 1'b1 && time_counter == COUTER_MAX) begin//寫完后等待0.2s
rd_en<=1'd1;
end
else begin
rd_en<=1'd0;
end
end
end
endmodule
(4)實(shí)驗(yàn)結(jié)果:
一、仿真結(jié)果
可以看到數(shù)據(jù)已經(jīng)寫入到wdata信號(hào),bresp響應(yīng)0且bvalid為高電平說(shuō)明已經(jīng)將數(shù)據(jù)寫入到PS側(cè)。
二、硬件結(jié)果
這里給出helloword.c代碼,由于傳輸數(shù)據(jù)量小,因此需要將緩存屏蔽掉。
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_cache.h"
int main()
{
//init_platform();
Xil_DCacheDisable();
print("Hello World\n\r");
//cleanup_platform();
return 0;
}
基于axi-hp通道的pl與ps數(shù)據(jù)交互
?5、結(jié)論及展望文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-423296.html
以上就是本實(shí)驗(yàn)的全部?jī)?nèi)容。本實(shí)驗(yàn)完成了,PL側(cè)自定義數(shù)據(jù)傳輸?shù)絇S側(cè),并在PS側(cè)寫加軟件,完成了PL側(cè)傳入數(shù)據(jù)的求和功能,發(fā)揮了整個(gè)SoC的功能,為后續(xù)PL側(cè)加速計(jì)算,PS側(cè)數(shù)據(jù)分析奠定了基礎(chǔ)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-423296.html
到了這里,關(guān)于FPGA----ZCU106基于axi-hp通道的pl與ps數(shù)據(jù)交互(全網(wǎng)唯一最詳)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!