OpenCores
URL https://opencores.org/ocsvn/wb2axi4/wb2axi4/trunk

Subversion Repositories wb2axi4

[/] [wb2axi4/] [trunk/] [rtl/] [axi2wb.sv] - Rev 3

Compare with Previous | Blame | View Log

//Author     : Alex Zhang (cgzhangwei@gmail.com)
//Date       : 03-11-2015
`include "wb2axi_parameters.vh"
module axi2wb (
axi_clk,
wb_clk,
axi_resetn,
wb_resetn,
ENABLE,
AXI_IF,
WB_TX_IF
);
parameter AXI_ID_W         = `WB2AXI_AXI_ID_W   ;
parameter AXI_ADDR_W       = `WB2AXI_AXI_ADDR_W ;
parameter AXI_DATA_W       = `WB2AXI_AXI_DATA_W ;
parameter AXI_PROT_W       = `WB2AXI_AXI_PROT_W ;
parameter AXI_STB_W        = `WB2AXI_AXI_STB_W  ;
parameter AXI_LEN_W        = `WB2AXI_AXI_LEN_W  ;
parameter AXI_SIZE_W       = `WB2AXI_AXI_SIZE_W ;
parameter AXI_BURST_W      = `WB2AXI_AXI_BURST_W;
parameter AXI_LOCK_W       = `WB2AXI_AXI_LOCK_W ;
parameter AXI_CACHE_W      = `WB2AXI_AXI_CACHE_W;
parameter AXI_RESP_W       = `WB2AXI_AXI_RESP_W ;

parameter FIFO_ADDR_DEPTH_W = 10;
parameter FIFO_ADDR_W       = AXI_ID_W+AXI_ADDR_W+AXI_PROT_W+AXI_LEN_W+AXI_SIZE_W+AXI_BURST_W+AXI_LOCK_W+AXI_CACHE_W+1;
parameter FIFO_DATA_DEPTH_W = 11;
parameter FIFO_DATA_W       = AXI_ID_W+AXI_DATA_W+AXI_STB_W+2;

parameter WB_ADR_W          = 32;
parameter WB_DAT_W          = 32;
parameter WB_TGA_W          = 8;
parameter WB_TGD_W          = 8;
parameter WB_TGC_W          = 4;
parameter WB_SEL_W          = 4;
parameter WB_CTI_W          = 3;
parameter WB_BTE_W          = 2;

localparam SRAM_UNUSED_ADDR_W= 4;
localparam AXI_MAX_RESP_W    = 4;
localparam FA_SRAM_UNUSED_ADDR_W = 1;
localparam FD_SRAM_UNUSED_ADDR_W = 1;
input  wire             axi_clk;
input  wire             wb_clk;
input  wire             axi_resetn;
input  wire             wb_resetn;
input  wire             ENABLE;
axi_if.target           AXI_IF;
wishbone_if.master      WB_TX_IF;

sram_if #(.DATA_W(32), .ADDR_W(11))  dat_sram_tx();
sram_if #(.DATA_W(64), .ADDR_W(10))  adr_sram_tx();

wire                   sync_ENABLE_axi;
wire                   sync_ENABLE_wb ;
wire                   fifo_adr_full  ;
wire                   fifo_dat_full  ;
wire [FIFO_DATA_W-1:0] fifo_dat_rdata ;
wire [FIFO_ADDR_W-1:0] fifo_adr_rdata ;

sync_doble_ff #(.DATA_W(1)) I_SYNC_ENABLE_AXI (
  .CLK              (           axi_clk ),
  .RESET_N          (        axi_resetn ),
  .DIN              (            ENABLE ),
  .DOUT             (   sync_ENABLE_axi )
);
sync_doble_ff #(.DATA_W(1)) I_SYNC_ENABLE_WB (
  .CLK              (            wb_clk ),
  .RESET_N          (         wb_resetn ),
  .DIN              (            ENABLE ),
  .DOUT             (   sync_ENABLE_wb  )
);
wire [FIFO_ADDR_W-1:0]  fifo_addr_info;
wire [FIFO_DATA_W-1:0]  fifo_data_info;
wire                    fifo_addr_wr  ;
wire                    fifo_data_wr  ;
wire [FIFO_ADDR_W-1:0]  fifo_adr_wdata;
wire [FIFO_DATA_W-1:0]  fifo_dat_wdata;

axi_ingress #(
      .AXI_ID_W        (    AXI_ID_W    ),
      .AXI_ADDR_W      (    AXI_ADDR_W   ),
      .AXI_DATA_W      (    AXI_DATA_W   ),
      .AXI_PROT_W      (    AXI_PROT_W   ),
      .AXI_STB_W       (    AXI_STB_W    ),
      .AXI_LEN_W       (    AXI_LEN_W    ),
      .AXI_SIZE_W      (    AXI_SIZE_W   ),
      .AXI_BURST_W     (    AXI_BURST_W  ),
      .AXI_LOCK_W      (    AXI_LOCK_W   ),
      .AXI_CACHE_W     (    AXI_CACHE_W  ),
      .AXI_RESP_W      (    AXI_RESP_W   ),
      .AXI_MAX_RESP_W  ( AXI_MAX_RESP_W  ),
      .FIFO_DAT_W      (   FIFO_DATA_W   ),
      .FIFO_ADR_W      (   FIFO_ADDR_W   )
) I_AXI_INGRESS (
  .axi_clk        ( axi_clk       ),
  .reset_n        ( axi_resetn    ),
  .AXI_IF         ( AXI_IF        ),
  .fifo_full      ( fifo_full     ),
  .fifo_addr_info ( fifo_addr_info),
  .fifo_data_info ( fifo_data_info),
  .fifo_addr_wr   ( fifo_addr_wr  ),
  .fifo_data_wr   ( fifo_data_wr  )
);

assign fifo_full  = fifo_adr_full | fifo_dat_full;

async_fifo #(
  .FIFO_DEPTH_W      (FIFO_ADDR_DEPTH_W),
  .FIFO_W            (FIFO_ADDR_W),
  .SRAM_UNUSED_ADDR_W(FA_SRAM_UNUSED_ADDR_W)
) I_FIFO_ADR (
  .wrclk_RESET_N    (      axi_resetn ),
  .rdclk_RESET_N    (       wb_resetn ),
  .wr_en            ( sync_ENABLE_axi ),
  .rd_en            ( sync_ENABLE_wb  ),
  .fifo_wr_clk      (         axi_clk ),
  .fifo_rd_clk      (         wb_clk  ),
  .fifo_wr          (     fifo_adr_wr ),
  .fifo_rd          (     fifo_adr_rd ),
  .fifo_wdata       (  fifo_adr_wdata ),
  .fifo_rdata       (  fifo_adr_rdata ),
  .fifo_empty       (  fifo_adr_empty ),
  .fifo_full        (   fifo_adr_full ),
  .fifo_level       (                 ),
  .SRAM_IF          (     adr_sram_tx )
);
wire    adr_sram_enable;
wire    adr_sram_wr;
wire [FIFO_ADDR_W-1:0] adr_sram_din;
wire [FIFO_ADDR_W-1:0] adr_sram_dout;
wire [FIFO_ADDR_DEPTH_W-1:0] adr_sram_addr;
sram_model #(
  .MEM_ADDR_W  (FIFO_ADDR_DEPTH_W),
  .MEM_DATA_W  (FIFO_ADDR_W)
) SRAM_ADR_1phc1024x32mx4tn(
  .CLK(axi_clk        ),
  .NCE(adr_sram_enable),
  .NWRT(adr_sram_wr   ),
  .NOE(1'b0           ),
  .DIN(adr_sram_din   ),
  .ADDR(adr_sram_addr ),
  .DOUT(adr_sram_dout )
);
assign adr_sram_enable   = adr_sram_tx.rd_l | adr_sram_tx.wr_l;
assign adr_sram_wr       = adr_sram_tx.wr_l;
assign adr_sram_din      = adr_sram_tx.wdata;
assign adr_sram_addr     = ~adr_sram_tx.wr_l ? adr_sram_tx.wr_address : adr_sram_tx.rd_address;
assign adr_sram_tx.rdata = adr_sram_dout;

assign fifo_adr_wr    = fifo_addr_wr;
assign fifo_adr_wdata = fifo_addr_info;
async_fifo #(
  .FIFO_DEPTH_W      (FIFO_DATA_DEPTH_W),
  .FIFO_W            (FIFO_DATA_W),
  .SRAM_UNUSED_ADDR_W(FD_SRAM_UNUSED_ADDR_W)
) I_FIFO_DAT (
  .wrclk_RESET_N    (      axi_resetn ),
  .rdclk_RESET_N    (       wb_resetn ),
  .wr_en            ( sync_ENABLE_axi ),
  .rd_en            ( sync_ENABLE_wb  ),
  .fifo_wr_clk      (         axi_clk ),
  .fifo_rd_clk      (         wb_clk  ),
  .fifo_wr          (     fifo_dat_wr ),
  .fifo_rd          (     fifo_dat_rd ),
  .fifo_wdata       (  fifo_dat_wdata ),
  .fifo_rdata       (  fifo_dat_rdata ),
  .fifo_empty       (  fifo_dat_empty ),
  .fifo_full        (   fifo_dat_full ),
  .fifo_level       (                 ),
  .SRAM_IF          (     dat_sram_tx )
);
wire    dat_sram_enable; 
wire    dat_sram_wr; 
wire [FIFO_DATA_W-1:0]       dat_sram_din;
wire [FIFO_DATA_W-1:0]       dat_sram_dout;
wire [FIFO_DATA_DEPTH_W-1:0] dat_sram_addr;
sram_model #(
  .MEM_ADDR_W  (FIFO_DATA_DEPTH_W),
  .MEM_DATA_W  (FIFO_DATA_W)
) SRAM_DAT_1phc1024x32mx4tn(
  .CLK(axi_clk        ),
  .NCE(dat_sram_enable),
  .NWRT(dat_sram_wr   ),
  .NOE(1'b0           ),
  .DIN(dat_sram_din   ),
  .ADDR(dat_sram_addr),
  .DOUT(dat_sram_dout)
);
assign dat_sram_enable   = dat_sram_tx.rd_l | dat_sram_tx.wr_l;
assign dat_sram_wr       = dat_sram_tx.wr_l;
assign dat_sram_din      = dat_sram_tx.wdata;
assign dat_sram_addr     = ~dat_sram_tx.wr_l ? dat_sram_tx.wr_address : dat_sram_tx.rd_address;
assign dat_sram_tx.rdata = dat_sram_dout;


assign fifo_dat_wr    = fifo_data_wr;
assign fifo_dat_wdata = fifo_data_info;
wb_egress #(   
  .WB_ADR_W   (WB_ADR_W   ),  
  .WB_DAT_W   (WB_DAT_W   ),  
  .WB_TGA_W   (WB_TGA_W   ),  
  .WB_TGD_W   (WB_TGD_W   ),  
  .WB_TGC_W   (WB_TGC_W   ),  
  .WB_SEL_W   (WB_SEL_W   ),  
  .WB_CTI_W   (WB_CTI_W   ),  
  .WB_BTE_W   (WB_BTE_W   ),  
  .AXI_ID_W   (AXI_ID_W   ),  
  .AXI_ADDR_W (AXI_ADDR_W ),  
  .AXI_LEN_W  (AXI_LEN_W  ),  
  .AXI_SIZE_W (AXI_SIZE_W ),  
  .AXI_BURST_W(AXI_BURST_W),  
  .AXI_LOCK_W (AXI_LOCK_W ),  
  .AXI_CACHE_W(AXI_CACHE_W),  
  .AXI_PROT_W (AXI_PROT_W ),  
  .AXI_DATA_W (AXI_DATA_W ),  
  .AXI_STB_W  (AXI_STB_W )  
) I_WB_EGRESS(
  .wb_clk         ( wb_clk         ),
  .wb_resetn      ( wb_resetn      ),
  .ENABLE         ( sync_ENABLE_wb ),
  .WB_TX_IF       ( WB_TX_IF       ),
  .fifo_adr_rdata ( fifo_adr_rdata ),
  .fifo_adr_rd    ( fifo_adr_rd    ),
  .fifo_adr_empty ( fifo_adr_empty ),
  .fifo_dat_rdata ( fifo_dat_rdata ),
  .fifo_dat_rd    ( fifo_dat_rd    ),
  .fifo_dat_empty ( fifo_dat_empty )
);

endmodule 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.