`timescale 1ns / 1ps
module ufo_compute_ip#
(
parameter brust_len=16
)
(
input clk,
input rst_n,
input [31:0] rd_data,
output reg [31:0] wr_data,
input M_AXI_WVALID0,
input M_AXI_WREADY,
input M_AXI_RVALID,
input M_AXI_RREADY0,
input [7:0]read_burst_len,
input [7:0]write_burst_len,
input compute_start,
output compute_done
);
integer i ;
reg [31:0] compute_data [0:brust_len-1];
reg [7:0]RD_CNT;
reg [7:0]WR_CNT;
reg co_done;
assign compute_done=co_done;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
co_done<=1'b0;
else if(compute_start)
co_done<=1'b1;
else
co_done<=1'b0;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
RD_CNT<=8'd0;
else if(M_AXI_RVALID && M_AXI_RREADY0)begin
if(RD_CNT==read_burst_len-1)
RD_CNT<=8'd0;
else
RD_CNT<=RD_CNT+1'b1;
end
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
for(i=0;i<16;i=i+1)
compute_data[i]<=32'd0;
end
else if(M_AXI_RVALID && M_AXI_RREADY0)
compute_data[RD_CNT]<=rd_data;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
WR_CNT<=8'd0;
else if(M_AXI_WVALID0 && M_AXI_WREADY)begin
if(WR_CNT==(write_burst_len-1))
WR_CNT<=8'd0;
else
WR_CNT<=WR_CNT+1'b1;
end
end
always@(*)begin
if(!rst_n)
wr_data=32'd0;
else if(M_AXI_WVALID0)
wr_data=compute_data[WR_CNT]+5;
else
wr_data=32'd0;
end
endmodule
`timescale 1ns / 1ps
module ufo_wr_ip#
(
parameter C_AXI_DATA_WIDTH=32,
parameter C_M_AXI_ID_WIDTH=4
)
(
input clk,
input rst_n,
output [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_AWID,
output [32-1 : 0] M_AXI_AWADDR,
output [7 : 0] M_AXI_AWLEN,
output [2 : 0] M_AXI_AWSIZE,
output [1 : 0] M_AXI_AWBURST,
output M_AXI_AWLOCK,
output [3 : 0] M_AXI_AWCACHE,
output [2 : 0] M_AXI_AWPROT,
output [3 : 0] M_AXI_AWQOS,
output M_AXI_AWVALID,
input M_AXI_AWREADY,
output [C_AXI_DATA_WIDTH-1 : 0] M_AXI_WDATA,
output [C_AXI_DATA_WIDTH/8-1 : 0] M_AXI_WSTRB,
output M_AXI_WLAST0,
output M_AXI_WVALID0,
input M_AXI_WREADY,
input [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_BID,
input [1 : 0] M_AXI_BRESP,
input M_AXI_BVALID,
output M_AXI_BREADY,
input write_start,
input [C_AXI_DATA_WIDTH-1 : 0] wdata_current,
input [7:0] wr_burst_len,
input [31:0] wr_addr_current
);
function integer clogb2 (input integer bit_depth);
begin
for(clogb2=0; bit_depth>0; clogb2=clogb2+1)
bit_depth = bit_depth >> 1;
end
endfunction
assign M_AXI_WDATA=wdata_current;
assign M_AXI_AWID=0;
assign M_AXI_AWSIZE=clogb2((C_AXI_DATA_WIDTH/8)-1);
assign M_AXI_AWBURST=2'b01;
assign M_AXI_AWLOCK=1'b0;
assign M_AXI_AWCACHE=4'b0010;
assign M_AXI_AWPROT=3'h0;
assign M_AXI_AWQOS=4'h0;
assign M_AXI_WSTRB={
(C_AXI_DATA_WIDTH/8){
1'b1}};
reg bready;
assign M_AXI_BREADY=bready;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
bready<=1'b0;
else begin
if(M_AXI_AWVALID && M_AXI_AWREADY)
bready<=1'b1;
else if(M_AXI_BREADY && M_AXI_BVALID)
bready<=1'b0;
end
end
reg write_start1;
reg write_start2;
wire pose_write_satr;
assign pose_write_satr=write_start1&(~write_start2);
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
write_start1<=1'b0;
write_start2<=1'b0;
end
else
{
write_start2,write_start1}<={
write_start1,write_start};
end
reg awvalid;
assign M_AXI_AWVALID=awvalid;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
awvalid<=1'b0;
else if(pose_write_satr)
awvalid<=1'b1;
else if(M_AXI_AWVALID && M_AXI_AWREADY)
awvalid<=