Hello!
We are currently using a Zedboard to create a custom AXI memory and register interface from a verilog file.
The memory interface is 16K words and uses AXI4 FULL, and the register interface is 32K words and uses AXI Lite
As of writing, we are able to do the following with these interfaces using a CLI:
- Read custom register interface
- Write to custom register interface
- Confirm data written can be read again
- Read custom memory interface
We are having issues trying to write to the custom memory interface.
All that the software CLI does is parse out an address and use Xil_In/Xil_Out to read/write to ZedBoard memory
- This feature has been tested extensively on other projects and other sections of memory on the ZedBoard, all of which work perfectly normally
We believe this is a Verilog error and want advice/help with testing and simulating the AXI bus to try and find the issue.
We looked for an AXI bus testing solution, but the posts on the Xilinx website were all out of date and unable to be followed (we run 2023.2 and the guides were written for 2019.2).
Contained below is a list of files associated with a block diagram of our project (I've had to rename them to .txt files to upload).
xilinx_tdpram_1024x36.v ====> Base single memory block file
dig_core_dpram_32.v ====> Top memory file (contains 4 rams)
proto_core_top_regs_ex.v ====> Top register file
pocket_interface_v1_0.v ====> Top reg/mem interface file
pocket_interface_v1_0_S00_AXI.v ====> Register AXI interface file
pocket_interface_v1_0_S01_AXI.v ====> Memory AXI interface file
Currently it seems that pocket_interface_v1_0_S01_AXI.v is the main problem with the temporary write address or "axi_awaddr" being the likely cause, but we can't be fully sure.
Any help with the error or testing methodology would be appreciated.
Regards,
--
Daniel
// True Dual Port Ram // Uses RAM36E1 Ram module xilinx_tdpram_1024x36( input clk_a, // Clock Port A input reset_a, // Sync active high reset input en_a, // Enable operations Port A input regce_a, // Output Register Clock Enable Port A input [3:0] wren_a, // Write Enables Port A input [9:0] addr_a, // Address Port A input [35:0] din_a, // Data Port A output [35:0] dout_a, // Data Port A input clk_b, // Clock Port A input reset_b, // Sync active high reset input en_b, // Enable operations Port B input regce_b, // Output Register Clock Enable Port B input [3:0] wren_b, // Write Enables Port B input [9:0] addr_b, // Address Port B input [35:0] din_b, // Data Port B output [35:0] dout_b // Data Port B ); parameter USE_OUTPUT_REG_A = 1'b0; parameter USE_OUTPUT_REG_B = 1'b0; wire [31:0] DOA ; wire [3:0] DOPA ; wire [31:0] DOB ; wire [3:0] DOPB ; wire [31:0] DIA = din_a[31:0] ; wire [3:0] DIPA = din_a[35:32] ; wire [31:0] DIB = din_b[31:0] ; wire [3:0] DIPB = din_b[35:32] ; wire [15:0] ADDRA = { 1'b1, addr_a[9:0], 5'b11111 }; wire [15:0] ADDRB = { 1'b1, addr_b[9:0], 5'b11111 }; wire [3:0] WEA = wren_a[3:0]; wire [7:0] WEBWE = { wren_b[3:0], wren_b[3:0]}; assign dout_a = {DOPA[3:0], DOA[31:0]}; assign dout_b = {DOPB[3:0], DOB[31:0]}; RAMB36E1 #( .RAM_MODE ( "TDP" ) // RAM Mode: "SDP" or "TDP" ,.SIM_COLLISION_CHECK ( "GENERATE_X_ONLY" ) // Colision check: Values ("ALL", "WARNING_ONLY", "GENERATE_X_ONLY" or "NONE") ,.SIM_DEVICE ( "7SERIES" ) // Simulation Device: Must be set to "7SERIES" for simulation behavior ,.DOA_REG ( USE_OUTPUT_REG_A ) // 1=Use output Reg ,.DOB_REG ( USE_OUTPUT_REG_B ) // 1=Use output Reg ,.READ_WIDTH_A ( 36 ) // Valid values are 1, 2, 4, 9, 18, or 36 ,.READ_WIDTH_B ( 36 ) ,.WRITE_WIDTH_A ( 36 ) ,.WRITE_WIDTH_B ( 36 ) ) RAM_I ( // Port A .CLKARDCLK (clk_a) // input Port A Clock ,.RSTRAMARSTRAM (reset_a) // input Port A set/reset ,.RSTREGARSTREG (reset_a) // input Port A Output Register set/reset ,.ENARDEN (en_a) // input Port A RAM Enable ,.REGCEAREGCE (regce_a) // input Port A Output Register Clock Enable ,.ADDRARDADDR (ADDRA[15:0]) // input [15:0] Port A Address ,.DIADI (DIA[31:0]) // input [31:0] Port A Data Input Bus ,.DIPADIP (DIPA[3:0]) // input [3:0] Port A Data Input Parity Bus ,.WEA (WEA[3:0]) // input [3:0] Port A Write Enable ,.DOADO (DOA[31:0]) // output [31:0] Port A Data Output Bus ,.DOPADOP (DOPA[3:0]) // output [3:0] Port A Data Output Parity Bus // Port B ,.CLKBWRCLK (clk_b) // input Port B Clock ,.RSTRAMB (reset_b) // input Port B set/reset ,.RSTREGB (reset_b) // input Port B Output Register set/reset ,.REGCEB (regce_b) // input Port B Output Register Clock Enable ,.ENBWREN (en_b) // input Port B RAM Enable ,.WEBWE (WEBWE[7:0]) // input [7:0] Port B Write Enable ,.ADDRBWRADDR (ADDRB[15:0]) // input [15:0] Port B Address ,.DIBDI (DIB[31:0]) // input [31:0] Port B Data Input Bus ,.DIPBDIP (DIPB[3:0]) // input [3:0] Port B Data Input Parity Bus ,.DOBDO (DOB[31:0]) // output [31:0] Port B Data Output Bus ,.DOPBDOP (DOPB[3:0]) // output [3:0] Port B Data Output Parity Bus ,.CASCADEINA (1'b0) // input ,.CASCADEOUTA () // output ,.CASCADEINB (1'b0) // input ,.CASCADEOUTB () // output ,.INJECTDBITERR (1'b0) // input Inject a Double Bit Error ,.INJECTSBITERR (1'b0) // input Inject a Single Bit Error ,.DBITERR () // output Double Bit Error Status ,.ECCPARITY () // output [7:0] ECC Encoder Output Bus ,.RDADDRECC () // output [8:0] ECC Read Address ,.SBITERR () // output Single Bit Error Status ); endmodule // xilinx_sdpram_1024x36
`timescale 1 ns / 1 ps module pocket_interface_v1_0 # ( // Users to add parameters here parameter integer USER_REG_ADDR_WIDTH = 10, parameter integer USER_IRAM_ADDR_WIDTH = 12, // User parameters ends // Do not modify the parameters beyond this line // Parameters of Axi Slave Bus Interface S00_AXI parameter integer C_S00_AXI_DATA_WIDTH = 32, parameter integer C_S00_AXI_ADDR_WIDTH = 12, // Parameters of Axi Slave Bus Interface S01_AXI parameter integer C_S01_AXI_ID_WIDTH = 12, parameter integer C_S01_AXI_DATA_WIDTH = 32, parameter integer C_S01_AXI_ADDR_WIDTH = 14, parameter integer C_S01_AXI_AWUSER_WIDTH = 0, parameter integer C_S01_AXI_ARUSER_WIDTH = 0, parameter integer C_S01_AXI_WUSER_WIDTH = 0, parameter integer C_S01_AXI_RUSER_WIDTH = 0, parameter integer C_S01_AXI_BUSER_WIDTH = 0 ) ( // Users to add ports here // Register Interface output wire preg_wren, // Register Write Enable output wire [3:0] preg_byte_en, // Register Byte Write Enables output wire [USER_REG_ADDR_WIDTH-1:0] preg_addr, // Register Write Address output wire [31:0] preg_wdata, // Register Write data output wire [USER_REG_ADDR_WIDTH-1:0] preg_raddr, // Register Read Address input wire [31:0] preg_rdata, // Register Read data // TDP RAM Interface output wire tdp_en_a, // Enable operations RAM Port A output wire [3:0] tdp_wren_a, // Write Enables RAM Port A output wire [USER_IRAM_ADDR_WIDTH-1:0] tdp_addr_a, // Address RAM Port A output wire [31:0] tdp_din_a, // Write Data RAM Port A input wire [31:0] tdp_dout_a, // Read Data RAM Port A // User ports ends // Do not modify the ports beyond this line // Ports of Axi Slave Bus Interface S00_AXI input wire s00_axi_aclk, input wire s00_axi_aresetn, input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_awaddr, input wire [2 : 0] s00_axi_awprot, input wire s00_axi_awvalid, output wire s00_axi_awready, input wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_wdata, input wire [(C_S00_AXI_DATA_WIDTH/8)-1 : 0] s00_axi_wstrb, input wire s00_axi_wvalid, output wire s00_axi_wready, output wire [1 : 0] s00_axi_bresp, output wire s00_axi_bvalid, input wire s00_axi_bready, input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_araddr, input wire [2 : 0] s00_axi_arprot, input wire s00_axi_arvalid, output wire s00_axi_arready, output wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_rdata, output wire [1 : 0] s00_axi_rresp, output wire s00_axi_rvalid, input wire s00_axi_rready, // Ports of Axi Slave Bus Interface S01_AXI input wire s01_axi_aclk, input wire s01_axi_aresetn, input wire [C_S01_AXI_ID_WIDTH-1 : 0] s01_axi_awid, input wire [C_S01_AXI_ADDR_WIDTH-1 : 0] s01_axi_awaddr, input wire [7 : 0] s01_axi_awlen, input wire [2 : 0] s01_axi_awsize, input wire [1 : 0] s01_axi_awburst, input wire s01_axi_awlock, input wire [3 : 0] s01_axi_awcache, input wire [2 : 0] s01_axi_awprot, input wire [3 : 0] s01_axi_awqos, input wire [3 : 0] s01_axi_awregion, input wire [C_S01_AXI_AWUSER_WIDTH-1 : 0] s01_axi_awuser, input wire s01_axi_awvalid, output wire s01_axi_awready, input wire [C_S01_AXI_DATA_WIDTH-1 : 0] s01_axi_wdata, input wire [(C_S01_AXI_DATA_WIDTH/8)-1 : 0] s01_axi_wstrb, input wire s01_axi_wlast, input wire [C_S01_AXI_WUSER_WIDTH-1 : 0] s01_axi_wuser, input wire s01_axi_wvalid, output wire s01_axi_wready, output wire [C_S01_AXI_ID_WIDTH-1 : 0] s01_axi_bid, output wire [1 : 0] s01_axi_bresp, output wire [C_S01_AXI_BUSER_WIDTH-1 : 0] s01_axi_buser, output wire s01_axi_bvalid, input wire s01_axi_bready, input wire [C_S01_AXI_ID_WIDTH-1 : 0] s01_axi_arid, input wire [C_S01_AXI_ADDR_WIDTH-1 : 0] s01_axi_araddr, input wire [7 : 0] s01_axi_arlen, input wire [2 : 0] s01_axi_arsize, input wire [1 : 0] s01_axi_arburst, input wire s01_axi_arlock, input wire [3 : 0] s01_axi_arcache, input wire [2 : 0] s01_axi_arprot, input wire [3 : 0] s01_axi_arqos, input wire [3 : 0] s01_axi_arregion, input wire [C_S01_AXI_ARUSER_WIDTH-1 : 0] s01_axi_aruser, input wire s01_axi_arvalid, output wire s01_axi_arready, output wire [C_S01_AXI_ID_WIDTH-1 : 0] s01_axi_rid, output wire [C_S01_AXI_DATA_WIDTH-1 : 0] s01_axi_rdata, output wire [1 : 0] s01_axi_rresp, output wire s01_axi_rlast, output wire [C_S01_AXI_RUSER_WIDTH-1 : 0] s01_axi_ruser, output wire s01_axi_rvalid, input wire s01_axi_rready ); // Instantiation of Axi Bus Interface S00_AXI pocket_interface_v1_0_S00_AXI # ( .USER_REG_ADDR_WIDTH(USER_REG_ADDR_WIDTH), .C_S_AXI_DATA_WIDTH(C_S00_AXI_DATA_WIDTH), .C_S_AXI_ADDR_WIDTH(C_S00_AXI_ADDR_WIDTH) ) pocket_interface_v1_0_S00_AXI_inst ( .preg_wren (preg_wren) // output wire Register Write Enable ,.preg_byte_en (preg_byte_en[3:0]) // output wire [3:0] Register Byte Write Enables ,.preg_addr (preg_addr[USER_REG_ADDR_WIDTH-1:0]) // output wire [4:0] Register Address ,.preg_wdata (preg_wdata[31:0]) // output wire [31:0] Register Write data ,.preg_raddr (preg_raddr[USER_REG_ADDR_WIDTH-1:0]) // output wire [4:0] Register Read Address ,.preg_rdata (preg_rdata[31:0]) // input wire [31:0] Register Read data ,.S_AXI_ACLK(s00_axi_aclk), .S_AXI_ARESETN(s00_axi_aresetn), .S_AXI_AWADDR(s00_axi_awaddr), .S_AXI_AWPROT(s00_axi_awprot), .S_AXI_AWVALID(s00_axi_awvalid), .S_AXI_AWREADY(s00_axi_awready), .S_AXI_WDATA(s00_axi_wdata), .S_AXI_WSTRB(s00_axi_wstrb), .S_AXI_WVALID(s00_axi_wvalid), .S_AXI_WREADY(s00_axi_wready), .S_AXI_BRESP(s00_axi_bresp), .S_AXI_BVALID(s00_axi_bvalid), .S_AXI_BREADY(s00_axi_bready), .S_AXI_ARADDR(s00_axi_araddr), .S_AXI_ARPROT(s00_axi_arprot), .S_AXI_ARVALID(s00_axi_arvalid), .S_AXI_ARREADY(s00_axi_arready), .S_AXI_RDATA(s00_axi_rdata), .S_AXI_RRESP(s00_axi_rresp), .S_AXI_RVALID(s00_axi_rvalid), .S_AXI_RREADY(s00_axi_rready) ); // Instantiation of Axi Bus Interface S01_AXI pocket_interface_v1_0_S01_AXI # ( .USER_IRAM_ADDR_WIDTH(USER_IRAM_ADDR_WIDTH), .C_S_AXI_ID_WIDTH(C_S01_AXI_ID_WIDTH), .C_S_AXI_DATA_WIDTH(C_S01_AXI_DATA_WIDTH), .C_S_AXI_ADDR_WIDTH(C_S01_AXI_ADDR_WIDTH), .C_S_AXI_AWUSER_WIDTH(C_S01_AXI_AWUSER_WIDTH), .C_S_AXI_ARUSER_WIDTH(C_S01_AXI_ARUSER_WIDTH), .C_S_AXI_WUSER_WIDTH(C_S01_AXI_WUSER_WIDTH), .C_S_AXI_RUSER_WIDTH(C_S01_AXI_RUSER_WIDTH), .C_S_AXI_BUSER_WIDTH(C_S01_AXI_BUSER_WIDTH) ) pocket_interface_v1_0_S01_AXI_inst ( .tdp_en_a (tdp_en_a) // output wire Enable operations RAM Port A ,.tdp_wren_a (tdp_wren_a[3:0]) // output wire [3:0] Write Enables RAM Port A ,.tdp_addr_a (tdp_addr_a[USER_IRAM_ADDR_WIDTH-1:0]) // output wire [9:0] Address RAM Port A ,.tdp_din_a (tdp_din_a[31:0]) // output wire [31:0] Write Data RAM Port A ,.tdp_dout_a (tdp_dout_a[31:0]) // input wire [31:0] Read Data RAM Port A ,.S_AXI_ACLK(s01_axi_aclk), .S_AXI_ARESETN(s01_axi_aresetn), .S_AXI_AWID(s01_axi_awid), .S_AXI_AWADDR(s01_axi_awaddr), .S_AXI_AWLEN(s01_axi_awlen), .S_AXI_AWSIZE(s01_axi_awsize), .S_AXI_AWBURST(s01_axi_awburst), .S_AXI_AWLOCK(s01_axi_awlock), .S_AXI_AWCACHE(s01_axi_awcache), .S_AXI_AWPROT(s01_axi_awprot), .S_AXI_AWQOS(s01_axi_awqos), .S_AXI_AWREGION(s01_axi_awregion), .S_AXI_AWUSER(s01_axi_awuser), .S_AXI_AWVALID(s01_axi_awvalid), .S_AXI_AWREADY(s01_axi_awready), .S_AXI_WDATA(s01_axi_wdata), .S_AXI_WSTRB(s01_axi_wstrb), .S_AXI_WLAST(s01_axi_wlast), .S_AXI_WUSER(s01_axi_wuser), .S_AXI_WVALID(s01_axi_wvalid), .S_AXI_WREADY(s01_axi_wready), .S_AXI_BID(s01_axi_bid), .S_AXI_BRESP(s01_axi_bresp), .S_AXI_BUSER(s01_axi_buser), .S_AXI_BVALID(s01_axi_bvalid), .S_AXI_BREADY(s01_axi_bready), .S_AXI_ARID(s01_axi_arid), .S_AXI_ARADDR(s01_axi_araddr), .S_AXI_ARLEN(s01_axi_arlen), .S_AXI_ARSIZE(s01_axi_arsize), .S_AXI_ARBURST(s01_axi_arburst), .S_AXI_ARLOCK(s01_axi_arlock), .S_AXI_ARCACHE(s01_axi_arcache), .S_AXI_ARPROT(s01_axi_arprot), .S_AXI_ARQOS(s01_axi_arqos), .S_AXI_ARREGION(s01_axi_arregion), .S_AXI_ARUSER(s01_axi_aruser), .S_AXI_ARVALID(s01_axi_arvalid), .S_AXI_ARREADY(s01_axi_arready), .S_AXI_RID(s01_axi_rid), .S_AXI_RDATA(s01_axi_rdata), .S_AXI_RRESP(s01_axi_rresp), .S_AXI_RLAST(s01_axi_rlast), .S_AXI_RUSER(s01_axi_ruser), .S_AXI_RVALID(s01_axi_rvalid), .S_AXI_RREADY(s01_axi_rready) ); // Add user logic here // User logic ends endmodule // pocket_interface_v1_0
// Change Feb. 17, 2020. Made RAM access little Endian module dig_core_dpram_32 #( parameter OADDR_BITS = 12 // Num address bits output RAM ) ( input clk, // Bus Clock input reset, // Sync active high reset input ram_cs, // RAM Bus Chip Select input [13:0] ram_addr, // RAM Bus Address input ram_wr, // RAM Bus Write input ram_rd, // RAM Bus Read input [3:0] ram_eb, // RAM Bus Enable Bytes input [31:0] ram_w_data, // RAM Bus Write Data output reg [31:0] ram_r_data // RAM Bus Read Data ); wire clk2pow25 = clk; // System clock: 2^25 Hz wire reset_clk2pow25 = reset; // Sync active high reset wire wr_en_obuf = 'd0; // Buffer Write Enable wire [OADDR_BITS-1:0] wr_addr_obuf = 'd0; // Buffer Address wire [31:0] wr_data_obuf = 'd0; // Buffer Data wire tdp_clk_a = clk; wire tdp_reset_a = reset; wire tdp_en_a_0 = ram_cs & (ram_rd | ram_wr) & ~ram_addr[13] & ~ram_addr[12]; // Enables for RAM ports? wire tdp_en_a_1 = ram_cs & (ram_rd | ram_wr) & ~ram_addr[13] & ram_addr[12]; wire tdp_en_a_2 = ram_cs & (ram_rd | ram_wr) & ram_addr[13] & ~ram_addr[12]; wire tdp_en_a_3 = ram_cs & (ram_rd | ram_wr) & ram_addr[13] & ram_addr[12]; wire [3:0] tdp_wren_a = ram_eb[3:0]; // Ram Bus enable bits //assign tdp_wren_a[3] = ram_addr[0] & ram_eb[1] & ram_wr; // R/W Enable for RAM Ports? //assign tdp_wren_a[2] = ram_addr[0] & ram_eb[0] & ram_wr; ///assign tdp_wren_a[1] = ~ram_addr[0] & ram_eb[1] & ram_wr; //assign tdp_wren_a[0] = ~ram_addr[0] & ram_eb[0] & ram_wr; wire [9:0] tdp_addr_a = ram_addr[11:2]; wire [35:0] tdp_din_a = {4'd0, ram_w_data[31:0]}; // 4 parity bits tied off to 0 (for now) bottom 32 bits is RAM data wire [35:0] tdp_dout_a_0; wire [35:0] tdp_dout_a_1; wire [35:0] tdp_dout_a_2; wire [35:0] tdp_dout_a_3; wire [35:0] tdp_dout_a = ram_addr[13] ? (ram_addr[12] ? tdp_dout_a_3 : tdp_dout_a_2 ) : (ram_addr[12] ? tdp_dout_a_1 : tdp_dout_a_0 ) ; // RAM Port B options wire [11:0] i_wr_addr = {{(12-OADDR_BITS){1'b0}}, wr_addr_obuf[OADDR_BITS-1:0]}; wire tdp_en_b_0 = wr_en_obuf & ~i_wr_addr[11] & ~i_wr_addr[10]; wire tdp_en_b_1 = wr_en_obuf & ~i_wr_addr[11] & i_wr_addr[10]; wire tdp_en_b_2 = wr_en_obuf & i_wr_addr[11] & ~i_wr_addr[10]; wire tdp_en_b_3 = wr_en_obuf & i_wr_addr[11] & i_wr_addr[10]; wire [3:0] tdp_wren_b = {4{wr_en_obuf}}; wire [9:0] tdp_addr_b = i_wr_addr[9:0]; wire [35:0] tdp_din_b = {4'd0, wr_data_obuf[31:0]}; wire [35:0] tdp_dout_b_0; wire [35:0] tdp_dout_b_1; wire [35:0] tdp_dout_b_2; wire [35:0] tdp_dout_b_3; xilinx_tdpram_1024x36 RAM_I_0 ( .clk_a (tdp_clk_a) // input Clock Port A ,.reset_a (tdp_reset_a) // input Sync active high reset ,.en_a (tdp_en_a_0) // input Enable operations Port A ,.regce_a (1'b0) // input Output Register Clock Enable Port A - Not using OutReg ,.wren_a (tdp_wren_a[3:0]) // input [3:0] Write Enables Port A ,.addr_a (tdp_addr_a[9:0]) // input [9:0] Address Port A ,.din_a (tdp_din_a[35:0]) // input [35:0] Data Port A ,.dout_a (tdp_dout_a_0[35:0]) // output [35:0] Data Port A ,.clk_b (clk2pow25) // input Clock Port A ,.reset_b (reset_clk2pow25) // input Sync active high reset ,.en_b (tdp_en_b_0) // input Enable operations Port B ,.regce_b (1'b0) // input Output Register Clock Enable Port B ,.wren_b (tdp_wren_b[3:0]) // input [3:0] Write Enables Port B ,.addr_b (tdp_addr_b[9:0]) // input [9:0] Address Port B ,.din_b (tdp_din_b[35:0]) // input [35:0] Data Port B ,.dout_b (tdp_dout_b_0[35:0]) // output [35:0] Data Port B ); xilinx_tdpram_1024x36 RAM_I_1 ( .clk_a (tdp_clk_a) // input Clock Port A ,.reset_a (tdp_reset_a) // input Sync active high reset ,.en_a (tdp_en_a_1) // input Enable operations Port A ,.regce_a (1'b0) // input Output Register Clock Enable Port A - Not using OutReg ,.wren_a (tdp_wren_a[3:0]) // input [3:0] Write Enables Port A ,.addr_a (tdp_addr_a[9:0]) // input [9:0] Address Port A ,.din_a (tdp_din_a[35:0]) // input [35:0] Data Port A ,.dout_a (tdp_dout_a_1[35:0]) // output [35:0] Data Port A ,.clk_b (clk2pow25) // input Clock Port A ,.reset_b (reset_clk2pow25) // input Sync active high reset ,.en_b (tdp_en_b_1) // input Enable operations Port B ,.regce_b (1'b0) // input Output Register Clock Enable Port B ,.wren_b (tdp_wren_b[3:0]) // input [3:0] Write Enables Port B ,.addr_b (tdp_addr_b[9:0]) // input [9:0] Address Port B ,.din_b (tdp_din_b[35:0]) // input [35:0] Data Port B ,.dout_b (tdp_dout_b_1[35:0]) // output [35:0] Data Port B ); xilinx_tdpram_1024x36 RAM_I_2 ( .clk_a (tdp_clk_a) // input Clock Port A ,.reset_a (tdp_reset_a) // input Sync active high reset ,.en_a (tdp_en_a_2) // input Enable operations Port A ,.regce_a (1'b0) // input Output Register Clock Enable Port A - Not using OutReg ,.wren_a (tdp_wren_a[3:0]) // input [3:0] Write Enables Port A ,.addr_a (tdp_addr_a[9:0]) // input [9:0] Address Port A ,.din_a (tdp_din_a[35:0]) // input [35:0] Data Port A ,.dout_a (tdp_dout_a_2[35:0]) // output [35:0] Data Port A ,.clk_b (clk2pow25) // input Clock Port A ,.reset_b (reset_clk2pow25) // input Sync active high reset ,.en_b (tdp_en_b_2) // input Enable operations Port B ,.regce_b (1'b0) // input Output Register Clock Enable Port B ,.wren_b (tdp_wren_b[3:0]) // input [3:0] Write Enables Port B ,.addr_b (tdp_addr_b[9:0]) // input [9:0] Address Port B ,.din_b (tdp_din_b[35:0]) // input [35:0] Data Port B ,.dout_b (tdp_dout_b_2[35:0]) // output [35:0] Data Port B ); xilinx_tdpram_1024x36 RAM_I_3 ( .clk_a (tdp_clk_a) // input Clock Port A ,.reset_a (tdp_reset_a) // input Sync active high reset ,.en_a (tdp_en_a_3) // input Enable operations Port A ,.regce_a (1'b0) // input Output Register Clock Enable Port A - Not using OutReg ,.wren_a (tdp_wren_a[3:0]) // input [3:0] Write Enables Port A ,.addr_a (tdp_addr_a[9:0]) // input [9:0] Address Port A ,.din_a (tdp_din_a[35:0]) // input [35:0] Data Port A ,.dout_a (tdp_dout_a_3[35:0]) // output [35:0] Data Port A ,.clk_b (clk2pow25) // input Clock Port A ,.reset_b (reset_clk2pow25) // input Sync active high reset ,.en_b (tdp_en_b_3) // input Enable operations Port B ,.regce_b (1'b0) // input Output Register Clock Enable Port B ,.wren_b (tdp_wren_b[3:0]) // input [3:0] Write Enables Port B ,.addr_b (tdp_addr_b[9:0]) // input [9:0] Address Port B ,.din_b (tdp_din_b[35:0]) // input [35:0] Data Port B ,.dout_b (tdp_dout_b_3[35:0]) // output [35:0] Data Port B ); always @ (posedge tdp_clk_a) begin if (tdp_reset_a) begin ram_r_data <= 0; end else begin ram_r_data[31:0] <= tdp_dout_a[31:0]; end end endmodule // dig_core_dpram_32
`timescale 1 ns / 1 ps module pocket_interface_v1_0_S00_AXI # ( // Users to add parameters here parameter integer USER_REG_ADDR_WIDTH = 10, // User parameters ends // Do not modify the parameters beyond this line // Width of S_AXI data bus parameter integer C_S_AXI_DATA_WIDTH = 32, // Width of S_AXI address bus parameter integer C_S_AXI_ADDR_WIDTH = 12 ) ( // Users to add ports here output wire preg_wren, // Register Write Enable output wire [3:0] preg_byte_en, // Register Byte Write Enables output wire [USER_REG_ADDR_WIDTH-1:0] preg_addr, // Register Write Address output wire [31:0] preg_wdata, // Register Write data output wire [USER_REG_ADDR_WIDTH-1:0] preg_raddr, // Register Read Address input wire [31:0] preg_rdata, // Register Read data // User ports ends // Do not modify the ports beyond this line // Global Clock Signal input wire S_AXI_ACLK, // Global Reset Signal. This Signal is Active LOW input wire S_AXI_ARESETN, // Write address (issued by master, acceped by Slave) input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR, // Write channel Protection type. This signal indicates the // privilege and security level of the transaction, and whether // the transaction is a data access or an instruction access. input wire [2 : 0] S_AXI_AWPROT, // Write address valid. This signal indicates that the master signaling // valid write address and control information. input wire S_AXI_AWVALID, // Write address ready. This signal indicates that the slave is ready // to accept an address and associated control signals. output wire S_AXI_AWREADY, // Write data (issued by master, acceped by Slave) input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA, // Write strobes. This signal indicates which byte lanes hold // valid data. There is one write strobe bit for each eight // bits of the write data bus. input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB, // Write valid. This signal indicates that valid write // data and strobes are available. input wire S_AXI_WVALID, // Write ready. This signal indicates that the slave // can accept the write data. output wire S_AXI_WREADY, // Write response. This signal indicates the status // of the write transaction. output wire [1 : 0] S_AXI_BRESP, // Write response valid. This signal indicates that the channel // is signaling a valid write response. output wire S_AXI_BVALID, // Response ready. This signal indicates that the master // can accept a write response. input wire S_AXI_BREADY, // Read address (issued by master, acceped by Slave) input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR, // Protection type. This signal indicates the privilege // and security level of the transaction, and whether the // transaction is a data access or an instruction access. input wire [2 : 0] S_AXI_ARPROT, // Read address valid. This signal indicates that the channel // is signaling valid read address and control information. input wire S_AXI_ARVALID, // Read address ready. This signal indicates that the slave is // ready to accept an address and associated control signals. output wire S_AXI_ARREADY, // Read data (issued by slave) output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA, // Read response. This signal indicates the status of the // read transfer. output wire [1 : 0] S_AXI_RRESP, // Read valid. This signal indicates that the channel is // signaling the required read data. output wire S_AXI_RVALID, // Read ready. This signal indicates that the master can // accept the read data and response information. input wire S_AXI_RREADY ); // AXI4LITE signals reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr; reg axi_awready; reg axi_wready; reg [1 : 0] axi_bresp; reg axi_bvalid; reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr; reg axi_arready; reg [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata; reg [1 : 0] axi_rresp; reg axi_rvalid; // Example-specific design signals // local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH // ADDR_LSB is used for addressing 32/64 bit registers/memories // ADDR_LSB = 2 for 32 bits (n downto 2) // ADDR_LSB = 3 for 64 bits (n downto 3) localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1; //localparam integer OPT_MEM_ADDR_BITS = 4; localparam integer OPT_MEM_ADDR_BITS = USER_REG_ADDR_WIDTH - 1; // up to 1024 registers //---------------------------------------------- //-- Signals for user logic register space example //------------------------------------------------ //-- Number of Slave Registers 32 wire slv_reg_rden; wire slv_reg_wren; // reg [C_S_AXI_DATA_WIDTH-1:0] reg_data_out; integer byte_index; reg aw_en; // I/O Connections assignments assign S_AXI_AWREADY = axi_awready; assign S_AXI_WREADY = axi_wready; assign S_AXI_BRESP = axi_bresp; assign S_AXI_BVALID = axi_bvalid; assign S_AXI_ARREADY = axi_arready; assign S_AXI_RDATA = axi_rdata; assign S_AXI_RRESP = axi_rresp; assign S_AXI_RVALID = axi_rvalid; // Implement axi_awready generation // axi_awready is asserted for one S_AXI_ACLK clock cycle when both // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is // de-asserted when reset is low. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_awready <= 1'b0; aw_en <= 1'b1; end else begin if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en) begin // slave is ready to accept write address when // there is a valid write address and write data // on the write address and data bus. This design // expects no outstanding transactions. axi_awready <= 1'b1; aw_en <= 1'b0; end else if (S_AXI_BREADY && axi_bvalid) begin aw_en <= 1'b1; axi_awready <= 1'b0; end else begin axi_awready <= 1'b0; end end end // Implement axi_awaddr latching // This process is used to latch the address when both // S_AXI_AWVALID and S_AXI_WVALID are valid. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_awaddr <= 0; end else begin if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en) begin // Write Address latching axi_awaddr <= S_AXI_AWADDR; end end end // Implement axi_wready generation // axi_wready is asserted for one S_AXI_ACLK clock cycle when both // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is // de-asserted when reset is low. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_wready <= 1'b0; end else begin if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en ) begin // slave is ready to accept write data when // there is a valid write address and write data // on the write address and data bus. This design // expects no outstanding transactions. axi_wready <= 1'b1; end else begin axi_wready <= 1'b0; end end end // Implement memory mapped register select and write logic generation // The write data is accepted and written to memory mapped registers when // axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to // select byte enables of slave registers while writing. // These registers are cleared when reset (active low) is applied. // Slave register write enable is asserted when valid address and data are available // and the slave is ready to accept the write address and write data. assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID; // always @( posedge S_AXI_ACLK ) // begin // if ( S_AXI_ARESETN == 1'b0 ) // begin // end // else begin // if (slv_reg_wren) // begin // end // end // end // Implement write response logic generation // The write response and response valid signals are asserted by the slave // when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. // This marks the acceptance of address and indicates the status of // write transaction. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_bvalid <= 0; axi_bresp <= 2'b0; end else begin if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID) begin // indicates a valid write response is available axi_bvalid <= 1'b1; axi_bresp <= 2'b0; // 'OKAY' response end // work error responses in future else begin if (S_AXI_BREADY && axi_bvalid) //check if bready is asserted while bvalid is high) //(there is a possibility that bready is always asserted high) begin axi_bvalid <= 1'b0; end end end end // Implement axi_arready generation // axi_arready is asserted for one S_AXI_ACLK clock cycle when // S_AXI_ARVALID is asserted. axi_awready is // de-asserted when reset (active low) is asserted. // The read address is also latched when S_AXI_ARVALID is // asserted. axi_araddr is reset to zero on reset assertion. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_arready <= 1'b0; axi_araddr <= 32'b0; end else begin if (~axi_arready && S_AXI_ARVALID) begin // indicates that the slave has acceped the valid read address axi_arready <= 1'b1; // Read address latching axi_araddr <= S_AXI_ARADDR; end else begin axi_arready <= 1'b0; end end end // Implement axi_arvalid generation // axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both // S_AXI_ARVALID and axi_arready are asserted. The slave registers // data are available on the axi_rdata bus at this instance. The // assertion of axi_rvalid marks the validity of read data on the // bus and axi_rresp indicates the status of read transaction.axi_rvalid // is deasserted on reset (active low). axi_rresp and axi_rdata are // cleared to zero on reset (active low). always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_rvalid <= 0; axi_rresp <= 0; end else begin if (axi_arready && S_AXI_ARVALID && ~axi_rvalid) begin // Valid read data is available at the read data bus axi_rvalid <= 1'b1; axi_rresp <= 2'b0; // 'OKAY' response end else if (axi_rvalid && S_AXI_RREADY) begin // Read data is accepted by the master axi_rvalid <= 1'b0; end end end // Implement memory mapped register select and read logic generation // Slave register read enable is asserted when valid address is available // and the slave is ready to accept the read address. assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid; // Output register or memory read data always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_rdata <= 0; end else begin // When there is a valid read address (S_AXI_ARVALID) with // acceptance of read address by the slave (axi_arready), // output the read dada if (slv_reg_rden) begin // axi_rdata <= reg_data_out; // register read data axi_rdata <= preg_rdata; // register read data end end end // Add user logic here assign preg_wren = slv_reg_wren; assign preg_byte_en[3:0] = S_AXI_WSTRB[3:0]; assign preg_addr[USER_REG_ADDR_WIDTH-1:0] = axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]; assign preg_wdata[31:0] = S_AXI_WDATA[31:0]; assign preg_raddr[USER_REG_ADDR_WIDTH-1:0] = axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]; // User logic ends endmodule
`timescale 1 ns / 1 ps module pocket_interface_v1_0_S01_AXI # ( // Users to add parameters here parameter integer USER_IRAM_ADDR_WIDTH = 12, // User parameters ends // Do not modify the parameters beyond this line // Width of ID for for write address, write data, read address and read data parameter integer C_S_AXI_ID_WIDTH = 1, // Width of S_AXI data bus parameter integer C_S_AXI_DATA_WIDTH = 32, // Width of S_AXI address bus parameter integer C_S_AXI_ADDR_WIDTH = 14, // Width of optional user defined signal in write address channel parameter integer C_S_AXI_AWUSER_WIDTH = 0, // Width of optional user defined signal in read address channel parameter integer C_S_AXI_ARUSER_WIDTH = 0, // Width of optional user defined signal in write data channel parameter integer C_S_AXI_WUSER_WIDTH = 0, // Width of optional user defined signal in read data channel parameter integer C_S_AXI_RUSER_WIDTH = 0, // Width of optional user defined signal in write response channel parameter integer C_S_AXI_BUSER_WIDTH = 0 ) ( // Users to add ports here output wire tdp_en_a, // Enable operations RAM Port A output wire [3:0] tdp_wren_a, // Write Enables RAM Port A output wire [USER_IRAM_ADDR_WIDTH-1:0] tdp_addr_a, // Address RAM Port A output wire [31:0] tdp_din_a, // Write Data RAM Port A input wire [31:0] tdp_dout_a, // Read Data RAM Port A // User ports ends // Do not modify the ports beyond this line // Global Clock Signal input wire S_AXI_ACLK, // Global Reset Signal. This Signal is Active LOW input wire S_AXI_ARESETN, // Write Address ID input wire [C_S_AXI_ID_WIDTH-1 : 0] S_AXI_AWID, // Write address input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR, // Burst length. The burst length gives the exact number of transfers in a burst input wire [7 : 0] S_AXI_AWLEN, // Burst size. This signal indicates the size of each transfer in the burst input wire [2 : 0] S_AXI_AWSIZE, // Burst type. The burst type and the size information, // determine how the address for each transfer within the burst is calculated. input wire [1 : 0] S_AXI_AWBURST, // Lock type. Provides additional information about the // atomic characteristics of the transfer. input wire S_AXI_AWLOCK, // Memory type. This signal indicates how transactions // are required to progress through a system. input wire [3 : 0] S_AXI_AWCACHE, // Protection type. This signal indicates the privilege // and security level of the transaction, and whether // the transaction is a data access or an instruction access. input wire [2 : 0] S_AXI_AWPROT, // Quality of Service, QoS identifier sent for each // write transaction. input wire [3 : 0] S_AXI_AWQOS, // Region identifier. Permits a single physical interface // on a slave to be used for multiple logical interfaces. input wire [3 : 0] S_AXI_AWREGION, // Optional User-defined signal in the write address channel. input wire [C_S_AXI_AWUSER_WIDTH-1 : 0] S_AXI_AWUSER, // Write address valid. This signal indicates that // the channel is signaling valid write address and // control information. input wire S_AXI_AWVALID, // Write address ready. This signal indicates that // the slave is ready to accept an address and associated // control signals. output wire S_AXI_AWREADY, // Write Data input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA, // Write strobes. This signal indicates which byte // lanes hold valid data. There is one write strobe // bit for each eight bits of the write data bus. input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB, // Write last. This signal indicates the last transfer // in a write burst. input wire S_AXI_WLAST, // Optional User-defined signal in the write data channel. input wire [C_S_AXI_WUSER_WIDTH-1 : 0] S_AXI_WUSER, // Write valid. This signal indicates that valid write // data and strobes are available. input wire S_AXI_WVALID, // Write ready. This signal indicates that the slave // can accept the write data. output wire S_AXI_WREADY, // Response ID tag. This signal is the ID tag of the // write response. output wire [C_S_AXI_ID_WIDTH-1 : 0] S_AXI_BID, // Write response. This signal indicates the status // of the write transaction. output wire [1 : 0] S_AXI_BRESP, // Optional User-defined signal in the write response channel. output wire [C_S_AXI_BUSER_WIDTH-1 : 0] S_AXI_BUSER, // Write response valid. This signal indicates that the // channel is signaling a valid write response. output wire S_AXI_BVALID, // Response ready. This signal indicates that the master // can accept a write response. input wire S_AXI_BREADY, // Read address ID. This signal is the identification // tag for the read address group of signals. input wire [C_S_AXI_ID_WIDTH-1 : 0] S_AXI_ARID, // Read address. This signal indicates the initial // address of a read burst transaction. input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR, // Burst length. The burst length gives the exact number of transfers in a burst input wire [7 : 0] S_AXI_ARLEN, // Burst size. This signal indicates the size of each transfer in the burst input wire [2 : 0] S_AXI_ARSIZE, // Burst type. The burst type and the size information, // determine how the address for each transfer within the burst is calculated. input wire [1 : 0] S_AXI_ARBURST, // Lock type. Provides additional information about the // atomic characteristics of the transfer. input wire S_AXI_ARLOCK, // Memory type. This signal indicates how transactions // are required to progress through a system. input wire [3 : 0] S_AXI_ARCACHE, // Protection type. This signal indicates the privilege // and security level of the transaction, and whether // the transaction is a data access or an instruction access. input wire [2 : 0] S_AXI_ARPROT, // Quality of Service, QoS identifier sent for each // read transaction. input wire [3 : 0] S_AXI_ARQOS, // Region identifier. Permits a single physical interface // on a slave to be used for multiple logical interfaces. input wire [3 : 0] S_AXI_ARREGION, // Optional User-defined signal in the read address channel. input wire [C_S_AXI_ARUSER_WIDTH-1 : 0] S_AXI_ARUSER, // Write address valid. This signal indicates that // the channel is signaling valid read address and // control information. input wire S_AXI_ARVALID, // Read address ready. This signal indicates that // the slave is ready to accept an address and associated // control signals. output wire S_AXI_ARREADY, // Read ID tag. This signal is the identification tag // for the read data group of signals generated by the slave. output wire [C_S_AXI_ID_WIDTH-1 : 0] S_AXI_RID, // Read Data output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA, // Read response. This signal indicates the status of // the read transfer. output wire [1 : 0] S_AXI_RRESP, // Read last. This signal indicates the last transfer // in a read burst. output wire S_AXI_RLAST, // Optional User-defined signal in the read address channel. output wire [C_S_AXI_RUSER_WIDTH-1 : 0] S_AXI_RUSER, // Read valid. This signal indicates that the channel // is signaling the required read data. output wire S_AXI_RVALID, // Read ready. This signal indicates that the master can // accept the read data and response information. input wire S_AXI_RREADY ); // AXI4FULL signals reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr; reg axi_awready; reg axi_wready; reg [1 : 0] axi_bresp; reg [C_S_AXI_BUSER_WIDTH-1 : 0] axi_buser; reg axi_bvalid; reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr; reg axi_arready; reg [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata; reg [1 : 0] axi_rresp; reg axi_rlast; reg [C_S_AXI_RUSER_WIDTH-1 : 0] axi_ruser; reg axi_rvalid; // aw_wrap_en determines wrap boundary and enables wrapping wire aw_wrap_en; // ar_wrap_en determines wrap boundary and enables wrapping wire ar_wrap_en; // aw_wrap_size is the size of the write transfer, the // write address wraps to a lower address if upper address // limit is reached wire [31:0] aw_wrap_size ; // ar_wrap_size is the size of the read transfer, the // read address wraps to a lower address if upper address // limit is reached wire [31:0] ar_wrap_size ; // The axi_awv_awr_flag flag marks the presence of write address valid reg axi_awv_awr_flag; //The axi_arv_arr_flag flag marks the presence of read address valid reg axi_arv_arr_flag; // The axi_awlen_cntr internal write address counter to keep track of beats in a burst transaction reg [7:0] axi_awlen_cntr; //The axi_arlen_cntr internal read address counter to keep track of beats in a burst transaction reg [7:0] axi_arlen_cntr; reg [1:0] axi_arburst; reg [1:0] axi_awburst; reg [7:0] axi_arlen; reg [7:0] axi_awlen; //local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH //ADDR_LSB is used for addressing 32/64 bit registers/memories //ADDR_LSB = 2 for 32 bits (n downto 2) //ADDR_LSB = 3 for 42 bits (n downto 3) localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32)+ 1; // localparam integer OPT_MEM_ADDR_BITS = 8; // **** Address Space [8:0] Words localparam integer OPT_MEM_ADDR_BITS = USER_IRAM_ADDR_WIDTH-1; localparam integer USER_NUM_MEM = 1; //---------------------------------------------- //-- Signals for user logic memory space example //------------------------------------------------ wire [OPT_MEM_ADDR_BITS:0] mem_address; wire [USER_NUM_MEM-1:0] mem_select; reg [C_S_AXI_DATA_WIDTH-1:0] mem_data_out[0 : USER_NUM_MEM-1]; genvar i; genvar j; genvar mem_byte_index; // I/O Connections assignments assign S_AXI_AWREADY = axi_awready; assign S_AXI_WREADY = axi_wready; assign S_AXI_BRESP = axi_bresp; assign S_AXI_BUSER = axi_buser; assign S_AXI_BVALID = axi_bvalid; assign S_AXI_ARREADY = axi_arready; assign S_AXI_RDATA = axi_rdata; assign S_AXI_RRESP = axi_rresp; assign S_AXI_RLAST = axi_rlast; assign S_AXI_RUSER = axi_ruser; assign S_AXI_RVALID = axi_rvalid; assign S_AXI_BID = S_AXI_AWID; assign S_AXI_RID = S_AXI_ARID; assign aw_wrap_size = (C_S_AXI_DATA_WIDTH/8 * (axi_awlen)); assign ar_wrap_size = (C_S_AXI_DATA_WIDTH/8 * (axi_arlen)); assign aw_wrap_en = ((axi_awaddr & aw_wrap_size) == aw_wrap_size)? 1'b1: 1'b0; assign ar_wrap_en = ((axi_araddr & ar_wrap_size) == ar_wrap_size)? 1'b1: 1'b0; // Implement axi_awready generation // axi_awready is asserted for one S_AXI_ACLK clock cycle when both // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is // de-asserted when reset is low. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_awready <= 1'b0; axi_awv_awr_flag <= 1'b0; end else begin if (~axi_awready && S_AXI_AWVALID && ~axi_awv_awr_flag && ~axi_arv_arr_flag) begin // slave is ready to accept an address and // associated control signals axi_awready <= 1'b1; axi_awv_awr_flag <= 1'b1; // used for generation of bresp() and bvalid end else if (S_AXI_WLAST && axi_wready) // preparing to accept next address after current write burst tx completion begin axi_awv_awr_flag <= 1'b0; end else begin axi_awready <= 1'b0; end end end // Implement axi_awaddr latching // This process is used to latch the address when both // S_AXI_AWVALID and S_AXI_WVALID are valid. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_awaddr <= 0; axi_awlen_cntr <= 0; axi_awburst <= 0; axi_awlen <= 0; end else begin if (~axi_awready && S_AXI_AWVALID && ~axi_awv_awr_flag) begin // address latching axi_awaddr <= S_AXI_AWADDR[C_S_AXI_ADDR_WIDTH - 1:0]; axi_awburst <= S_AXI_AWBURST; axi_awlen <= S_AXI_AWLEN; // start address of transfer axi_awlen_cntr <= 0; end else if((axi_awlen_cntr <= axi_awlen) && axi_wready && S_AXI_WVALID) begin axi_awlen_cntr <= axi_awlen_cntr + 1; case (axi_awburst) 2'b00: // fixed burst // The write address for all the beats in the transaction are fixed begin axi_awaddr <= axi_awaddr; //for awsize = 4 bytes (010) end 2'b01: //incremental burst // The write address for all the beats in the transaction are increments by awsize begin axi_awaddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB] <= axi_awaddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB] + 1; //awaddr aligned to 4 byte boundary axi_awaddr[ADDR_LSB-1:0] <= {ADDR_LSB{1'b0}}; //for awsize = 4 bytes (010) end 2'b10: //Wrapping burst // The write address wraps when the address reaches wrap boundary if (aw_wrap_en) begin axi_awaddr <= (axi_awaddr - aw_wrap_size); end else begin axi_awaddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB] <= axi_awaddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB] + 1; axi_awaddr[ADDR_LSB-1:0] <= {ADDR_LSB{1'b0}}; end default: //reserved (incremental burst for example) begin axi_awaddr <= axi_awaddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB] + 1; //for awsize = 4 bytes (010) end endcase end end end // Implement axi_wready generation // axi_wready is asserted for one S_AXI_ACLK clock cycle when both // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is // de-asserted when reset is low. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_wready <= 1'b0; end else begin if ( ~axi_wready && S_AXI_WVALID && axi_awv_awr_flag) begin // slave can accept the write data axi_wready <= 1'b1; end //else if (~axi_awv_awr_flag) else if (S_AXI_WLAST && axi_wready) begin axi_wready <= 1'b0; end end end // Implement write response logic generation // The write response and response valid signals are asserted by the slave // when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. // This marks the acceptance of address and indicates the status of // write transaction. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_bvalid <= 0; axi_bresp <= 2'b0; axi_buser <= 0; end else begin if (axi_awv_awr_flag && axi_wready && S_AXI_WVALID && ~axi_bvalid && S_AXI_WLAST ) begin axi_bvalid <= 1'b1; axi_bresp <= 2'b0; // 'OKAY' response end else begin if (S_AXI_BREADY && axi_bvalid) //check if bready is asserted while bvalid is high) //(there is a possibility that bready is always asserted high) begin axi_bvalid <= 1'b0; end end end end // Implement axi_arready generation // axi_arready is asserted for one S_AXI_ACLK clock cycle when // S_AXI_ARVALID is asserted. axi_awready is // de-asserted when reset (active low) is asserted. // The read address is also latched when S_AXI_ARVALID is // asserted. axi_araddr is reset to zero on reset assertion. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_arready <= 1'b0; axi_arv_arr_flag <= 1'b0; end else begin if (~axi_arready && S_AXI_ARVALID && ~axi_awv_awr_flag && ~axi_arv_arr_flag) begin axi_arready <= 1'b1; axi_arv_arr_flag <= 1'b1; end else if (axi_rvalid && S_AXI_RREADY && axi_arlen_cntr == axi_arlen) // preparing to accept next address after current read completion begin axi_arv_arr_flag <= 1'b0; end else begin axi_arready <= 1'b0; end end end // Implement axi_araddr latching //This process is used to latch the address when both //S_AXI_ARVALID and S_AXI_RVALID are valid. always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_araddr <= 0; axi_arlen_cntr <= 0; axi_arburst <= 0; axi_arlen <= 0; axi_rlast <= 1'b0; axi_ruser <= 0; end else begin if (~axi_arready && S_AXI_ARVALID && ~axi_arv_arr_flag) begin // address latching axi_araddr <= S_AXI_ARADDR[C_S_AXI_ADDR_WIDTH - 1:0]; axi_arburst <= S_AXI_ARBURST; axi_arlen <= S_AXI_ARLEN; // start address of transfer axi_arlen_cntr <= 0; axi_rlast <= 1'b0; end else if((axi_arlen_cntr <= axi_arlen) && axi_rvalid && S_AXI_RREADY) begin axi_arlen_cntr <= axi_arlen_cntr + 1; axi_rlast <= 1'b0; case (axi_arburst) 2'b00: // fixed burst // The read address for all the beats in the transaction are fixed begin axi_araddr <= axi_araddr; //for arsize = 4 bytes (010) end 2'b01: //incremental burst // The read address for all the beats in the transaction are increments by awsize begin axi_araddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB] <= axi_araddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB] + 1; //araddr aligned to 4 byte boundary axi_araddr[ADDR_LSB-1:0] <= {ADDR_LSB{1'b0}}; //for awsize = 4 bytes (010) end 2'b10: //Wrapping burst // The read address wraps when the address reaches wrap boundary if (ar_wrap_en) begin axi_araddr <= (axi_araddr - ar_wrap_size); end else begin axi_araddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB] <= axi_araddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB] + 1; //araddr aligned to 4 byte boundary axi_araddr[ADDR_LSB-1:0] <= {ADDR_LSB{1'b0}}; end default: //reserved (incremental burst for example) begin axi_araddr <= axi_araddr[C_S_AXI_ADDR_WIDTH - 1:ADDR_LSB]+1; //for arsize = 4 bytes (010) end endcase end else if((axi_arlen_cntr == axi_arlen) && ~axi_rlast && axi_arv_arr_flag ) begin axi_rlast <= 1'b1; end else if (S_AXI_RREADY) begin axi_rlast <= 1'b0; end end end // Implement axi_arvalid generation // axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both // S_AXI_ARVALID and axi_arready are asserted. The slave registers // data are available on the axi_rdata bus at this instance. The // assertion of axi_rvalid marks the validity of read data on the // bus and axi_rresp indicates the status of read transaction.axi_rvalid // is deasserted on reset (active low). axi_rresp and axi_rdata are // cleared to zero on reset (active low). always @( posedge S_AXI_ACLK ) begin if ( S_AXI_ARESETN == 1'b0 ) begin axi_rvalid <= 0; axi_rresp <= 0; end else begin if (axi_arv_arr_flag && ~axi_rvalid) begin axi_rvalid <= 1'b1; axi_rresp <= 2'b0; // 'OKAY' response end else if (axi_rvalid && S_AXI_RREADY) begin axi_rvalid <= 1'b0; end end end // ------------------------------------------ // -- Example code to access user logic memory region // ------------------------------------------ // generate // if (USER_NUM_MEM >= 1) // begin // assign mem_select = 1; // assign mem_address = (axi_arv_arr_flag? axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]:(axi_awv_awr_flag? axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]:0)); // end // endgenerate // implement Block RAM(s) // generate // for(i=0; i<= USER_NUM_MEM-1; i=i+1) // begin:BRAM_GEN // wire mem_rden; // wire mem_wren; // assign mem_wren = axi_wready && S_AXI_WVALID ; // assign mem_rden = axi_arv_arr_flag ; //& ~axi_rvalid // for(mem_byte_index=0; mem_byte_index<= (C_S_AXI_DATA_WIDTH/8-1); mem_byte_index=mem_byte_index+1) // begin:BYTE_BRAM_GEN // wire [8-1:0] data_in ; // wire [8-1:0] data_out; // reg [8-1:0] byte_ram [0 : 255]; // integer j; //assigning 8 bit data // assign data_in = S_AXI_WDATA[(mem_byte_index*8+7) -: 8]; // assign data_out = byte_ram[mem_address]; // always @( posedge S_AXI_ACLK ) // begin // if (mem_wren && S_AXI_WSTRB[mem_byte_index]) // begin // byte_ram[mem_address] <= data_in; // end // end // always @( posedge S_AXI_ACLK ) // begin // if (mem_rden) // begin // mem_data_out[i][(mem_byte_index*8+7) -: 8] <= data_out; // end // end // end // end // endgenerate //Output register or memory read data // always @( mem_data_out, axi_rvalid) // begin // if (axi_rvalid) // begin // Read address mux // axi_rdata <= mem_data_out[0]; // end // else // begin // axi_rdata <= 32'h00000000; // end // end // Add user logic here //wire tdp_clk_a = S_AXI_ACLK; //wire tdp_reset_a = ~S_AXI_ARESETN; // Read and Write Enables wire tdp_wren = axi_wready && S_AXI_WVALID ; wire tdp_rden = axi_arv_arr_flag ; //& ~axi_rvalid // Enable A or read or write assign tdp_en_a = tdp_wren || tdp_rden; assign tdp_wren_a[3:0] = {4{tdp_wren}} & S_AXI_WSTRB[3:0]; // Write Enables //wire [7:0] tdp_low_addr = (axi_arv_arr_flag? axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]:(axi_awv_awr_flag? axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]:0)); //wire [9:0] tdp_addr_a = {2'b00, tdp_low_addr[7:0]}; //wire [8:0] tdp_low_addr = (axi_arv_arr_flag? axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]:(axi_awv_awr_flag? axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]:0)); //assign tdp_addr_a[9:0] = {1'b0, tdp_low_addr[8:0]}; assign tdp_addr_a = (axi_arv_arr_flag? axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]:(axi_awv_awr_flag? axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]:0)); //wire [35:0] tdp_din_a = {4'b0000, S_AXI_WDATA[31:0]}; assign tdp_din_a[31:0] = S_AXI_WDATA[31:0]; // wire [35:0] tdp_dout_a; always @( tdp_dout_a, axi_rvalid) begin if (axi_rvalid) begin // Read address mux axi_rdata <= tdp_dout_a[31:0]; end else begin axi_rdata <= 32'h00000000; end end // User logic ends endmodule
// Registers for proto_core_top module proto_core_top_regs #( parameter FRAC = 19, // Fractional bits parameter CHANNELS = 50 // Number of channels ) ( /* input clk2pow25, // System clock 2^25 MHz input reset_clk2pow25, // Active high sync reset */ input wire clk_axi, // Clock for AXI4 domain input wire resetn_axi, // Active low sync reset // A2D SPI Interface output wire ad_sclk, // A2D SPI Clock output wire ad_csb, // A2D SPI Enable SPI-Active Low inout wire ad_sdio, // A2D SPI Serial I/O Data // Register Interface input wire preg_wren, // Register Write Enable input wire [3:0] preg_byte_en, // Register Byte Write Enables input wire [9:0] preg_addr, // Register Write Address input wire [31:0] preg_wdata, // Register Write data input wire [9:0] preg_raddr, // Register Read Address output reg [31:0] preg_rdata // Register Read data ); localparam integer C_S_AXI_DATA_WIDTH = 32; integer byte_index; //---------------------------------------------- //-- Signals for user logic register space example //------------------------------------------------ //-- Number of Slave Registers 16 // Toggle Registers reg slv_reg0_tog; reg slv_reg1_tog; reg slv_reg2_tog; reg slv_reg3_tog; reg slv_reg4_tog; reg slv_reg5_tog; reg slv_reg6_tog; reg slv_reg7_tog; reg slv_reg8_tog; reg slv_reg9_tog; reg slv_reg10_tog; reg slv_reg11_tog; reg slv_reg12_tog; reg slv_reg13_tog; reg slv_reg14_tog; reg slv_reg15_tog; reg slv_reg16_tog; reg slv_reg17_tog; reg slv_reg18_tog; reg slv_reg19_tog; reg slv_reg20_tog; reg slv_reg21_tog; reg slv_reg22_tog; reg slv_reg23_tog; reg slv_reg24_tog; reg slv_reg25_tog; reg slv_reg26_tog; reg slv_reg27_tog; reg slv_reg28_tog; reg slv_reg29_tog; reg slv_reg30_tog; reg slv_reg31_tog; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg0; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg1; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg2; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg3; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg4; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg5; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg6; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg7; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg8; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg9; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg10; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg11; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg12; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg13; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg14; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg15; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg16; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg17; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg18; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg19; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg20; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg21; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg22; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg23; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg24; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg25; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg26; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg27; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg28; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg29; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg30; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg31; always @( posedge clk_axi ) begin if ( resetn_axi == 1'b0 ) begin slv_reg0_tog <= 0; slv_reg1_tog <= 0; slv_reg2_tog <= 0; slv_reg3_tog <= 0; slv_reg4_tog <= 0; slv_reg5_tog <= 0; slv_reg6_tog <= 0; slv_reg7_tog <= 0; slv_reg8_tog <= 0; slv_reg9_tog <= 0; slv_reg10_tog <= 0; slv_reg11_tog <= 0; slv_reg12_tog <= 0; slv_reg13_tog <= 0; slv_reg14_tog <= 0; slv_reg15_tog <= 0; slv_reg16_tog <= 0; slv_reg17_tog <= 0; slv_reg18_tog <= 0; slv_reg19_tog <= 0; slv_reg20_tog <= 0; slv_reg21_tog <= 0; slv_reg22_tog <= 0; slv_reg23_tog <= 0; slv_reg24_tog <= 0; slv_reg25_tog <= 0; slv_reg26_tog <= 0; slv_reg27_tog <= 0; slv_reg28_tog <= 0; slv_reg29_tog <= 0; slv_reg30_tog <= 0; slv_reg31_tog <= 0; slv_reg0 <= 0; slv_reg1 <= 0; slv_reg2 <= 0; slv_reg3 <= 0; slv_reg4 <= 0; slv_reg5 <= 0; slv_reg6 <= 0; slv_reg7 <= 0; slv_reg8 <= 0; slv_reg9 <= 0; slv_reg10 <= 0; slv_reg11 <= 0; slv_reg12 <= 32'h00000006; slv_reg13 <= 0; slv_reg14 <= 0; slv_reg15 <= 0; slv_reg16 <= 0; slv_reg17 <= 0; slv_reg18 <= 0; slv_reg19 <= 0; slv_reg20 <= 0; slv_reg21 <= 0; slv_reg22 <= 0; slv_reg23 <= 0; slv_reg24 <= 0; slv_reg25 <= 0; slv_reg26 <= 0; slv_reg27 <= 0; slv_reg28 <= 0; slv_reg29 <= 0; slv_reg30 <= 0; slv_reg31 <= 0; end else begin if (preg_wren) begin case ( preg_addr[4:0] ) 5'h00: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg0_tog <= ~slv_reg0_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 0 slv_reg0[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end // case: 5'h00 5'h01: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg1_tog <= ~slv_reg1_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 1 slv_reg1[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h02: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg2_tog <= ~slv_reg2_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 2 slv_reg2[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h03: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg3_tog <= ~slv_reg3_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 3 slv_reg3[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h04: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg4_tog <= ~slv_reg4_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 4 slv_reg4[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h05: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg5_tog <= ~slv_reg5_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 5 slv_reg5[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h06: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg6_tog <= ~slv_reg6_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 6 slv_reg6[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h07: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg7_tog <= ~slv_reg7_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 7 slv_reg7[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h08: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg8_tog <= ~slv_reg8_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 8 slv_reg8[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h09: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg9_tog <= ~slv_reg9_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 9 slv_reg9[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h0A: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg10_tog <= ~slv_reg10_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 10 slv_reg10[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h0B: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg11_tog <= ~slv_reg11_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 11 slv_reg11[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h0C: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg12_tog <= ~slv_reg12_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 12 slv_reg12[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h0D: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg13_tog <= ~slv_reg13_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 13 slv_reg13[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h0E: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg14_tog <= ~slv_reg14_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 14 slv_reg14[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h0F: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg15_tog <= ~slv_reg15_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 15 slv_reg15[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h10: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg16_tog <= ~slv_reg16_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 16 slv_reg16[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h11: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg17_tog <= ~slv_reg17_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 17 slv_reg17[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h12: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg18_tog <= ~slv_reg18_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 18 slv_reg18[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h13: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg19_tog <= ~slv_reg19_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 19 slv_reg19[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h14: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg20_tog <= ~slv_reg20_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 20 slv_reg20[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h15: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg21_tog <= ~slv_reg21_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 21 slv_reg21[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h16: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg22_tog <= ~slv_reg22_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 22 slv_reg22[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h17: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg23_tog <= ~slv_reg23_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 23 slv_reg23[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h18: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg24_tog <= ~slv_reg24_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 24 slv_reg24[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h19: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg25_tog <= ~slv_reg25_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 25 slv_reg25[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h1A: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg26_tog <= ~slv_reg26_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 26 slv_reg26[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h1B: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg27_tog <= ~slv_reg27_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 27 slv_reg27[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h1C: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg28_tog <= ~slv_reg28_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 28 slv_reg28[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h1D: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg29_tog <= ~slv_reg29_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 29 slv_reg29[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h1E: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg30_tog <= ~slv_reg30_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 30 slv_reg30[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end 5'h1F: begin if (|preg_byte_en[3:0]) // Any byte write enables then toggle slv_reg31_tog <= ~slv_reg31_tog; for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) if ( preg_byte_en[byte_index] == 1 ) begin // Respective byte enables are asserted as per write strobes // Slave register 31 slv_reg31[(byte_index*8) +: 8] <= preg_wdata[(byte_index*8) +: 8]; end end default : // From example code but isn't needed begin slv_reg0 <= slv_reg0; slv_reg1 <= slv_reg1; slv_reg2 <= slv_reg2; slv_reg3 <= slv_reg3; slv_reg4 <= slv_reg4; slv_reg5 <= slv_reg5; slv_reg6 <= slv_reg6; slv_reg7 <= slv_reg7; slv_reg8 <= slv_reg8; slv_reg9 <= slv_reg9; slv_reg10 <= slv_reg10; slv_reg11 <= slv_reg11; slv_reg12 <= slv_reg12; slv_reg13 <= slv_reg13; slv_reg14 <= slv_reg14; slv_reg15 <= slv_reg15; slv_reg16 <= slv_reg16; slv_reg17 <= slv_reg17; slv_reg18 <= slv_reg18; slv_reg19 <= slv_reg19; slv_reg20 <= slv_reg20; slv_reg21 <= slv_reg21; slv_reg22 <= slv_reg22; slv_reg23 <= slv_reg23; slv_reg24 <= slv_reg24; slv_reg25 <= slv_reg25; slv_reg26 <= slv_reg26; slv_reg27 <= slv_reg27; slv_reg28 <= slv_reg28; slv_reg29 <= slv_reg29; slv_reg30 <= slv_reg30; slv_reg31 <= slv_reg31; end // case: default endcase // case ( preg_addr[4:0] ) end // if (preg_wren) end // else: !if( resetn_axi == 1'b0 ) end // always @ ( posedge clk_axi ) assign ad_sclk = slv_reg12[2]; assign ad_csb = slv_reg12[1]; assign ad_sdio = slv_reg12[0]; // Combinatorial select always @(*) begin // Address decoding for reading registers case ( preg_raddr[4:0] ) 5'h00 : preg_rdata <= slv_reg0; 5'h01 : preg_rdata <= slv_reg1; 5'h02 : preg_rdata <= slv_reg2; 5'h03 : preg_rdata <= slv_reg3; 5'h04 : preg_rdata <= slv_reg4; 5'h05 : preg_rdata <= slv_reg5; 5'h06 : preg_rdata <= slv_reg6; 5'h07 : preg_rdata <= slv_reg7; 5'h08 : preg_rdata <= slv_reg8; 5'h09 : preg_rdata <= slv_reg9; 5'h0A : preg_rdata <= slv_reg10; 5'h0B : preg_rdata <= slv_reg11; 5'h0C : preg_rdata <= slv_reg12; 5'h0D : preg_rdata <= slv_reg13; 5'h0E : preg_rdata <= slv_reg14; 5'h0F : preg_rdata <= slv_reg15; 5'h10 : preg_rdata <= slv_reg16; 5'h11 : preg_rdata <= slv_reg17; 5'h12 : preg_rdata <= slv_reg18; 5'h13 : preg_rdata <= slv_reg19; 5'h14 : preg_rdata <= slv_reg20; 5'h15 : preg_rdata <= slv_reg21; 5'h16 : preg_rdata <= slv_reg22; 5'h17 : preg_rdata <= slv_reg23; 5'h18 : preg_rdata <= slv_reg24; 5'h19 : preg_rdata <= slv_reg25; 5'h1A : preg_rdata <= slv_reg26; 5'h1B : preg_rdata <= slv_reg27; 5'h1C : preg_rdata <= slv_reg28; 5'h1D : preg_rdata <= slv_reg29; 5'h1E : preg_rdata <= slv_reg30; 5'h1F : preg_rdata <= slv_reg31; default : preg_rdata <= 0; endcase end // always @ (*) endmodule // proto_core_top_regs