v1.0
This commit is contained in:
85
rtl/async_fifo.v
Normal file
85
rtl/async_fifo.v
Normal file
@@ -0,0 +1,85 @@
|
||||
module async_fifo #(
|
||||
parameter DATA_WIDTH = 8,
|
||||
parameter FIFO_DEPTH = 16
|
||||
)(
|
||||
input wr_clk,
|
||||
input wr_rst_n,
|
||||
input wr_en,
|
||||
input [DATA_WIDTH-1:0] wr_data,
|
||||
output full,
|
||||
|
||||
input rd_clk,
|
||||
input rd_rst_n,
|
||||
input rd_en,
|
||||
output [DATA_WIDTH-1:0] rd_data,
|
||||
output empty
|
||||
);
|
||||
|
||||
reg [DATA_WIDTH-1:0] mem [FIFO_DEPTH -1 : 0];
|
||||
reg [$clog2(FIFO_DEPTH) : 0] wr_ptr, rd_ptr;
|
||||
|
||||
integer i;
|
||||
always@(posedge wr_clk or negedge wr_rst_n) begin
|
||||
if(!wr_rst_n) begin
|
||||
wr_ptr <= 'd0;
|
||||
for(i=0;i<FIFO_DEPTH;i=i+1) begin
|
||||
mem[i] <= 'd0;
|
||||
end
|
||||
end else if(wr_en && !full) begin
|
||||
mem[wr_ptr[$clog2(FIFO_DEPTH)-1:0]] <= wr_data;
|
||||
wr_ptr <= wr_ptr + 1'b1;
|
||||
end else begin
|
||||
wr_ptr <= wr_ptr;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge rd_clk or negedge rd_rst_n) begin
|
||||
if(!rd_rst_n) begin
|
||||
rd_ptr <= 'd0;
|
||||
end else if(rd_en && !empty) begin
|
||||
rd_ptr <= rd_ptr + 1'b1;
|
||||
end else begin
|
||||
rd_ptr <= rd_ptr;
|
||||
end
|
||||
end
|
||||
|
||||
wire [$clog2(FIFO_DEPTH):0] wr_ptr_g , rd_ptr_g;
|
||||
|
||||
assign wr_ptr_g = wr_ptr ^(wr_ptr >>1);
|
||||
assign rd_ptr_g = rd_ptr ^(rd_ptr >>1);
|
||||
|
||||
reg [$clog2(FIFO_DEPTH):0] wr_ptr_gr , wr_ptr_grr;
|
||||
reg [$clog2(FIFO_DEPTH):0] rd_ptr_gr , rd_ptr_grr;
|
||||
|
||||
always@(posedge rd_clk or negedge rd_rst_n) begin
|
||||
if(!rd_rst_n) begin
|
||||
wr_ptr_gr <= 0;
|
||||
wr_ptr_grr <=0;
|
||||
end else begin
|
||||
wr_ptr_gr <= wr_ptr_g;
|
||||
wr_ptr_grr <= wr_ptr_gr;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge wr_clk or negedge wr_rst_n) begin
|
||||
if(!wr_rst_n) begin
|
||||
rd_ptr_gr <= 0;
|
||||
rd_ptr_grr <=0;
|
||||
end else begin
|
||||
rd_ptr_gr <= rd_ptr_g;
|
||||
rd_ptr_grr <= rd_ptr_gr;
|
||||
end
|
||||
end
|
||||
|
||||
assign rd_data = mem[rd_ptr[$clog2(FIFO_DEPTH)-1:0]];
|
||||
|
||||
|
||||
assign full = ((wr_ptr_g[$clog2(FIFO_DEPTH)] !=
|
||||
rd_ptr_grr[$clog2(FIFO_DEPTH)]) && (wr_ptr_g[$clog2(FIFO_DEPTH)-1] !=
|
||||
rd_ptr_grr[$clog2(FIFO_DEPTH)]-1) && (wr_ptr_g[$clog2(FIFO_DEPTH)-2:0] ==
|
||||
rd_ptr_grr[$clog2(FIFO_DEPTH)-2 : 0])) ? 1:0;
|
||||
|
||||
assign empty = (rd_ptr_g[$clog2(FIFO_DEPTH) : 0] ==
|
||||
wr_ptr_grr[$clog2(FIFO_DEPTH) :0]) ? 1:0;
|
||||
|
||||
endmodule
|
214
rtl/rchannel.v
Normal file
214
rtl/rchannel.v
Normal file
@@ -0,0 +1,214 @@
|
||||
module rchannel (
|
||||
input clk,
|
||||
input rst_n,
|
||||
input axi_s_arvalid,
|
||||
input [7:0] axi_s_arlen,
|
||||
input [25:0] axi_s_araddr,
|
||||
output axi_s_arready,
|
||||
output axi_s_rvalid,
|
||||
output axi_s_rlast,
|
||||
output [63:0] axi_s_rdata,
|
||||
output rframe_valid,
|
||||
output [159:0] rframe_data,
|
||||
input rframe_ready,
|
||||
input array2axi_rdata_valid,
|
||||
input [127:0] array2axi_rdata
|
||||
);
|
||||
|
||||
wire rsof,reof;
|
||||
reg [15:0] rraddr;
|
||||
reg [5:0] rcaddr;
|
||||
wire [127:0] wdata;
|
||||
wire [7:0] arlen;
|
||||
|
||||
wire [15:0] arraddr;
|
||||
wire [5:0] arcaddr;
|
||||
|
||||
reg [6:0] rframe_cnt;
|
||||
reg [7:0] rdata_cnt;
|
||||
|
||||
|
||||
reg [1:0] cur_state,next_state;
|
||||
localparam [1:0] RCH_IDLE = 2'b00;
|
||||
localparam [1:0] RCH_GET_RADDR = 2'b01;
|
||||
localparam [1:0] RCH_SD_RADDR = 2'b10;
|
||||
|
||||
|
||||
|
||||
|
||||
wire sync_fifo_ar_wr_en;
|
||||
wire sync_fifo_ar_rd_en;
|
||||
wire sync_fifo_ar_full;
|
||||
wire sync_fifo_ar_empty;
|
||||
wire [29:0] sync_fifo_ar_wr_data;
|
||||
wire [29:0] sync_fifo_ar_rd_data;
|
||||
|
||||
|
||||
sync_fifo #(.DATA_WIDTH(30),
|
||||
.FIFO_DEPTH(4)
|
||||
) sync_fifo_ar (
|
||||
.clk (clk),
|
||||
.rst_n (rst_n),
|
||||
.wr_en (sync_fifo_ar_wr_en),
|
||||
.wr_data (sync_fifo_ar_wr_data),
|
||||
.full (sync_fifo_ar_full),
|
||||
.rd_en (sync_fifo_ar_rd_en),
|
||||
.rd_data (sync_fifo_ar_rd_data),
|
||||
.empty (sync_fifo_ar_empty)
|
||||
);
|
||||
|
||||
wire sync_fifo_arlen_wr_en;
|
||||
wire sync_fifo_arlen_rd_en;
|
||||
wire sync_fifo_arlen_full;
|
||||
wire sync_fifo_arlen_empty;
|
||||
wire [7:0] sync_fifo_arlen_wr_data;
|
||||
wire [7:0] sync_fifo_arlen_rd_data;
|
||||
|
||||
|
||||
sync_fifo #(.DATA_WIDTH(8),
|
||||
.FIFO_DEPTH(4)
|
||||
) sync_fifo_arlen (
|
||||
.clk (clk),
|
||||
.rst_n (rst_n),
|
||||
.wr_en (sync_fifo_arlen_wr_en),
|
||||
.wr_data (sync_fifo_arlen_wr_data),
|
||||
.full (sync_fifo_arlen_full),
|
||||
.rd_en (sync_fifo_arlen_rd_en),
|
||||
.rd_data (sync_fifo_arlen_rd_data),
|
||||
.empty (sync_fifo_arlen_empty)
|
||||
);
|
||||
|
||||
wire sync_fifo_r_wr_en;
|
||||
wire sync_fifo_r_rd_en;
|
||||
wire sync_fifo_r_full;
|
||||
wire sync_fifo_r_empty;
|
||||
wire [127:0]sync_fifo_r_wr_data;
|
||||
wire [63:0] sync_fifo_r_rd_data;
|
||||
|
||||
|
||||
sync_fifo_128_to_64 #(.DATA_IN_WIDTH(128),
|
||||
.FIFO_DEPTH(8),
|
||||
.DATA_OUT_WIDTH(64)
|
||||
) sync_fifo_r (
|
||||
.clk (clk),
|
||||
.rst_n (rst_n),
|
||||
.wr_en (sync_fifo_r_wr_en),
|
||||
.wr_data (sync_fifo_r_wr_data),
|
||||
.full (sync_fifo_r_full),
|
||||
.rd_en (sync_fifo_r_rd_en),
|
||||
.rd_data (sync_fifo_r_rd_data),
|
||||
.empty (sync_fifo_r_empty)
|
||||
);
|
||||
|
||||
|
||||
assign axi_s_arready = !sync_fifo_ar_full;
|
||||
assign rframe_valid = (cur_state == RCH_SD_RADDR);
|
||||
assign rframe_data = {rsof,reof,rraddr,rcaddr,128'b0,arlen};
|
||||
assign axi_s_rvalid = !sync_fifo_r_empty;
|
||||
assign axi_s_rdata = sync_fifo_r_rd_data;
|
||||
assign axi_s_rlast = axi_s_rvalid && (rdata_cnt == sync_fifo_arlen_rd_data);
|
||||
|
||||
assign sync_fifo_ar_wr_en = axi_s_arvalid && axi_s_arready;
|
||||
assign sync_fifo_ar_wr_data = {axi_s_araddr[25:4],axi_s_arlen};
|
||||
assign sync_fifo_ar_rd_en = rframe_ready && rframe_valid &&
|
||||
rframe_cnt == arlen>>1'b1 && !sync_fifo_ar_empty;
|
||||
|
||||
assign {arraddr , arcaddr, arlen} = sync_fifo_ar_rd_data;
|
||||
assign sync_fifo_arlen_wr_en = rframe_valid && rframe_ready &&
|
||||
rframe_cnt == arlen >> 1'b1;
|
||||
assign sync_fifo_arlen_wr_data = arlen;
|
||||
assign sync_fifo_arlen_rd_en = axi_s_rlast && axi_s_rvalid;
|
||||
assign rsof = rframe_valid && (rframe_cnt == 7'b0 || rcaddr == 6'd0);
|
||||
assign reof = rframe_valid && (rframe_cnt == arlen >>1'b1 || rcaddr == 6'h3f);
|
||||
|
||||
|
||||
assign sync_fifo_r_wr_en = array2axi_rdata_valid && !sync_fifo_r_full;
|
||||
assign sync_fifo_r_wr_data = array2axi_rdata;
|
||||
assign sync_fifo_r_rd_en = !sync_fifo_r_empty;
|
||||
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
cur_state <= RCH_IDLE;
|
||||
end else begin
|
||||
cur_state <= next_state;
|
||||
end
|
||||
end
|
||||
|
||||
always@(*) begin
|
||||
case(cur_state)
|
||||
RCH_IDLE: begin
|
||||
if(sync_fifo_ar_wr_en) begin
|
||||
next_state <= RCH_GET_RADDR;
|
||||
end else begin
|
||||
next_state <= RCH_IDLE;
|
||||
end
|
||||
end
|
||||
RCH_GET_RADDR: begin
|
||||
next_state <= RCH_SD_RADDR;
|
||||
end
|
||||
RCH_SD_RADDR: begin
|
||||
if(rframe_ready && rframe_valid && rframe_cnt == arlen >>1) begin
|
||||
next_state <= RCH_IDLE;
|
||||
end else begin
|
||||
next_state <= RCH_SD_RADDR;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
rraddr <= 'd0;
|
||||
end else if(cur_state == RCH_GET_RADDR) begin
|
||||
rraddr <= arraddr;
|
||||
if(rframe_valid && rframe_ready) begin
|
||||
if(rcaddr == 6'b111111) begin
|
||||
rraddr <= rraddr + 1'b1;
|
||||
end else begin
|
||||
rraddr <= rraddr;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
rcaddr <= 'd0;
|
||||
end else if (cur_state == RCH_GET_RADDR) begin
|
||||
rcaddr <= arcaddr;
|
||||
if(rframe_valid && rframe_ready) begin
|
||||
if(rcaddr == 6'b111111) begin
|
||||
rcaddr <= 'd0;
|
||||
end else begin
|
||||
rcaddr <= rcaddr + 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
rframe_cnt <= 'd0;
|
||||
end else if (rframe_valid && rframe_ready) begin
|
||||
if(rframe_cnt == arlen>>1'b1) begin
|
||||
rframe_cnt <= 'd0;
|
||||
end else begin
|
||||
rframe_cnt <= rframe_cnt + 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
rdata_cnt <= 'd0;
|
||||
end else if(axi_s_rvalid) begin
|
||||
if(rdata_cnt == sync_fifo_arlen_rd_data) begin
|
||||
rdata_cnt <= 'd0;
|
||||
end else begin
|
||||
rdata_cnt <= rdata_cnt + 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
76
rtl/sync_fifo.v
Normal file
76
rtl/sync_fifo.v
Normal file
@@ -0,0 +1,76 @@
|
||||
module sync_fifo #(
|
||||
parameter DATA_WIDTH = 8,
|
||||
parameter FIFO_DEPTH = 16
|
||||
)(
|
||||
input clk,
|
||||
input rst_n,
|
||||
input wr_en,
|
||||
input [DATA_WIDTH-1:0] wr_data,
|
||||
output full,
|
||||
input rd_en,
|
||||
output [DATA_WIDTH-1:0] rd_data,
|
||||
output empty
|
||||
);
|
||||
localparam ADDR_WIDTH = $clog2(FIFO_DEPTH);
|
||||
reg [DATA_WIDTH-1:0] mem [0 : FIFO_DEPTH -1];
|
||||
reg [ADDR_WIDTH : 0] wr_ptr, rd_ptr ,rd_ptrr;
|
||||
wire [ADDR_WIDTH -1:0] wr_addr ,rd_addr;
|
||||
|
||||
assign wr_addr = wr_ptr[ADDR_WIDTH -1:0];
|
||||
assign rd_addr = rd_ptr[ADDR_WIDTH -1:0];
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
wr_ptr <= 'd0;
|
||||
end else if(wr_en && !full) begin
|
||||
wr_ptr <= wr_ptr + 1'b1;
|
||||
end else begin
|
||||
wr_ptr <= wr_ptr;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
rd_ptr <= 'd0;
|
||||
rd_ptrr <= 'd0;
|
||||
end else if(rd_en && !empty) begin
|
||||
|
||||
rd_ptr <= rd_ptr + 1'b1;
|
||||
rd_ptrr <= rd_ptr;
|
||||
end else begin
|
||||
rd_ptr <= rd_ptr;
|
||||
rd_ptrr <= rd_ptr;
|
||||
end
|
||||
end
|
||||
|
||||
integer i;
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
for(i=0;i<FIFO_DEPTH;i=i+1) begin
|
||||
mem[i] <= 'd0;
|
||||
end
|
||||
end else if(wr_en && !full) begin
|
||||
mem[wr_addr] <= wr_data;
|
||||
end else begin
|
||||
mem[wr_addr] <= mem[wr_addr];
|
||||
end
|
||||
end
|
||||
|
||||
/*always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
r_rd_data <= 'd0;
|
||||
end else if(rd_en && !empty) begin
|
||||
r_rd_data <= mem[rd_addr];
|
||||
end else begin
|
||||
r_rd_data <= r_rd_data;
|
||||
end
|
||||
end*/
|
||||
|
||||
assign rd_data = mem[rd_addr];
|
||||
|
||||
|
||||
assign full = ((wr_ptr[ADDR_WIDTH] != rd_ptr[ADDR_WIDTH]) &&
|
||||
(wr_ptr[ADDR_WIDTH -1:0] == rd_ptr[ADDR_WIDTH -1:0])) ? 1:0;
|
||||
assign empty = (wr_ptr == rd_ptr) ? 1:0;
|
||||
|
||||
endmodule
|
62
rtl/sync_fifo_128_to_64.v
Normal file
62
rtl/sync_fifo_128_to_64.v
Normal file
@@ -0,0 +1,62 @@
|
||||
module sync_fifo_128_to_64 #(
|
||||
parameter DATA_IN_WIDTH = 128,
|
||||
parameter DATA_OUT_WIDTH = 64,
|
||||
parameter FIFO_DEPTH = 16,
|
||||
parameter ADDR_WIDTH = $clog2(FIFO_DEPTH)
|
||||
)(
|
||||
input clk,
|
||||
input rst_n,
|
||||
input wr_en,
|
||||
input [DATA_IN_WIDTH-1:0] wr_data,
|
||||
output full,
|
||||
input rd_en,
|
||||
output [DATA_OUT_WIDTH-1:0] rd_data,
|
||||
output empty
|
||||
);
|
||||
|
||||
reg [DATA_OUT_WIDTH-1:0] mem [0 :FIFO_DEPTH -1];
|
||||
reg [ADDR_WIDTH : 0] wr_ptr, rd_ptr;
|
||||
wire [ADDR_WIDTH -1:0] wr_addr ,rd_addr;
|
||||
|
||||
assign wr_addr = wr_ptr[ADDR_WIDTH -1:0];
|
||||
assign rd_addr = rd_ptr[ADDR_WIDTH -1:0];
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
wr_ptr <= 'd0;
|
||||
end else if(wr_en && !full) begin
|
||||
wr_ptr <= wr_ptr + 2'd2;
|
||||
end else begin
|
||||
wr_ptr <= wr_ptr;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
rd_ptr <= 'd0;
|
||||
end else if(rd_en && !empty) begin
|
||||
rd_ptr <= rd_ptr + 1'd1;
|
||||
end else begin
|
||||
rd_ptr <= rd_ptr;
|
||||
end
|
||||
end
|
||||
|
||||
integer i;
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
for(i=0;i<FIFO_DEPTH;i=i+1) begin
|
||||
mem[i] <= 'd0;
|
||||
end
|
||||
end else if(wr_en && !full) begin
|
||||
{mem[wr_addr+1'b1],mem[wr_addr]} <= wr_data;
|
||||
end else begin
|
||||
mem[wr_addr] <= mem[wr_addr];
|
||||
end
|
||||
end
|
||||
|
||||
assign rd_data = mem[rd_addr];
|
||||
|
||||
assign full = (wr_ptr - rd_ptr == FIFO_DEPTH) ? 1:0;
|
||||
assign empty = (wr_ptr == rd_ptr) ? 1:0;
|
||||
|
||||
endmodule
|
62
rtl/sync_fifo_64_to_128.v
Normal file
62
rtl/sync_fifo_64_to_128.v
Normal file
@@ -0,0 +1,62 @@
|
||||
module sync_fifo_64_to_128 #(
|
||||
parameter DATA_IN_WIDTH = 64,
|
||||
parameter DATA_OUT_WIDTH = 128,
|
||||
parameter FIFO_DEPTH = 16,
|
||||
parameter ADDR_WIDTH = $clog2(FIFO_DEPTH)
|
||||
)(
|
||||
input clk,
|
||||
input rst_n,
|
||||
input wr_en,
|
||||
input [DATA_IN_WIDTH-1:0] wr_data,
|
||||
output full,
|
||||
input rd_en,
|
||||
output [DATA_OUT_WIDTH-1:0] rd_data,
|
||||
output empty
|
||||
);
|
||||
|
||||
reg [DATA_IN_WIDTH-1:0] mem [FIFO_DEPTH -1 : 0];
|
||||
reg [ADDR_WIDTH : 0] wr_ptr, rd_ptr;
|
||||
wire [ADDR_WIDTH -1:0] wr_addr ,rd_addr;
|
||||
|
||||
assign wr_addr = wr_ptr[ADDR_WIDTH -1:0];
|
||||
assign rd_addr = rd_ptr[ADDR_WIDTH -1:0];
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
wr_ptr <= 'd0;
|
||||
end else if(wr_en && !full) begin
|
||||
wr_ptr <= wr_ptr + 1'b1;
|
||||
end else begin
|
||||
wr_ptr <= wr_ptr;
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
rd_ptr <= 'd0;
|
||||
end else if(rd_en && !empty) begin
|
||||
rd_ptr <= rd_ptr + 2'd2;
|
||||
end else begin
|
||||
rd_ptr <= rd_ptr;
|
||||
end
|
||||
end
|
||||
|
||||
integer i;
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
for(i=0;i<FIFO_DEPTH;i=i+1) begin
|
||||
mem[i] <= 'd0;
|
||||
end
|
||||
end else if(wr_en && !full) begin
|
||||
mem[wr_addr] <= wr_data;
|
||||
end else begin
|
||||
mem[wr_addr] <= mem[wr_addr];
|
||||
end
|
||||
end
|
||||
|
||||
assign rd_data = {mem[rd_addr+1],mem[rd_addr]};
|
||||
|
||||
assign full = (wr_ptr - rd_ptr == FIFO_DEPTH) ? 1:0;
|
||||
assign empty = (wr_ptr - rd_ptr <=1) ? 1:0;
|
||||
|
||||
endmodule
|
168
rtl/wchannel.v
Normal file
168
rtl/wchannel.v
Normal file
@@ -0,0 +1,168 @@
|
||||
module wchannel(
|
||||
input clk,
|
||||
input rst_n,
|
||||
|
||||
input axi_s_awvalid,
|
||||
input [7:0] axi_s_awlen,
|
||||
input [25:0] axi_s_awaddr,
|
||||
output axi_s_awready,
|
||||
|
||||
input axi_s_wvalid,
|
||||
input axi_s_wlast,
|
||||
input [63:0] axi_s_wdata,
|
||||
output axi_s_wready,
|
||||
|
||||
output wframe_valid,
|
||||
output [159:0] wframe_data,
|
||||
input wframe_ready
|
||||
);
|
||||
wire wsof,weof;
|
||||
reg [15:0] wraddr;
|
||||
reg [5:0] wcaddr;
|
||||
wire [127:0] wdata;
|
||||
|
||||
wire [7:0] awlen;
|
||||
wire [15:0] awraddr;
|
||||
wire [5:0] awcaddr;
|
||||
|
||||
reg [6:0] wframe_cnt;
|
||||
|
||||
reg [1:0] cur_state,next_state;
|
||||
localparam [1:0] WCH_IDLE = 2'b01;
|
||||
localparam [1:0] WCH_SD_WADDR = 2'b10;
|
||||
localparam [1:0] WCH_SD_WDATA = 2'b11;
|
||||
|
||||
wire sync_fifo_aw_wr_en;
|
||||
wire [29:0] sync_fifo_aw_wr_data;
|
||||
wire sync_fifo_aw_rd_en;
|
||||
wire [29:0] sync_fifo_aw_rd_data;
|
||||
wire sync_fifo_aw_full;
|
||||
wire sync_fifo_aw_empty;
|
||||
|
||||
wire sync_fifo_w_wr_en;
|
||||
wire [63:0] sync_fifo_w_wr_data;
|
||||
wire sync_fifo_w_rd_en;
|
||||
wire [127:0] sync_fifo_w_rd_data;
|
||||
wire sync_fifo_w_full;
|
||||
wire sync_fifo_w_empty;
|
||||
|
||||
assign sync_fifo_aw_wr_en = axi_s_awvalid && axi_s_awready;
|
||||
assign sync_fifo_aw_wr_data = {axi_s_awaddr[25:4],axi_s_awlen};
|
||||
assign sync_fifo_aw_rd_en = wframe_ready && weof && !sync_fifo_aw_empty;
|
||||
assign {awraddr,awcaddr,awlen} = sync_fifo_aw_rd_data;
|
||||
assign axi_s_awready = !sync_fifo_aw_full;
|
||||
|
||||
|
||||
|
||||
assign sync_fifo_w_wr_en = axi_s_wvalid && axi_s_wready;
|
||||
assign sync_fifo_w_wr_data = axi_s_wdata;
|
||||
assign sync_fifo_w_rd_en = wframe_valid && wframe_ready;
|
||||
assign wdata = sync_fifo_w_rd_data;
|
||||
assign axi_s_wready = !sync_fifo_w_full;
|
||||
|
||||
assign wsof = wframe_valid && (wframe_cnt == 7'd0);
|
||||
assign weof = wframe_valid && ((wframe_cnt == awlen >> 1'b1));
|
||||
|
||||
assign wframe_data = {wsof,weof,wraddr,wcaddr,wdata,awlen};
|
||||
assign wframe_valid = !sync_fifo_w_empty && (cur_state == WCH_SD_WDATA);
|
||||
|
||||
sync_fifo #(.DATA_WIDTH(30),
|
||||
.FIFO_DEPTH(4)
|
||||
) sync_fifo_aw (.clk (clk),
|
||||
.rst_n (rst_n),
|
||||
.wr_en (sync_fifo_aw_wr_en),
|
||||
.wr_data (sync_fifo_aw_wr_data),
|
||||
.rd_en (sync_fifo_aw_rd_en),
|
||||
.rd_data (sync_fifo_aw_rd_data),
|
||||
.full (sync_fifo_aw_full),
|
||||
.empty (sync_fifo_aw_empty)
|
||||
);
|
||||
|
||||
sync_fifo_64_to_128 #(
|
||||
.DATA_IN_WIDTH(64),
|
||||
.DATA_OUT_WIDTH(128),
|
||||
.FIFO_DEPTH(8)
|
||||
) sync_fifo_w (.clk (clk),
|
||||
.rst_n (rst_n),
|
||||
.wr_en (sync_fifo_w_wr_en),
|
||||
.wr_data (sync_fifo_w_wr_data),
|
||||
.rd_en (sync_fifo_w_rd_en),
|
||||
.rd_data (sync_fifo_w_rd_data),
|
||||
.full (sync_fifo_w_full),
|
||||
.empty (sync_fifo_w_empty)
|
||||
);
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
wframe_cnt <= 'd0;
|
||||
end else if (sync_fifo_w_rd_en) begin
|
||||
if (wframe_cnt == (awlen >> 1'b1)) begin
|
||||
wframe_cnt <= 'd0;
|
||||
end else begin
|
||||
wframe_cnt <= wframe_cnt + 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
cur_state <= WCH_IDLE;
|
||||
end else begin
|
||||
cur_state <= next_state;
|
||||
end
|
||||
end
|
||||
|
||||
always@(*) begin
|
||||
case(cur_state)
|
||||
WCH_IDLE: begin
|
||||
if(sync_fifo_aw_wr_en) begin
|
||||
next_state <= WCH_SD_WADDR;
|
||||
end else begin
|
||||
next_state <= WCH_IDLE;
|
||||
end
|
||||
end
|
||||
|
||||
WCH_SD_WADDR: begin
|
||||
next_state <= WCH_SD_WDATA;
|
||||
end
|
||||
|
||||
WCH_SD_WDATA: begin
|
||||
if(sync_fifo_w_rd_en && (wframe_cnt == (awlen >> 1))) begin
|
||||
next_state <= WCH_IDLE;
|
||||
end else begin
|
||||
next_state <= WCH_SD_WDATA;
|
||||
end
|
||||
end
|
||||
|
||||
default : begin
|
||||
next_state <= WCH_IDLE;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
wcaddr <= 'd0;
|
||||
end else if (cur_state == WCH_SD_WADDR) begin
|
||||
wcaddr <= awcaddr;
|
||||
end else if (sync_fifo_w_rd_en) begin
|
||||
if (wcaddr == 6'h3f) begin
|
||||
wcaddr <= 'd0;
|
||||
end else begin
|
||||
wcaddr <= wcaddr + 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or negedge rst_n) begin
|
||||
if(!rst_n) begin
|
||||
wraddr <= 'd0;
|
||||
end else if (cur_state == WCH_SD_WADDR) begin
|
||||
if (sync_fifo_w_rd_en && (wcaddr == 6'h3f)) begin
|
||||
wraddr <= wraddr + 1'b1;
|
||||
end else begin
|
||||
wraddr <= wraddr;
|
||||
end
|
||||
end
|
||||
end
|
||||
endmodule
|
Reference in New Issue
Block a user