Beruflich Dokumente
Kultur Dokumente
module axi_slave
#(
parameterAXI_ID_WIDTH = 4
)
(
clk,
rstn,
// AXI write address channel
i_awaddr,
i_awid,
i_awlen,
i_awvalid,
o_awready,
// AXI write data channel
i_wdata,
i_wid,
i_wstrb,
i_wlast,
i_wvalid,
o_wready,
o_bresp,
o_bid,
o_bvalid,
i_bready,
// AXI read address channel
i_araddr,
i_arid,
i_arlen,
i_arvalid,
o_arready,
clk;
rstn;
output
o_arready;
ST_R_IDLE = 3'd0;
ST_R_PRE1 = 3'd1;
ST_R_PRE2 = 3'd2;
ST_R_PRE3 = 3'd3;
ST_R_READ = 3'd4;
ST_R_END = 3'd5;
parameter
parameter
parameter
parameter
parameter
parameter
ST_W_IDLE = 3'd0;
ST_W_PRE1 = 3'd1;
ST_W_PRE2 = 3'd2;
ST_W_PRE3 = 3'd3;
ST_W_WRITE = 3'd4;
ST_W_END = 3'd5;
reg
reg
reg
reg
[2:0]
[2:0]
[2:0]
[2:0]
r_cs;
r_ns;
w_cs;
w_ns;
reg
reg
reg
reg
[3:0] rdcnt;
[31:0] araddr;
[3:0] arlen;
[AXI_ID_WIDTH-1:0] arid;
reg
reg
[3:0] wdcnt;
[31:0] awaddr;
reg
reg
[3:0] awlen;
[AXI_ID_WIDTH-1:0] awid;
reg
reg
reg
reg
reg
reg
[5:0] axi_wait_cnt_0;
[5:0] axi_wait_cnt_1;
[5:0] axi_wait_num_0;
[5:0] axi_wait_num_1;
[31:0] rdn_num_0;
[31:0] rdn_num_1;
reg
reg
[31:0] o_rdata;
[31:0] mem[63:0];
initial begin
$mem_alloc();
end
always@(posedge clk or negedge rstn) begin
if (!rstn) begin
rdn_num_0 <= 32'd0;
rdn_num_1 <= 32'd0;
end else begin
rdn_num_0 <= $random;
rdn_num_1 <= $random;
end
end
always@(posedge clk or negedge rstn) begin
if (!rstn) begin
axi_wait_cnt_0 <= 6'd0;
axi_wait_num_0 <= 6'd8;
end else if (i_arvalid & o_arready) begin
axi_wait_cnt_0 <= 6'd0;
axi_wait_num_0 <= rdn_num_0[5:0];
end else if (i_arvalid & !o_arready) begin
if (axi_wait_cnt_0==axi_wait_num_0) begin
o_rresp = 2'b00;
o_rvalid = (r_cs==ST_R_READ);
o_rlast = o_rvalid & (rdcnt==arlen);
o_rid
= arid;
o_wready = (w_cs==ST_W_WRITE);
o_bresp = 2'b00;
o_bid
= awid;
o_bvalid = (w_cs==ST_W_END);
endmodule