天天看點

深入 AXI4總線 (四):RAM 讀取實戰

光說不練,雲玩家。這篇文章中我們就通過通路一個 AXI4 接口的 RAM 的實際操作,加深我們對 AXI4 總線的了解。

我們的實驗平台是 ISE 14.7 以及 modelsim 10.2, RAM 的 ip 使用 ISE 的 block memory generator 生成,Intel 方面的工具和 ip 我不是太熟悉,但想必很多内容都是共通的。

Native V.S AXI4 ?

首先使用 ip 核生成器生成一個 AXI4 的 ip 核,我們先比較一下 Native 接口和 AXI4 接口的 RAM。

深入 AXI4總線 (四):RAM 讀取實戰

一号選手:Native

首先登場的是一号選手:Natiiiive,他有着小小的身闆,位址,輸入資料,輸出資料,使能,時鐘接口錯落有緻,簡潔分明。小快靈是他的信仰,好用好上手是他的宣言。

深入 AXI4總線 (四):RAM 讀取實戰

二号選手:AXI4

接下來登場的是 AXIFour,他的身闆恐怕是 Native 的三倍,更大的身闆,更大的力量是他的座右銘。“通用性”,“标準總線”是他挂在嘴上的口頭禅

Ok,Stop,兩者之間其實并不是一個競争關系,沒有孰勝孰劣的比較。Native 接口資料線更少,但不夠通用,自然也沒有總線的概念;AXI4 支援标準化的,通用總線通路,可以将多個 RAM 挂載到一條總線上,通過 ID 區分不同的 RAM,但接口要确實複雜地多。

AXI 總線讀寫 RAM 實戰

首先建構 AXI4 接口的 RAM ip核,在工程中添加 ip 核檔案

深入 AXI4總線 (四):RAM 讀取實戰

選擇 AXI 協定,另外關于 AXI-Lite 協定将會在以後的文章中介紹。AXI-Lite 協定簡化了 AXI 協定,但不支援突發傳輸操作。

在 Slave Option 中選擇 Memory Slave,因為 RAM 作為一個存儲媒體,不能主動發起操作,在 AXI 傳輸中隻能作為從機。作為從機有兩種選項,Memory Slave 作為存儲媒體,使用完整的 AXI 總線;Peripheral Slave 不是很熟悉,在該模式下不支援突發傳輸。

深入 AXI4總線 (四):RAM 讀取實戰

在 Memory Type 中,如果使用 AXI 總線,則隻能選擇單口RAM。而 Native 接口是支援多種模式的,包括 ROM,雙口 RAM 等。

深入 AXI4總線 (四):RAM 讀取實戰

Native 接口下可以選擇多種模式

之後選擇适合的資料總線寬度和 RAM 深度即可以生成 RAM 。

在工程中為新生成的 ip 核添加 testbench。

首先是非突發傳輸(突發傳輸長度為 1 的突發傳輸。。)寫入與讀取操作,即寫入位址,寫入一次資料。讀取操作時,也先寫入資料,然後讀取。下圖中為了說明一些細節,進行了兩次同樣的流程。

Testbench 的時序部分

initial begin
 // Initialize Inputs
        //....初值均賦為0 除 bready 外
        s_axi_bready = 1;
        

 // Wait 100 ns for global reset to finish
 #100;
 
 // Add stimulus here
        s_aresetn = 1;
 
 repeat(2) begin
 #100;
 //aw channel
            s_axi_awaddr = 32'b100;
            s_axi_awlen = 0;
            s_axi_awsize = 3'b010;
            s_axi_awburst = 0;
 #20;
            s_axi_awvalid = 1;
 #20;
 //wait(s_axi_awready == 1 && s_aclk == 1);
            s_axi_awvalid = 0;

 #100;
 //w channel
            s_axi_wdata = 32'h01020304;
            s_axi_wstrb = 4'b1111;
            s_axi_wlast = 1;
            s_axi_wvalid = 1;
 #20;
            s_axi_wlast = 0;
            s_axi_wvalid = 0;
            s_axi_wstrb = 4'b0;
 
 #100;
 //ar channel
            s_axi_araddr = 32'b100;
            s_axi_arlen = 0;
            s_axi_arsize = 3'b010;
            s_axi_arburst = 0;
 #20;
            s_axi_arvalid = 1;
 #20;
 //wait(s_axi_arready == 1 && s_aclk == 1);
            s_axi_arvalid = 0;
 
 #100;
 //r channel
            s_axi_rready = 1;
 end

 end

 always #10 s_aclk = ~s_aclk;
           
深入 AXI4總線 (四):RAM 讀取實戰

我們關注一些細節,有關 RAM IP 核的一些特性,比如當完成一次寫入時,RAM 的 AXREADY 信号會拉低約 6 個時鐘之後,才會拉高允許下一次位址寫入發生;而 XREADY 信号則會保持低電平直到下一次位址位址寫入之後,才會拉高準備接收資料。

通過實踐發現了 AXI4 在讀取時的一個特性,如果在讀取時,将突發傳輸長度設為 2,突發傳輸寬度設為 16 位,資料總線寬度為 32 位,即通過兩次 16 位傳輸讀取寫入的 32 位資料 0x01020304。實踐後發現,實際上會讀取兩次 0x01020304,需要主機自行整理資料,因為主機實際上知道,自己讀取的資料寬度是 16 位,資料總線寬度為 32 位。

讀者可以通過仿真結果看到本系列之前的文章中提到,握手機制,AXI 各信号線的含義以及突發傳輸機制等。

ljgibbs:深入 AXI4 總線(一)握手機制​zhuanlan.zhihu.com

深入 AXI4總線 (四):RAM 讀取實戰

ljgibbs:深入 AXI4 總線(二)架構​zhuanlan.zhihu.com

深入 AXI4總線 (四):RAM 讀取實戰

ljgibbs:深入 AXI4 總線(三)突發傳輸機制​zhuanlan.zhihu.com

深入 AXI4總線 (四):RAM 讀取實戰

接下來嘗試突發傳輸操作

Testbench 部分

// Wait 100 ns for global reset to finish
 #100;
 
 // Add stimulus here
        s_aresetn = 1;
 
 repeat(2) begin
 #100;
 //aw channel
            s_axi_awaddr = 32'b100;
            s_axi_awlen = 8'd3;
            s_axi_awsize = 3'b010;
            s_axi_awburst = 2'b01;
 #20;
            s_axi_awvalid = 1;
 #20;
 //wait(s_axi_awready == 1 && s_aclk == 1);
            s_axi_awvalid = 0;


 #100;
 //w channel
            s_axi_wdata = 32'h01020304;
            s_axi_wstrb = 4'b1111;
 repeat (3) begin
            s_axi_wdata = s_axi_wdata + 1'b1;
            s_axi_wvalid = 1;
 #20;
            s_axi_wvalid = 0;
 #20;
 end
            s_axi_wdata = s_axi_wdata + 1'b1;
            s_axi_wvalid = 1;
            s_axi_wlast = 1;
 #20
            s_axi_wlast = 0;
            s_axi_wvalid = 0;
 #100;
 //ar channel
            s_axi_araddr = 32'b100;
            s_axi_arlen = 8'd7;
            s_axi_arsize = 3'b001;
            s_axi_arburst = 2'b01;
 #20;
            s_axi_arvalid = 1;
 #20;
 //wait(s_axi_arready == 1 && s_aclk == 1);
            s_axi_arvalid = 0;

 #100;
 //r channel
            s_axi_rready = 1;
 end

 end
           
深入 AXI4總線 (四):RAM 讀取實戰

突發傳輸類型為 INCR,寫入時,突發傳輸長度為 4,寬度為 32 位;讀取時長度為 8,寬度為 16 位,仿真的結果和預期一緻。

繼續閱讀