Line 97... |
Line 97... |
|
|
parameter IDLE = 0;
|
parameter IDLE = 0;
|
parameter DESC_RD = 1;
|
parameter DESC_RD = 1;
|
parameter DATA_WAIT = 2;
|
parameter DATA_WAIT = 2;
|
parameter TXFR = 3;
|
parameter TXFR = 3;
|
|
parameter MEM_WRITE2 = 4;
|
|
parameter MEM_WRITE3 = 5;
|
|
parameter MEM_WRITE4 = 6;
|
|
|
|
|
//-------------------------------------------
|
//-------------------------------------------
|
// Input Declaration
|
// Input Declaration
|
//------------------------------------------
|
//------------------------------------------
|
Line 197... |
Line 200... |
|
|
//----------------------------------------
|
//----------------------------------------
|
// Register Declration
|
// Register Declration
|
//----------------------------------------
|
//----------------------------------------
|
|
|
reg [1:0] state ;
|
reg [2:0] state ;
|
reg [15:0] cnt ;
|
reg [15:0] cnt ;
|
reg [TAR_WD-1:0] wbo_taddr ;
|
reg [TAR_WD-1:0] wbo_taddr ;
|
reg [ADR_WD-1:0] wbo_addr ;
|
reg [ADR_WD-1:0] wbo_addr ;
|
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 [15:0] mem_addr ;
|
reg [15:0] mem_addr ;
|
|
|
wire mem_wr = (state == TXFR) ? wbo_ack: 1'b0 ;
|
|
|
|
// Generate Next Address, to fix the read to address inc issue
|
|
wire [15:0] taddr = mem_addr+1;
|
|
|
|
assign mem_din[7:0] = (mem_addr[1:0] == 2'b00) ? wbo_dout[7:0] :
|
|
(mem_addr[1:0] == 2'b01) ? wbo_dout[15:8] :
|
|
(mem_addr[1:0] == 2'b10) ? wbo_dout[23:16] : wbo_dout[31:24] ;
|
|
|
|
assign mem_din[8] = (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
|
|
|
|
reg [3:0] desc_ptr;
|
reg [3:0] desc_ptr;
|
|
reg [23:0] tWrData; // Temp Write Data
|
|
reg [8:0] mem_din;
|
|
reg mem_wr;
|
|
|
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
|
state <= IDLE;
|
state <= IDLE;
|
wbo_taddr <= 0;
|
wbo_taddr <= 0;
|
Line 231... |
Line 229... |
wbo_we <= 0;
|
wbo_we <= 0;
|
wbo_be <= 0;
|
wbo_be <= 0;
|
wbo_cyc <= 0;
|
wbo_cyc <= 0;
|
desc_ptr <= 0;
|
desc_ptr <= 0;
|
mem_addr <= 0;
|
mem_addr <= 0;
|
|
mem_din <= 0;
|
|
tWrData <= 0;
|
|
mem_wr <= 0;
|
end
|
end
|
else begin
|
else begin
|
case(state)
|
case(state)
|
IDLE: begin
|
IDLE: begin
|
|
mem_wr <= 0;
|
// Check for Descriptor Q not empty
|
// Check for Descriptor Q not empty
|
if(!desc_q_empty) begin
|
if(!desc_q_empty) begin
|
wbo_taddr <= mem_taddr;
|
wbo_taddr <= mem_taddr;
|
wbo_addr <= {cfg_desc_baddr[15:6],desc_ptr[3:0]};
|
wbo_addr <= {cfg_desc_baddr[15:6],desc_ptr[3:0]};
|
wbo_be <= 4'hF;
|
wbo_be <= 4'hF;
|
Line 260... |
Line 262... |
state <= DATA_WAIT;
|
state <= DATA_WAIT;
|
end
|
end
|
end
|
end
|
|
|
DATA_WAIT: begin
|
DATA_WAIT: begin
|
|
mem_wr <= 0; // Reset the write for handling interburst
|
// check for internal memory not full and initiate
|
// check for internal memory not full and initiate
|
// the transfer
|
// the transfer
|
if(!mem_full) begin
|
if(!(mem_full || mem_afull)) 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'b0;
|
wbo_we <= 1'b0;
|
wbo_be <= 4'hF;
|
wbo_be <= 4'hF;
|
Line 274... |
Line 277... |
state <= TXFR;
|
state <= TXFR;
|
end
|
end
|
end
|
end
|
TXFR: begin
|
TXFR: begin
|
if(wbo_ack) begin
|
if(wbo_ack) begin
|
mem_addr <= mem_addr+1;
|
wbo_cyc <= 1'b0;
|
|
wbo_stb <= 1'b0;
|
|
mem_addr <= mem_addr+4;
|
|
mem_din[7:0] <= wbo_dout[7:0]; // Write First Byte
|
|
tWrData <= wbo_dout[31:8];
|
|
mem_din[8] <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
|
|
mem_wr <= 1;
|
cnt <= cnt-1;
|
cnt <= cnt-1;
|
wbo_addr <= taddr[14:2];
|
|
wbo_be <= 4'hF;
|
|
if(cnt == 1) begin
|
if(cnt == 1) begin
|
wbo_stb <= 1'b0;
|
|
wbo_cyc <= 1'b0;
|
|
state <= IDLE;
|
state <= IDLE;
|
|
end else begin
|
|
state <= MEM_WRITE2;
|
end
|
end
|
else if(mem_afull) begin // to handle the interburst fifo full case
|
|
wbo_cyc <= 1'b0;
|
|
wbo_stb <= 1'b0;
|
|
end
|
end
|
end else if(!mem_full) begin // to handle interbust fifo full cases
|
end
|
wbo_cyc <= 1'b1;
|
MEM_WRITE2: begin // Write 2nd Byte
|
wbo_stb <= 1'b1;
|
if(!(mem_full || mem_afull)) begin // to handle the interburst fifo full case
|
|
mem_din[7:0] <= tWrData[7:0];
|
|
mem_din[8] <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
|
|
mem_wr <= 1;
|
|
cnt <= cnt-1;
|
|
if(cnt == 1) begin
|
|
state <= IDLE;
|
|
end else begin
|
|
state <= MEM_WRITE3;
|
|
end
|
|
end else begin
|
|
mem_wr <= 0;
|
|
end
|
|
end
|
|
MEM_WRITE3: begin // Write 3rd Byte
|
|
if(!(mem_full || mem_afull)) begin // to handle the interburst fifo full case
|
|
mem_din[7:0] <= tWrData[15:8];
|
|
mem_din[8] <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
|
|
mem_wr <= 1;
|
|
cnt <= cnt-1;
|
|
if(cnt == 1) begin
|
|
state <= IDLE;
|
|
end else begin
|
|
state <= MEM_WRITE4;
|
|
end
|
|
end else begin
|
|
mem_wr <= 0;
|
|
end
|
|
end
|
|
MEM_WRITE4: begin // Write 4th Byte
|
|
if(!(mem_full || mem_afull)) begin // to handle the interburst fifo full case
|
|
mem_din[7:0] <= tWrData[23:16];
|
|
mem_din[8] <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
|
|
mem_wr <= 1;
|
|
cnt <= cnt-1;
|
|
if(cnt == 1) begin
|
|
state <= IDLE;
|
|
end else begin
|
|
state <= DATA_WAIT;
|
|
end
|
|
end else begin
|
|
mem_wr <= 0;
|
end
|
end
|
end
|
end
|
endcase
|
endcase
|
end
|
end
|
end
|
end
|