HITDAQ/FPGA_firmware/q_sys/synthesis/submodules/rw_manager_ddr3.v
2024-10-11 14:49:54 +02:00

233 lines
7.8 KiB
Verilog

// (C) 2001-2019 Intel Corporation. All rights reserved.
// Your use of Intel Corporation's design tools, logic functions and other
// software and tools, and its AMPP partner logic functions, and any output
// files from any of the foregoing (including device programming or simulation
// files), and any associated documentation or information are expressly subject
// to the terms and conditions of the Intel Program License Subscription
// Agreement, Intel FPGA IP License Agreement, or other applicable
// license agreement, including, without limitation, that your use is for the
// sole purpose of programming logic devices manufactured by Intel and sold by
// Intel or its authorized distributors. Please refer to the applicable
// agreement for further details.
`timescale 1 ps / 1 ps
module rw_manager_ddr3 (
avl_clk,
avl_reset_n,
avl_address,
avl_write,
avl_writedata,
avl_read,
avl_readdata,
avl_waitrequest,
afi_clk,
afi_reset_n,
afi_addr,
afi_ba,
afi_cs_n,
afi_cke,
afi_odt,
afi_ras_n,
afi_cas_n,
afi_we_n,
afi_dqs_burst,
afi_rst_n,
afi_wdata,
afi_wdata_valid,
afi_dm,
afi_rdata_en,
afi_rdata_en_full,
afi_rdata,
afi_rdata_valid,
afi_wrank,
afi_rrank,
csr_clk,
csr_ena,
csr_dout_phy,
csr_dout
);
parameter AVL_DATA_WIDTH = 32;
parameter AVL_ADDR_WIDTH = 16;
parameter MEM_ADDRESS_WIDTH = 19;
parameter MEM_CONTROL_WIDTH = 4;
parameter MEM_DQ_WIDTH = 36;
parameter MEM_DM_WIDTH = 4;
parameter MEM_NUMBER_OF_RANKS = 1;
parameter MEM_CLK_EN_WIDTH = 1;
parameter MEM_BANK_WIDTH = 2;
parameter MEM_ODT_WIDTH = 2;
parameter MEM_CHIP_SELECT_WIDTH = 1;
parameter MEM_READ_DQS_WIDTH = 4;
parameter MEM_WRITE_DQS_WIDTH = 4;
parameter AFI_RATIO = 2;
parameter RATE = "Half";
parameter HCX_COMPAT_MODE = 0;
parameter DEVICE_FAMILY = "STRATIXIV";
parameter AC_ROM_INIT_FILE_NAME = "AC_ROM.hex";
parameter INST_ROM_INIT_FILE_NAME = "inst_ROM.hex";
parameter DEBUG_WRITE_TO_READ_RATIO_2_EXPONENT = 0;
parameter DEBUG_WRITE_TO_READ_RATIO = 0;
parameter MAX_DI_BUFFER_WORDS_LOG_2 = 0;
parameter AVL_CLK_PS = 123;
parameter AFI_CLK_PS = 456;
parameter ENABLE_NON_DES_CAL = 0;
parameter TREFI = 36000;
parameter REFRESH_INTERVAL = 30000;
parameter TRFC = 370;
parameter AP_MODE_EN= 2'b00;
input avl_clk;
input avl_reset_n;
input [AVL_ADDR_WIDTH-1:0] avl_address;
input avl_write;
input [AVL_DATA_WIDTH-1:0] avl_writedata;
input avl_read;
output [AVL_DATA_WIDTH-1:0] avl_readdata;
output avl_waitrequest;
input afi_clk;
input afi_reset_n;
output [MEM_ADDRESS_WIDTH * AFI_RATIO - 1:0] afi_addr;
output [MEM_BANK_WIDTH * AFI_RATIO - 1:0] afi_ba;
output [MEM_CHIP_SELECT_WIDTH * AFI_RATIO - 1:0] afi_cs_n;
output [MEM_CLK_EN_WIDTH * AFI_RATIO - 1:0] afi_cke;
output [MEM_ODT_WIDTH * AFI_RATIO - 1:0] afi_odt;
output [MEM_CONTROL_WIDTH * AFI_RATIO - 1:0] afi_ras_n;
output [MEM_CONTROL_WIDTH * AFI_RATIO - 1:0] afi_cas_n;
output [MEM_CONTROL_WIDTH * AFI_RATIO - 1:0] afi_we_n;
output [MEM_WRITE_DQS_WIDTH * AFI_RATIO - 1:0] afi_dqs_burst;
output [MEM_CONTROL_WIDTH * AFI_RATIO - 1:0] afi_rst_n;
output [MEM_DQ_WIDTH * 2 * AFI_RATIO - 1:0] afi_wdata;
output [MEM_WRITE_DQS_WIDTH * AFI_RATIO - 1:0] afi_wdata_valid;
output [MEM_DM_WIDTH * 2 * AFI_RATIO - 1:0] afi_dm;
output [AFI_RATIO-1:0] afi_rdata_en;
output [AFI_RATIO-1:0] afi_rdata_en_full;
input [MEM_DQ_WIDTH * 2 * AFI_RATIO - 1:0] afi_rdata;
input [AFI_RATIO-1:0] afi_rdata_valid;
output [MEM_WRITE_DQS_WIDTH * MEM_NUMBER_OF_RANKS * AFI_RATIO -1:0] afi_wrank;
output [MEM_READ_DQS_WIDTH * MEM_NUMBER_OF_RANKS * AFI_RATIO -1:0] afi_rrank;
input csr_clk;
input csr_ena;
input csr_dout_phy;
output csr_dout;
parameter AC_BUS_WIDTH = 30;
wire [AC_BUS_WIDTH - 1:0] ac_bus;
rw_manager_generic rw_mgr_inst (
.avl_clk(avl_clk),
.avl_reset_n(avl_reset_n),
.avl_address(avl_address),
.avl_write(avl_write),
.avl_writedata(avl_writedata),
.avl_read(avl_read),
.avl_readdata(avl_readdata),
.avl_waitrequest(avl_waitrequest),
.afi_clk(afi_clk),
.afi_reset_n(afi_reset_n),
.ac_masked_bus (afi_cs_n),
.ac_bus (ac_bus),
.afi_wdata(afi_wdata),
.afi_dm(afi_dm),
.afi_odt(afi_odt),
.afi_rdata(afi_rdata),
.afi_rdata_valid(afi_rdata_valid[0]),
.afi_wrank(afi_wrank),
.afi_rrank(afi_rrank),
.csr_clk(csr_clk),
.csr_ena(csr_ena),
.csr_dout_phy(csr_dout_phy),
.csr_dout(csr_dout)
);
defparam rw_mgr_inst.AVL_CLK_PS = AVL_CLK_PS;
defparam rw_mgr_inst.AFI_CLK_PS = AFI_CLK_PS;
defparam rw_mgr_inst.ENABLE_NON_DES_CAL = ENABLE_NON_DES_CAL;
defparam rw_mgr_inst.TREFI = TREFI;
defparam rw_mgr_inst.REFRESH_INTERVAL = REFRESH_INTERVAL;
defparam rw_mgr_inst.TRFC = TRFC;
defparam rw_mgr_inst.AVL_DATA_WIDTH = AVL_DATA_WIDTH;
defparam rw_mgr_inst.AVL_ADDRESS_WIDTH = AVL_ADDR_WIDTH;
defparam rw_mgr_inst.MEM_DQ_WIDTH = MEM_DQ_WIDTH;
defparam rw_mgr_inst.MEM_DM_WIDTH = MEM_DM_WIDTH;
defparam rw_mgr_inst.MEM_ODT_WIDTH = MEM_ODT_WIDTH;
defparam rw_mgr_inst.AC_BUS_WIDTH = AC_BUS_WIDTH;
defparam rw_mgr_inst.AC_MASKED_BUS_WIDTH = MEM_CHIP_SELECT_WIDTH * AFI_RATIO;
defparam rw_mgr_inst.MASK_WIDTH = MEM_CHIP_SELECT_WIDTH;
defparam rw_mgr_inst.AFI_RATIO = AFI_RATIO;
defparam rw_mgr_inst.MEM_READ_DQS_WIDTH = MEM_READ_DQS_WIDTH;
defparam rw_mgr_inst.MEM_WRITE_DQS_WIDTH = MEM_WRITE_DQS_WIDTH;
defparam rw_mgr_inst.MEM_NUMBER_OF_RANKS = MEM_NUMBER_OF_RANKS;
defparam rw_mgr_inst.RATE = RATE;
defparam rw_mgr_inst.HCX_COMPAT_MODE = HCX_COMPAT_MODE;
defparam rw_mgr_inst.DEVICE_FAMILY = DEVICE_FAMILY;
defparam rw_mgr_inst.DEBUG_READ_DI_WIDTH = 32;
defparam rw_mgr_inst.DEBUG_WRITE_TO_READ_RATIO_2_EXPONENT = DEBUG_WRITE_TO_READ_RATIO_2_EXPONENT;
defparam rw_mgr_inst.DEBUG_WRITE_TO_READ_RATIO = DEBUG_WRITE_TO_READ_RATIO;
defparam rw_mgr_inst.MAX_DI_BUFFER_WORDS_LOG_2 = MAX_DI_BUFFER_WORDS_LOG_2;
defparam rw_mgr_inst.AC_ROM_INIT_FILE_NAME = AC_ROM_INIT_FILE_NAME;
defparam rw_mgr_inst.INST_ROM_INIT_FILE_NAME = INST_ROM_INIT_FILE_NAME;
defparam rw_mgr_inst.AC_ODT_BIT =
(AFI_RATIO == 4) ? 27 :
(AFI_RATIO == 2) ? 25 :
24;
defparam rw_mgr_inst.AP_MODE_EN = AP_MODE_EN;
generate
begin
wire [MEM_ADDRESS_WIDTH-1:0] afi_address_half;
assign afi_address_half = ac_bus[12:0];
assign afi_addr = {AFI_RATIO{afi_address_half}};
assign afi_ba = {AFI_RATIO{ac_bus[15:13]}};
assign afi_rst_n = {(MEM_CONTROL_WIDTH * AFI_RATIO){ac_bus[16]}};
assign afi_ras_n = {(MEM_CONTROL_WIDTH * AFI_RATIO){ac_bus[17]}};
assign afi_cas_n = {(MEM_CONTROL_WIDTH * AFI_RATIO){ac_bus[18]}};
assign afi_we_n = {(MEM_CONTROL_WIDTH * AFI_RATIO){ac_bus[19]}};
if (AFI_RATIO == 4) begin
assign afi_dqs_burst = {{(MEM_WRITE_DQS_WIDTH * AFI_RATIO / 4){ac_bus[23]}},
{(MEM_WRITE_DQS_WIDTH * AFI_RATIO / 4){ac_bus[22]}},
{(MEM_WRITE_DQS_WIDTH * AFI_RATIO / 4){ac_bus[21]}},
{(MEM_WRITE_DQS_WIDTH * AFI_RATIO / 4){ac_bus[20]}}};
assign afi_rdata_en_full = {AFI_RATIO{ac_bus[24]}};
assign afi_rdata_en = {AFI_RATIO{ac_bus[25]}};
assign afi_wdata_valid = {MEM_WRITE_DQS_WIDTH * AFI_RATIO{ac_bus[26]}};
assign afi_cke = {(MEM_CLK_EN_WIDTH * AFI_RATIO){ac_bus[28]}};
end else if (AFI_RATIO == 2) begin
assign afi_dqs_burst = {{(MEM_WRITE_DQS_WIDTH * AFI_RATIO / 2){ac_bus[21]}}, {(MEM_WRITE_DQS_WIDTH * AFI_RATIO / 2){ac_bus[20]}}};
assign afi_rdata_en_full = {AFI_RATIO{ac_bus[22]}};
assign afi_rdata_en = {AFI_RATIO{ac_bus[23]}};
assign afi_wdata_valid = {MEM_WRITE_DQS_WIDTH * AFI_RATIO{ac_bus[24]}};
assign afi_cke = {(MEM_CLK_EN_WIDTH * AFI_RATIO){ac_bus[26]}};
end else begin
assign afi_dqs_burst = {MEM_WRITE_DQS_WIDTH * AFI_RATIO{ac_bus[20]}};
assign afi_rdata_en_full = {AFI_RATIO{ac_bus[21]}};
assign afi_rdata_en = {AFI_RATIO{ac_bus[22]}};
assign afi_wdata_valid = {MEM_WRITE_DQS_WIDTH * AFI_RATIO{ac_bus[23]}};
assign afi_cke = {(MEM_CLK_EN_WIDTH * AFI_RATIO){ac_bus[25]}};
end
end
endgenerate
endmodule