AXXI4總線協議 ------ AXI_FULL協議

https://download.csdn.net/download/mvpkuku/90855619

?一、AXI_FULL協議的前提知識

1. 各端口的功能

2. 4K邊界問題?

3. outstanding?

4.時序仿真體驗?

可通過VIVADO自帶ADMA工程觀察仿真波形圖

二、FPGA實現 (主要用于讀寫DDR)

1.功能模塊及框架

將用戶端的寫/讀相關信號轉換為AXI4_MASTER接口信號。因此頂層設計主要分為用戶端接口以及AXI4協議主機接口

1、換存數據量較小的時候,FIFO建議采用DRAM
DRAM是由邏輯資源搭建而成的,消耗的是LUT的資源
緩存命令、地址、幀長度等等。

2、緩存數據量比較大的時候,采用BRAM,
BRAM是一種資源。

18k = 18 * 1024bit = 36bit(最大寬度) * 512(深度)= 18bit * 1024 = 9bit * 2048
36k = 2 * 18k = 72bit(最大寬度) * 512(深度)= 36bit * 1024 = 18bit * 2048
37bit = 36bit + 36bit

FIFO使用了一個18k的bram,即使FIFo的深度和寬度開的很小,很多空間沒有使用,
這個FIFO的消耗的BRAM,不能被其他的模塊(FIFO)使用
FIFO采用BRAM的時候,消耗最少相同的BARM數量,建議把FIFO的深度和寬度開到最大

AXI_DATA_WIDTH == 64
64bit + 1bit = 65bit = 36bit + 36bit ?至少2個18k bram

2.寫通道實現?

2.1 wr_ctrl模塊?

寫入用戶端信號(寫使能,寫數據,寫地址)

1.對復位信號以及ddr初始化完成信號進行同步,進而對用戶端信號進行有效寄存

2.對用戶端寫數據進行計數(位寬轉換,突發寫字節數)

3.生成數據及數據有效,寫數據最后一位,寫突發長度

4.生成寫請求和寫地址

ps:3、4輸出信號均給wr_buffer模塊進行跨時鐘與緩存

下一個模塊的cmd_wren在wr_req_en為1時拉高,并且此模塊在此時更新地址

wr_req_en作為wr_buffer狀態機啟動信號

2.2 wr_buffer模塊

1.復位信號進行跨時鐘域同步(用戶時鐘/AXI4時鐘)

2.將地址和length寫入CMD fifo (clk),cmd_wren在wr_req_en為1時拉高,并且此時更新地址

3..將數據和last 寫入data?fifo

寫數據隨著上層數據有效寫入data_fifo

4.狀態機設計(輸出傳給axi4_master模塊)

axi_aw_req_en和axi_aw_ready)握手機制控制是否開始寫狀態

//表示AXI4寫請求? 本模塊時序控制,狀態機一個狀態產生請求信號,握手成功之后拉低
//axi_aw_req_en 和axi_aw_ready同時為高,開啟一次AXI4寫傳輸

并在該信號跳轉開始寫數據狀態的同時,拉高cmd_rden,讀出數據突發長度以及寫地址

5.輸出信號的時序

突發長度和地址cmd_dout分配

其次是是數據有效同上,已進入寫數據狀態就拉高

數據和last由當data_en為高時由data_dout分配

三個信號同步

2.3 axi_master模塊

1.對除了與下游從機交互的握手信號以及寫地址,寫突發長度的信號進行固定賦值;

2.?axi_aw_req_en啟動狀態機

3.組合邏輯輸出作為叢機給wr_buffer的握手準備信號,一個由狀態機產生,一個由下游從機輸入

4.對和下游從機交互的握手信號以及寫地址,寫突發長度以及數據,數據最后一位的信號 時序控制

2.4 實現頂層代碼?

`timescale 1ns / 1ps
//
// Description: 寫通道
//
module axi_wr_channel#(parameter		USER_WR_DATA_WIDTH = 16  ,parameter       AXI_DATA_WIDTH     = 128 ,parameter       AXI_ADDR_WIDTH     = 32  
)(input                              user_wr_clk       , //用戶端寫時鐘input                              axi_clk           , // AXI4端時鐘input                              reset             ,input                              ddr_init_done     ,/*-------------用戶寫端口信號------------------------*/input                              user_wr_en        ,input   [USER_WR_DATA_WIDTH-1:0]   user_wr_data      ,input   [AXI_ADDR_WIDTH-1:0]       user_wr_base_addr , //一定要被4096整除input   [AXI_ADDR_WIDTH-1:0]       user_wr_end_addr  , //一定要被4096整除	/*-------------AXI寫通道端口信號---------------------*/output                             m_axi_awvalid     ,input                              m_axi_awready     ,output  [AXI_ADDR_WIDTH-1:0]       m_axi_awaddr      ,output  [3:0]                      m_axi_awid        ,output  [7:0]                      m_axi_awlen       ,output  [1:0]                      m_axi_awburst     ,output  [2:0]                      m_axi_awsize      ,output  [2:0]                      m_axi_awport      ,output  [3:0]                      m_axi_awqos       ,output                             m_axi_awlock      ,output  [3:0]                      m_axi_awcache     ,output                             m_axi_wvalid      ,input                              m_axi_wready      ,output  [AXI_DATA_WIDTH-1:0]       m_axi_wdata       ,output  [AXI_DATA_WIDTH/8-1:0]     m_axi_wstrb       ,   	output                             m_axi_wlast  	 ,input      [3:0]                   m_axi_bid         ,input      [1:0]                   m_axi_bresp       ,input                              m_axi_bvalid      ,output                             m_axi_bready      
);wire                          wr_req_en;wire [7:0]                    wr_burst_length;wire [AXI_ADDR_WIDTH-1:0]     wr_data_addr;wire                          wr_data_valid;wire [AXI_DATA_WIDTH-1:0]     wr_data_out;wire                          wr_data_last;wire                          axi_aw_req_en;wire                      	  axi_aw_ready;wire [7:0] 	  				  axi_aw_burst_len;wire [AXI_ADDR_WIDTH-1:0] 	  axi_aw_addr;wire                      	  axi_w_valid;wire                      	  axi_w_ready;wire [AXI_DATA_WIDTH-1:0] 	  axi_w_data;wire                      	  axi_w_last;wr_ctrl #(.USER_WR_DATA_WIDTH(USER_WR_DATA_WIDTH),.AXI_DATA_WIDTH(AXI_DATA_WIDTH),.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),.WR_BURST_LENGTH(1024)) wr_ctrl (.clk               (user_wr_clk),.reset             (reset),.ddr_init_done     (ddr_init_done),.user_wr_en        (user_wr_en),.user_wr_data      (user_wr_data),.user_wr_base_addr (user_wr_base_addr),.user_wr_end_addr  (user_wr_end_addr),.wr_req_en         (wr_req_en),.wr_burst_length   (wr_burst_length),.wr_data_addr      (wr_data_addr),.wr_data_valid     (wr_data_valid),.wr_data_out       (wr_data_out),.wr_data_last      (wr_data_last));wr_buffer #(.AXI_DATA_WIDTH(AXI_DATA_WIDTH),.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH)) wr_buffer (.clk              (user_wr_clk),.axi_clk          (axi_clk),.reset            (reset),.wr_req_en        (wr_req_en),.wr_burst_length  (wr_burst_length),.wr_data_addr     (wr_data_addr),.wr_data_valid    (wr_data_valid),.wr_data_in       (wr_data_out),.wr_data_last     (wr_data_last),.axi_aw_req_en    (axi_aw_req_en),.axi_aw_ready     (axi_aw_ready),.axi_aw_burst_len (axi_aw_burst_len),.axi_aw_addr      (axi_aw_addr),			.axi_w_valid      (axi_w_valid),.axi_w_ready      (axi_w_ready),.axi_w_data       (axi_w_data),.axi_w_last       (axi_w_last));axi_wr_master #(.AXI_DATA_WIDTH(AXI_DATA_WIDTH),.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH)) axi_wr_master (.axi_clk          (axi_clk),.reset            (reset),.axi_aw_req_en    (axi_aw_req_en),.axi_aw_ready     (axi_aw_ready),.axi_aw_burst_len (axi_aw_burst_len),.axi_aw_addr      (axi_aw_addr),.axi_w_valid      (axi_w_valid),.axi_w_ready      (axi_w_ready),.axi_w_data       (axi_w_data),.axi_w_last       (axi_w_last),.m_axi_awvalid    (m_axi_awvalid),.m_axi_awready    (m_axi_awready),.m_axi_awaddr     (m_axi_awaddr),.m_axi_awid       (m_axi_awid),.m_axi_awlen      (m_axi_awlen),.m_axi_awburst    (m_axi_awburst),.m_axi_awsize     (m_axi_awsize),.m_axi_awport     (m_axi_awport),.m_axi_awqos      (m_axi_awqos),.m_axi_awlock     (m_axi_awlock),.m_axi_awcache    (m_axi_awcache),.m_axi_wvalid     (m_axi_wvalid),.m_axi_wready     (m_axi_wready),.m_axi_wdata      (m_axi_wdata),.m_axi_wstrb      (m_axi_wstrb),.m_axi_wlast      (m_axi_wlast),.m_axi_bid        (m_axi_bid),.m_axi_bresp      (m_axi_bresp),.m_axi_bvalid     (m_axi_bvalid),.m_axi_bready     (m_axi_bready));endmodule

2.5 部分仿真時序圖?

3.讀通道實現?

3.1 rd_ctrl模塊

基本上與wr_ctrl模塊類似,主要注意幾個區別:

1.狀態機由讀請求的上升沿在ddr初始化完成之后啟動;

2.給用戶端讀忙的信號,只要不處于初始態??user_rd_req_busy

3.wr-buffer輸入fifo是否寫滿的信號 rd_req_ready

3.2 rd_buffer模塊?

同理:仍然與wr_buffer對比

1. rd_cmd_fifo?

通過 cmd_wrcount 給出?fifo是否寫滿的信號 rd_req_ready,在這個前提下cmd開始寫入fifo

cmd_rden由下游axi_master的握手信號控制

2. rd_data_fifo

? ??????由下游axi_master 數據寫入 (axi_clk)data_wren/data_din;

????????data_rden 需要data_fifo非空,并且不在data_fifo非讀,一周期拉低

? ? ? ? rd_data_fifo_out :在data_rden一次性讀取位寬128的數據,然后在rd_data_flag進行數據的移位

????????rd_data_fifo_last:通過data_dout[64]判斷是否為1,持續最后一個128位寬數據時間

3. 狀態機起始跳轉需要cmd非空而且data_fifo沒寫滿;

結束跳轉的條件

4.最后將rd_data_fifo_out截取16位給到用戶端口,同步數據有效,rd_data_fifo_last計數最后一個移位數據給到用戶端口

?3.3 axi_rd_master模塊

?m_axi控制拉低,axi_控制拉高

`timescale 1ns / 1ps
//
// Description:讀通道
/
module axi_rd_channel#(parameter	AXI_DATA_WIDTH      = 128,parameter   AXI_ADDR_WIDTH      = 32 ,parameter   USER_RD_DATA_WIDTH	= 16)(input                              user_rd_clk       , //用戶端讀時鐘input                              axi_clk           , //axi的時鐘input                              reset             ,input                              ddr_init_done     ,/*--------------用戶端讀請求信號----------------------*/input                              user_rd_req        , //上升沿觸發用戶讀請求input    [AXI_ADDR_WIDTH-1:0]      user_rd_base_addr  , //一定要被4096整除input    [AXI_ADDR_WIDTH-1:0]      user_rd_end_addr   , //一定要被4096整除output                             user_rd_req_busy   , //用戶讀請求忙標志	output  						   user_rd_valid      ,output                             user_rd_last       ,output   [USER_RD_DATA_WIDTH-1:0]  user_rd_data       ,/*-------------AXI讀通道端口信號---------------------*/output                             m_axi_arvalid     ,input                              m_axi_arready     ,output   [AXI_ADDR_WIDTH-1:0]      m_axi_araddr      ,output   [3:0]                     m_axi_arid        ,output   [7:0]                     m_axi_arlen       ,output   [1:0]                     m_axi_arburst     ,output   [2:0]                     m_axi_arsize      ,output   [2:0]                     m_axi_arport      ,output   [3:0]                     m_axi_arqos       ,output                             m_axi_arlock      ,output   [3:0]                     m_axi_arcache     ,input    [3:0]                     m_axi_rid         ,input                              m_axi_rvalid      ,output                             m_axi_rready      ,input    [AXI_DATA_WIDTH-1:0]      m_axi_rdata       ,input                              m_axi_rlast       ,input    [1:0]                     m_axi_rresp     );wire                          rd_req_en       ;wire                [7:0]     rd_burst_length ;wire [AXI_ADDR_WIDTH-1:0]     rd_data_addr    ;wire                          rd_req_ready    ;wire                          axi_ar_req_en   ;wire                          axi_ar_ready    ;wire [7:0]                    axi_ar_burst_len;wire [AXI_ADDR_WIDTH-1:0]     axi_ar_addr     ;wire                          axi_r_valid     ;wire [AXI_DATA_WIDTH-1:0]     axi_r_data      ;wire                          axi_r_last      ;rd_ctrl #(.AXI_DATA_WIDTH(AXI_DATA_WIDTH),.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),.RD_BURST_LENGTH(1024)) rd_ctrl (.clk               (user_rd_clk),.reset             (reset),.ddr_init_done     (ddr_init_done),.user_rd_req       (user_rd_req),.user_rd_base_addr (user_rd_base_addr),.user_rd_end_addr  (user_rd_end_addr),.user_rd_req_busy  (user_rd_req_busy),.rd_req_en         (rd_req_en),.rd_burst_length   (rd_burst_length),.rd_data_addr      (rd_data_addr),.rd_req_ready      (rd_req_ready));rd_buffer #(.AXI_DATA_WIDTH(AXI_DATA_WIDTH),.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),.USER_RD_DATA_WIDTH(USER_RD_DATA_WIDTH)) rd_buffer (.clk              (user_rd_clk),.axi_clk          (axi_clk),.reset            (reset),.rd_req_en        (rd_req_en),.rd_burst_length  (rd_burst_length),.rd_data_addr     (rd_data_addr),.rd_req_ready     (rd_req_ready),.axi_ar_req_en    (axi_ar_req_en),.axi_ar_ready     (axi_ar_ready),.axi_ar_burst_len (axi_ar_burst_len),.axi_ar_addr      (axi_ar_addr),.axi_r_valid      (axi_r_valid),.axi_r_data       (axi_r_data),.axi_r_last       (axi_r_last),.user_rd_valid    (user_rd_valid),.user_rd_last     (user_rd_last),.user_rd_data     (user_rd_data));axi_rd_master #(.AXI_DATA_WIDTH(AXI_DATA_WIDTH),.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH)) axi_rd_master (.axi_clk          (axi_clk),.reset            (reset),.axi_ar_req_en    (axi_ar_req_en),.axi_ar_ready     (axi_ar_ready),.axi_ar_burst_len (axi_ar_burst_len),.axi_ar_addr      (axi_ar_addr),.axi_r_valid      (axi_r_valid),.axi_r_data       (axi_r_data),.axi_r_last       (axi_r_last),.m_axi_arvalid    (m_axi_arvalid),.m_axi_arready    (m_axi_arready),.m_axi_araddr     (m_axi_araddr),.m_axi_arid       (m_axi_arid),.m_axi_arlen      (m_axi_arlen),.m_axi_arburst    (m_axi_arburst),.m_axi_arsize     (m_axi_arsize),.m_axi_arport     (m_axi_arport),.m_axi_arqos      (m_axi_arqos),.m_axi_arlock     (m_axi_arlock),.m_axi_arcache    (m_axi_arcache),.m_axi_rid        (m_axi_rid),.m_axi_rvalid     (m_axi_rvalid),.m_axi_rready     (m_axi_rready),.m_axi_rdata      (m_axi_rdata),.m_axi_rlast      (m_axi_rlast),.m_axi_rresp      (m_axi_rresp));endmodule

4.仿真實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81625.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81625.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81625.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React系列——nvm、node、npm、yarn(MAC)

nvm,node,npm之間的區別 1、nvm:nodejs版本管理工具。nvm 可以管理很多 node 版本和 npm 版本。 2、nodejs:在項目開發時的所需要的代碼庫 3、npm:nodejs包管理工具。nvm、nodejs、npm的關系 nvm 管理 nodejs 和 npm…

2025年AI與網絡安全的終極博弈:沖擊、重構與生存法則

引言 2025年,生成式AI的推理速度突破每秒千萬次,網絡安全行業正經歷前所未有的范式革命。攻擊者用AI批量生成惡意代碼,防御者用AI構建智能護盾,這場技術軍備競賽正重塑行業規則——60%的傳統安全崗位面臨轉型,70%的防…

【Android】Android 實現一個依賴注入的注解

Android 實現一個依賴注入的注解 🎯 目標功能 自定義注解 Inject創建一個 Injector 類,用來掃描并注入對象支持 Activity 或其他類中的字段注入 🧩 步驟一:定義注解 import java.lang.annotation.ElementType; import java.lan…

Spring Boot與Kafka集成實踐:從入門到實戰

Spring Boot與Kafka集成實踐 引言 在現代分布式系統中,消息隊列是不可或缺的組件之一。Apache Kafka作為一種高吞吐量的分布式消息系統,廣泛應用于日志收集、流處理、事件驅動架構等場景。Spring Boot作為Java生態中最流行的微服務框架,提供…

ubuntu的虛擬機上的網絡圖標沒有了

非正常的關機導致虛擬機連接xshell連接不上,ping也ping不通。網絡的圖標也沒有了。 記錄一下解決步驟 1、重啟服務 sudo systemctl restart NetworkManager 2、圖標顯示 sudo nmcli network off sudo nmcli network on 3、sudo dhclient ens33 //(網卡) …

生產者 - 消費者模式實現方法整理

一、Channels &#xff08;一&#xff09;使用場景 適用于高并發、大數據量傳輸&#xff0c;且需要異步操作的場景&#xff0c;如實時數據處理系統。 &#xff08;二&#xff09;使用方法 創建 Channel<T>&#xff08;無界&#xff09;或 BoundedChannel<T>&…

OpenCV光流估計:原理、實現與應用

一、什么是光流&#xff1f; 光流(Optical Flow)是計算機視覺中描述圖像序列中像素運動模式的重要概念。它表示圖像中物體在連續幀之間的表觀運動&#xff0c;是由物體或相機的運動引起的。 光流的基本假設 亮度恒常性&#xff1a;同一物體點在連續幀中的亮度保持不變時間持…

Java實現MinIO上傳PDF文件并配置瀏覽器在線打開及vue2上傳頁面

win下載啟動minio結合vue2實現文件上傳瀏覽 一.下載啟動minio 1. 下載minio 2.在D盤創建文件夾 1.首先創建minio文件夾再minio中依次創建bin/data/logs,如下圖 2.把下載的minio.exe放到minio->bin文件中 3.在bin文件夾中輸入cmd打開命令框輸入命令minio.exe server D:…

VR 互動實訓與展示,借科技開啟沉浸式體驗新篇?

對于企業而言&#xff0c;產品設計與展示是極為關鍵的環節&#xff0c;這直接關系到能否成功吸引客戶&#xff0c;以及精準獲取市場反饋。在當下科技飛速發展的時代&#xff0c;VR 互動實訓為這一至關重要的環節注入了全新活力&#xff0c;帶來了前所未有的體驗。以某智能家居企…

進階-數據結構部分:1、數據結構入門

飛書文檔https://x509p6c8to.feishu.cn/wiki/HRLkwznHiiOgZqkqhLrcZNqVnLd 一、存儲結構 順序存儲 鏈式存儲 二、常用數據結構 2.1、棧 先進后出 場景&#xff1a; 后退/前進功能&#xff1a;網頁瀏覽器中的后退和前進按鈕可以使用棧來實現。在瀏覽網頁時&#xff0c;每次…

HarmonyOS Navigation組件深度解析與應用實踐

HarmonyOS Navigation組件深度解析與應用實踐 一、組件架構與核心能力 HarmonyOS Navigation組件作為路由導航的根視圖容器&#xff0c;采用三層架構設計&#xff1a; 標題層&#xff1a;支持主副標題配置&#xff0c;提供Mini/Free/Full三種顯示模式內容層&#xff1a;默認…

基于AI的Web數據管道,使用n8n、Scrapeless和Claude

引言 在當今數據驅動的環境中&#xff0c;組織需要高效的方法來提取、處理和分析網絡內容。傳統的網絡抓取面臨著諸多挑戰&#xff1a;反機器人保護、復雜的JavaScript渲染以及持續的維護需求。此外&#xff0c;理解非結構化的網絡數據則需要復雜的處理能力。 本指南演示了如…

Cadence學習筆記之---PCB器件放置與布局

目錄 01 | 引 言 02 | 環境描述 03 | 元件放置 04 | 布局相關操作 06 | 總 結 01 | 引 言 在上一篇文章中&#xff0c;介紹了如何設置PCB的電氣規則約束&#xff0c;以及如何設置層疊&#xff0c;到此我們已經完成了使用Cadence設計PCB的前期準備工作&#xff1b; 在本篇…

力扣HOT100之二叉樹:199. 二叉樹的右視圖

這道題沒啥好說的&#xff0c;首先定義一個向量來保存每一層的最后一個元素&#xff0c;直接用層序遍歷&#xff08;廣度優先搜索&#xff09;遍歷二叉樹&#xff0c;然后將每一層的最后一個元素加入到這個向量中即可。屬于是二叉樹層序遍歷的模板題。 /*** Definition for a …

CSS:三大特性

文章目錄 一、層疊性二、繼承性三、優先級 一、層疊性 二、繼承性 可以在MDN網站上查看屬性是否可以被繼承 例如color 三、優先級

C++經典庫介紹

在 C 開發的漫長歷程中&#xff0c;涌現出了許多經典的庫&#xff0c;它們在不同的領域發揮著重要作用&#xff0c;極大地提升了 C 開發的效率和質量。下面為你介紹一些 C 開發中的經典庫。 標準模板庫&#xff08;STL&#xff09; STL 堪稱 C 編程領域的基石&#xff0c;是每…

Git本地使用小Tips

要將本地倉庫 d:\test 的更新推送到另一個本地倉庫 e:\test&#xff0c;可以使用 Git 的遠程倉庫功能。以下是具體步驟&#xff1a; ??在 e:\test 中添加 d:\test 作為遠程倉庫?? 在 e:\test 目錄中打開 Git Bash 或命令行&#xff0c;執行以下命令&#xff1a; git remo…

AWS SageMaker vs Bedrock:該選哪個?

隨著生成式 AI 的快速崛起&#xff0c;越來越多企業希望借助云上工具&#xff0c;加速 AI 應用的構建與落地。AWS 作為領先的云服務提供商&#xff0c;提供了兩款核心 AI 服務&#xff1a;Amazon SageMaker 和 Amazon Bedrock。它們雖然同屬 AWS AI 生態系統&#xff0c;但定位…

51單片機的lcd12864驅動程序

#include <reg51.h> #include <intrins.h>#define uchar

Git .gitattributes 文件用途詳解

.gitattributes 是 Git 版本控制系統中的一個配置文件&#xff0c;用于定義特定文件或路徑的屬性&#xff0c;從而控制 Git 如何處理這些文件。它類似于 .gitignore&#xff0c;但功能更廣泛&#xff0c;可以精細化管理文件在版本控制中的行為。 主要用途 以下是 .gitattribut…