Created
May 3, 2024 12:02
-
-
Save nickfox-taterli/5d76e80288d762bcf4631231d5389e22 to your computer and use it in GitHub Desktop.
RTL AXI4Lite BRAM
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module rtl_bram( | |
input wire clk, | |
(* X_INTERFACE_PARAMETER = "POLARITY ACTIVE_HIGH" *) | |
input wire rst, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI AWADDR" *) | |
input wire [31:0] s_axil_awaddr, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI AWPROT" *) | |
input wire [2:0] s_axil_awprot, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI AWVALID" *) | |
input wire s_axil_awvalid, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI AWREADY" *) | |
output wire s_axil_awready, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI WDATA" *) | |
input wire [31:0] s_axil_wdata, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI WSTRB" *) | |
input wire [3:0] s_axil_wstrb, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI WVALID" *) | |
input wire s_axil_wvalid, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI WREADY" *) | |
output wire s_axil_wready, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI BRESP" *) | |
output wire [1:0] s_axil_bresp, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI BVALID" *) | |
output wire s_axil_bvalid, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI BREADY" *) | |
input wire s_axil_bready, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI ARADDR" *) | |
input wire [31:0] s_axil_araddr, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI ARPROT" *) | |
input wire [2:0] s_axil_arprot, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI ARVALID" *) | |
input wire s_axil_arvalid, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI ARREADY" *) | |
output wire s_axil_arready, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI RDATA" *) | |
output wire [31:0] s_axil_rdata, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI RRESP" *) | |
output wire [1:0] s_axil_rresp, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI RVALID" *) | |
output wire s_axil_rvalid, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 S_AXI RREADY" *) | |
input wire s_axil_rready, | |
(* X_INTERFACE_PARAMETER = "FREQ_HZ 1000000" *) | |
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORT CLK" *) | |
output wire bram_clk, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORT EN" *) | |
(* X_INTERFACE_PARAMETER = "MASTER_TYPE BRAM_CTRL,RITE_MODE READ_WRITE" *) | |
output wire bram_en, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORT WE" *) | |
output wire [3:0] bram_we, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORT RST" *) | |
output wire bram_rst, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORT DOUT" *) | |
input wire [31:0] bram_rdata, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORT DIN" *) | |
output wire [31:0] bram_wdata, | |
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORT ADDR" *) | |
output wire [12:0] bram_addr | |
); | |
reg s_axil_awready_reg = 1'b0, s_axil_awready_next; | |
reg s_axil_wready_reg = 1'b0, s_axil_wready_next; | |
reg s_axil_bvalid_reg = 1'b0, s_axil_bvalid_next; | |
reg s_axil_arready_reg = 1'b0, s_axil_arready_next; | |
reg [31:0] s_axil_rdata_reg = 32'd0, s_axil_rdata_next; | |
reg s_axil_rvalid_reg = 1'b0, s_axil_rvalid_next; | |
assign s_axil_awready = s_axil_awready_reg; | |
assign s_axil_wready = s_axil_wready_reg; | |
assign s_axil_bresp = 2'b00; | |
assign s_axil_bvalid = s_axil_bvalid_reg; | |
assign s_axil_arready = s_axil_arready_reg; | |
assign s_axil_rdata = bram_rdata; | |
assign s_axil_rresp = 2'b00; | |
assign s_axil_rvalid = s_axil_rvalid_reg; | |
assign bram_clk = clk; | |
assign bram_we = s_axil_wstrb; | |
assign bram_rst = rst; | |
assign bram_en = s_axil_awvalid | s_axil_arvalid; | |
assign bram_wdata = s_axil_wdata; | |
assign bram_addr = s_axil_arvalid?s_axil_araddr[12:0]:s_axil_awaddr[12:0]; | |
(* ram_style = "block" *) reg [31:0] memory [0:8191]; | |
always @(posedge clk) begin | |
s_axil_awready_reg <= s_axil_awready_next; | |
s_axil_wready_reg <= s_axil_wready_next; | |
s_axil_bvalid_reg <= s_axil_bvalid_next; | |
s_axil_arready_reg <= s_axil_arready_next; | |
s_axil_rvalid_reg <= s_axil_rvalid_next; | |
if(rst) begin | |
s_axil_awready_reg <= 1'b0; | |
s_axil_wready_reg <= 1'b0; | |
s_axil_bvalid_reg <= 1'b0; | |
s_axil_arready_reg <= 1'b0; | |
s_axil_rvalid_reg <= 1'b0; | |
end | |
end | |
always @(*) begin | |
s_axil_awready_next = 1'b0; | |
s_axil_wready_next = 1'b0; | |
s_axil_bvalid_next = s_axil_bvalid_reg && !s_axil_bready; | |
s_axil_arready_next = 1'b0; | |
s_axil_rvalid_next = s_axil_rvalid_reg && !s_axil_rready; | |
if(s_axil_awvalid && s_axil_wvalid && !s_axil_bvalid) begin | |
s_axil_awready_next = 1'b1; | |
s_axil_wready_next = 1'b1; | |
s_axil_bvalid_next = 1'b1; | |
end | |
if(s_axil_arvalid && !s_axil_rvalid) begin | |
s_axil_arready_next = 1'b1; | |
s_axil_rvalid_next = 1'b1; | |
end | |
end | |
endmodule |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment