commit axi_lite_master/slave.v
This commit is contained in:
parent
2798d57325
commit
b546caabba
|
@ -0,0 +1,216 @@
|
|||
//**************************************************************************
|
||||
// *** file name : Axi4_lite_slave.v
|
||||
// *** version : 1.0
|
||||
// *** Description : AXI4-Lite slave interface
|
||||
// *** Blogs : https://www.cnblogs.com/WenGalois123/
|
||||
// *** Author : Galois_V
|
||||
// *** Date : 2022.3.29
|
||||
// *** Changes : https://www.cnblogs.com/WenGalois123/p/16071850.html
|
||||
//**************************************************************************
|
||||
`timescale 1ns/1ps
|
||||
module Axi4_lite_slave
|
||||
(
|
||||
input wire i_s_axi_aclk ,
|
||||
input wire i_s_axi_aresetn ,
|
||||
input wire [31:0] i_s_axi_awaddr ,
|
||||
input wire [2:0] i_s_axi_awprot ,
|
||||
input wire i_s_axi_awvalid ,
|
||||
output reg o_s_axi_awready ,
|
||||
input wire [31:0] i_s_axi_wdata ,
|
||||
input wire [3:0] i_s_axi_wstrb ,
|
||||
input wire i_s_axi_wvalid ,
|
||||
output reg o_s_axi_wready ,
|
||||
output wire [1:0] o_s_axi_bresp ,
|
||||
output reg o_s_axi_bvalid ,
|
||||
input wire i_s_axi_bready ,
|
||||
input wire [31:0] i_s_axi_araddr ,
|
||||
input wire [2:0] i_s_axi_arprot ,
|
||||
input wire i_s_axi_arvalid ,
|
||||
output reg o_s_axi_arready ,
|
||||
output reg [31:0] o_s_axi_rdata ,
|
||||
output wire [1:0] o_s_axi_rresp ,
|
||||
output reg o_s_axi_rvalid ,
|
||||
input wire i_s_axi_rready ,
|
||||
output reg [31:0] o_ctrl_wr_addr ,
|
||||
output wire o_ctrl_wr_en ,
|
||||
output wire [31:0] o_ctrl_wr_data ,
|
||||
output wire [3:0] o_ctrl_wr_mask ,
|
||||
output reg [31:0] o_ctrl_rd_addr ,
|
||||
input wire [31:0] i_ctrl_rd_data
|
||||
);
|
||||
|
||||
reg r_wr_en;
|
||||
reg r_rd_en;
|
||||
wire w_raddr_en;
|
||||
/******************************************************************************\
|
||||
Write Address operation
|
||||
\******************************************************************************/
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
r_wr_en <= 1'b1;
|
||||
end
|
||||
else if(o_ctrl_wr_en)
|
||||
begin
|
||||
r_wr_en <= 1'b0;
|
||||
end
|
||||
else if(o_s_axi_bvalid & i_s_axi_bready)
|
||||
begin
|
||||
r_wr_en <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
o_s_axi_awready <= 'd0;
|
||||
end
|
||||
else if(~o_s_axi_awready & i_s_axi_wvalid & i_s_axi_awvalid & r_wr_en)
|
||||
begin
|
||||
o_s_axi_awready <= 1'b1;
|
||||
end
|
||||
else
|
||||
begin
|
||||
o_s_axi_awready <= 'd0;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
o_ctrl_wr_addr <= 'd0;
|
||||
end
|
||||
else if(~o_s_axi_awready & i_s_axi_awvalid & i_s_axi_wvalid)
|
||||
begin
|
||||
o_ctrl_wr_addr <= i_s_axi_awaddr;
|
||||
end
|
||||
end
|
||||
/******************************************************************************\
|
||||
Write data operation
|
||||
\******************************************************************************/
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
o_s_axi_wready <= 'd0;
|
||||
end
|
||||
else if(~o_s_axi_wready & i_s_axi_wvalid & i_s_axi_awvalid & r_wr_en)
|
||||
begin
|
||||
o_s_axi_wready <= 1'b1;
|
||||
end
|
||||
else
|
||||
begin
|
||||
o_s_axi_wready <= 'd0;
|
||||
end
|
||||
end
|
||||
|
||||
assign o_ctrl_wr_data = i_s_axi_wdata;
|
||||
assign o_ctrl_wr_mask = i_s_axi_wstrb;
|
||||
assign o_ctrl_wr_en = o_s_axi_awready & i_s_axi_awvalid & i_s_axi_wvalid & o_s_axi_wready;
|
||||
|
||||
/******************************************************************************\
|
||||
write response and response
|
||||
\******************************************************************************/
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
o_s_axi_bvalid <= 'd0;
|
||||
end
|
||||
else if(~o_s_axi_bvalid & o_ctrl_wr_en)
|
||||
begin
|
||||
o_s_axi_bvalid <= 1'b1;
|
||||
end
|
||||
else if(o_s_axi_bvalid & i_s_axi_bready)
|
||||
begin
|
||||
o_s_axi_bvalid <= 'd0;
|
||||
end
|
||||
end
|
||||
|
||||
/******************************************************************************\
|
||||
Read Address operation
|
||||
\******************************************************************************/
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
r_rd_en <= 1'b1;
|
||||
end
|
||||
else if(w_raddr_en)
|
||||
begin
|
||||
r_rd_en <= 1'b0;
|
||||
end
|
||||
else if(o_s_axi_rvalid & i_s_axi_rready)
|
||||
begin
|
||||
r_rd_en <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
o_s_axi_arready <= 'd0;
|
||||
end
|
||||
else if(~o_s_axi_arready & i_s_axi_arvalid & r_rd_en)
|
||||
begin
|
||||
o_s_axi_arready <= 1'b1;
|
||||
end
|
||||
else
|
||||
begin
|
||||
o_s_axi_arready <= 'd0;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
o_ctrl_rd_addr <= 'd0;
|
||||
end
|
||||
else if(~o_s_axi_arready & i_s_axi_arvalid)
|
||||
begin
|
||||
o_ctrl_rd_addr <= i_s_axi_araddr;
|
||||
end
|
||||
end
|
||||
|
||||
assign w_raddr_en = o_s_axi_arready & i_s_axi_arvalid & (~o_s_axi_rvalid);
|
||||
/******************************************************************************\
|
||||
Read data operation
|
||||
\******************************************************************************/
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
o_s_axi_rvalid <= 'd0;
|
||||
end
|
||||
else if(w_raddr_en)
|
||||
begin
|
||||
o_s_axi_rvalid <= 1'b1;
|
||||
end
|
||||
else if(o_s_axi_rvalid & i_s_axi_rready)
|
||||
begin
|
||||
o_s_axi_rvalid <= 'd0;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge i_s_axi_aclk)
|
||||
begin
|
||||
if(~i_s_axi_aresetn)
|
||||
begin
|
||||
o_s_axi_rdata <= 'd0;
|
||||
end
|
||||
else if(w_raddr_en)
|
||||
begin
|
||||
o_s_axi_rdata <= i_ctrl_rd_data;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
assign o_s_axi_rresp = 2'b00;
|
||||
assign o_s_axi_bresp = 2'b00;
|
||||
|
||||
endmodule
|
|
@ -0,0 +1,274 @@
|
|||
//==========================================================
|
||||
//--Author : colonel
|
||||
//--Date : 11-14
|
||||
//--Module : axi_lite_master
|
||||
//--Function: axi_lite_master
|
||||
//--Ref: axi_lite_master工程链接:https://pan.baidu.com/s/1PNe15vpTL4cKr4GhXawXsw 提取码:qvq6
|
||||
//==========================================================
|
||||
|
||||
module axi_lite_master #(
|
||||
parameter UADDR_W = 8 ,//用户地址位宽;
|
||||
parameter UDATA_W = 32 ,//用户数据位宽;
|
||||
parameter ADATA_W = 32 //AXI_LITE的地址和数据位宽;
|
||||
)(
|
||||
input M_AXI_ACLK ,//AXI接口时钟信号;
|
||||
input M_AXI_ARESETN ,//AXI接口复位信号,低电平有效;
|
||||
//AXI写地址通道信号;
|
||||
output reg [ADATA_W - 1 : 0] M_AXI_AWADDR ,//AXI地址信号;
|
||||
output [2 : 0] M_AXI_AWPROT ,//AXI地址端口信号;
|
||||
output reg M_AXI_AWVALID ,//AIX地址数据有效指示信号,高电平有效;
|
||||
input M_AXI_AWREADY ,//AXI地址数据应答信号。
|
||||
//AXI写数据通道信号;
|
||||
output reg [ADATA_W - 1 : 0] M_AXI_WDATA ,//AXI写数据信号;
|
||||
output [ADATA_W / 8 - 1 : 0] M_AXI_WSTRB ,//AXI写数据掩码信号,低电平有效;
|
||||
output reg M_AXI_WVALID ,//AXI写入数据有效指示信号,高电平有效;
|
||||
input M_AXI_WREADY ,//AXI写入数据应答信号,高电平有效;
|
||||
//AXI写应答通道信号;
|
||||
input [1 : 0] M_AXI_BRESP ,//AXI写应答信号,为0时表示写入正确;
|
||||
input M_AXI_BVALID ,//AXI写应答有效指示信号,高电平有效;
|
||||
output reg M_AXI_BREADY ,//AXI写应答响应信号,高电平有效;
|
||||
//AXI读地址通道信号;
|
||||
output reg [ADATA_W - 1 : 0] M_AXI_ARADDR ,//AXI读地址信号;
|
||||
output [2 : 0] M_AXI_ARPROT ,//AXI读地址端口信号;
|
||||
output reg M_AXI_ARVALID ,//AXI读地址有效指示信号,高电平有效;
|
||||
input M_AXI_ARREADY ,//AXI读地址应答信号,高电平有效;
|
||||
//AXI读数据通道信号;
|
||||
input [ADATA_W - 1 : 0] M_AXI_RDATA ,//AXI读数据信号;
|
||||
input [1 : 0] M_AXI_RRESP ,//AXI读数据状态应答信号,为0表示读数据正确;
|
||||
input M_AXI_RVALID ,//读数据有效指示信号,高电平有效;
|
||||
output reg M_AXI_RREADY ,//主机接收从机读出数据的应答信号,高电平有效;
|
||||
//用户写数据信号;
|
||||
input wr_en ,//写使能信号,高电平有效;
|
||||
input [UADDR_W - 1 : 0] waddr ,//写地址信号,与写使能对齐;
|
||||
input [UDATA_W - 1 : 0] wdata ,//写数据信号,与写使能对齐;
|
||||
//用户读数据信号;
|
||||
input rd_en ,//读使能信号,高电平有效;
|
||||
input [UADDR_W - 1 : 0] raddr ,//读地址信号,与读使能对齐;
|
||||
output reg [UDATA_W - 1 : 0] rdata ,//读数据信号;
|
||||
output reg rdata_vld ,//读数据有效指示信号,高电平有效;
|
||||
output reg error //错误指示信号,当写入错误或读出错误时为1,正常为0;
|
||||
);
|
||||
reg rd_flag ;//
|
||||
reg wr_flag ;//
|
||||
reg wfifo_rd_en ;//
|
||||
reg wfifo_rdata_vld ;
|
||||
reg ra_fifo_rd_en ;//
|
||||
reg ra_fifo_rdata_vld;
|
||||
|
||||
wire wa_fifo_full ;//写地址FIFO满指示信号;
|
||||
wire wa_fifo_empty ;//写地址FIFO空指示信号;
|
||||
wire [UADDR_W - 1 : 0] wa_fifo_dout ;//写地址FIFO读数据信号;
|
||||
wire ra_fifo_full ;//读地址FIFO满指示信号;
|
||||
wire ra_fifo_empty ;//读地址FIFO空指示信号;
|
||||
wire [UADDR_W - 1 : 0] ra_fifo_dout ;//读地址FIFO读数据信号;
|
||||
wire wd_fifo_full ;//写数据FIFO满指示信号;
|
||||
wire wd_fifo_empty ;//写数据FIFO空指示信号;
|
||||
wire [UDATA_W - 1 : 0] wd_fifo_dout ;//写数据FIFO读数据信号;
|
||||
|
||||
assign M_AXI_AWPROT = 3'd0 ;//写地址端口信号始终为0;
|
||||
assign M_AXI_ARPROT = 3'd0 ;//读地址端口信号始终为0;
|
||||
assign M_AXI_WSTRB = {{ADATA_W/8}{1'b1}};//写数据掩码信号,本模块写入数据全部有效,因此全为高电平;
|
||||
assign wfifo_empty = wa_fifo_empty & wa_fifo_empty;//由于写地址和写数据可以同时进行,所以将两个写FIFO空指示信号合并;
|
||||
|
||||
//用于存储写地址的FIFO;
|
||||
addr_fifo_8x32 u_waddr_fifo (
|
||||
.clk ( M_AXI_ACLK ),//input wire clk;
|
||||
.din ( waddr ),//input wire [7 : 0] din;
|
||||
.wr_en ( wr_en ),//input wire wr_en;
|
||||
.rd_en ( wfifo_rd_en ),//input wire rd_en;
|
||||
.dout ( wa_fifo_dout ),//output wire [7 : 0] dout;
|
||||
.full ( wa_fifo_full ),//output wire full;
|
||||
.empty ( wa_fifo_empty ) //output wire empty;
|
||||
);
|
||||
|
||||
//用于存储读地址的FIFO;
|
||||
addr_fifo_8x32 u_raddr_fifo (
|
||||
.clk ( M_AXI_ACLK ),//input wire clk;
|
||||
.din ( raddr ),//input wire [7 : 0] din;
|
||||
.wr_en ( rd_en ),//input wire wr_en;
|
||||
.rd_en ( ra_fifo_rd_en ),//input wire rd_en;
|
||||
.dout ( ra_fifo_dout ),//output wire [7 : 0] dout;
|
||||
.full ( ra_fifo_full ),//output wire full;
|
||||
.empty ( ra_fifo_empty ) //output wire empty;
|
||||
);
|
||||
|
||||
//用于存储写数据的FIFO;
|
||||
data_fifo_32x32 u_wdata_fifo (
|
||||
.clk ( M_AXI_ACLK ),//input wire clk;
|
||||
.din ( wdata ),//input wire [31 : 0] din;
|
||||
.wr_en ( wr_en ),//input wire wr_en;
|
||||
.rd_en ( wfifo_rd_en ),//input wire rd_en;
|
||||
.dout ( wd_fifo_dout ),//output wire [31 : 0] dout;
|
||||
.full ( wd_fifo_full ),//output wire full;
|
||||
.empty ( wd_fifo_empty ) //output wire empty;
|
||||
);
|
||||
|
||||
//写标志信号,初始值为0,当写入数据时拉高,一次写入完成后拉低;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
wr_flag <= 1'b0;
|
||||
end//当写应答通道的有效信号和应答信号均为高时,表示一次写数据完成;
|
||||
else if(M_AXI_BVALID & M_AXI_BREADY)begin
|
||||
wr_flag <= 1'b0;
|
||||
end//当不处于写数据状态且写FIFO中有数据时拉高;
|
||||
else if((~wa_fifo_empty) && (~wr_flag))begin
|
||||
wr_flag <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//写地址FIFO读使能信号;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
wfifo_rd_en <= 1'b0;
|
||||
end
|
||||
else begin//当FIFO没有空且写标志信号开始时拉高;
|
||||
wfifo_rd_en <= ((~wfifo_empty) && (~wr_flag));
|
||||
end
|
||||
end
|
||||
|
||||
//将写地址FIFO读使能信号延迟一个时钟作为读出数据有效指示信号;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
wfifo_rdata_vld <= wfifo_rd_en;
|
||||
end
|
||||
|
||||
//生成AXI写地址信号,初始值为0,当写地址FIFO读数据有效时,输出FIFO读出的数据,其余时间保持不变;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
M_AXI_AWADDR <= {{ADATA_W}{1'b0}};
|
||||
M_AXI_WDATA <= {{ADATA_W}{1'b0}};
|
||||
end
|
||||
else if(wfifo_rdata_vld)begin//将写地址FIFO输出数据赋值给AXI地址信号;
|
||||
M_AXI_AWADDR <= {{{ADATA_W - UADDR_W}{1'b0}},wa_fifo_dout[UADDR_W - 1 : 0]};
|
||||
M_AXI_WDATA <= {{{ADATA_W - UDATA_W}{1'b0}},wd_fifo_dout[UDATA_W - 1 : 0]};
|
||||
end
|
||||
end
|
||||
|
||||
//生成AXI写地址有效指示信号,与写地址信号对齐;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
M_AXI_AWVALID <= 1'b0;
|
||||
end
|
||||
else if(M_AXI_AWREADY)begin//当写地址信号被应答后拉低;
|
||||
M_AXI_AWVALID <= 1'b0;
|
||||
end
|
||||
else if(wfifo_rdata_vld)begin//当写地址FIFO输出有效数据后拉高;
|
||||
M_AXI_AWVALID <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//生成AXI写数据有效指示信号,与写地址信号对齐;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
M_AXI_WVALID <= 1'b0;
|
||||
end
|
||||
else if(M_AXI_WREADY)begin//当写数据信号被应答后拉低;
|
||||
M_AXI_WVALID <= 1'b0;
|
||||
end
|
||||
else if(wfifo_rdata_vld)begin//当FIFO输出有效数据后拉高;
|
||||
M_AXI_WVALID <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//生成应答通道的应答数据,当写入数据后拉高,等待从机有效指示信号拉高后拉低。
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
M_AXI_BREADY <= 1'b0;
|
||||
end
|
||||
else if(M_AXI_BVALID)begin//从机应答信号拉高;
|
||||
M_AXI_BREADY <= 1'b0;
|
||||
end
|
||||
else if(M_AXI_WREADY & M_AXI_WVALID)begin//写入数据完成;
|
||||
M_AXI_BREADY <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//读标志信号;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
rd_flag <= 1'b0;
|
||||
end
|
||||
else if(M_AXI_RREADY & M_AXI_RREADY)begin//当读数据通道的应答信号和输出数据有效信号同时为高时,表示读取成功;
|
||||
rd_flag <= 1'b0;
|
||||
end
|
||||
else if((~ra_fifo_empty) && (~rd_flag) && wfifo_empty && (~wr_flag))begin//当读地址FIFO不为空且不处于读数据状态时拉高;
|
||||
rd_flag <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//读地址FIFO读使能信号,当需要同时执行读写操作时,优先执行写操作,防止同时读写同一地址引发错误。
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
ra_fifo_rd_en <= 1'b0;
|
||||
end
|
||||
else begin//当FIFO没有空且读标志信号开始时拉高;
|
||||
ra_fifo_rd_en <= ((~ra_fifo_empty) && (~rd_flag) && wfifo_empty && (~wr_flag));
|
||||
end
|
||||
end
|
||||
|
||||
//将读地址FIFO读使能信号延迟一个时钟作为读出数据有效指示信号;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
ra_fifo_rdata_vld <= ra_fifo_rd_en;
|
||||
end
|
||||
|
||||
//生成AXI读地址信号,初始值为0,当读地址FIFO读数据有效时,输出FIFO读出的数据,其余时间保持不变;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
M_AXI_ARADDR <= {{ADATA_W}{1'b0}};
|
||||
end
|
||||
else if(ra_fifo_rdata_vld)begin//将读地址FIFO输出数据赋值给AXI地址信号;
|
||||
M_AXI_ARADDR <= {{{ADATA_W - UADDR_W}{1'b0}},ra_fifo_dout[UADDR_W - 1 : 0]};
|
||||
end
|
||||
end
|
||||
|
||||
//生成AXI读地址有效指示信号,与读地址信号对齐;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
M_AXI_ARVALID <= 1'b0;
|
||||
end
|
||||
else if(M_AXI_ARREADY)begin//当读地址信号被应答后拉低;
|
||||
M_AXI_ARVALID <= 1'b0;
|
||||
end
|
||||
else if(ra_fifo_rdata_vld)begin//当读地址FIFO输出有效数据后拉高;
|
||||
M_AXI_ARVALID <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//生成读数据通道的应答信号;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
M_AXI_RREADY <= 1'b0;
|
||||
end
|
||||
else if(M_AXI_RVALID)begin//当读数据有效时拉低;
|
||||
M_AXI_RREADY <= 1'b0;
|
||||
end
|
||||
else if(M_AXI_ARVALID & M_AXI_ARREADY)begin//当从机应答读地址信号时拉高;
|
||||
M_AXI_RREADY <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//生成用户读数据及读数据有效信号;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
rdata <= {{UDATA_W}{1'b0}};
|
||||
rdata_vld <= 1'b0;
|
||||
end
|
||||
else begin//将AXI读出数据输出,并且把数据有效信号拉高一个时钟周期;
|
||||
rdata <= M_AXI_RVALID ? M_AXI_RDATA[UDATA_W-1 : 0] : rdata;
|
||||
rdata_vld <= M_AXI_RVALID;
|
||||
end
|
||||
end
|
||||
|
||||
//生成错误指示信号,初始值为0;
|
||||
always@(posedge M_AXI_ACLK)begin
|
||||
if(M_AXI_ARESETN==1'b0)begin//初始值为0;
|
||||
error <= 1'b0;
|
||||
end//每次读写使能信号有效时清零;
|
||||
else if(wfifo_rd_en | ra_fifo_rd_en)begin
|
||||
error <= 1'b0;
|
||||
end//当写入数据失败或者读出数据错误时拉高;
|
||||
else if((M_AXI_ARVALID & M_AXI_ARREADY & (M_AXI_RRESP!=2'd0)) | (M_AXI_BREADY & M_AXI_BREADY & (M_AXI_BRESP != 2'd0)))begin
|
||||
error <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
Loading…
Reference in New Issue