Template code for module's IO ports.
// ### AXI4-full slave signals (for BRAM Controller) ####
// *** Read address signals ***
input wire [14:0] s_axi_dat_araddr,
input wire [1:0] s_axi_dat_arburst,
input wire [3:0] s_axi_dat_arcache,
input wire [7:0] s_axi_dat_arlen,
input wire s_axi_dat_arlock,
input wire [2:0] s_axi_dat_arprot,
output wire s_axi_dat_arready,
input wire [2:0] s_axi_dat_arsize,
input wire s_axi_dat_arvalid,
// *** Write address signals ***
input wire [14:0] s_axi_dat_awaddr,
input wire [1:0] s_axi_dat_awburst,
input wire [3:0] s_axi_dat_awcache,
input wire [7:0] s_axi_dat_awlen,
input wire s_axi_dat_awlock,
input wire [2:0] s_axi_dat_awprot,
output wire s_axi_dat_awready,
input wire [2:0] s_axi_dat_awsize,
input wire s_axi_dat_awvalid,
// *** Write response signals ***
input wire s_axi_dat_bready,
output wire [1:0] s_axi_dat_bresp,
output wire s_axi_dat_bvalid,
// *** Read data signals ***
output wire [31:0] s_axi_dat_rdata,
output wire s_axi_dat_rlast,
input wire s_axi_dat_rready,
output wire [1:0] s_axi_dat_rresp,
output wire s_axi_dat_rvalid,
// *** Write data signals ***
input wire [31:0] s_axi_dat_wdata,
input wire s_axi_dat_wlast,
output wire s_axi_dat_wready,
input wire [3:0] s_axi_dat_wstrb,
input wire s_axi_dat_wvalid,
// ### AXI4-lite slave signals ###
// *** Write address signals ***
output wire s_axi_awready,
input wire [31:0] s_axi_awaddr,
input wire s_axi_awvalid,
// *** Write data signals ***
output wire s_axi_wready,
input wire [31:0] s_axi_wdata,
input wire [3:0] s_axi_wstrb,
input wire s_axi_wvalid,
// *** Write response signals ***
input wire s_axi_bready,
output wire [1:0] s_axi_bresp,
output wire s_axi_bvalid,
// *** Read address signals ***
output wire s_axi_arready,
input wire [31:0] s_axi_araddr,
input wire s_axi_arvalid,
// *** Read data signals ***
input wire s_axi_rready,
output wire [31:0] s_axi_rdata,
output wire [1:0] s_axi_rresp,
output wire s_axi_rvalid,
// ### AXI4-stream slave port ###
output wire s_axis_tready,
input wire [31:0] s_axis_tdata,
input wire s_axis_tvalid,
input wire s_axis_tlast,
// ### AXI4-stream master port ###
input wire m_axis_tready,
output wire [31:0] m_axis_tdata,
output wire m_axis_tvalid,
output wire m_axis_tlast,
// ### Input to control BRAM ###
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA CLK" *) input wire clka,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA RST" *) input wire rsta,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA EN" *) input wire ena,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA ADDR" *) input wire [31:0] addra,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA DIN" *) input wire [31:0] dina,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA WE" *) input wire [3:0] wea,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT" *) output wire [31:0] douta,
// ### Output to control BRAM ###
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA CLK" *) output wire clka,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA RST" *) output wire rsta,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA EN" *) output wire ena,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA ADDR" *) output wire [31:0] addra,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA DIN" *) output wire [31:0] dina,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA WE" *) output wire [3:0] wea,
(* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT" *) input wire [31:0] douta,
// ### Input to control BRAM ###
input wire clka,
input wire rsta,
input wire ena,
input wire [31:0] addra,
input wire [31:0] dina,
input wire [3:0] wea,
output wire [31:0] douta,
// ### Output to control BRAM ###
output wire clka,
output wire rsta,
output wire ena,
output wire [31:0] addra,
output wire [31:0] dina,
output wire [3:0] wea,
input wire [31:0] douta,
Template code for module's variables.
// AXI slave
wire s_axi_arready;
wire [31:0] s_axi_araddr;
wire s_axi_arvalid;
wire s_axi_awready;
wire [31:0] s_axi_awaddr;
wire s_axi_awvalid;
wire s_axi_bready;
wire [1:0] s_axi_bresp;
wire s_axi_bvalid;
wire s_axi_rready;
wire [31:0] s_axi_rdata;
wire [1:0] s_axi_rresp;
wire s_axi_rvalid;
wire s_axi_wready;
wire [31:0] s_axi_wdata;
wire [3:0] s_axi_wstrb;
wire s_axi_wvalid;
wire s_axis_tready;
wire [7:0] s_axis_tdata;
wire s_axis_tvalid;
wire s_axis_tlast;
wire m_axis_tready;
wire [7:0] m_axis_tdata;
wire m_axis_tvalid;
wire m_axis_tlast;
wire clka;
wire rsta;
wire ena;
wire [31:0] addra;
wire [31:0] dina;
wire [3:0] wea;
wire [31:0] douta;
wire clkb;
wire rstb;
wire enb;
wire [31:0] addrb;
wire [31:0] dinb;
wire [3:0] web;
wire [31:0] doutb;
Template code for XPM instantiation.
// xpm_fifo_sync: Synchronous FIFO
// Xilinx Parameterized Macro, version 2019.1
xpm_fifo_sync
#(
.DOUT_RESET_VALUE("0"), // String
.ECC_MODE("no_ecc"), // String
.FIFO_MEMORY_TYPE("auto"), // String
.FIFO_READ_LATENCY(1), // DECIMAL
.FIFO_WRITE_DEPTH(512), // DECIMAL, depth 512 elemen
.FULL_RESET_VALUE(0), // DECIMAL
.PROG_EMPTY_THRESH(10), // DECIMAL
.PROG_FULL_THRESH(10), // DECIMAL
.RD_DATA_COUNT_WIDTH(1), // DECIMAL
.READ_DATA_WIDTH(2), // DECIMAL, lebar data 2 bits
.READ_MODE("std"), // String
.SIM_ASSERT_CHK(0), // DECIMAL
.USE_ADV_FEATURES("1000"), // String, enable data valid
.WAKEUP_TIME(0), // DECIMAL
.WRITE_DATA_WIDTH(2), // DECIMAL, lebar data 2 bits
.WR_DATA_COUNT_WIDTH(1) // DECIMAL
)
xpm_fifo_sync_ce
(
.almost_empty(),
.almost_full(),
.dbiterr(),
.empty(),
.full(),
.overflow(),
.prog_empty(),
.prog_full(),
.rd_data_count(),
.rd_rst_busy(),
.sbiterr(),
.underflow(),
.wr_ack(),
.wr_data_count(),
.wr_rst_busy(),
.injectdbiterr(1'b0),
.injectsbiterr(1'b0),
.sleep(1'b0),
.wr_clk(clk), // clk
.rst(rst), // rst
.din(din), // din
.wr_en(wr_en), // wr_en
.rd_en(rd_en), // rd_en
.dout(dout), // dout
.data_valid(valid) // valid
);
// xpm_fifo_axis: AXI Stream FIFO
// Xilinx Parameterized Macro, version 2018.3
xpm_fifo_axis
#(
.CDC_SYNC_STAGES(2), // DECIMAL
.CLOCKING_MODE("common_clock"), // String
.ECC_MODE("no_ecc"), // String
.FIFO_DEPTH(256), // DECIMAL, depth 256 elemen
.FIFO_MEMORY_TYPE("auto"), // String
.PACKET_FIFO("false"), // String
.PROG_EMPTY_THRESH(10), // DECIMAL
.PROG_FULL_THRESH(10), // DECIMAL
.RD_DATA_COUNT_WIDTH(1), // DECIMAL
.RELATED_CLOCKS(0), // DECIMAL
.SIM_ASSERT_CHK(0), // DECIMAL
.TDATA_WIDTH(32), // DECIMAL, data width 32 bit
.TDEST_WIDTH(1), // DECIMAL
.TID_WIDTH(1), // DECIMAL
.TUSER_WIDTH(1), // DECIMAL
.USE_ADV_FEATURES("0004"), // String, write data count
.WR_DATA_COUNT_WIDTH(9) // DECIMAL, width log2(256)+1=9
)
xpm_fifo_axis_0
(
.almost_empty_axis(),
.almost_full_axis(),
.dbiterr_axis(),
.prog_empty_axis(),
.prog_full_axis(),
.rd_data_count_axis(),
.sbiterr_axis(),
.injectdbiterr_axis(1'b0),
.injectsbiterr_axis(1'b0),
.s_aclk(aclk), // aclk
.m_aclk(aclk), // aclk
.s_aresetn(aresetn), // aresetn
.s_axis_tready(s_axis_tready), // ready
.s_axis_tdata(s_axis_tdata), // data
.s_axis_tvalid(s_axis_tvalid), // valid
.s_axis_tdest(1'b0),
.s_axis_tid(1'b0),
.s_axis_tkeep(4'b1),
.s_axis_tlast(1'b0),
.s_axis_tstrb(4'b1),
.s_axis_tuser(1'b0),
.m_axis_tready(m_axis_tready), // ready
.m_axis_tdata(m_axis_tdata), // data
.m_axis_tvalid(m_axis_tvalid), // valid
.m_axis_tdest(),
.m_axis_tid(),
.m_axis_tkeep(),
.m_axis_tlast(),
.m_axis_tstrb(),
.m_axis_tuser(),
.wr_data_count_axis(wr_data_count) // data count
);
// xpm_memory_spram: Single Port RAM
// Xilinx Parameterized Macro, version 2019.1
xpm_memory_spram
#(
// Common module parameters
.MEMORY_SIZE(32768), // DECIMAL, ukuran memory: 1024x32bit= 32768 bits
.MEMORY_PRIMITIVE("auto"), // String, "auto", "distributed", "block" or "ultra"
.MEMORY_INIT_FILE("preamble_rom.mem"),
.MEMORY_INIT_PARAM("0"), // String
.USE_MEM_INIT(1), // DECIMAL
.WAKEUP_TIME("disable_sleep"), // String
.MESSAGE_CONTROL(0), // DECIMAL
.AUTO_SLEEP_TIME(0), // DECIMAL, 0=Disable auto-sleep feature
.ECC_MODE("no_ecc"), // String
.MEMORY_OPTIMIZATION("true"), // String
.CASCADE_HEIGHT(0), // DECIMAL
.SIM_ASSERT_CHK(0), // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
// Port A module parameters
.WRITE_DATA_WIDTH_A(32), // DECIMAL, lebar data: 32-bit
.READ_DATA_WIDTH_A(32), // DECIMAL, lebar data: 32-bit
.BYTE_WRITE_WIDTH_A(32), // DECIMAL
.ADDR_WIDTH_A(10), // DECIMAL, lebar address: clog2(32768/32)=clog2(1024)= 10 elemen
.READ_RESET_VALUE_A("0"), // String
.READ_LATENCY_A(2), // DECIMAL
.WRITE_MODE_A("write_first"), // String
.RST_MODE_A("SYNC") // String
)
xpm_memory_spram_0
(
.sleep(1'b0),
.clka(aclk),
.rsta(areset),
.ena(bram_ena),
.wea(bram_wea),
.addra(bram_addra),
.dina(bram_dina),
.douta(bram_douta),
.regcea(1'b1), //do not change
.injectsbiterra(1'b0), //do not change
.injectdbiterra(1'b0), //do not change
.sbiterra(), //do not change
.dbiterra() //do not change
);
// xpm_memory_tdpram: True Dual Port RAM
// Xilinx Parameterized Macro, version 2018.3
xpm_memory_tdpram
#(
// Common module parameters
.MEMORY_SIZE(16384), // DECIMAL, size: 2048x8bit= 16384 bits
.MEMORY_PRIMITIVE("auto"), // String
.CLOCKING_MODE("common_clock"), // String, "common_clock"
.MEMORY_INIT_FILE("none"), // String
.MEMORY_INIT_PARAM("0"), // String
.USE_MEM_INIT(1), // DECIMAL
.WAKEUP_TIME("disable_sleep"), // String
.MESSAGE_CONTROL(0), // DECIMAL
.AUTO_SLEEP_TIME(0), // DECIMAL
.ECC_MODE("no_ecc"), // String
.MEMORY_OPTIMIZATION("true"), // String
.USE_EMBEDDED_CONSTRAINT(0), // DECIMAL
// Port A module parameters
.WRITE_DATA_WIDTH_A(8), // DECIMAL, lebar data: 8-bit
.READ_DATA_WIDTH_A(8), // DECIMAL, lebar data: 8-bit
.BYTE_WRITE_WIDTH_A(8), // DECIMAL
.ADDR_WIDTH_A(11), // DECIMAL, clog2(16384/8)=clog2(2048)= 11
.READ_RESET_VALUE_A("0"), // String
.READ_LATENCY_A(1), // DECIMAL
.WRITE_MODE_A("write_first"), // String
.RST_MODE_A("SYNC"), // String
// Port B module parameters
.WRITE_DATA_WIDTH_B(8), // DECIMAL, lebar data: 8-bit
.READ_DATA_WIDTH_B(8), // DECIMAL, lebar data: 8-bit
.BYTE_WRITE_WIDTH_B(8), // DECIMAL
.ADDR_WIDTH_B(11), // DECIMAL, clog2(16384/8)=clog2(2048)= 11
.READ_RESET_VALUE_B("0"), // String
.READ_LATENCY_B(1), // DECIMAL
.WRITE_MODE_B("write_first"), // String
.RST_MODE_B("SYNC") // String
)
xpm_memory_tdpram_0
(
.sleep(1'b0),
.regcea(1'b1), //do not change
.injectsbiterra(1'b0), //do not change
.injectdbiterra(1'b0), //do not change
.sbiterra(), //do not change
.dbiterra(), //do not change
.regceb(1'b1), //do not change
.injectsbiterrb(1'b0), //do not change
.injectdbiterrb(1'b0), //do not change
.sbiterrb(), //do not change
.dbiterrb(), //do not change
// Port A module ports
.clka(aclk),
.rsta(~aresetn),
.ena(ena),
.wea(wea),
.addra(addra),
.dina(dina),
.douta(douta),
// Port B module ports
.clkb(clkb),
.rstb(rstb),
.enb(enb),
.web(web),
.addrb(addrb),
.dinb(dinb),
.doutb(doutb)
);
Template code for module instantiation.
// AXI BRAM controller
axi_bram_ctrl_0 axi_bram_ctrl_0_inst
(
.s_axi_aclk(aclk),
.s_axi_aresetn(aresetn),
.s_axi_araddr(s_axi_dat_araddr),
.s_axi_arburst(s_axi_dat_arburst),
.s_axi_arcache(s_axi_dat_arcache),
.s_axi_arlen(s_axi_dat_arlen),
.s_axi_arlock(s_axi_dat_arlock),
.s_axi_arprot(s_axi_dat_arprot),
.s_axi_arready(s_axi_dat_arready),
.s_axi_arsize(s_axi_dat_arsize),
.s_axi_arvalid(s_axi_dat_arvalid),
.s_axi_awaddr(s_axi_dat_awaddr),
.s_axi_awburst(s_axi_dat_awburst),
.s_axi_awcache(s_axi_dat_awcache),
.s_axi_awlen(s_axi_dat_awlen),
.s_axi_awlock(s_axi_dat_awlock),
.s_axi_awprot(s_axi_dat_awprot),
.s_axi_awready(s_axi_dat_awready),
.s_axi_awsize(s_axi_dat_awsize),
.s_axi_awvalid(s_axi_dat_awvalid),
.s_axi_bready(s_axi_dat_bready),
.s_axi_bresp(s_axi_dat_bresp),
.s_axi_bvalid(s_axi_dat_bvalid),
.s_axi_rdata(s_axi_dat_rdata),
.s_axi_rlast(s_axi_dat_rlast),
.s_axi_rready(s_axi_dat_rready),
.s_axi_rresp(s_axi_dat_rresp),
.s_axi_rvalid(s_axi_dat_rvalid),
.s_axi_wdata(s_axi_dat_wdata),
.s_axi_wlast(s_axi_dat_wlast),
.s_axi_wready(s_axi_dat_wready),
.s_axi_wstrb(s_axi_dat_wstrb),
.s_axi_wvalid(s_axi_dat_wvalid),
.bram_addr_a(addra),
.bram_clk_a(clka),
.bram_wrdata_a(dina),
.bram_rddata_a(bram_rddata_a),
.bram_en_a(ena),
.bram_rst_a(rsta),
.bram_we_a(wea)
);
// Block memory generator
blk_mem_gen_0 blk_mem_gen_0_inst
(
.clka(clka),
.rsta(rsta),
.ena(ena),
.addra(addra),
.dina(dina),
.douta(douta),
.wea(wea),
.rsta_busy(), // NC
.clkb(clkb),
.rstb(rstb),
.enb(enb),
.addrb(addrb),
.dinb(dinb),
.doutb(doutb),
.web(web),
.rstb_busy() // NC
);
Template code for testbench.
`timescale 1ns / 1ps
module module_tb();
localparam T = 10;
reg aclk;
reg aresetn;
// AXI slave
wire s_axi_arready;
reg [31:0] s_axi_araddr;
reg s_axi_arvalid;
wire s_axi_awready;
reg [31:0] s_axi_awaddr;
reg s_axi_awvalid;
reg s_axi_bready;
wire [1:0] s_axi_bresp;
wire s_axi_bvalid;
reg s_axi_rready;
wire [31:0] s_axi_rdata;
wire [1:0] s_axi_rresp;
wire s_axi_rvalid;
wire s_axi_wready;
reg [31:0] s_axi_wdata;
reg [3:0] s_axi_wstrb;
reg s_axi_wvalid;
// AXI TX FIFO
wire s_axi_tx_fifo_arready;
reg [31:0] s_axi_tx_fifo_araddr;
reg s_axi_tx_fifo_arvalid;
wire s_axi_tx_fifo_awready;
reg [31:0] s_axi_tx_fifo_awaddr;
reg s_axi_tx_fifo_awvalid;
reg s_axi_tx_fifo_bready;
wire [1:0] s_axi_tx_fifo_bresp;
wire s_axi_tx_fifo_bvalid;
reg s_axi_tx_fifo_rready;
wire [31:0] s_axi_tx_fifo_rdata;
wire [1:0] s_axi_tx_fifo_rresp;
wire s_axi_tx_fifo_rvalid;
wire s_axi_tx_fifo_wready;
reg [31:0] s_axi_tx_fifo_wdata;
reg [3:0] s_axi_tx_fifo_wstrb;
reg s_axi_tx_fifo_wvalid;
// AXI RX FIFO
wire s_axi_rx_fifo_arready;
reg [31:0] s_axi_rx_fifo_araddr;
reg s_axi_rx_fifo_arvalid;
wire s_axi_rx_fifo_awready;
reg [31:0] s_axi_rx_fifo_awaddr;
reg s_axi_rx_fifo_awvalid;
reg s_axi_rx_fifo_bready;
wire [1:0] s_axi_rx_fifo_bresp;
wire s_axi_rx_fifo_bvalid;
reg s_axi_rx_fifo_rready;
wire [31:0] s_axi_rx_fifo_rdata;
wire [1:0] s_axi_rx_fifo_rresp;
wire s_axi_rx_fifo_rvalid;
wire s_axi_rx_fifo_wready;
reg [31:0] s_axi_rx_fifo_wdata;
reg [3:0] s_axi_rx_fifo_wstrb;
reg s_axi_rx_fifo_wvalid;
// AXI TX
wire s_axi_tx_arready;
reg [31:0] s_axi_tx_araddr;
reg s_axi_tx_arvalid;
wire s_axi_tx_awready;
reg [31:0] s_axi_tx_awaddr;
reg s_axi_tx_awvalid;
reg s_axi_tx_bready;
wire [1:0] s_axi_tx_bresp;
wire s_axi_tx_bvalid;
reg s_axi_tx_rready;
wire [31:0] s_axi_tx_rdata;
wire [1:0] s_axi_tx_rresp;
wire s_axi_tx_rvalid;
wire s_axi_tx_wready;
reg [31:0] s_axi_tx_wdata;
reg [3:0] s_axi_tx_wstrb;
reg s_axi_tx_wvalid;
// AXI RX
wire s_axi_rx_arready;
reg [31:0] s_axi_rx_araddr;
reg s_axi_rx_arvalid;
wire s_axi_rx_awready;
reg [31:0] s_axi_rx_awaddr;
reg s_axi_rx_awvalid;
reg s_axi_rx_bready;
wire [1:0] s_axi_rx_bresp;
wire s_axi_rx_bvalid;
reg s_axi_rx_rready;
wire [31:0] s_axi_rx_rdata;
wire [1:0] s_axi_rx_rresp;
wire s_axi_rx_rvalid;
wire s_axi_rx_wready;
reg [31:0] s_axi_rx_wdata;
reg [3:0] s_axi_rx_wstrb;
reg s_axi_rx_wvalid;
// S_AXIS
wire s_axis_tready;
reg [7:0] s_axis_tdata;
reg s_axis_tvalid;
reg s_axis_tlast;
// M_AXIS
reg m_axis_tready;
wire [7:0] m_axis_tdata;
wire m_axis_tvalid;
wire m_axis_tlast;
// Interrupt
wire tx_itrpt;
reg s2mm_introut;
wire rx_itrpt;
reg [31:0] data[0:1000];
integer i = 0, j = 0;
always
begin
aclk = 0;
#(T/2);
aclk = 1;
#(T/2);
end
initial
begin
$readmemh("D:/Repository/matlab/data.dat", data);
s_axi_awaddr = 0;
s_axi_awvalid = 0;
s_axi_wstrb = 0;
s_axi_wdata = 0;
s_axi_wvalid = 0;
s_axi_bready = 1;
s_axi_araddr = 0;
s_axi_arvalid = 0;
s_axi_rready = 0;
s_axi_tx_fifo_awaddr = 0;
s_axi_tx_fifo_awvalid = 0;
s_axi_tx_fifo_wstrb = 0;
s_axi_tx_fifo_wdata = 0;
s_axi_tx_fifo_wvalid = 0;
s_axi_tx_fifo_bready = 1;
s_axi_tx_fifo_araddr = 0;
s_axi_tx_fifo_arvalid = 0;
s_axi_tx_fifo_rready = 1;
s_axi_rx_fifo_awaddr = 0;
s_axi_rx_fifo_awvalid = 0;
s_axi_rx_fifo_wstrb = 0;
s_axi_rx_fifo_wdata = 0;
s_axi_rx_fifo_wvalid = 0;
s_axi_rx_fifo_bready = 1;
s_axi_rx_fifo_araddr = 0;
s_axi_rx_fifo_arvalid = 0;
s_axi_rx_fifo_rready = 1;
s_axi_tx_awaddr = 0;
s_axi_tx_awvalid = 0;
s_axi_tx_wstrb = 0;
s_axi_tx_wdata = 0;
s_axi_tx_wvalid = 0;
s_axi_tx_bready = 1;
s_axi_tx_araddr = 0;
s_axi_tx_arvalid = 0;
s_axi_tx_rready = 0;
s_axi_rx_awaddr = 0;
s_axi_rx_awvalid = 0;
s_axi_rx_wstrb = 0;
s_axi_rx_wdata = 0;
s_axi_rx_wvalid = 0;
s_axi_rx_bready = 1;
s_axi_rx_araddr = 0;
s_axi_rx_arvalid = 0;
s_axi_rx_rready = 0;
s_axis_tdata = 0;
s_axis_tvalid = 0;
s_axis_tlast = 0;
m_axis_tready = 1;
s2mm_introut = 0;
aresetn = 0;
#(T*50);
aresetn = 1;
#(T*50);
axi_write(32'h00000000, 168);
// Send data to AXIS
s_axis_tvalid = 1;
for (i = 0; i < 1000; i = i+1)
begin
s_axis_tdata = data[i];
if (i == 1000-1)
begin
s_axis_tlast = 1;
end
#T;
end
s_axis_tvalid = 0;
s_axis_tlast = 0;
#(T*10);
end
always @(posedge aclk)
begin
if (m_axis_tvalid)
begin
$display("%b", m_axis_tdata);
end
end
// Read TX buffer descriptor
always @(posedge aclk)
begin
if (tx_itrpt)
begin
#(T*5);
axi_read_tx_fifo(32'h0000000c);
end
end
// Generate stream to memory mapped interrupt
always @(posedge aclk)
begin
if (m_axis_tlast)
begin
s2mm_introut = 1;
#(T*10);
s2mm_introut = 0;
while (m_axis_tlast)
begin
#T;
end
end
end
task axi_write;
input [31:0] awaddr;
input [31:0] wdata;
begin
// *** Write address ***
s_axi_awaddr = awaddr;
s_axi_awvalid = 1;
#T;
s_axi_awvalid = 0;
// *** Write data ***
s_axi_wdata = wdata;
s_axi_wstrb = 4'hf;
s_axi_wvalid = 1;
#T;
s_axi_wvalid = 0;
#T;
end
endtask
task axi_read;
input [31:0] araddr;
begin
// *** Read address ***
s_axi_araddr = araddr;
s_axi_arvalid = 1;
#T;
s_axi_arvalid = 0;
#T;
end
endtask
task axi_write_tx_fifo;
input [31:0] awaddr;
input [31:0] wdata;
begin
// *** Write address ***
s_axi_tx_fifo_awaddr = awaddr;
s_axi_tx_fifo_awvalid = 1;
#T;
s_axi_tx_fifo_awvalid = 0;
// *** Write data ***
s_axi_tx_fifo_wdata = wdata;
s_axi_tx_fifo_wstrb = 4'hf;
s_axi_tx_fifo_wvalid = 1;
#T;
s_axi_tx_fifo_wvalid = 0;
#T;
end
endtask
task axi_read_tx_fifo;
input [31:0] araddr;
begin
// *** Read address ***
s_axi_tx_fifo_araddr = araddr;
s_axi_tx_fifo_arvalid = 1;
#T;
s_axi_tx_fifo_arvalid = 0;
#T;
end
endtask
task axi_write_rx_fifo;
input [31:0] awaddr;
input [31:0] wdata;
begin
// *** Write address ***
s_axi_rx_fifo_awaddr = awaddr;
s_axi_rx_fifo_awvalid = 1;
#T;
s_axi_rx_fifo_awvalid = 0;
// *** Write data ***
s_axi_rx_fifo_wdata = wdata;
s_axi_rx_fifo_wstrb = 4'hf;
s_axi_rx_fifo_wvalid = 1;
#T;
s_axi_rx_fifo_wvalid = 0;
#T;
end
endtask
task axi_read_rx_fifo;
input [31:0] araddr;
begin
// *** Read address ***
s_axi_rx_fifo_araddr = araddr;
s_axi_rx_fifo_arvalid = 1;
#T;
s_axi_rx_fifo_arvalid = 0;
#T;
end
endtask
task axi_tx_write;
input [31:0] awaddr;
input [31:0] wdata;
begin
// *** Write address ***
s_axi_tx_awaddr = awaddr;
s_axi_tx_awvalid = 1;
#T;
s_axi_tx_awvalid = 0;
// *** Write data ***
s_axi_tx_wdata = wdata;
s_axi_tx_wstrb = 4'hf;
s_axi_tx_wvalid = 1;
#T;
s_axi_tx_wvalid = 0;
#T;
end
endtask
task axi_tx_read;
input [31:0] araddr;
begin
// *** Read address ***
s_axi_tx_araddr = araddr;
s_axi_tx_arvalid = 1;
#T;
s_axi_tx_arvalid = 0;
#T;
end
endtask
task axi_rx_write;
input [31:0] awaddr;
input [31:0] wdata;
begin
// *** Write address ***
s_axi_rx_awaddr = awaddr;
s_axi_rx_awvalid = 1;
#T;
s_axi_rx_awvalid = 0;
// *** Write data ***
s_axi_rx_wdata = wdata;
s_axi_rx_wstrb = 4'hf;
s_axi_rx_wvalid = 1;
#T;
s_axi_rx_wvalid = 0;
#T;
end
endtask
task axi_rx_read;
input [31:0] araddr;
begin
// *** Read address ***
s_axi_rx_araddr = araddr;
s_axi_rx_arvalid = 1;
#T;
s_axi_rx_arvalid = 0;
#T;
end
endtask
endmodule
After you complete this tutorial, you should be able to:
Nov 19, 2024After you complete this tutorial, you should be able to:
Nov 12, 2024ObjectiveAfter you complete this tutorial, you should be able to:
Nov 11, 2024After you complete this tutorial, you should be able to:
Nov 5, 2024or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up