This commit is contained in:
Core_kingdom
2025-08-06 13:42:13 +08:00
commit 163d200aae
345 changed files with 32786 additions and 0 deletions

85
rtl/async_fifo.v Normal file
View 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
View 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
View 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
View 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
View 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
View 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