Line 56... |
Line 56... |
mem_addr ,
|
mem_addr ,
|
mem_empty ,
|
mem_empty ,
|
mem_aempty ,
|
mem_aempty ,
|
mem_rd ,
|
mem_rd ,
|
mem_dout ,
|
mem_dout ,
|
|
mem_eop ,
|
|
|
|
cfg_desc_baddr ,
|
|
desc_req ,
|
|
desc_ack ,
|
|
desc_disccard ,
|
|
desc_data ,
|
|
|
|
|
// Slave Interface Signal
|
// Slave Interface Signal
|
wbo_din ,
|
wbo_din ,
|
wbo_taddr ,
|
wbo_taddr ,
|
wbo_addr ,
|
wbo_addr ,
|
Line 77... |
Line 85... |
parameter BE_WD = 2; // Byte Enable
|
parameter BE_WD = 2; // Byte Enable
|
parameter ADR_WD = 28; // Address Width
|
parameter ADR_WD = 28; // Address Width
|
parameter TAR_WD = 4; // Target Width
|
parameter TAR_WD = 4; // Target Width
|
|
|
// State Machine
|
// State Machine
|
parameter IDLE = 0;
|
parameter IDLE = 2'h0;
|
parameter XFR = 1;
|
parameter XFR = 2'h1;
|
|
parameter DESC_WAIT = 2'h2;
|
|
parameter DESC_XFR = 2'h3;
|
|
|
input clk ; // CLK_I The clock input [CLK_I] coordinates all activities
|
input clk ; // CLK_I The clock input [CLK_I] coordinates all activities
|
// for the internal logic within the WISHBONE interconnect.
|
// for the internal logic within the WISHBONE interconnect.
|
// All WISHBONE output signals are registered at the
|
// All WISHBONE output signals are registered at the
|
// rising edge of [CLK_I].
|
// rising edge of [CLK_I].
|
Line 99... |
Line 109... |
input [15:0] mem_addr; // memory address
|
input [15:0] mem_addr; // memory address
|
input mem_empty; // memory empty
|
input mem_empty; // memory empty
|
input mem_aempty; // memory empty
|
input mem_aempty; // memory empty
|
output mem_rd; // memory read
|
output mem_rd; // memory read
|
input [7:0] mem_dout; // memory read data
|
input [7:0] mem_dout; // memory read data
|
|
input mem_eop; // Last Transfer indication
|
|
|
|
//----------------------------------------
|
|
// Discriptor defination
|
|
//----------------------------------------
|
|
input desc_req; // descriptor request
|
|
output desc_ack; // descriptor ack
|
|
input desc_disccard;// descriptor discard
|
|
input [15:6] cfg_desc_baddr; // descriptor memory base address
|
|
input [31:0] desc_data; // descriptor data
|
|
|
//------------------------------------------
|
//------------------------------------------
|
// External Memory WB Interface
|
// External Memory WB Interface
|
//------------------------------------------
|
//------------------------------------------
|
output [TAR_WD-1:0] wbo_taddr ;
|
output [TAR_WD-1:0] wbo_taddr ;
|
Line 175... |
Line 195... |
reg wbo_stb ;
|
reg wbo_stb ;
|
reg wbo_we ;
|
reg wbo_we ;
|
reg [BE_WD-1:0] wbo_be ;
|
reg [BE_WD-1:0] wbo_be ;
|
reg wbo_cyc ;
|
reg wbo_cyc ;
|
reg [D_WD-1:0] wbo_din ;
|
reg [D_WD-1:0] wbo_din ;
|
reg state ;
|
reg [1:0] state ;
|
|
|
reg mem_rd ;
|
reg mem_rd ;
|
|
reg [3:0] desc_ptr ; // descriptor pointer, in 32 bit mode
|
|
reg mem_eop_l ; // delayed eop signal
|
|
reg desc_ack ; // delayed eop signal
|
|
|
always @(negedge rst_n or posedge clk) begin
|
always @(negedge rst_n or posedge clk) begin
|
if(rst_n == 0) begin
|
if(rst_n == 0) begin
|
wbo_taddr <= 0;
|
wbo_taddr <= 0;
|
wbo_addr <= 0;
|
wbo_addr <= 0;
|
Line 190... |
Line 212... |
wbo_we <= 0;
|
wbo_we <= 0;
|
wbo_be <= 0;
|
wbo_be <= 0;
|
wbo_cyc <= 0;
|
wbo_cyc <= 0;
|
wbo_din <= 0;
|
wbo_din <= 0;
|
mem_rd <= 0;
|
mem_rd <= 0;
|
|
desc_ptr <= 0;
|
|
mem_eop_l <= 0;
|
|
desc_ack <= 0;
|
state <= IDLE;
|
state <= IDLE;
|
end
|
end
|
else begin
|
else begin
|
case(state)
|
case(state)
|
IDLE: begin
|
IDLE: begin
|
|
desc_ack <= 0;
|
if(!mem_empty) begin
|
if(!mem_empty) begin
|
wbo_taddr <= mem_taddr;
|
wbo_taddr <= mem_taddr;
|
wbo_addr <= mem_addr[14:2];
|
wbo_addr <= mem_addr[14:2];
|
wbo_stb <= 1'b1;
|
wbo_stb <= 1'b1;
|
wbo_we <= 1'b1;
|
wbo_we <= 1'b1;
|
wbo_be <= 1 << mem_addr[1:0];
|
wbo_be <= 1 << mem_addr[1:0];
|
wbo_cyc <= 1;
|
wbo_cyc <= 1;
|
wbo_din <= {mem_dout,mem_dout,mem_dout,mem_dout};
|
wbo_din <= {mem_dout,mem_dout,mem_dout,mem_dout};
|
|
mem_eop_l <= mem_eop;
|
mem_rd <= 1;
|
mem_rd <= 1;
|
state <= XFR;
|
state <= XFR;
|
end
|
end
|
end
|
end
|
XFR: begin
|
XFR: begin
|
if(wbo_ack) begin
|
if(wbo_ack) begin
|
|
mem_eop_l <= mem_eop;
|
wbo_addr <= mem_addr[14:2];
|
wbo_addr <= mem_addr[14:2];
|
wbo_be <= 1 << mem_addr[1:0];
|
wbo_be <= 1 << mem_addr[1:0];
|
wbo_din <= {mem_dout,mem_dout,mem_dout,mem_dout};
|
wbo_din <= {mem_dout,mem_dout,mem_dout,mem_dout};
|
if(mem_aempty || mem_empty) begin
|
if(mem_eop_l) begin
|
|
state <= DESC_WAIT;
|
|
end
|
|
else if(mem_aempty || mem_empty) begin
|
wbo_stb <= 1'b0;
|
wbo_stb <= 1'b0;
|
wbo_cyc <= 0;
|
wbo_cyc <= 0;
|
state <= IDLE;
|
state <= IDLE;
|
end else begin
|
end else begin
|
mem_rd <= 1;
|
mem_rd <= 1;
|
end
|
end
|
end else begin
|
end else begin
|
mem_rd <= 0;
|
mem_rd <= 0;
|
end
|
end
|
end
|
end
|
|
DESC_WAIT: begin
|
|
if(desc_req) begin
|
|
desc_ack <= 1;
|
|
if(desc_disccard) begin // if the Desc is discarded
|
|
state <= IDLE;
|
|
end
|
|
else begin
|
|
wbo_addr <= {cfg_desc_baddr[15:6],desc_ptr[3:0]}; // Each Transfer is 32bit
|
|
wbo_be <= 4'hF;
|
|
wbo_din <= desc_data;
|
|
wbo_we <= 1'b1;
|
|
wbo_stb <= 1'b1;
|
|
wbo_cyc <= 1;
|
|
state <= DESC_XFR;
|
|
desc_ptr <= desc_ptr+1;
|
|
end
|
|
end
|
|
end
|
|
DESC_XFR: begin
|
|
desc_ack <= 0;
|
|
if(wbo_ack) begin
|
|
wbo_stb <= 1'b0;
|
|
wbo_cyc <= 1'b0;
|
|
state <= IDLE;
|
|
end
|
|
end
|
|
|
endcase
|
endcase
|
end
|
end
|
end
|
end
|
|
|
|
|