Verilog功能模块——AXI4-Lite协议主机-单次写-使用FIFO
生活随笔
收集整理的這篇文章主要介紹了
Verilog功能模块——AXI4-Lite协议主机-单次写-使用FIFO
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一. 模塊功能與應用場景
模塊功能:AXI4-Lite協議主機,從FWFT FIFO(首字直通FIFO)中讀取地址和數據,實現將數據寫入到設定的地址中的操作。
二. 模塊框圖與使用說明
2.1 模塊框圖
2.2 參數與接口信號
參數列表:
| ADDR_WIDTH | 地址寬度,可設置為任意正數 |
| DATA_WIDTH | 數據寬度,可選32/64 |
| RD_CHECK_EN | 讀檢查使能,1打開使能,0關閉使能 |
接口列表:
| m_axi_xxx | 以m_axi_開頭的表示axi-Lite協議主機的接口信號 |
| fwft_fifo_xxx | 共三個,組成首字直通FIFO的讀接口 |
| single_burst_wr_finish | 單次突發寫完成 |
| error_flag | error_flag為錯誤指示信號,用來指示有錯誤發生 |
| write_resp_error | 寫響應錯誤 |
| read_resp_error | 讀響應錯誤 |
| rdata_notequal_wdata_error | 讀數據不等于寫數據的錯誤 |
2.3 模塊IP框圖
m_axi接口與FIFO READ接口封裝完成后框圖如下:
模塊IP參數配置界面:
2.4 使用說明
當FIFO非空時,此模塊會讀取FIFO中的數據,數據位寬必須等于 = 設置的地址位寬 + 設置的數據位寬。高位存地址,低位存數據。此AXI模塊會將接收到的數據寫入設置的地址中。如果使能了讀檢查使能(Rd Check En),此AXI模塊會在寫入完成后再讀取相同地址,并比較寫入數據和讀出數據,不同則報錯。
三. 模塊代碼
太長,見六. 工程分享。
四. testbench
/** @Author : Xu Dakang* @Email : XudaKang_up@qq.com* @Date : 2021-12-09 19:46:44* @LastEditors : Xu Dakang* @LastEditTime : 2021-12-11 13:48:25* @Filename :* @Description : */module AXI4Lite_singleRW_tb ();timeunit 1ns; timeprecision 1ps;localparam ADDR_WIDTH = 13; localparam DIN_WIDTH = 32;logic FIFO_WRITE_full; logic [ADDR_WIDTH + DIN_WIDTH-1 : 0] FIFO_WRITE_wr_data; logic FIFO_WRITE_wr_en; logic error_flag; logic m_axi_aclk; logic m_axi_aresetn; logic rdata_notequal_wdata_error; logic read_resp_error; logic single_burst_wr_finish; logic write_resp_error;AXI4Lite_singleRW_sys_wrapper AXI4Lite_singleRW_sys_wrapper_inst (.*);// 生成時鐘 localparam CLKT = 2; initial beginm_axi_aclk = 0;forever #(CLKT / 2) m_axi_aclk = ~m_axi_aclk; end// 導入輸入波形文件 路徑需要修改 string din_path = "F:/Onedrive/VivadoPrj/AXI4LiteMaster_singleRW_useFIFO/myAXI4LiteMasterV1.srcs/sim_1/new/sin.txt";localparam DATA_NUM = 10000; // 數據量, 也就是txt文件的行數, 如果此參數大于數據行數, 讀取到的內容為不定態 logic [DIN_WIDTH-1 : 0] din_wave_data [DATA_NUM]; // 讀取輸入波形數據 initial begin$readmemb(din_path, din_wave_data, 0, DATA_NUM-1); // vivado讀取txt文件 end// 寫使能 logic start; logic [ADDR_WIDTH-1 : 0] addr; always_ff @(posedge m_axi_aclk) beginif (~m_axi_aresetn)FIFO_WRITE_wr_en <= 1'b0;else if (start || single_burst_wr_finish)FIFO_WRITE_wr_en <= 1'b1;elseFIFO_WRITE_wr_en <= 1'b0; end// 寫地址 always_ff @(posedge m_axi_aclk) beginif (~m_axi_aresetn)addr <= '0;else if (start || single_burst_wr_finish)addr <= addr + 1'b1;elseaddr <= addr; end// 寫數據 always_ff @(posedge m_axi_aclk) beginif (~m_axi_aresetn)FIFO_WRITE_wr_data <= '0;else if (start || single_burst_wr_finish)FIFO_WRITE_wr_data <= {addr, din_wave_data[addr]};elseFIFO_WRITE_wr_data <= FIFO_WRITE_wr_data; end// 控制復位,仿真開始,仿真結束信號 initial beginm_axi_aresetn = 0;#(CLKT * 10) m_axi_aresetn = 1;wait(FIFO_WRITE_full == 0)start = 1;#(CLKT) start = 0;wait (addr == 5000);#(CLKT * 1000) $stop; endendmodule五. 仿真驗證
仿真工具:Vivado 2021.2 Simulator。
Block Design如下圖:
仿真波形:寫數據和讀數據沒有問題。
六. 工程分享
AXI4LiteMaster_singleRW_useFIFO_Vivado2021.2工程分享:
鏈接:https://pan.baidu.com/s/1pMLVXw1URcthGT2Uv9QHxw
提取碼:dcq6
注意,需要修改testbench中的sin文件路徑才能得到正確的仿真結果。
總結
以上是生活随笔為你收集整理的Verilog功能模块——AXI4-Lite协议主机-单次写-使用FIFO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python学会使用虚拟环境——pipe
- 下一篇: Verilog功能模块 —— 按键消抖