From d94a97b112dfe52a01daeefdc02bdbb53dd87e59 Mon Sep 17 00:00:00 2001 From: Benjamin Krill Date: Mon, 17 Feb 2014 13:33:46 +0100 Subject: [PATCH] initial HDET design --- .gitmodules | 9 + README | 12 + fpga/src/dvi | 1 + fpga/src/i2c/master/i2c_master_bit_ctrl.vhd | 496 ++ fpga/src/i2c/master/i2c_master_byte_ctrl.vhd | 371 + fpga/src/i2c/master/i2c_master_top.vhd | 366 + fpga/src/i2c/master/i2c_specs.pdf | Bin 0 -> 211471 bytes fpga/src/i2c/master/i2c_wrapper.vhdl | 193 + fpga/src/i2c/sim/sim_tb.vhd | 131 + fpga/src/i2c/slave/hdmi_in.dat | 256 + fpga/src/i2c/slave/hdmi_in_syncmaster191t.dat | 128 + fpga/src/i2c/slave/hdmi_in_syncmaster940t.dat | 256 + fpga/src/i2c/slave/i2c_rom.vhd | 80 + fpga/src/i2c/slave/i2c_slave.vhd | 282 + fpga/src/sig/ddr2dvi.vhd | 194 + fpga/src/sig/dvi2ddr.vhd | 112 + fpga/src/sig/sig.vhd | 127 + fpga/src/sig/sig_read.vhd | 281 + fpga/src/sig/sig_read_tb.vhd | 263 + fpga/src/sig/sig_tb.vhd | 112 + fpga/src/sig/sig_write.vhd | 171 + fpga/src/snippets | 1 + fpga/src/top/atlys.ucf | 93 + fpga/src/top/atlys.vhd | 275 + fpga/src/top/atlys_sig.ucf | 196 + fpga/src/top/atlys_sig.vhd | 466 ++ fpga/src/top/dmb.ucf | 98 + fpga/src/top/dmb.vhd | 345 + fpga/src/vendor/xilinx/atlys_ddr2/coregen.cgp | 9 + .../vendor/xilinx/atlys_ddr2/create_ddr2.tcl | 37 + fpga/src/vendor/xilinx/atlys_ddr2/ddr2.gise | 49 + fpga/src/vendor/xilinx/atlys_ddr2/ddr2.ncf | 164 + fpga/src/vendor/xilinx/atlys_ddr2/ddr2.vho | 365 + fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xco | 49 + fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xise | 123 + .../xilinx/atlys_ddr2/ddr2/docs/ug388.pdf | Bin 0 -> 2172724 bytes .../xilinx/atlys_ddr2/ddr2/docs/ug416.pdf | Bin 0 -> 80254 bytes .../ddr2/example_design/datasheet.txt | 72 + .../ddr2/example_design/par/create_ise.sh | 72 + .../ddr2/example_design/par/example_top.ucf | 172 + .../ddr2/example_design/par/icon_coregen.xco | 48 + .../ddr2/example_design/par/ila_coregen.xco | 131 + .../ddr2/example_design/par/ise_flow.sh | 86 + .../ddr2/example_design/par/ise_run.txt | 58 + .../ddr2/example_design/par/makeproj.sh | 2 + .../example_design/par/mem_interface_top.ut | 22 + .../ddr2/example_design/par/readme.txt | 146 + .../ddr2/example_design/par/rem_files.sh | 169 + .../ddr2/example_design/par/set_ise_prop.tcl | 106 + .../ddr2/example_design/par/vio_coregen.xco | 51 + .../ddr2/example_design/rtl/example_top.vhd | 1059 +++ .../example_design/rtl/iodrp_controller.vhd | 372 + .../rtl/iodrp_mcb_controller.vhd | 517 ++ .../example_design/rtl/mcb_raw_wrapper.vhd | 7117 +++++++++++++++++ .../rtl/mcb_soft_calibration.vhd | 1774 ++++ .../rtl/mcb_soft_calibration_top.vhd | 428 + .../rtl/memc3_infrastructure.vhd | 334 + .../ddr2/example_design/rtl/memc3_tb_top.vhd | 1070 +++ .../ddr2/example_design/rtl/memc3_wrapper.vhd | 1013 +++ .../example_design/rtl/traffic_gen/afifo.vhd | 280 + .../rtl/traffic_gen/cmd_gen.vhd | 1077 +++ .../rtl/traffic_gen/cmd_prbs_gen.vhd | 247 + .../rtl/traffic_gen/data_prbs_gen.vhd | 135 + .../rtl/traffic_gen/init_mem_pattern_ctr.vhd | 620 ++ .../rtl/traffic_gen/mcb_flow_control.vhd | 539 ++ .../rtl/traffic_gen/mcb_traffic_gen.vhd | 1001 +++ .../rtl/traffic_gen/rd_data_gen.vhd | 434 + .../rtl/traffic_gen/read_data_path.vhd | 638 ++ .../rtl/traffic_gen/read_posted_fifo.vhd | 339 + .../rtl/traffic_gen/sp6_data_gen.vhd | 793 ++ .../rtl/traffic_gen/tg_status.vhd | 142 + .../rtl/traffic_gen/v6_data_gen.vhd | 3276 ++++++++ .../rtl/traffic_gen/wr_data_gen.vhd | 511 ++ .../rtl/traffic_gen/write_data_path.vhd | 210 + .../sim/functional/ddr2_model_c3.v | 2031 +++++ .../functional/ddr2_model_parameters_c3.vh | 1394 ++++ .../example_design/sim/functional/isim.sh | 70 + .../example_design/sim/functional/isim.tcl | 72 + .../example_design/sim/functional/readme.txt | 131 + .../ddr2/example_design/sim/functional/sim.do | 144 + .../sim/functional/sim_tb_top.vhd | 445 ++ .../sim/functional/timing_sim.sh | 72 + .../synth/mem_interface_top_synp.sdc | 36 + .../ddr2/example_design/synth/script_synp.tcl | 56 + .../atlys_ddr2/ddr2/user_design/datasheet.txt | 72 + .../ddr2/user_design/par/create_ise.sh | 72 + .../atlys_ddr2/ddr2/user_design/par/ddr2.ucf | 163 + .../ddr2/user_design/par/icon_coregen.xco | 48 + .../ddr2/user_design/par/ila_coregen.xco | 131 + .../ddr2/user_design/par/ise_flow.sh | 86 + .../ddr2/user_design/par/ise_run.txt | 58 + .../ddr2/user_design/par/makeproj.sh | 2 + .../ddr2/user_design/par/mem_interface_top.ut | 22 + .../ddr2/user_design/par/readme.txt | 146 + .../ddr2/user_design/par/rem_files.sh | 169 + .../ddr2/user_design/par/set_ise_prop.tcl | 90 + .../ddr2/user_design/par/vio_coregen.xco | 51 + .../atlys_ddr2/ddr2/user_design/rtl/ddr2.vhd | 822 ++ .../ddr2/user_design/rtl/iodrp_controller.vhd | 372 + .../user_design/rtl/iodrp_mcb_controller.vhd | 517 ++ .../ddr2/user_design/rtl/mcb_raw_wrapper.vhd | 7117 +++++++++++++++++ .../user_design/rtl/mcb_soft_calibration.vhd | 1774 ++++ .../rtl/mcb_soft_calibration_top.vhd | 428 + .../user_design/rtl/memc3_infrastructure.vhd | 334 + .../ddr2/user_design/rtl/memc3_wrapper.vhd | 1013 +++ .../atlys_ddr2/ddr2/user_design/sim/afifo.vhd | 280 + .../ddr2/user_design/sim/cmd_gen.vhd | 1077 +++ .../ddr2/user_design/sim/cmd_prbs_gen.vhd | 247 + .../ddr2/user_design/sim/data_prbs_gen.vhd | 135 + .../ddr2/user_design/sim/ddr2_model_c3.v | 2031 +++++ .../sim/ddr2_model_parameters_c3.vh | 1394 ++++ .../user_design/sim/init_mem_pattern_ctr.vhd | 620 ++ .../atlys_ddr2/ddr2/user_design/sim/isim.sh | 70 + .../atlys_ddr2/ddr2/user_design/sim/isim.tcl | 72 + .../ddr2/user_design/sim/mcb_flow_control.vhd | 539 ++ .../ddr2/user_design/sim/mcb_traffic_gen.vhd | 1001 +++ .../ddr2/user_design/sim/memc3_tb_top.vhd | 1070 +++ .../ddr2/user_design/sim/rd_data_gen.vhd | 434 + .../ddr2/user_design/sim/read_data_path.vhd | 638 ++ .../ddr2/user_design/sim/read_posted_fifo.vhd | 339 + .../ddr2/user_design/sim/readme.txt | 131 + .../atlys_ddr2/ddr2/user_design/sim/sim.do | 141 + .../ddr2/user_design/sim/sim_tb_top.vhd | 975 +++ .../ddr2/user_design/sim/sp6_data_gen.vhd | 793 ++ .../ddr2/user_design/sim/tg_status.vhd | 142 + .../ddr2/user_design/sim/v6_data_gen.vhd | 3276 ++++++++ .../ddr2/user_design/sim/wr_data_gen.vhd | 511 ++ .../ddr2/user_design/sim/write_data_path.vhd | 210 + .../synth/mem_interface_top_synp.sdc | 20 + .../ddr2/user_design/synth/script_synp.tcl | 40 + .../vendor/xilinx/atlys_ddr2/ddr2_flist.txt | 112 + .../vendor/xilinx/atlys_ddr2/ddr2_readme.txt | 45 + .../vendor/xilinx/atlys_ddr2/ddr2_xmdf.tcl | 78 + .../vendor/xilinx/atlys_ddr2/edit_ddr2.tcl | 37 + fpga/src/vendor/xilinx/px_fifo.ngc | 3 + fpga/src/vendor/xilinx/px_fifo.vhd | 286 + fpga/src/vendor/xilinx/px_fifo.xco | 213 + fpga/syn/Makefile | 235 + fpga/syn/syn.gise | 258 + fpga/syn/syn.xise | 513 ++ fpga/tools/edid2dat.sh | 31 + fpga/tools/edid_extract_timing.sh | 61 + fx2 | 1 + 143 files changed, 67169 insertions(+) create mode 100644 .gitmodules create mode 100644 README create mode 160000 fpga/src/dvi create mode 100644 fpga/src/i2c/master/i2c_master_bit_ctrl.vhd create mode 100644 fpga/src/i2c/master/i2c_master_byte_ctrl.vhd create mode 100644 fpga/src/i2c/master/i2c_master_top.vhd create mode 100644 fpga/src/i2c/master/i2c_specs.pdf create mode 100644 fpga/src/i2c/master/i2c_wrapper.vhdl create mode 100644 fpga/src/i2c/sim/sim_tb.vhd create mode 100644 fpga/src/i2c/slave/hdmi_in.dat create mode 100644 fpga/src/i2c/slave/hdmi_in_syncmaster191t.dat create mode 100644 fpga/src/i2c/slave/hdmi_in_syncmaster940t.dat create mode 100644 fpga/src/i2c/slave/i2c_rom.vhd create mode 100644 fpga/src/i2c/slave/i2c_slave.vhd create mode 100644 fpga/src/sig/ddr2dvi.vhd create mode 100644 fpga/src/sig/dvi2ddr.vhd create mode 100644 fpga/src/sig/sig.vhd create mode 100644 fpga/src/sig/sig_read.vhd create mode 100644 fpga/src/sig/sig_read_tb.vhd create mode 100644 fpga/src/sig/sig_tb.vhd create mode 100644 fpga/src/sig/sig_write.vhd create mode 160000 fpga/src/snippets create mode 100644 fpga/src/top/atlys.ucf create mode 100644 fpga/src/top/atlys.vhd create mode 100644 fpga/src/top/atlys_sig.ucf create mode 100644 fpga/src/top/atlys_sig.vhd create mode 100644 fpga/src/top/dmb.ucf create mode 100644 fpga/src/top/dmb.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/coregen.cgp create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/create_ddr2.tcl create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2.gise create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2.ncf create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2.vho create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xco create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xise create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/docs/ug388.pdf create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/docs/ug416.pdf create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/datasheet.txt create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/create_ise.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/example_top.ucf create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/icon_coregen.xco create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ila_coregen.xco create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ise_flow.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ise_run.txt create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/makeproj.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/mem_interface_top.ut create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/readme.txt create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/rem_files.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/set_ise_prop.tcl create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/vio_coregen.xco create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/example_top.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/iodrp_controller.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/iodrp_mcb_controller.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_raw_wrapper.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_soft_calibration.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_soft_calibration_top.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_infrastructure.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_tb_top.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_wrapper.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/afifo.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/cmd_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/cmd_prbs_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/data_prbs_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/init_mem_pattern_ctr.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/mcb_flow_control.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/mcb_traffic_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/rd_data_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/read_data_path.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/read_posted_fifo.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/sp6_data_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/tg_status.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/v6_data_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/wr_data_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/write_data_path.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/ddr2_model_c3.v create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/ddr2_model_parameters_c3.vh create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/isim.sh create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/isim.tcl create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/readme.txt create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/sim.do create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/sim_tb_top.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/timing_sim.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/synth/mem_interface_top_synp.sdc create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/synth/script_synp.tcl create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/datasheet.txt create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/create_ise.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/ddr2.ucf create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/icon_coregen.xco create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/ila_coregen.xco create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/ise_flow.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/ise_run.txt create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/makeproj.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/mem_interface_top.ut create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/readme.txt create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/rem_files.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/set_ise_prop.tcl create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/par/vio_coregen.xco create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/rtl/ddr2.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/rtl/iodrp_controller.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/rtl/iodrp_mcb_controller.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/rtl/mcb_raw_wrapper.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/rtl/mcb_soft_calibration.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/rtl/mcb_soft_calibration_top.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/rtl/memc3_infrastructure.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/rtl/memc3_wrapper.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/afifo.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/cmd_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/cmd_prbs_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/data_prbs_gen.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/ddr2_model_c3.v create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/ddr2_model_parameters_c3.vh create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/init_mem_pattern_ctr.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/isim.sh create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/isim.tcl create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/mcb_flow_control.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/mcb_traffic_gen.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/memc3_tb_top.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/rd_data_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/read_data_path.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/read_posted_fifo.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/readme.txt create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/sim.do create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/sim_tb_top.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/sp6_data_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/tg_status.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/v6_data_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/wr_data_gen.vhd create mode 100755 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/sim/write_data_path.vhd create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/synth/mem_interface_top_synp.sdc create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2/user_design/synth/script_synp.tcl create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2_flist.txt create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2_readme.txt create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/ddr2_xmdf.tcl create mode 100644 fpga/src/vendor/xilinx/atlys_ddr2/edit_ddr2.tcl create mode 100644 fpga/src/vendor/xilinx/px_fifo.ngc create mode 100644 fpga/src/vendor/xilinx/px_fifo.vhd create mode 100644 fpga/src/vendor/xilinx/px_fifo.xco create mode 100644 fpga/syn/Makefile create mode 100644 fpga/syn/syn.gise create mode 100644 fpga/syn/syn.xise create mode 100755 fpga/tools/edid2dat.sh create mode 100755 fpga/tools/edid_extract_timing.sh create mode 160000 fx2 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..335ddf8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "fpga/src/dvi"] + path = fpga/src/dvi + url = http://dev.krll.de/git/hdmi +[submodule "fx2"] + path = fx2 + url = http://dev.krll.de/git/fx2 +[submodule "fpga/src/snippets"] + path = fpga/src/snippets + url = http://dev.krll.de/git/snippets diff --git a/README b/README new file mode 100644 index 0000000..84cf448 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +HDMI Experimental Toolkit + +-- SOURCE CODE -------------------------------------------- +- git submodules: +http://dev.krll.de/git/hdmi +http://dev.krll.de/git/fx2 +http://dev.krll.de/git/snippets + +- clone: +git clone ssh://dev.krll.de//home/shared/dev/hmb.git/ +git submodule init +git submodule update diff --git a/fpga/src/dvi b/fpga/src/dvi new file mode 160000 index 0000000..6a2d616 --- /dev/null +++ b/fpga/src/dvi @@ -0,0 +1 @@ +Subproject commit 6a2d616d8aed15ba241dd9ea65518ecf6f128961 diff --git a/fpga/src/i2c/master/i2c_master_bit_ctrl.vhd b/fpga/src/i2c/master/i2c_master_bit_ctrl.vhd new file mode 100644 index 0000000..0f786b4 --- /dev/null +++ b/fpga/src/i2c/master/i2c_master_bit_ctrl.vhd @@ -0,0 +1,496 @@ +--------------------------------------------------------------------- +---- ---- +---- WISHBONE revB2 I2C Master Core; bit-controller ---- +---- ---- +---- ---- +---- Author: Richard Herveille ---- +---- richard@asics.ws ---- +---- www.asics.ws ---- +---- ---- +---- Downloaded from: http://www.opencores.org/projects/i2c/ ---- +---- ---- +--------------------------------------------------------------------- +---- ---- +---- Copyright (C) 2000 Richard Herveille ---- +---- richard@asics.ws ---- +---- ---- +---- This source file may be used and distributed without ---- +---- restriction provided that this copyright statement is not ---- +---- removed from the file and that any derivative work contains ---- +---- the original copyright notice and the associated disclaimer.---- +---- ---- +---- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ---- +---- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ---- +---- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ---- +---- FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ---- +---- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ---- +---- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ---- +---- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ---- +---- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ---- +---- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ---- +---- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ---- +---- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ---- +---- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ---- +---- POSSIBILITY OF SUCH DAMAGE. ---- +---- ---- +--------------------------------------------------------------------- + +-- CVS Log +-- +-- $Id: i2c_master_bit_ctrl.vhd,v 1.14 2006/10/11 12:10:13 rherveille Exp $ +-- +-- $Date: 2006/10/11 12:10:13 $ +-- $Revision: 1.14 $ +-- $Author: rherveille $ +-- $Locker: $ +-- $State: Exp $ +-- +-- Change History: +-- $Log: i2c_master_bit_ctrl.vhd,v $ +-- Revision 1.14 2006/10/11 12:10:13 rherveille +-- Added missing semicolons ';' on endif +-- +-- Revision 1.13 2006/10/06 10:48:24 rherveille +-- fixed short scl high pulse after clock stretch +-- +-- Revision 1.12 2004/05/07 11:53:31 rherveille +-- Fixed previous fix :) Made a variable vs signal mistake. +-- +-- Revision 1.11 2004/05/07 11:04:00 rherveille +-- Fixed a bug where the core would signal an arbitration lost (AL bit set), when another master controls the bus and the other master generates a STOP bit. +-- +-- Revision 1.10 2004/02/27 07:49:43 rherveille +-- Fixed a bug in the arbitration-lost signal generation. VHDL version only. +-- +-- Revision 1.9 2003/08/12 14:48:37 rherveille +-- Forgot an 'end if' :-/ +-- +-- Revision 1.8 2003/08/09 07:01:13 rherveille +-- Fixed a bug in the Arbitration Lost generation caused by delay on the (external) sda line. +-- Fixed a potential bug in the byte controller's host-acknowledge generation. +-- +-- Revision 1.7 2003/02/05 00:06:02 rherveille +-- Fixed a bug where the core would trigger an erroneous 'arbitration lost' interrupt after being reset, when the reset pulse width < 3 clk cycles. +-- +-- Revision 1.6 2003/02/01 02:03:06 rherveille +-- Fixed a few 'arbitration lost' bugs. VHDL version only. +-- +-- Revision 1.5 2002/12/26 16:05:47 rherveille +-- Core is now a Multimaster I2C controller. +-- +-- Revision 1.4 2002/11/30 22:24:37 rherveille +-- Cleaned up code +-- +-- Revision 1.3 2002/10/30 18:09:53 rherveille +-- Fixed some reported minor start/stop generation timing issuess. +-- +-- Revision 1.2 2002/06/15 07:37:04 rherveille +-- Fixed a small timing bug in the bit controller.\nAdded verilog simulation environment. +-- +-- Revision 1.1 2001/11/05 12:02:33 rherveille +-- Split i2c_master_core.vhd into separate files for each entity; same layout as verilog version. +-- Code updated, is now up-to-date to doc. rev.0.4. +-- Added headers. +-- + + +-- +------------------------------------- +-- Bit controller section +------------------------------------ +-- +-- Translate simple commands into SCL/SDA transitions +-- Each command has 5 states, A/B/C/D/idle +-- +-- start: SCL ~~~~~~~~~~~~~~\____ +-- SDA XX/~~~~~~~\______ +-- x | A | B | C | D | i +-- +-- repstart SCL ______/~~~~~~~\___ +-- SDA __/~~~~~~~\______ +-- x | A | B | C | D | i +-- +-- stop SCL _______/~~~~~~~~~~~ +-- SDA ==\___________/~~~~~ +-- x | A | B | C | D | i +-- +--- write SCL ______/~~~~~~~\____ +-- SDA XXX===============XX +-- x | A | B | C | D | i +-- +--- read SCL ______/~~~~~~~\____ +-- SDA XXXXXXX=XXXXXXXXXXX +-- x | A | B | C | D | i +-- + +-- Timing: Normal mode Fast mode +----------------------------------------------------------------- +-- Fscl 100KHz 400KHz +-- Th_scl 4.0us 0.6us High period of SCL +-- Tl_scl 4.7us 1.3us Low period of SCL +-- Tsu:sta 4.7us 0.6us setup time for a repeated start condition +-- Tsu:sto 4.0us 0.6us setup time for a stop conditon +-- Tbuf 4.7us 1.3us Bus free time between a stop and start condition +-- + +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_Logic_unsigned.all; +use IEEE.numeric_std.all; + +entity i2c_master_bit_ctrl is + port ( + clk : in std_logic; + rst : in std_logic; + nReset : in std_logic; + ena : in std_logic; -- core enable signal + + clk_cnt : in unsigned(15 downto 0); -- clock prescale value + + cmd : in std_logic_vector(3 downto 0); + cmd_ack : out std_logic; -- command completed + busy : out std_logic; -- i2c bus busy + al : out std_logic; -- arbitration lost + + din : in std_logic; + dout : out std_logic; + + -- i2c lines + scl_i : in std_logic; -- i2c clock line input + scl_o : out std_logic; -- i2c clock line output + scl_oen : out std_logic; -- i2c clock line output enable, active low + sda_i : in std_logic; -- i2c data line input + sda_o : out std_logic; -- i2c data line output + sda_oen : out std_logic -- i2c data line output enable, active low + ); +end entity i2c_master_bit_ctrl; + +architecture structural of i2c_master_bit_ctrl is + constant I2C_CMD_NOP : std_logic_vector(3 downto 0) := "0000"; + constant I2C_CMD_START : std_logic_vector(3 downto 0) := "0001"; + constant I2C_CMD_STOP : std_logic_vector(3 downto 0) := "0010"; + constant I2C_CMD_READ : std_logic_vector(3 downto 0) := "0100"; + constant I2C_CMD_WRITE : std_logic_vector(3 downto 0) := "1000"; + + type states is (idle, start_a, start_b, start_c, start_d, start_e, + stop_a, stop_b, stop_c, stop_d, rd_a, rd_b, rd_c, rd_d, wr_a, wr_b, wr_c, wr_d); + signal c_state : states; + + signal iscl_oen, isda_oen : std_logic; -- internal I2C lines + signal sda_chk : std_logic; -- check SDA status (multi-master arbitration) + signal dscl_oen : std_logic; -- delayed scl_oen signals + signal sSCL, sSDA : std_logic; -- synchronized SCL and SDA inputs + signal clk_en, slave_wait : std_logic; -- clock generation signals + signal ial : std_logic; -- internal arbitration lost signal +-- signal cnt : unsigned(15 downto 0) := clk_cnt; -- clock divider counter (simulation) + signal cnt : unsigned(15 downto 0); -- clock divider counter (synthesis) + +begin + -- whenever the slave is not ready it can delay the cycle by pulling SCL low + -- delay scl_oen + process (clk) + begin + if (clk'event and clk = '1') then + dscl_oen <= iscl_oen; + end if; + end process; + slave_wait <= dscl_oen and not sSCL; + + -- generate clk enable signal + gen_clken: process(clk, nReset) + begin + if (nReset = '0') then + cnt <= (others => '0'); + clk_en <= '1'; + elsif (clk'event and clk = '1') then + if (rst = '1') then + cnt <= (others => '0'); + clk_en <= '1'; + elsif ( (cnt = 0) or (ena = '0') ) then + cnt <= clk_cnt; + clk_en <= '1'; + elsif (slave_wait = '1') then + cnt <= cnt; + clk_en <= '0'; + else + cnt <= cnt -1; + clk_en <= '0'; + end if; + end if; + end process gen_clken; + + + -- generate bus status controller + bus_status_ctrl: block + signal dSCL, dSDA : std_logic; -- delayes sSCL and sSDA + signal sta_condition : std_logic; -- start detected + signal sto_condition : std_logic; -- stop detected + signal cmd_stop : std_logic; -- STOP command + signal ibusy : std_logic; -- internal busy signal + begin + -- synchronize SCL and SDA inputs + synch_scl_sda: process(clk, nReset) + begin + if (nReset = '0') then + sSCL <= '1'; + sSDA <= '1'; + + dSCL <= '1'; + dSDA <= '1'; + elsif (clk'event and clk = '1') then + if (rst = '1') then + sSCL <= '1'; + sSDA <= '1'; + + dSCL <= '1'; + dSDA <= '1'; + else + sSCL <= scl_i; + sSDA <= sda_i; + + dSCL <= sSCL; + dSDA <= sSDA; + end if; + end if; + end process synch_SCL_SDA; + + -- detect start condition => detect falling edge on SDA while SCL is high + -- detect stop condition => detect rising edge on SDA while SCL is high + detect_sta_sto: process(clk, nReset) + begin + if (nReset = '0') then + sta_condition <= '0'; + sto_condition <= '0'; + elsif (clk'event and clk = '1') then + if (rst = '1') then + sta_condition <= '0'; + sto_condition <= '0'; + else + sta_condition <= (not sSDA and dSDA) and sSCL; + sto_condition <= (sSDA and not dSDA) and sSCL; + end if; + end if; + end process detect_sta_sto; + + -- generate i2c-bus busy signal + gen_busy: process(clk, nReset) + begin + if (nReset = '0') then + ibusy <= '0'; + elsif (clk'event and clk = '1') then + if (rst = '1') then + ibusy <= '0'; + else + ibusy <= (sta_condition or ibusy) and not sto_condition; + end if; + end if; + end process gen_busy; + busy <= ibusy; + + + -- generate arbitration lost signal + -- aribitration lost when: + -- 1) master drives SDA high, but the i2c bus is low + -- 2) stop detected while not requested (detect during 'idle' state) + gen_al: process(clk, nReset) + begin + if (nReset = '0') then + cmd_stop <= '0'; + ial <= '0'; + elsif (clk'event and clk = '1') then + if (rst = '1') then + cmd_stop <= '0'; + ial <= '0'; + else + if (clk_en = '1') then + if (cmd = I2C_CMD_STOP) then + cmd_stop <= '1'; + else + cmd_stop <= '0'; + end if; + end if; + + if (c_state = idle) then + ial <= (sda_chk and not sSDA and isda_oen); + else + ial <= (sda_chk and not sSDA and isda_oen) or (sto_condition and not cmd_stop); + end if; + + end if; + end if; + end process gen_al; + al <= ial; + + -- generate dout signal, store dout on rising edge of SCL + gen_dout: process(clk) + begin + if (clk'event and clk = '1') then + if (sSCL = '1' and dSCL = '0') then + dout <= sSDA; + end if; + end if; + end process gen_dout; + end block bus_status_ctrl; + + + -- generate statemachine + nxt_state_decoder : process (clk, nReset, c_state, cmd) + begin + if (nReset = '0') then + c_state <= idle; + cmd_ack <= '0'; + iscl_oen <= '1'; + isda_oen <= '1'; + sda_chk <= '0'; + elsif (clk'event and clk = '1') then + if (rst = '1' or ial = '1') then + c_state <= idle; + cmd_ack <= '0'; + iscl_oen <= '1'; + isda_oen <= '1'; + sda_chk <= '0'; + else + cmd_ack <= '0'; -- default no acknowledge + + if (clk_en = '1') then + case (c_state) is + -- idle + when idle => + case cmd is + when I2C_CMD_START => c_state <= start_a; + when I2C_CMD_STOP => c_state <= stop_a; + when I2C_CMD_WRITE => c_state <= wr_a; + when I2C_CMD_READ => c_state <= rd_a; + when others => c_state <= idle; -- NOP command + end case; + + iscl_oen <= iscl_oen; -- keep SCL in same state + isda_oen <= isda_oen; -- keep SDA in same state + sda_chk <= '0'; -- don't check SDA + + -- start + when start_a => + c_state <= start_b; + iscl_oen <= iscl_oen; -- keep SCL in same state (for repeated start) + isda_oen <= '1'; -- set SDA high + sda_chk <= '0'; -- don't check SDA + + when start_b => + c_state <= start_c; + iscl_oen <= '1'; -- set SCL high + isda_oen <= '1'; -- keep SDA high + sda_chk <= '0'; -- don't check SDA + + when start_c => + c_state <= start_d; + iscl_oen <= '1'; -- keep SCL high + isda_oen <= '0'; -- set SDA low + sda_chk <= '0'; -- don't check SDA + + when start_d => + c_state <= start_e; + iscl_oen <= '1'; -- keep SCL high + isda_oen <= '0'; -- keep SDA low + sda_chk <= '0'; -- don't check SDA + + when start_e => + c_state <= idle; + cmd_ack <= '1'; -- command completed + iscl_oen <= '0'; -- set SCL low + isda_oen <= '0'; -- keep SDA low + sda_chk <= '0'; -- don't check SDA + + -- stop + when stop_a => + c_state <= stop_b; + iscl_oen <= '0'; -- keep SCL low + isda_oen <= '0'; -- set SDA low + sda_chk <= '0'; -- don't check SDA + + when stop_b => + c_state <= stop_c; + iscl_oen <= '1'; -- set SCL high + isda_oen <= '0'; -- keep SDA low + sda_chk <= '0'; -- don't check SDA + + when stop_c => + c_state <= stop_d; + iscl_oen <= '1'; -- keep SCL high + isda_oen <= '0'; -- keep SDA low + sda_chk <= '0'; -- don't check SDA + + when stop_d => + c_state <= idle; + cmd_ack <= '1'; -- command completed + iscl_oen <= '1'; -- keep SCL high + isda_oen <= '1'; -- set SDA high + sda_chk <= '0'; -- don't check SDA + + -- read + when rd_a => + c_state <= rd_b; + iscl_oen <= '0'; -- keep SCL low + isda_oen <= '1'; -- tri-state SDA + sda_chk <= '0'; -- don't check SDA + + when rd_b => + c_state <= rd_c; + iscl_oen <= '1'; -- set SCL high + isda_oen <= '1'; -- tri-state SDA + sda_chk <= '0'; -- don't check SDA + + when rd_c => + c_state <= rd_d; + iscl_oen <= '1'; -- keep SCL high + isda_oen <= '1'; -- tri-state SDA + sda_chk <= '0'; -- don't check SDA + + when rd_d => + c_state <= idle; + cmd_ack <= '1'; -- command completed + iscl_oen <= '0'; -- set SCL low + isda_oen <= '1'; -- tri-state SDA + sda_chk <= '0'; -- don't check SDA + + -- write + when wr_a => + c_state <= wr_b; + iscl_oen <= '0'; -- keep SCL low + isda_oen <= din; -- set SDA + sda_chk <= '0'; -- don't check SDA (SCL low) + + when wr_b => + c_state <= wr_c; + iscl_oen <= '1'; -- set SCL high + isda_oen <= din; -- keep SDA + sda_chk <= '1'; -- check SDA + + when wr_c => + c_state <= wr_d; + iscl_oen <= '1'; -- keep SCL high + isda_oen <= din; -- keep SDA + sda_chk <= '1'; -- check SDA + + when wr_d => + c_state <= idle; + cmd_ack <= '1'; -- command completed + iscl_oen <= '0'; -- set SCL low + isda_oen <= din; -- keep SDA + sda_chk <= '0'; -- don't check SDA (SCL low) + + when others => + + end case; + end if; + end if; + end if; + end process nxt_state_decoder; + + + -- assign outputs + scl_o <= '0'; + scl_oen <= iscl_oen; + sda_o <= '0'; + sda_oen <= isda_oen; +end architecture structural; + diff --git a/fpga/src/i2c/master/i2c_master_byte_ctrl.vhd b/fpga/src/i2c/master/i2c_master_byte_ctrl.vhd new file mode 100644 index 0000000..97d0c9f --- /dev/null +++ b/fpga/src/i2c/master/i2c_master_byte_ctrl.vhd @@ -0,0 +1,371 @@ +--------------------------------------------------------------------- +---- ---- +---- WISHBONE revB2 compl. I2C Master Core; byte-controller ---- +---- ---- +---- ---- +---- Author: Richard Herveille ---- +---- richard@asics.ws ---- +---- www.asics.ws ---- +---- ---- +---- Downloaded from: http://www.opencores.org/projects/i2c/ ---- +---- ---- +--------------------------------------------------------------------- +---- ---- +---- Copyright (C) 2000 Richard Herveille ---- +---- richard@asics.ws ---- +---- ---- +---- This source file may be used and distributed without ---- +---- restriction provided that this copyright statement is not ---- +---- removed from the file and that any derivative work contains ---- +---- the original copyright notice and the associated disclaimer.---- +---- ---- +---- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ---- +---- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ---- +---- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ---- +---- FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ---- +---- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ---- +---- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ---- +---- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ---- +---- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ---- +---- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ---- +---- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ---- +---- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ---- +---- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ---- +---- POSSIBILITY OF SUCH DAMAGE. ---- +---- ---- +--------------------------------------------------------------------- + +-- CVS Log +-- +-- $Id: i2c_master_byte_ctrl.vhd,v 1.5 2004/02/18 11:41:48 rherveille Exp $ +-- +-- $Date: 2004/02/18 11:41:48 $ +-- $Revision: 1.5 $ +-- $Author: rherveille $ +-- $Locker: $ +-- $State: Exp $ +-- +-- Change History: +-- $Log: i2c_master_byte_ctrl.vhd,v $ +-- Revision 1.5 2004/02/18 11:41:48 rherveille +-- Fixed a potential bug in the statemachine. During a 'stop' 2 cmd_ack signals were generated. Possibly canceling a new start command. +-- +-- Revision 1.4 2003/08/09 07:01:13 rherveille +-- Fixed a bug in the Arbitration Lost generation caused by delay on the (external) sda line. +-- Fixed a potential bug in the byte controller's host-acknowledge generation. +-- +-- Revision 1.3 2002/12/26 16:05:47 rherveille +-- Core is now a Multimaster I2C controller. +-- +-- Revision 1.2 2002/11/30 22:24:37 rherveille +-- Cleaned up code +-- +-- Revision 1.1 2001/11/05 12:02:33 rherveille +-- Split i2c_master_core.vhd into separate files for each entity; same layout as verilog version. +-- Code updated, is now up-to-date to doc. rev.0.4. +-- Added headers. +-- + + + + +-- +------------------------------------------ +-- Byte controller section +------------------------------------------ +-- +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_Logic_unsigned.all; +use IEEE.numeric_std.all; + +entity i2c_master_byte_ctrl is + port ( + clk : in std_logic; + rst : in std_logic; -- synchronous active high reset (WISHBONE compatible) + nReset : in std_logic; -- asynchornous active low reset (FPGA compatible) + ena : in std_logic; -- core enable signal + + clk_cnt : in unsigned(15 downto 0); -- 4x SCL + + -- input signals + start, + stop, + read, + write, + ack_in : std_logic; + din : in std_logic_vector(7 downto 0); + + -- output signals + cmd_ack : out std_logic; -- command done + ack_out : out std_logic; + i2c_busy : out std_logic; -- arbitration lost + i2c_al : out std_logic; -- i2c bus busy + dout : out std_logic_vector(7 downto 0); + + -- i2c lines + scl_i : in std_logic; -- i2c clock line input + scl_o : out std_logic; -- i2c clock line output + scl_oen : out std_logic; -- i2c clock line output enable, active low + sda_i : in std_logic; -- i2c data line input + sda_o : out std_logic; -- i2c data line output + sda_oen : out std_logic -- i2c data line output enable, active low + ); +end entity i2c_master_byte_ctrl; + +architecture structural of i2c_master_byte_ctrl is + component i2c_master_bit_ctrl is + port ( + clk : in std_logic; + rst : in std_logic; + nReset : in std_logic; + ena : in std_logic; -- core enable signal + + clk_cnt : in unsigned(15 downto 0); -- clock prescale value + + cmd : in std_logic_vector(3 downto 0); + cmd_ack : out std_logic; -- command done + busy : out std_logic; -- i2c bus busy + al : out std_logic; -- arbitration lost + + din : in std_logic; + dout : out std_logic; + + -- i2c lines + scl_i : in std_logic; -- i2c clock line input + scl_o : out std_logic; -- i2c clock line output + scl_oen : out std_logic; -- i2c clock line output enable, active low + sda_i : in std_logic; -- i2c data line input + sda_o : out std_logic; -- i2c data line output + sda_oen : out std_logic -- i2c data line output enable, active low + ); + end component i2c_master_bit_ctrl; + + -- commands for bit_controller block + constant I2C_CMD_NOP : std_logic_vector(3 downto 0) := "0000"; + constant I2C_CMD_START : std_logic_vector(3 downto 0) := "0001"; + constant I2C_CMD_STOP : std_logic_vector(3 downto 0) := "0010"; + constant I2C_CMD_READ : std_logic_vector(3 downto 0) := "0100"; + constant I2C_CMD_WRITE : std_logic_vector(3 downto 0) := "1000"; + + -- signals for bit_controller + signal core_cmd : std_logic_vector(3 downto 0); + signal core_ack, core_txd, core_rxd : std_logic; + signal al : std_logic; + + -- signals for shift register + signal sr : std_logic_vector(7 downto 0); -- 8bit shift register + signal shift, ld : std_logic; + + -- signals for state machine + signal go, host_ack : std_logic; + signal dcnt : unsigned(2 downto 0); -- data counter + signal cnt_done : std_logic; + +begin + -- hookup bit_controller + bit_ctrl: i2c_master_bit_ctrl port map( + clk => clk, + rst => rst, + nReset => nReset, + ena => ena, + clk_cnt => clk_cnt, + cmd => core_cmd, + cmd_ack => core_ack, + busy => i2c_busy, + al => al, + din => core_txd, + dout => core_rxd, + scl_i => scl_i, + scl_o => scl_o, + scl_oen => scl_oen, + sda_i => sda_i, + sda_o => sda_o, + sda_oen => sda_oen + ); + i2c_al <= al; + + -- generate host-command-acknowledge + cmd_ack <= host_ack; + + -- generate go-signal + go <= (read or write or stop) and not host_ack; + + -- assign Dout output to shift-register + dout <= sr; + + -- generate shift register + shift_register: process(clk, nReset) + begin + if (nReset = '0') then + sr <= (others => '0'); + elsif (clk'event and clk = '1') then + if (rst = '1') then + sr <= (others => '0'); + elsif (ld = '1') then + sr <= din; + elsif (shift = '1') then + sr <= (sr(6 downto 0) & core_rxd); + end if; + end if; + end process shift_register; + + -- generate data-counter + data_cnt: process(clk, nReset) + begin + if (nReset = '0') then + dcnt <= (others => '0'); + elsif (clk'event and clk = '1') then + if (rst = '1') then + dcnt <= (others => '0'); + elsif (ld = '1') then + dcnt <= (others => '1'); -- load counter with 7 + elsif (shift = '1') then + dcnt <= dcnt -1; + end if; + end if; + end process data_cnt; + + cnt_done <= '1' when (dcnt = 0) else '0'; + + -- + -- state machine + -- + statemachine : block + type states is (st_idle, st_start, st_read, st_write, st_ack, st_stop); + signal c_state : states; + begin + -- + -- command interpreter, translate complex commands into simpler I2C commands + -- + nxt_state_decoder: process(clk, nReset) + begin + if (nReset = '0') then + core_cmd <= I2C_CMD_NOP; + core_txd <= '0'; + shift <= '0'; + ld <= '0'; + host_ack <= '0'; + c_state <= st_idle; + ack_out <= '0'; + elsif (clk'event and clk = '1') then + if (rst = '1' or al = '1') then + core_cmd <= I2C_CMD_NOP; + core_txd <= '0'; + shift <= '0'; + ld <= '0'; + host_ack <= '0'; + c_state <= st_idle; + ack_out <= '0'; + else + -- initialy reset all signal + core_txd <= sr(7); + shift <= '0'; + ld <= '0'; + host_ack <= '0'; + + case c_state is + when st_idle => + if (go = '1') then + if (start = '1') then + c_state <= st_start; + core_cmd <= I2C_CMD_START; + elsif (read = '1') then + c_state <= st_read; + core_cmd <= I2C_CMD_READ; + elsif (write = '1') then + c_state <= st_write; + core_cmd <= I2C_CMD_WRITE; + else -- stop + c_state <= st_stop; + core_cmd <= I2C_CMD_STOP; + end if; + + ld <= '1'; + end if; + + when st_start => + if (core_ack = '1') then + if (read = '1') then + c_state <= st_read; + core_cmd <= I2C_CMD_READ; + else + c_state <= st_write; + core_cmd <= I2C_CMD_WRITE; + end if; + + ld <= '1'; + end if; + + when st_write => + if (core_ack = '1') then + if (cnt_done = '1') then + c_state <= st_ack; + core_cmd <= I2C_CMD_READ; + else + c_state <= st_write; -- stay in same state + core_cmd <= I2C_CMD_WRITE; -- write next bit + shift <= '1'; + end if; + end if; + + when st_read => + if (core_ack = '1') then + if (cnt_done = '1') then + c_state <= st_ack; + core_cmd <= I2C_CMD_WRITE; + else + c_state <= st_read; -- stay in same state + core_cmd <= I2C_CMD_READ; -- read next bit + end if; + + shift <= '1'; + core_txd <= ack_in; + end if; + + when st_ack => + if (core_ack = '1') then + -- check for stop; Should a STOP command be generated ? + if (stop = '1') then + c_state <= st_stop; + core_cmd <= I2C_CMD_STOP; + else + c_state <= st_idle; + core_cmd <= I2C_CMD_NOP; + + -- generate command acknowledge signal + host_ack <= '1'; + end if; + + -- assign ack_out output to core_rxd (contains last received bit) + ack_out <= core_rxd; + + core_txd <= '1'; + else + core_txd <= ack_in; + end if; + + when st_stop => + if (core_ack = '1') then + c_state <= st_idle; + core_cmd <= I2C_CMD_NOP; + + -- generate command acknowledge signal + host_ack <= '1'; + end if; + + when others => -- illegal states + c_state <= st_idle; + core_cmd <= I2C_CMD_NOP; + report ("Byte controller entered illegal state."); + + end case; + + end if; + end if; + end process nxt_state_decoder; + + end block statemachine; + +end architecture structural; + diff --git a/fpga/src/i2c/master/i2c_master_top.vhd b/fpga/src/i2c/master/i2c_master_top.vhd new file mode 100644 index 0000000..a990ef3 --- /dev/null +++ b/fpga/src/i2c/master/i2c_master_top.vhd @@ -0,0 +1,366 @@ +--------------------------------------------------------------------- +---- ---- +---- WISHBONE revB2 compl. I2C Master Core; top level ---- +---- ---- +---- ---- +---- Author: Richard Herveille ---- +---- richard@asics.ws ---- +---- www.asics.ws ---- +---- ---- +---- Downloaded from: http://www.opencores.org/projects/i2c/ ---- +---- ---- +--------------------------------------------------------------------- +---- ---- +---- Copyright (C) 2000 Richard Herveille ---- +---- richard@asics.ws ---- +---- ---- +---- This source file may be used and distributed without ---- +---- restriction provided that this copyright statement is not ---- +---- removed from the file and that any derivative work contains ---- +---- the original copyright notice and the associated disclaimer.---- +---- ---- +---- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ---- +---- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ---- +---- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ---- +---- FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ---- +---- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ---- +---- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ---- +---- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ---- +---- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ---- +---- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ---- +---- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ---- +---- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ---- +---- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ---- +---- POSSIBILITY OF SUCH DAMAGE. ---- +---- ---- +--------------------------------------------------------------------- + +-- CVS Log +-- +-- $Id: i2c_master_top.vhd,v 1.7 2004/03/14 10:17:03 rherveille Exp $ +-- +-- $Date: 2004/03/14 10:17:03 $ +-- $Revision: 1.7 $ +-- $Author: rherveille $ +-- $Locker: $ +-- $State: Exp $ +-- +-- Change History: +-- $Log: i2c_master_top.vhd,v $ +-- Revision 1.7 2004/03/14 10:17:03 rherveille +-- Fixed simulation issue when writing to CR register +-- +-- Revision 1.6 2003/08/09 07:01:13 rherveille +-- Fixed a bug in the Arbitration Lost generation caused by delay on the (external) sda line. +-- Fixed a potential bug in the byte controller's host-acknowledge generation. +-- +-- Revision 1.5 2003/02/01 02:03:06 rherveille +-- Fixed a few 'arbitration lost' bugs. VHDL version only. +-- +-- Revision 1.4 2002/12/26 16:05:47 rherveille +-- Core is now a Multimaster I2C controller. +-- +-- Revision 1.3 2002/11/30 22:24:37 rherveille +-- Cleaned up code +-- +-- Revision 1.2 2001/11/10 10:52:44 rherveille +-- Changed PRER reset value from 0x0000 to 0xffff, conform specs. +-- + + +--library ieee; +--use ieee.std_logic_1164.all; +--use ieee.std_logic_arith.all; +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_Logic_unsigned.all; +use IEEE.numeric_std.all; + +entity i2c_master_top is + generic( + ARST_LVL : std_logic := '0' -- asynchronous reset level + ); + port ( + -- wishbone signals + wb_clk_i : in std_logic; -- master clock input + wb_rst_i : in std_logic := '0'; -- synchronous active high reset + arst_i : in std_logic := not ARST_LVL; -- asynchronous reset +-- wb_adr_i : in unsigned(2 downto 0); -- lower address bits + wb_adr_i : in std_logic_vector(2 downto 0); -- lower address bits + wb_dat_i : in std_logic_vector(7 downto 0); -- Databus input + wb_dat_o : out std_logic_vector(7 downto 0); -- Databus output + wb_we_i : in std_logic; -- Write enable input + wb_stb_i : in std_logic; -- Strobe signals / core select signal + wb_cyc_i : in std_logic; -- Valid bus cycle input + wb_ack_o : out std_logic; -- Bus cycle acknowledge output + wb_inta_o : out std_logic; -- interrupt request output signal + + -- i2c lines + scl_pad_i : in std_logic; -- i2c clock line input + scl_pad_o : out std_logic; -- i2c clock line output + scl_padoen_o : out std_logic; -- i2c clock line output enable, active low + sda_pad_i : in std_logic; -- i2c data line input + sda_pad_o : out std_logic; -- i2c data line output + sda_padoen_o : out std_logic -- i2c data line output enable, active low + ); +end entity i2c_master_top; + +architecture structural of i2c_master_top is +-- component i2c_master_byte_ctrl is +-- port ( +-- clk : in std_logic; +-- rst : in std_logic; -- synchronous active high reset (WISHBONE compatible) +-- nReset : in std_logic; -- asynchornous active low reset (FPGA compatible) +-- ena : in std_logic; -- core enable signal +-- +-- clk_cnt : in unsigned(15 downto 0); -- 4x SCL +-- +-- -- input signals +-- start, +-- stop, +-- read, +-- write, +-- ack_in : std_logic; +-- din : in std_logic_vector(7 downto 0); +-- +-- -- output signals +-- cmd_ack : out std_logic; +-- ack_out : out std_logic; +-- i2c_busy : out std_logic; +-- i2c_al : out std_logic; +-- dout : out std_logic_vector(7 downto 0); +-- +-- -- i2c lines +-- scl_i : in std_logic; -- i2c clock line input +-- scl_o : out std_logic; -- i2c clock line output +-- scl_oen : out std_logic; -- i2c clock line output enable, active low +-- sda_i : in std_logic; -- i2c data line input +-- sda_o : out std_logic; -- i2c data line output +-- sda_oen : out std_logic -- i2c data line output enable, active low +-- ); +-- end component i2c_master_byte_ctrl; + + -- registers + signal prer : unsigned(15 downto 0); -- clock prescale register + signal ctr : std_logic_vector(7 downto 0); -- control register + signal txr : std_logic_vector(7 downto 0); -- transmit register + signal rxr : std_logic_vector(7 downto 0); -- receive register + signal cr : std_logic_vector(7 downto 0); -- command register + signal sr : std_logic_vector(7 downto 0); -- status register + + -- internal reset signal + signal rst_i : std_logic; + + -- wishbone write access + signal wb_wacc : std_logic; + + -- internal acknowledge signal + signal iack_o : std_logic; + + -- done signal: command completed, clear command register + signal done : std_logic; + + -- command register signals + signal sta, sto, rd, wr, ack, iack : std_logic; + + signal core_en : std_logic; -- core enable signal + signal ien : std_logic; -- interrupt enable signal + + -- status register signals + signal irxack, rxack : std_logic; -- received aknowledge from slave + signal tip : std_logic; -- transfer in progress + signal irq_flag : std_logic; -- interrupt pending flag + signal i2c_busy : std_logic; -- i2c bus busy (start signal detected) + signal i2c_al, al : std_logic; -- arbitration lost + +begin + -- generate internal reset signal + rst_i <= arst_i xor ARST_LVL; + + -- generate acknowledge output signal + gen_ack_o : process(wb_clk_i) + begin + if (wb_clk_i'event and wb_clk_i = '1') then + iack_o <= wb_cyc_i and wb_stb_i and not iack_o; -- because timing is always honored + end if; + end process gen_ack_o; + wb_ack_o <= iack_o; + + -- generate wishbone write access signal + wb_wacc <= wb_cyc_i and wb_stb_i and wb_we_i; + + -- assign wb_dat_o + assign_dato : process(wb_clk_i) + begin + if (wb_clk_i'event and wb_clk_i = '1') then + if (wb_stb_i = '1' and wb_we_i = '0') then + case wb_adr_i is + when "000" => wb_dat_o <= std_logic_vector(prer( 7 downto 0)); + when "001" => wb_dat_o <= std_logic_vector(prer(15 downto 8)); + when "010" => wb_dat_o <= ctr; + when "011" => wb_dat_o <= rxr; -- write is transmit register TxR + when "100" => wb_dat_o <= sr; -- write is command register CR + + -- Debugging registers: + -- These registers are not documented. + -- Functionality could change in future releases + when "101" => wb_dat_o <= txr; + when "110" => wb_dat_o <= cr; + when "111" => wb_dat_o <= x"23"; --(others => '0'); + when others => wb_dat_o <= (others => 'X'); -- for simulation only + end case; + else + wb_dat_o <= (others => '0'); + end if; + end if; + end process assign_dato; + + -- generate registers (CR, SR see below) + gen_regs: process(rst_i, wb_clk_i) + begin + if (rst_i = '0') then + prer <= (others => '1'); + ctr <= (others => '0'); + txr <= (others => '0'); + elsif (wb_clk_i'event and wb_clk_i = '1') then + if (wb_rst_i = '1') then + prer <= (others => '1'); + ctr <= (others => '0'); + txr <= (others => '0'); + elsif (wb_wacc = '1') then + case wb_adr_i is + when "000" => prer( 7 downto 0) <= unsigned(wb_dat_i); + when "001" => prer(15 downto 8) <= unsigned(wb_dat_i); + when "010" => ctr <= wb_dat_i; + when "011" => txr <= wb_dat_i; + when "100" => null; --write to CR, avoid executing the others clause + + -- illegal cases, for simulation only + when others => + report ("Illegal write address, setting all registers to unknown."); + prer <= (others => 'X'); + ctr <= (others => 'X'); + txr <= (others => 'X'); + end case; + end if; + end if; + end process gen_regs; + + + -- generate command register + gen_cr: process(rst_i, wb_clk_i) + begin + if (rst_i = '0') then + cr <= (others => '0'); + elsif (wb_clk_i'event and wb_clk_i = '1') then + if (wb_rst_i = '1') then + cr <= (others => '0'); + elsif (wb_wacc = '1') then + if ( (core_en = '1') and (wb_adr_i = 4) ) then + -- only take new commands when i2c core enabled + -- pending commands are finished + cr <= wb_dat_i; + end if; + else + if (done = '1' or i2c_al = '1') then + cr(7 downto 4) <= (others => '0'); -- clear command bits when command done or arbitration lost + end if; + + cr(2 downto 1) <= (others => '0'); -- reserved bits, always '0' + cr(0) <= '0'; -- clear IRQ_ACK bit + end if; + end if; + end process gen_cr; + + -- decode command register + sta <= cr(7); + sto <= cr(6); + rd <= cr(5); + wr <= cr(4); + ack <= cr(3); + iack <= cr(0); + + -- decode control register + core_en <= ctr(7); + ien <= ctr(6); + + -- hookup byte controller block + byte_ctrl: entity work.i2c_master_byte_ctrl port map ( + clk => wb_clk_i, + rst => wb_rst_i, + nReset => rst_i, + ena => core_en, + clk_cnt => prer, + start => sta, + stop => sto, + read => rd, + write => wr, + ack_in => ack, + i2c_busy => i2c_busy, + i2c_al => i2c_al, + din => txr, + cmd_ack => done, + ack_out => irxack, + dout => rxr, + scl_i => scl_pad_i, + scl_o => scl_pad_o, + scl_oen => scl_padoen_o, + sda_i => sda_pad_i, + sda_o => sda_pad_o, + sda_oen => sda_padoen_o + ); + + + -- status register block + interrupt request signal + st_irq_block : block + begin + -- generate status register bits + gen_sr_bits: process (wb_clk_i, rst_i) + begin + if (rst_i = '0') then + al <= '0'; + rxack <= '0'; + tip <= '0'; + irq_flag <= '0'; + elsif (wb_clk_i'event and wb_clk_i = '1') then + if (wb_rst_i = '1') then + al <= '0'; + rxack <= '0'; + tip <= '0'; + irq_flag <= '0'; + else + al <= i2c_al or (al and not sta); + rxack <= irxack; + tip <= (rd or wr); + + -- interrupt request flag is always generated + irq_flag <= (done or i2c_al or irq_flag) and not iack; + end if; + end if; + end process gen_sr_bits; + + -- generate interrupt request signals + gen_irq: process (wb_clk_i, rst_i) + begin + if (rst_i = '0') then + wb_inta_o <= '0'; + elsif (wb_clk_i'event and wb_clk_i = '1') then + if (wb_rst_i = '1') then + wb_inta_o <= '0'; + else + -- interrupt signal is only generated when IEN (interrupt enable bit) is set + wb_inta_o <= irq_flag and ien; + end if; + end if; + end process gen_irq; + + -- assign status register bits + sr(7) <= rxack; + sr(6) <= i2c_busy; + sr(5) <= al; + sr(4 downto 2) <= (others => '0'); -- reserved + sr(1) <= tip; + sr(0) <= irq_flag; + end block; + +end architecture structural; diff --git a/fpga/src/i2c/master/i2c_specs.pdf b/fpga/src/i2c/master/i2c_specs.pdf new file mode 100644 index 0000000000000000000000000000000000000000..72021df117397a4c324ee17a0515db6f04af5a93 GIT binary patch literal 211471 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

$!*8+!jWjT$ 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⋘^_5TbYiv8GgfB!s{U43V^y5Q-SkQW$>}Iw;FT zCKwC|j4jX(wr;D+KBUnyiB0N0y4Hhgk)~>k*?X6y(yD5*{k(T)`((e*^ZW89P?gcE zN4w8AOCBZwCd%TXQCO=Dxhk?*E?P@$ZWkRBaSG~%NWi?!cSX1+-DBPW3(cPjnT%~d?}@L#h#1xD?^I) zHUfVj9%u{vzWN?x8k67`!uwSp2=B-4N*@bl0hJF*ltZJ^2yl!!%oC#ZhIteW)z$>1 z7QUUwJa6{aNR^ddOqnS+^3(p5U-kFMdJHDB;ivv?~!`4|C%Xh?j-=u2^>?%nAkF;B@t zk$6n^jDnJ;284K3z!#Ooc$Jt2AwWv3x+V=#hGgB@<_!;{){bo|%@X?I=NltzXg+Bn zhd?830)k=P01d!^21ofz7*>NuJ=u$jGCm^4h%oCONhDx_(*g0x%=C|lK36bApW)NX zzd3mC=XC=Mvrh-t9$m7#BfSjoC~XM?*!a z&$Nx8!iz*St;QdRPV*5klsRApIqHS2um=vJ*QlR4|BNg~r;5G;hUJvusBr?{QIk}q zL>mx0PEneF=|@Azh@Pe>yFrdLah{|HBMd&+So?*;T?&9 z`z7%fe=A{V6~3FmKCVjX6$}=zM8)W0)CqmKPuKxF@MdmvXlvy8=sp+;9ZQ^rv(YQ! z^~58=TNc_4`-R=H6rIFpfjmToZrOtTnev`?+S?yv)4HY&d8> zX~t&6j0Z9ka7cC5OTl0OI~@)ZBPn-S%LJWSZBZX@&!X_TFm5NN2!}7xIZ$)`xjQ*S zE<@?aru2QFbYxSJO0SM=uYS?1Bis9WcJ);~9?h9w9oBSVV5+c5mNir-XHcD-MfI$C zDi&!1>%u@%)>2ZnpDxZNB5*hQeX|ir9-&P;e_EIFX}C|+u{;+|@X0jPv7{)G+BD*Y zRH!};Xl}BGhhczB)qrlfuA(T(K{hQ1J-krSC}}yVLKjSO`0x_ln4+CTB4I`uiQSUr za2RyR|36AFYq<&PXGwu@f@y8(wNf@6va@tRT$(p8Bt=iZ3p9P+P z<*i#MUd*q-+c7|C>;FOyU@_1KN(GgC+6W5YPI`F zEjYo6tp?;YN+@oU+o2s>T=@xDq~6KR%lQqAvB%d_-Q(|J%1m~X1J&Hf8wag}_Cd#1 zXFuD|^(XsNqtqVjh<(Jd+c_eS8OPGJ+n%;(?Ac&Cm~-K@DS-^f4ASA3P4$DlsUoP+lO!!7{0 zh9(Scsy%zWF2Dr)IEH1f1+^=g>f;rJJeq8d3Y*O#+iDy}(V{P9JWP`WB-I&ssltNC zL1iNu08RvP0(g~9x+Y!tz6(OGbFTX?gKGkhT;ax9nI?$VKERz&U{ZOYJR;JjF3zgT zd*sA`l#r4lf@f5&!y?oOi@-NC?uCN9iIC;MRB@V!*z`bSQl9Z1x^8LFfD|&-vO~)R zi2h`XjC7HtLhYyk^rqr0wdRDB*&~V8T1y(motmh5NHM3#X?enyMpj#`9HWWEIUVtu zsGGT@<4Q_jY8 z%BkDKmEhtP%ty++WaO(@tZSZ@F(PGV-j!zY%$UbSK@_u@T)JN4EsrR&z;h@|%e_ISy%$Vjbn zw78w*cFWK?qL&j`QvH-g=Q)c`X%?O5ERm{8PG&WJbZFl|EY0??Cs`wV4NIu<(I=`^ zW5G(D|0>DdFNVHe@X0g@4O0b;@K{2y)~t4e3sz@_Y_R+x-K5jvl-?PnTC?Oe_tsx@ zt25n1tPA}P{f?Fzi7WB&qSgcc3p}K`bEL2OcF<)oW7~q^HV)i<_WV% zo0gW|>Jah`|DKw&;zpapv%dSkjF)|E6XzYr?>XPA&#}*E`)uDi_T4%6;yCu5!3JNT z_&i{xgtlRgL<~!ZG*X4O8v!u}r2({#QmRR1>x&B0rtS}*iKdPeng*COq=~K4n8YSk zLi=M16Qf8~rA%YhC?whQoWqMWO`1=Bp7V1TD}L_x`F+1%unO%ew=hFa!d)$cSI%P& zj2+!})j{z?>GEf9K+IGvs+Zb8?TZk4UN@KImzZnwYt54;T`*k}?{{`{`y(gJ-k0b5zb%;WLj8><7L6ZFcbWNkiJ7Cm#&pG4FIE0f^{D-Od z4^#0UrlJYL!5G*P12JE_VqtVGmPOZMY5VrW{D<n7}eCgic=BY)Vsn;3FD(is89l2Q04U!W^p=76`*Z?pz}eDLKd-| z2wCtTfyF6bcMPaCj|Q{2&)=c~1^xtPmi8AD8^5^n*PD*A_Q|FA`szSex^u%DBZvR| zBvc&I)b-W5opXP=a{U)4e$e_CE{r{;>$R?3bCXYB*|mQ6N7r!upwa{DK!B<214I`t zoC`*%96pKTs|N$DCMU?#)Hpqn zI4zPtrH@692`9v3D!DzeExDW67d)hro5fAZes!4IPLo^c7PBSzY`B#mJ+&Vj2y7ys zp-4ro67|H_u_wZ$P8Dd2u@aU@LIQ?otN={PfM|l}6tSUiK61&BKNOz#0D2Jhr z(@ZXmBmRc?xyzR?!?ZC3ySD4fUK}HVj71W>90@b<=3Fu>=cX5qcu|q26o#gu8;V0W zKvEPc;F_3(pOU!m~09-t;t)aap542a43Qi34z)6T_W<$Z&GB5G)OEJp zwdDDGe-A`=mpW@4Yzn9o$qU!%F<60aAlt6JDHhZVMm!3u&x;5yZsHl%kqJ(~IR>*~ z87AF^Ux*J%G0jpPbchMEbTH^pE-i#pF*gL?GAcxdt-|>bnlo_rZo!jfY|UQJwunLY zG)oy&k?G;AkQK9}g4}JHm1UGGRh`GFHFO`hP9C5J=|QFy91IOggU&!@JGG5|ksFal zv#Do>S zvcqNwF52E%Szu@maExmTsO(|guk;HamA-FSQ0e!unGD0S!3^|W*(`%m5QLZ%mt&S) zkS!quzs1ZNvguapvOB#ndRFFw%JjkxFYYk365=>bhIh+SCX;1@K}1JF&cKC?-N`VT zW5*rGu23|Mu4J4F{8)(zre(RVfZ<#)$S^d!;^)-K3VdcCdbJ8_F}?oe86~IcR1Q^+ zRRT{}zE#;;8TCKRRAwtoS`#{yU{meC-PGWvW*10o-*)Nj5l)m>K<%w^d)Vy_)_VFc07LyoZ`pTacw+* zsx)q2%wN7gsf!ebQ=^65?ghRUTGPswd0D zB7qtqHN8UADC1E~EfcbiwnCODi9uT-8+8L==p(o|p-s52L49S#1|?Ooc`eFoLIVRO zp+WJqOi2p-7PDkQ2phe!O9DbB(?Uv48yfmnd%0XMX*{oiQXGI1?3@CEZIxoj6~!*A zQH<~hptoLh$P{5sJ!91*Qwni5^j5|J{_{DH#;*dKA#E9`u&zm1tEE*}GXhb@Rw1owyJ`|>-6mKo6=(*@nAH4H zO+ph=Rnckt1GGtqKc;16QaZ8GIQzbHTCpz9-S_VK-TC|8_s8e+xzb?zz+82is;tm2 z?^`a#>~JV%R8!1ec*zyF8Lt@ykQ9toGe*s9{$F_g@(YtA z22;%aa;yjAN08X-t<9>9P)We_F{FdDl=-5Usa2JknluNC5ct)0b5`Mx)kcQiYM7%Abr!twX*vfnz z?-llk_9n(M$NA&J@x<}=iA)7o_!(g)QE9Ja&b7ad-zMiXAGUnb@|TQuik}r`6ATte zGp-53a7=3sqeQA1)udraZD|g*#neCmWUdd=UvM~Rc|_w0xJ#(9Ksq6090?&FQ@OB= z5ekPxR7wUK7S{eVPbCIitk^P!URZ8h2}Ui4NNgDiW7ljY`K}hHyP(wNw0I_N#mC|k z@k;z`T!=4_H{VawqG^;@%0?4tjAE0zt~4I48`=oyG0Uz~L3SN}uwt$kknu=~)UIpI zXTA_C#0jL94Lg&Q2t)^-!n70?5l7o76ar3Aq@gF3rm#eLAvH9iFH0uPQJT1v658kj zDD)LYO4IWHum_~dNBGZ8O^0?AtBb+dj^yeRRjAb;J(hml7bE?l^yntsjGe`nd>*hS zwdcvz)#|%n$W{C`(tD_@)v4>rWZQx2HvIDgsbI2^W?2(L?5`oqJebTY7N|P9zfXCa zx_jNdazFRD`!qXOcTHS$FUq2hN6;2L;ylDYC5(H&%T5Us-qY+!q2j%WE;@f%_W@eK zA2=84d~O-Ck7F3#!|^U?e^Jrt1O6k*4kt!1Dq?Ygv8=4a>1y?O5UAQ#NEy+g@fqIY z&+#nZl=haqqh7}A>C$8@zv^gIywj0mWoU{cE8Bt9gQ&b$mT7ReuhRIg7Ug>i4R3&k zcQ$1}ND;)@9+7XzH)zlxUIr!b^GJqJKBr9{di1qLibGSP4?I*MTSdbfj$WOe(SAVLre@yRt5$}YZyih$##<^oiKqoBK z5-}1)hUH=mkp(^m^(zJfO$?=8R*tDLFotsI)}EZqXv_ptVb}_DmLcaE%*=B9C5*?& zI3WP%;sWk`Kl1T@d-0RS?XXzjSySNg$d+&Q-}_<@R*QCa(}m)QC*p^Lj8_NoLiG-g zR*wpJ^xr=NKett%A&l+kjMZj|=S4CuV(^p~Vi?IB8zYQTf(U`T7?VppS96vcD+JDR z8aKgJIJUx_<;ZysbF&%r9wG?*{2lH@5wr^m+;+9Rz2+u(HX>6`%a6EP^K`Q81vhhW zYy&?B!OuI~u?N*r{t&`zpH{cBO7$(oAZ-y5CT`UsH-qvV!AIDELDi5yE6OX70?Y6s zcn7OIyv?>&x9&pV&CuF1GsnD#y3i(OsK%Qttz^+IQnF~r@iz-8-QjYP-MU0abtGkL zSfr5M*#mi|-WKnv#vi>QG?=%Hn>YMy`Z7!5Z>k-at-CS_4E~nHa+1w;yNYHIA>h$T@5E2NVs&c zM8+Li)Ll$%=;*!8i(&{TJQNIuEpRPDlw2B0lJ<(C=ARRf_w*_XaGT)tO{9nQihfpSE&aYuDmvC>I!V7y`XH_Skgs9WzkrWeq2{#NDOmNU zCX5LcfsqA#U%+Dm7Wy{#eMdD$WSXH<#`fivWkX&yXu1|xjdjr?|EmnywX%A*EH6)% zmZyM<86LA%dFdJ^Twx>(h_DQ?s?}cKv^9|17;NRdJ-zu}!ix^4gYc247A1VnWopRN z;te9j>kiiiakO+#d^ zxQEgyAYR!nGVtTJ{HB91g*N=*?@#P3=`oUy>FG=7UL4sNRGa~~EcuHQhdT@SjpS(m zp5Eb^XFZKSINI0Q|GhnJbBCkRWFghn-LdEFhVWy?sp^fB8+}4uvG?`#?t4X6!&T&w)cA&yqCOlz6*Nl10l>Qy0u@7e4_qG?8l>w=fOO^hl_t)qeGGu(>-=WfWlv*S2x#x?gM_Gt6cc|rl4S|1 z@2r=2f&J&!w0iTY-#)>JM9IUv35c_h8!5Aqj#djGs>LLd3Cbb41H*mEp z97B4G#M=+OH<4J zehRu3i_ zY@hmrz?gq5{8N0KJDEI!e-0UN zBtS5bj;H`P11|Dr(d3Y+n1COo*ubHKxSG74%&Hp-)6G=?Tn3C$rVy}+Rp+pBk1bG_Agyc$09;fI{zab z^tdnx+-PfS!)*{SC~Oc&b|v?Pvr*8!vw^HbQL>mu8-*%k=~qfc@UR6CE5KGUxrA$N zK@4k9U&=x`Rl8tC+xYI(wcT(13**VXzg*V1I_`HTlaFnC^jpV9w|sMD3x4LzM_9ah z4a)~M)Mjc!I}-8kEys@E>u7ozX5V@Lmf!$|N}x3N#3Ht8Gd4w5y%=Vok}3dWU_*wk zF~QQ@29+g0#gpNoKr`5{;p!JQgQO9rJ&f4<{NIsIjT%~dLZ#BB1Z=0w^#_6|1uw3# zk!Oj6Dpv*$yqGX&wPG(9OVrPmO4rR24kk#+#mo{2&5VD?NBeT-g<=W(W zQ}|iK(F`eN<}J=JkYT zhV-S{+E`rgOh7lc&=_K?mT1I{jS1eJKyK4x(14+a@>)?lsqqPIOyjiM^}QmD^>kfR z3oXxewTc~09Xl)f2q|M>BnR1-ejo{hIF_kADoh`d@=zwLYb`-qnyQuR4P*&$sv{`_ zH#i!ZFye|N=GrL20pA5YQpkZngF9D@SOp_)eW;8TJFaphTm4Pkml)+T=PekBJ_X_7auFKhz*vM^kZsA6_(ZFcrP~f=pxNAx}Y`bnhF{cnY6mo4yAuo+CEP5HNnEpZK)NaMieyVL6KO)4 zlSJu+91_qd#TDOZtIe`4_sTqy71@yac^S)eBu-dMxg*}Om|S2BuwkJpE^MLix?Q0ITwV^@|cMMF52yNs^-QYolLoQhUj(aOEWmaEcoRa#EgvSnvBq(rh2!=LrS!KC0TDSdEo zFd$aZ9JI1((ZN*eU?~&a3*w`}Cf4B6Q`=cW-}o_VC4pz4+%2C9-uz-)?U8 z)t6q{`rY8@-!T5%|)QC#fDYB4Uv;5VKs(hH=eyGd8m8(7w*{ zwJfI_A6U>0dVG;@w<51{OE#Jv^de%qw@OwOt!vfBvcba437#Wwwoo_2| z`zO*)MFgE1Y8bM(m?TferGrcGWSmU#lATD#$KxNwxwyY3RfVly1uM-B^{QW#h)V&0 zPvIv|AAk+-6!-Zl++a;%#rD?KW7X$Z4*Gn!hJy8U{{Ku@eQXow8Nb(OpW}-^&L45k z&L#FGceWGf96Ry(BMJEOK}H=y0t5nhp&6|-wbK;G5^Um+H7on-CNu8y z9|dF}bfaWbRH>6v(Ei|`iI!EU+8<;>U4^Et345N`PKD!p-{+q9!}nf(zvuTn3u)R9 z4%YiZq24Pg+8cgJPFI}-A^xJX>|Ar+b8^l=@B1vrTI(6qd>xcin*d!}*$zYZ`TU~_ zs89jKXsa?@*n-LyUIf)2j~ey)BWg=T^~WS8>Qf}rP#u&S1};dF+&)0sK#Qyc+%mem zOCNv|kk)`SW2z@iQ2DhCw2;e^y8F=9gYMX9;M%pL*Oy*7I+*Tg9VmuEk%S>VX7_Df zUheEwl-T%5)A7B-Z+viST+4On@^`)7)VJ@C?gjWUyS69Tze7$w#Js>9V^@sVJ^q;!kN`ExDR=QVuSb9=w3x-<;1l^Yjl`Ow&DrO38jGxWO#Wp4|=5Y%y zr^DXN+iYI1&(^f85|6t2?30=YbV$X2htFQX-e~qT7cQ#rsdrRXT_x{cKN??#Vhg4k z4xH<`D8DD)ky*L1hW4;ThPj4VEs~-E-l74nVlPssIO8L}RnlZQnhY0g(4=$c$H>?! zn=2(5xDYkr+i^YcRbM zBh#^RY%O*#W{x>=CJcR9L$ZVMFT;bOB6ccVN|ub$C3xGG5-ydR?dg(pg8k zRM<~k{<8lrg!$EHUl?v&=eJ`@;HS^%Up3t}yypv~kV>*MtZ9ZN3@flE7GGkZJxzPq zmBpXO1R0H+ct-Y>_o1TWuf8G1<4=(g5XCnuTh!Q$R~`xRrKj{JUctB@UlJZc z)&`}lu-TA` z7r`FBlxb%s=LYvEy42n(5=%twPYtBfDV7_FOh*!GPvnR?D-mg^Lt-ZNsW3B23SnlK zr64gg+LXi`jL(M2xHut^!_hg39GPn$Y=h}-L(INZF-#_ldd4t~g&}_LHV;c=f8PO# zIn;e1%OOw|N7GdgvSr5%%jLHQAsoSgaFvo1y4Q!aJcHBb<;5t zfy5Kp4|;4)(mC4doq!T7k+0xU|2;rW;gL{4U_{OEP z3xA0_Sx=1lp0pHS9#7BgJGp0I z`#*ij!Iy8>{xFcf@DH-T`>kU?TQ@A6tu@G7xV`1&8@@>1=MG!Vti|RiA6$Crmvj9Y zQB+55FNIQ}t`nx8o<8&L+-T*@#p9!2{czx@npAebwm0qfn?dXu2Lz>mLlu`Xtu!>T zJ!c?c1>Vh50pvvm@5LbAh)|?aMu73qpp~8IM2LzJRLKxJB63=fYD6~M?WV&r-9y$y z+(TP^_TL(M!FXE30d0q2U_3TlRE+6<8iDF-ga?WBz@@?!gDc9UL2zBVVS}}LhKah{ zd(Bn=bzdLWfS|UI9|I^Gbs$Yvh4l~nh4pydvjK(S`g1km(X}=U;x?l%XY}ZNZUORTm+Fcv=c+mLmE2nHUXG1(WG1(eE2GQEk#LjP z-QiwkU52|;>+XmaJNfPoq1YvNcSKfMr;+H=qluAphdxfi(F{XR3F(yEE${(Ru~m6; zg(oh)%wOd1@@5`Gl&UeZk_c%t+JaWr%*$F;GhNXLD3!LR-P6q4LiRFLg~C%zBr&7h zs`sGB$V52Husffp1tGqC8Y+B2$5kchP@Xl+MX2GUYtUaBzj1VUFFr5SY? zX^0x_Z)kKDM4A?boRyY@;O)<5cAQWtlBvblNA{Q7yiPu8Z0~L{`gt}qo=m-3Y{^e- z5AN#niLOwvrO!z`mN&Ofp4oHco5t_A|1=jCB}Iuwg#Bdv?Gt_J>22vmBBUr@K6ixO zRj(QuNXLhvu>xP3nNHISb;jIc6p(>-gtNy%;qH({M6xU*vSqKx+CV>OBnRUm1-=cd zKO6?*;~O~J<`8${Js6+W8gzTOL$~|aDci!Uz<}0ic~O21SyL>KpUIgL(-GAgi}P35c2Tb;Q^X6C7d60hzYAPi=CtVT_E_4I_}va)%9$ zFx(~1gg?qKVY$=l#p69SBwT5;DP0cA2Zsq^@1T6ZlhyekBJnAIz;m-sA*Jg%4%BN) zc=iVyg^hVyhcu`Vs48SZDJxawlJZ2cgq0b^WMHG9T=w^;X`dUc_gb>vcd4{D5`kbE z2;wbvI=VYNK#OQ#B-|m7+XHrQ6^@c;m`=OZ>*1?5V#}ifUmMf0Gh79o{f^!42sjkc zi04K01v7)`sz_!;vLKels(49!B3i_2UDtj?>41;Di5vjo-K?jlpu2E1p+N?EB=`W- z=Sc;y-rqc=7d8lOpPtD<8_6Je)w_`^f3~YGwr%SQ z^HP7bbS;vWOiHpP(H3ommZKlrw5-^zsLZj`SW3LavZDfSjKM<(tXu2=Yda)Gy#Ygj zJp|rf`p}1T58EE+wdv+QbTfh?PYV`c8;0$n7_cI1nq&=z><3+{?3^RXanKPWd3f%< zNBlYG`@WOBT6)LtFGWkSbILjOT=FI5ym~(Qrr32iaX%?;b$usz!*xTxBi@nktDp8r zWwjhBC#Q^ZX->Z2|CTJ}#1X|9GKO=dDK@3}dX+jmtt=Vtl(NEB;Av`J$jd>B;(2CG4ZJE4XARcJI3R3BAE1^an;>tJPl<@T?%=lay*_$o)O*cqRmZ4 zu&4~Cxcq4w-q9t__(e!yzc-rZ9R9k^O`Nz1UixjSLXX6Xh(D0$TU>m=*)9GT zE^hEWF7lkNUyZOxELmbDASS`g<%Fz~-O27{Z)H7;S+e zU*$ei_FBiwIQD_h*MRqP;ld{Lm8%!nDs951unAK0Jwbu834_{99s=DAd)$GUY{>SiWKo;5~U_X^w3+Z zSUgCJr|z8K(!emga{3#UyLZ1bm^Y)(Hor97cc}TdXtvhO&ZT+-a?ptNj;KuWTzRzd zhuI#^!*S6t#O(B+nt!}FkPG@vll6x5arR>KR%0r{Oj8Z$17CI>y*l5grVweK0e+ML zX?ocYI_#(eIS@OBxtIAEVFn}2V1yZrqew#70OJ$VhrC089BC2(1B?&f#WmdXK7fM+ zyH5xKKm+1h7ns@2+hI77jy*lG&DkPnYkY%m^SAf| z?%{812S}$SzRELCXa*V{hG<7D^E9(`GUH-&V!l}}XJf%+Bz8z;s^`joE6Y=HViA|~ z=6p;05Q}*8uAd1juHUs;L~l^9&~Wfu=_-9%wO-A4@IH?p6h9w&92viHK0~uIh2mUi z)?8;6dYl2AHCLIh(7XyIN`(@oQVrw3RXgjd9e$~H0)X+E6UDhzKZdDhXnBT~XNvFv zod7zD3NC}|-#Y=2gmg)o>Gy zWT=J7kS|lL&{c)5Dph!nPbm2f<7^R|Ky(*d-5?qNpwVLSY!x{koz+eSf$<+2tyUXn z+l8a<9~HQB+TjrddghzuGJ-N>?@sr^(%D}NbB{k3j=`RTJ^%RQcVm%g1X{1w*64Hk zCw#XWpK7ixNbv^tN||o9-GG+Juo977@zJ%xqLnCs;RFV&R$~6dplT&_=!&kTGFBqL z>*~Iis#u9RFq~&o^>nSWl&H^2Rojxn*jHz7Ly_ZFreBQ+j3f`d zTw%Z8>U3O#CYQU1Qo|-6=x0HBFgSFu^(BqEL2MY z&%o%ZN&C#%fln<=U!b{s2{o1e0kZ>pgq%-l)A{izmaw9 zW1kdVczRNS;Af+UIXKq5SlG!vI;F&xl1*16V!Con!FR08Ag&M;2bgg7mZQ=mA7 zh+7d1VUcjQIs(~hNi;HAAZH=A`Ei9M^owR5fuyV8bm9Gub^i(oQGtCB_8}ZGWpm6I z8x;vlayj6{d-oI&$dDpWOXCChp&)?Z0a0TgHeSeSSjG5iy!8UvbOVJ}eA$$UJtaa4 ziBLn*M09E7(j;_gnmr-JX=a=paT<)%gQC~!z=efif-@}3o_HckTdH)Qb93-ms7y4dTe7kK^Y)^>W^dTrw&$>$Ib?6a)sF4mv2WSpj?LD_GL}9jHNR5rt6Pu}&EC>C%X8N`zwj(iF+K{eF zzm?q5uK2#wXN||rk)*X~tyvqEd&}Ckb}W}*DVAsOk96pqI>Ku#&$}z-=uE6?xG4LOkiRW6=8A#7txLj^FR@d}p6u?tFg9`Rv?F{BpL> zi4!|X>xPko6lfaSgjE_zThmY~&}c^zcOA4qV=-Fj#*|7-FjUl5+CYejrLESHb}P$9 z)=`zvZt9r2KeqjWx@F)Yq5iQBn(TSbcG_@-5`}q6&e#1Wt{{}9&7Fw^m z81Zi$taIHJzCUyTUT_`auSQwbD)i9m0K)E=3g<%?WYSV$(Alg;r148Pk^dh?DAI5l zpGW9%dXhd&pP(7~6OV-!EzdC&aR!uuA<5h*T(6iLYGv%{hEAk64V@UdZ}UlyGI&y@ z2fw;`^c>+?nI~v;s4Mfh1rCh{KK@&l$up}%+|Lb4W9mX0rgdpmLRx#;Ik;zz! zOEM`xAJm9ekTnRq&`e^{EZ`M1h*Ibja<^zi#DPxr0CMXOwGF_26Hx~Pqn3XUxrf=u z?epyup9t@f_Qag!F%*PQ__16u!C#7^BZMCMNp}hFG=>l@AU=Z(6K^w8J>9*%Eo}@F z3W}IX)Hz7v^8TIQx-@-h-y=`Izo}>EoyVSeaR1lup=OUhH~Zul)z`lJ*8Urh-_d{c zsrQ!ueEi+(FN~wmv2tU1J#`kbW)LN^t-)HR&%&x&;Ieq&7>p7p1tNq-WdgPa2ehzl z&XBnNwCUGu-PJHeUfbAFX;Y+qjC>YpYYUDX$bNJreZ6B0YuGAG*eXl_q7x}Ba&9$S zaP5|yuM6$`yl@@~Yu+ZdDXnLS!paw?F^B~YGb!OI$Mvm2)!EzzY>f-6>D1 zGuguyG{}3=sp#s}pv&E%5yUNYkx))m%EVL|AxI^QA?$Q8hpf$^(KIl{@TxBZlA|t| z$O82=j1CEM>Ykb5?`)lVe)7%rz3DRLgX()mqMS0sE~lKh6Zv2)3y?uQyucYbwdzDOYF>qU6IjmS#F=>}KntgVrZ+Tu5Cb81K` z_-(TOC;6&PU#m79sfyLej}cRYm_F6Eu&SMS?GJ)LN#V%P5p)ufLfH9+jR|Agpo}yt zc_<`Si#XxdP`>>?S1K%=Z#vOte~;tsQs}!Au4xzPLK{d7s?-)rznx%ljsLcV5>5VL zhfq9u8?UKqHuI&KMEeu@{>8=eEe{#BCQy9i3uJ+}NQ-}lX00r2%Yuqk&d!SmHd#WgQY-uGS*}Dh1rK@L3i5ZTafYzDL#-3>(nwtmKi3Rt z4Mzv}?%um2e-fJN9 zmI&K<>Y?LbiD3hWc-gV?5%~wiOBdbU;KeA~yc8|$&Pb5(`v(cXZ{VY{)9~QyhR!$T zhsTYyfYwsMja3u2pkYyu}EAWs4N>Y3DRv4j>-Q5cRQZ`ads)h zIZ^=?@<75In5T$y9djUC{;Z@#&P5ejl|hg-^yKhj$>+<@@f`Cpel94v^Bl+$6O_8)(| ziY`9H_~Ww9YCZN?JnFX|aD1JGp90?srFU$Urp-j|sE5Q){ha-iyp;%ahaw^804CQd zKYPQ4GR!0sC(I&yROSMJ_3`}USVN&|hb>q!wn^Z^QdKAN*yQ^$wHysV<}bLNCESf= zmC&1ZpRG{5m%UN%S9_cf-Y6U{>wS}$iZx@Ie<{f+fEUndPE^0G`O0A^Q3_D@;8KL4 zQS%U`xW<$roWaAL)iX(zHUE_hCgW2hHm!ey<0I$GR#f^6vM6NTbDeN%zQCzozh!%R zd(DjV?A*L~lb10w+b;80yOcCD4br6wFeLi|^-A{iRu=lDyM7-*1?B^ExwSPicZ*q~9nn#nRB8wbqSXcgCHa?4UICtnjn4|3#c@#f* zB0F8g0Ta#rQ#iXA(#y@G%;k1DEKFR*4-?7zO4hyQ8NHxTsyR5NEEIs5VzCP}42CkL z)1MaQ#dtOmG-fm>6Lf1dxwYc8}D9%94^)kC7xRthnH5>*q~*ud*iT5S@tzC zdXbm`Zh#q)$oedgH*@eTLRiYmMY-&#u*o$+#9L6f8c)8CBx2MK%8#&o?0iUc+&8M1 z@qmE(*bjP>KyfPz@gs1;ml~cNr!*e>THDqT#iMUpyrhAc5_~~}kKW+OuIe2R*$?XS z$Fk5YspO&@!(Ox-vlCNS-nP;5i#aW^GA)M-6$${d%jvGw4sFx209RAKtX1iGHj8w&AXblt5PvSRf~n>^|0U8i zpX!j_W$ck~K{@D0_r6m-s-GMrJx*r3m50 z_OI!r3{l4LhZsHv(lAgiA9Mjc5WlTnP_E%GB@(Qi>&f;}G4(NQ#2bVB|AN6I5`cQx zVK7;stgWh`vmS>+wYd7>O+jOHGIhe_j*NZOKTKWAWxB-F&&Tj*teM}MM5yx*!lV~U zBauV=@ae~#xba%*UE!6`;v)-)%~N||xz7WAi4GvPqCxcQ+18YKOl z2%=Nl8X`Dt;b++pA=_M2ncWj-&8Z*6a`o(Wc5vINS9GvrTc58&>%A*qN8>K#Vlx#> zFt}dTJjk`;<%=7IotJ*@2UCBhfkr=#lH_y(yQ+A0K{)0rqCzHePgH>d> z>z)#c_az}bs;ZhAtm05r^{9SLaTHkrX0gfT=+z9?IQOsKLOI%kqa}1QA|y!-dTB0X z6_bs4DXD_9=*sxHj;meY`0rLBj=qk8$!e~p>El|Cu0kz+uhDGzNt4$8_2gMbiYdk^17Pp$g)x7^IN})TL~VIjgP&iHCEEX|7m%|gf%>|gFy_8}?@9{9lNMF`HtZ_JOT^V;5GQAy zQ-K4X>kU5z_8GB5e`?yQ3i&^Uo!bLXf*0gJ@_-K$9m^y3(&nAZL3%i9D-de3GOrVm zXUGC-&GB`Qc2H436<@0*g!prG1q^d+sq93!6+(9%-WY_LVBOFrfXa|y`TgT8BLL|@ zzlFOHk>Mu4RpVL&1e1A~R&gjxR#R}W;74)BYbi7ZYKblcE)S{!d!C^3_V^i6Hd+)` z)FatZZA*^pO;K7qA-S+T36PBl+sxet9={pA9$p)iK$H9}LAX_Kw1O>3+>={Y^$q3> z(y6F+N5y}o^t)ox@5DaQkDok#>17bvD6iB!NlcMRAeZe(D?B6;)F9^lWC8*7HosNt zsSaa@JGA+T&YQxdzMBHDH#0hvPbQ5=I$50ZRCgLrs@)`2En^0R_Be;t=d}{X&}`&|y(25ye@d}cSLxMCkbo@w!)w4S+*we%S1Xd}aT8HqDS`dz=twb5XiYC$57 z^X(cv`rCHfEIZDs6BrXGFt3K&e=I?*mhaFi!bgKfhk$#?faECUkV{_Cf+UP3vnOOS z5|`aL82Wir)9SbhTEb<)$%N?+|74YzJCFmY6A%wI=^Zwh2T~?2C8cDtUuUwif7 z#awkZ8ji+zo9fOyw|^&V(Lbp)X?E6BgKhkUDiJAc3JzzTpI8@2k~9kn=L_Hu4EJSx zHB@5hUoR>0H&Y}F=7ah&R8|3@^flrm#zd&75{zT#zTsHY&~x?JIdR{4c=PF=J$d8J z!aZi^Nt{kmp{c6KFgIdW*~9;4e}#oQrTwFTxRs5=Ul1jRNZ`lnPfacX3|x*ZurDEu zyh{dObPn_mnvVqSv4!$LyJ^Lm30Jf{WQe_}oLZwr6qBCrKGcT5X4A^@m=UtQ{9U#M zc>cw1DdaXQ&yU@Ss9&y@Ay#Emdrs%rLeN?GKUSmGDV*pru~&H2*i(x>NBj2|OC#f&7f!o&%xZwzx$A0ch}gaElDVRdR~ao~IY z{zK_u+@qrT($&G}XY%fHXif2_hP{Ma^b>ujp`W?w;ss*!JCyRjc(QIi~O@P8lraC2IdJe(k2%~66-Hz z6GkDE5+?G(v*H9Lnr)_Ot!5Zo&w`lq-!|zhpWjy6a4Q#_c+*D{D!f|N_qRtXDQXoQ z+E7ueArlH-)4FIM3O@i|5S>AMz{GayBkJwKXbSad(xmLT#K*R>A_`4Kvqbu=#RM>p z$*JcxE(#x&Ed}##K&FP){#NiR1FHK`7Lf$9Yj6;OvJc2Fu(Ce}C9sf4KLWvUiNkOpwRos$obS4J9d@6_ z{j2AqCvq1$>vZjZU{X{vlZ8-pG_Xg=6fv2H3-MnQg7-hjhLv41976xIV;c@IgnaTR zkGXw_U~JnZ83wT4j7edr9-*VG5<5StQS}xAm|r575R#3z^+9SrtxGr|ByOExEPF!W#`@8?WM5(a>!(hbQkT5xIO}j z06gco0B#k!f1O$NXHu$8hhe-&gW|n;DNf%pM5^7{}XdC@!o}PM6U2Dj0Qa-wrqcmU@sAS-{mEU+?{q%bCZrhdk*uTd3As(dFs@N-9WobSaP=-}Ri*)CczHTt^4`QnQIk>Y6(e{WjosVjjifD-}E$jc^*F@s zkm4Z3{}m-BqmAPN_s<*0vGEry#&D}rhs zP4`wEeXga&iQ|0H2dr{QAzmejt%_yqwzL8e(XE>V2M=yVB@g2%f$nU zU--lohcrna)z|bq+mys{%34{$=N85&>E3!HDGd3p(ru)*RM5x#*xEv+wmj^4ln*&v*d$uLW`s4x!=NlYIWz@kWk_Hi;TFd zAF-$}R7pi4VZ27%5oDaEEH%${TRWSwv}EFY;cnq9Xp+!;Flu~@2J-T@piM}o7yDN+ zSBI#Pm69B(ZfK!Afpt)+4Az_{WFd0Rj*=<2M^>*L^b>vgC|r;gJ-H}b_T}d2dZwI3EXyYpG~TFJRq3zcQ%gI>wzcDIn>yR@?g`o{#BKS) zB$ibO2Cyak!9ER0aOBkCaFpJSsC;kGvfx2wQ=6LYf>=~UylON0b{hJQ?qH+{TIoC1 zk8qo4wS+QOw5X|yl={`J)YNwkYO_YB88gYz8>ZBSn8^(-7nLAyrR=D^N=-n>T}}QA zj;w1Nqf+Xa{ZdUpwvuO#I~>;080u>@>4*FK5#&OLGrSr=a&j86s-GLv9ax+l%v=|g zSt@`waGw&NK7u%DZ%_6sF1;2&lrB)oAj8y(VG$3MRVMJIJ^zRTej|e2oOk05fcu+Y zBTdK$6aJ58UL7_$Zt3W)MBbxuo)$nCb4%>Cu26!j9sd@D-ii{x65HH813bR&u3%J) zPB;@ozytru3cnmeogBpD)}I_w8Q@+ZFbDtm8-pkXEu^HtGtEB7>^>;u188%%J21VJ z`&&r!%t8iPAKL;OL&TOoV=85l+47w=6K7*@Y+`17+OY#ysHZfquI%+LVWHt3 z($+Y+7Sm_3;5$6K6Vru_m8Fnn?%Bvw%udc!%~kGZ+dDsW=hop*Dr@S~4hqR}`8KG( z;8H&LiJ2!~$ldza^Ai>vu3ewc7dB3< z)Y?z!fX#Z~pdT|V6w^`^vVVF^8jhH%Kl|XspL^syfd&-h4TW)&abK;5WFs+Ru9(YY zekI4e_H7hwOc=SQkkSpf=x02u3o{6trC5NYvh;J4#lc|wBL`%C>Ad7~^QHrM?Uw`m z^*Mi33tO@u{1SS>?K>LZ4~3V~%L)g3ES1HA0xQVdyhJbETZ$x}V0MTp?q)m5hM`JN zQ)u!8^8(h1KqU>K;OB6hQV#nx%dD8}I1|-+#@Bw5m2cjjbJLjt5zpM-cpnjNI#QaU zAKrFWGB*w!?FdI4oVQs(fJps=EJ$M;BS$9(V|{CwU&+?M0)~|XpC11|0yj5444tyO zoiRS0sI85Yu(6||gSnlPt;4Tcz|qjy#tEN;p5=ESq;Dr~Y;J1i^t&Sr-GA)2 zNlDAgi%|(UnCn}~DF04LIO$uN8w%K%S{eU$9VI7YYt{cs|M4qoZe`4f&qn{NP{fDf z<;DNMaQ>_MUpREXR!+tazwubKEt|V=2W9npv&%n;Y%=~{NhTkLRU}wkw zkE8#c9!T+UEfokiR9t$4^s!$nP^R$Jw6O z>OY>>81R1Li~NMPM*6M4Bo$W_d8UYBB1uY~o^eyjUcloMz(sjR(-fT(E|$=j9#E?- zvX2R>0~hTGfJ<1NSejf;+j}mc^?4=C;$nqtCGoJ-pLO>dW;OKO21m zGg)#;wHC+JGnu);lx;Ve3ddC7*xk^?cAs`qTw&}!2hCSuN)llpRVF@kAie&O7m9X# zuP8f>&Iem)tNv`|K(_m_Zn-s$OPcI{pk7hvzqpi&der7ReQGJ6P$1IiBTI@I3w}1M zV=vYN_KTQ)AZ%f-h-O+tf|N12H46x$Y(If9Ar#dGJ4@D)y(*2UZS)xPTZQPO7FBi2 zs_NAc;CsUhRzmn##FB$$xb@WK6>-Bz=fAOyO(ny;Mh;1s%U&2vbpkPJM#-9d_Mo!d z!yM#?`|LOf6qnu5)5uawjFH_|_0kvQmd<@{ZuNj*xtoV`1h|ifE5V*_2(8e0#(gk2z%v*cu%v zk&Kc6E&3ZCQ5e_QY*?+bn>2@vSb%X7{sFxs7faXE$Ef< zGs;mdrJ9dgqySxa&30@3GgUj9k>57qBH2HjSBH{u_>p9pvWGzy$O8(}oE#R+JVML? ztBY35z^;lwV;mA_=ZxRcw(>NAq*>>6*hPR62~5IDhcxOHm>IH>)rNeHqNL*}8d9WTCQZ?2$(;rOX0`{JgJ(NqxUOluBw5Lzozm%pqk;+oKL0oBUgX9d?95 z(TnL$F;B25ID;InDLumb4T%5!Q6MdeTr!9@gU^l3Ez%YpOKGT$)N)pYpp+;sBd{pQsAerUS*nWu7h}G&Hej9HQrsfC!FLtA#&qfa z?DgUH@$mfhJUbB4&c)Zq`w95M<0MO)K-&&iDJ+LVCL4ydIg6w~=?LOlu_`b*tUBDOJ=bSwB*OyoafiL2lF*QVipd<{}wQFsiJVzBhkGD_7In0u)Kj&l}yNO?` zk)tjZ|J`8<&e%1XFm{j1J>}AZ>APltBBUnbiZQlxw{Bu?({3Vqm8kTe*Ci5dj%@3I zsvTZzo;Ej{r~>Dgrbe8>A6EricZA5hqE|$X3d6b znlE)_@?N(vO#DUJni@K1((>khM`j(HI&Gv<1}qs$Y|}%mEbqisBF81?YQHWo;A2CI z63s|@Imb#RWmpM0e1+_TGgX>@$%(yC?iEo7=`FdoF9JEhfkw1a2JMa^j=E9D5cU3N zA~{GATx9__ujn}jWOI60B$x^{A_#Ig{5Vj^dR0%H%bG`NCe;F%vw<3w89dj0u5P$o zW)iy?uXFLXGZ>gPM`5HiqmoEI_8Q0$9bmJm^Rh*My=I%hIL79-{dK+l1)-Z%|N0(W z`vj3)dPoo0-qNVO0gIti#^#yo1(mfr6vbZfM0#0vE`<;5HJ2C=!|G>h2ae_>q_cP| z=1uuy^y1F->hAD%d-AL^b&I{&X#Z1GO6cUiuPhpx5e-nfS-jhWy*fBBFkEl8evrRV zou?@z#6j4j8MtJXkq{7f#^4z4NLRM1AT~UmYua7Et?P5l&0AemPkP9UDMt%kd<0`* zQg^)nF*n(spXw@=n12U=7MEJm4zaX;P%2X5bvI*10*(XYOg@ifo|Iyts2a{N9>lO}m5!(=ph_NPKFN5MPwyd8 zhe^G1p%nY7#w=>6Xdh9yNd6S%n7N>Y95qiFd|;BvAm@wq(M!T*n|)N%?c3V@*l9rZ zxVvyuyELu#u=R4o8Q3c#av5kXVjx@37b;Y%2Oo-Zjx9q?;gH!BBy`>{8KAONUOQz6 zLNcu6)ELaLdi!3A{4hWCA%i^ScpV)(%dM9!)Ft&2>wqQesOMQYmbjJQ1M>;;upKkG zc!0YpAypk~;|#X?UY6pDA$IsBz1H0gkERIcFbH`~Ak`lgHQG)f-7S0~y$QOqNcO6< z4ECMCTQwqwP@k+mL8hqRGDi6<_5w8#_*{~LZhiWVwF^sMqvI~W-%eFeBD%vL2lG7M zt$OgK>&8SfEG-M$62=obo8&kJUhP?2JY$X=vKP7hHh4=ATmOXobTM+vmE8}lvz-<$ z(M4~0zva5jN!q*<`QxDb)UTkT_SyAv?b(T+6zo(UCx8e9DTp7pM-|)vAI1-fdEcyV z4uRJ!UZhx_;-Z`afu}FQxr|B*v_Kr3K+_QJ;e6eGlH;jswtm>qrZdBWVhx6=9fzn=pmFj8(WryNkc=2ORjtVNr#n{BR1*N(+YeOiT`V5*UK4{!L-LH66Qt;Sz3BDQjSjM2;^h!GKwv# zZo&O0^~eEuD7R42pf{wvLMwzXW@d`QUEHbuua2mOP8D}c%XCc5q&Sq((E3y3``T&> z$&t-&(^~0E@yJ8P^sL@U@Wj=TyoZ?UC^&09f3%3T>$ zYbio-k*b`Tx};(FJxkSn(simz`PD0S_=E-lilWX=N&MoQcDCrnhLadt9OtJ!?>G%4 znOFq3k8!$}^&Zt3l{Xay8^4wqqJuZ)iZZ-!enJzRO9DAf*>K8?IM<0k8q9&|&fSR!{S zkx#=jfySZhVK1;L*$z1N0Ea-gNX+W?CX9Q9M^8XJoyK;UckH^1GSv6MGF`YW1UqyG zo{7qNI;mu^H;Y?sP*CbqGW{%Xi*8qRQ?ry+i(dccB>kzQKAS0fICi)(u}tJ!LcQ2! z2^EdfEk6%>6@zb{Dlk+kod|oEd>_E~=uoZjd$U!2|4_iQKH;xF(@VYLvw@}hU&S*W z{<7<1maz$p6P<-1n%G=^qu^3ms2QFKO_)U*@g)pcD_+80>k=)EG3{#<^H-q zps4(D)^-F3(tyr%`dJEoAW?uNKwJF4@_>f`vw%npZ2CGvBUA<ZUMahd!L9B|6c=4@H_}Wr76RqlXUz3{aXHoAqzf_ET-t2b}>2I-a>J;|$4qSv>PX zuJthY(1a~o$Btl`Z`{~(k>!wHzf~#Y43p38Q$Blt6M6g7<+8Q7)2c zJA1@$ML8oFCaaytD4d&=y})iR@fJAmaA{ac=areDIIF;{4?N(i?+;*Ny1RY>8@M&b zuN_S?CSc2J(7rD7|8CD(MN)ZXoy<$tta=R-TxP76@lua2R-vi~%MDG4SH4Q$XMw&7 z)}pe0=Pg~5d zQ#np5(=ef0?7nBHx~gvxZVC2JOEZ{8t!8HLefVQQUAXQnbR~vPI5y%wcgGZbFy1Z%wO?Hn#~dHF<z??Bd`!&l}HF zy2sl<>?d8#I#&f=A`vt6rArkI*o`B0_NsiOL!ElL%52ODa1qe{cHZM`Wbh=Z#x~e9wNvP zGtvbjW#3fGTajmyFZ~I3h(>wjsYZY}rav;@>eCO_ol_jA;Rn2aO2Mz3ZMP|s3rUy!Ix?l0n4{h3 zhPL&5bw@qUBsm_;1u(dS2x-nH>=CQ;b>;WP8hIQ`GYxS|VTCc8<)5RKPkGD_l)uN^ z`T~gUg3yxOXEt$W^P>IWg{te_@UNBl`A!U=4C%?!F0$W6vIRT3DP=#SL%%V zYskD1Tf|%M8-rUf=r%h2a^BtGstcCzWP19Sag$wqXfUxUkpMN1XE*ul#Efjv1HqY2 zhc5B}7+=s86RcQ<*l>zS)AeBH&*NR4bJL~LwD=gBT?(KL)dyTLW(aqu-?ron6XFw7 ze6K%o?~FmOfvoz?b!;cy_Lsjmfjw^6ZVkJf`mW%uU@FpG^}R@M8lBxf4}l}?*>h97 z3u#SuG?drMrrXpH+3sZ*v=b2BSMA9@^&kgfpZh-IHUZRa%;mtxp-u(yxd`o>5#}w^ zVLsul<=o!$b><&v5qEZ{oj-gsPESHfcmX|={?(Dn6-qY~3UgnIPfwM1klEjAzCunQ z2+l`E|9&ix>L89@{72=#nO>pWP_K4Gdb4*MWxa1O$6^6yg|7WS0pLa7Anf3|LBs(? z^L_w9d&O!#V83b~qI>ylQtnLD;kZTvfUi+JFN8@MCMZu< zKTs6>6l<=b^0Ys9i8z-)p~=jUxw?KP2QxY&r~{B+wPx{e+1kRL`3V9t+^XvH!I z%S{il$-)>RpX6a4T@W~f&g`)(KW274&dk*rb$r^2gt6U0GdOR` z*dT+kcHW$RTQLGnr<<;?W-NY`m5G)S(FVfij;2?Hm(s9<2v#gim>Mit04PmwN))k+ zSq&Z(LI#4A4}?U%CRX&A#INK&BTt-Kyar^iU+q0|%!I+pmvI9PBi2$EJATnej9(XP z?=!?ZfcHWD42{4F4Go;w2cri_->9C2xBuzq&5wQQtq2q3Z=;8v_6HRJ$`eo3=;jV* ztZowyII0_rs)4JmnyU_$J4DeXb4%3RS9Zw;IvPv1j`Ko1S-rH3`J!!;Ap48L**CbT zu{U}`;LM>YWQ!QHkA79g$tQ7)pK1>H5!l47b$5%9(hj!`+6+L)R!@ZAgsE?%k46!g zoS#b1_@;zDYR0ArC|Yr7`g?4fP$X^9b@c|uC$ro97H{hk!q#^E62946PQ}SH!+8AWEPjUipxFh314|mR8~PTxlBOR zQXnZuQtlRAx>EKIuJBgokzGPkt}Z>dsQ@iM&#y?WfK;hnfJuW)rc}eVv{8;I=M-96 zDa$Cb@T*8xuFk8FwnWK(Q=F}0AUBya3;L<)lVc0QE}IXIN)|P63M7 z%0WnV<4BEF4Q9Gh$rKDF%3Ncn%^F#um*M>*{TfhGA5}6x&dh1o7xH^;A^!p__+gwo zAoCji1+!v-2kr1b@dxR%N@@h4cVO4tzYx`5S}V|WiZjKg@@v zv%V|ou1aaUQ{>l@tyC&?H`G1)dZ^?!h+JLeU=^OY70H^tmp}JOFZ!3N+6!)Fx zCiBYOeuC|_j}M$ z<-M{h(@gRmim*0Df{mxN_+qI8CEgM+JAl+ki1T_4znj%iTn^u!f&}M;ne?mgA2rS+ zdU%htfh!`-Fo89klX&L5?qZ{wV#2ATG^D4C)Dy-Mr_Xenav)*=Ml0lS%`JN1d$(vP zm!)%uuDW@J(=O4=qw-@53p}zUPPrVKqtEC> zQzQt*OI}o3*iOtWtX>T7fV1)S-NM3GhF3ssi9`Pt2nNW(X*3B z8){D38+*y7SSXmshgBC`G|YlcCVVt?KRH^z*vH4&L@YUci*ms3k<&@(gb zf>x&Glh~(MLvQ}rUr6t_fy@@wBvCg+P8IW1&x@`J8HYHE` ze40Bp3wHoH9u#-V0i{=&J7wO17^{j`x9nP{fN#P~Lw~ru8%^kq8-^Yplt@~^yQH|t zL7{@Ul_w0DG*q8AH$P@6nXk3{#%f~a`^CV->F~_9UD5hfW*2?kE-p=SyY}HfJj6(C z{lqW}hX#0}Ys3dgKE09X>={oD5A<GaH!B$`BmnDmfa-X2AsJ151pO9LpOYs5_m44Rt zcN_P$QePp;w>f(|La_6-K`y+45n2MyZM*y<#%CUPWM;A`y4q6aHxZaDEiBa>Qr%@Z zq`KYRMOb;hhEYNXyO3tc)b8)0Pne2_Y(h_n31i{y#}RGZqm&I9w;7-zW-`jSHE8}rs(RFo|R%Q-Z)qzyVHgtdsNzri^`j-^BU_KjXci; zCIvig`|}3^NqCBPOaqS%pHHyq(sWz2;A_!#Oj@T}FI}-GaZ@szD0qL?F|kNk=SQqg zNK6y-ASm9#CWQO1a$b6zLuOso>~N38?RYgwuQ&xe#z1}K@fGkpmTMu}w`v6A)4z@; zfk6s9Wz4#jKG}9ufRTrtM|V6se~S+~Jv(2f?Wv(o0ds&9c)Nl^SPV;8EbPw31j*PI z$I1Y?Kozi1L?8f3%Kln@qEF{7k;e>$;gh9RKrDrn|0`jiNn0$rDl@d6U8N|_rWE_J zeUmp`pV_?b*=YTE?%w%%`S|*wOG}x^L{)ukt+LkrQgr{>ySQ-4wymzQvEEYtk_>t@ zMD;yUK3jXeRl9Thd}#63ewFvSX@$FU(E8r3_5hz?19&Iu+la_;ik=rCX$`0*;2QT~ z@{AZpHQEO^+^gfa%Uw$AOs)afhuH>!fBJ(N%`gV@`UO-P`K)DQmCu2_%$`l86;O?Z zw*N8*4n`?dX9W(;ENZ5D2xCYhof<=!pTsQDuU`QTWX#!E>S=(df;ypZ){dhD;o{F^RN36P^Gxrfu@iH(#40|aRPQtytfX?CGjVpoLVt=|FS4KDJNS{u@tw*z49{>}K zM@WX-D!~pP2W=x-1^NJ#fd{B@LUk(}fPsGtxI0GAL6*hO~BYV-+QPo}b zsF(7779(}%yIK5w0j52!#rEnSHto@K;H=+n$Nx(zgm2@R!oDk|J^&aX=pVYxS{k_( z2LOCxsEXA8D=I7uuby+}Pg9ApAQx#PLJbw0$4iApBGt)0Q$a>@q9KqL;;C6!mx|=h z!$Om~la(;awgJ%$lX*HJB20>@zx#9L_^7ZzA!45hc%mzWFvtZe*f-zVppP3@1qzi+ zAIyMlGX`1TC*QdR>xapqj{WW3Ndz5Yr`;+8#Z;~|0G*knEbgogWH-pvAvI^Mum8|h zmj^Z|XaP{8G$6`KzRrt#|{0W*=;4%gL(b`!owmRU24*E}J&{?Lx2#b%Bj*eE$$ zwRQ09GVzjj{4C*;kY3eQQgx|XiUu*Bxbu3%#yOq>2K ziczpRE=88+8jx4=jLOO%Yjs?5$sIoGLiYlpL0xuoF&azbrFlolC#1oA1 z1QagwR^)7QEs9zy*vmX3+ln`mw$Z6i9%i{KLVPFD2@s}2L~nTadREx`3ZC><1YC$% z!-Q9lo@(e*NJtTiLmsd8S=ud0Ve z5|4x4rE-JsXn|~QZ3p7Qwik-EVd}5H?`XiSf6|FU^p*%ilpzGj@diY#^h366YU|4s{5E_Qiw$g5d!%b<8>9dG3fsw}n@; z+14*XJng&O)Fx5Mic!wh@#MXoiTrCgGmbzl+Eiv@0W9Yw?qk+yxJ^tiQ$eFyMI@PY z;!rkTVZkrKA?maudnVs@wyCH+M*?M<+u_Zh;L(Zb_-*LL#>b`;0W18QiYsd9WQ|~G zzo;d4W+u+vP=TnDva3f==gK@Ddqn)lHLIqy?3J0${%wQmTBpmYcV7%<;~1v$LT;UDy`HHKUq#*c9`kL!nTj$aO+Hcg*`is>u&b^FWa=ytbjjbe3xkhq@uKCh!#?XU8KKBL%8D38)){D9##1IJXrqt)h6(UpTzl zS$U1r*MI=rEMZRijIX7ldY7`@c3J_)=Ty6TCD!^CQrB1ru(bGA}x`rDbIZma?t+e~b@HYr<=@7>R-FGiiJpTM4byv90=&aznc zL=|nP|8Z4OjiAh;C?!LW6QwJ!D3eOy)3sNTgRW|^B1gp)qWhrZCvhh1h5pDBMcsu- zAK5GlUN!C2QGWDNLa|mit27TDm3} zf~({;PztJEa@ZlhL+Pi3v3&Y{rnvzdMMK#EwPaSp zU5O#K`Bc_O@b5}Y`_sW4k6z}w3ktpx&>#)lnkblM+SFbqU3qz`eZE1=fL%R>%yox;Iy4av zbTF{Zzi%yuHv4-wTPkVpXeR2!j`q-73=DOkwU+$EpmC$(v3Wld@o6U7nDWSc7UaCD(sn{=MK%=)Y!z4bkiInjENSY`Iq;lTc5Y#*YXbcMvd zWqvO;VLP5Nd>EX4Q~hB5Cv$xK$@)oZ-uPo-Lcj;9?n6Z^Q0LWEN_>X6SC>$9B=UD+ zG6J2Mj<8&HlM8SdN3TI%Kz4I44Qt=h&Bo|inyr;AgDiXs_R6oWURyWdA`>lu56KN- zCcgOZ-tV`x?JuJ=sc;AcE6%D{?$&?N+0E+RHTSth&c+=qmg^Ia+i9v(C3NNH)95(h zfy(!dPLPtf_X*eMy-@D1uyYm{r{${Dwun#H72kVrDNvBiCipcM_Vgj(W?TA*9mEZL z7Js~jP-kc_QDgwQ&VCJF8NLNn-_aYMl?_xMsU3?|ux1NTTI8+GREdRIZjaGaYd;|i z3mPQ6$};45zAOvp7OVkCd8Uv<;gTsI;{KBy*31Rj9|u}!CM8c3JJKMUZL6X=vO zLUsB7F?LTunuJ}0uFJOVsxI5My7-oD+eVjd+qP}H%eHM}_qXTYu_NY-iI|f-$df$F z$jE1{>o(p6FJS0E|8ZM+BxIx0;PqJRK-81E85wu^_jb>Hd?=-8E&UnuY#2oJ;qkc~ zi*fcmK~275Lx0h8zxaG=fC|_WL~DS!4U7?xQJEWvm#T@OUlt!@TL)cN?nuZfngCp} z@>TyuX%Y8K{*vw(OQ+aFo`()E6Lu==F=ulT1+_nAP2gu*ho1G$OBE$_{Se9S@yGh% zWMjuvrKZN2T-w~MC(=-nJ;EtWIAokgJj$DBFB}t0X(%BUCzCD8GJ_H|6&pD4qHttU@c2s6xnX&@%3*ryzgFh;`RW{C25;DgA9-!0!R$g2B$e&oN zL}!|Ap+YsdSc9Mvhn#u1Fw*4(MWv(~BS0eLn1b8^^Ozjl-9is&N)Uj7u;3%5dnzwY zER>H)p5) zLbm@&cCDWf4>D$`GK?R`4lRa38!fhKEw-g;r*qPxN1&yk-A{l_9zGxHO3Y}h|k12GuJX2+XWyK=!bRS1&BcZdmJ-ufX-CD9qoJ_NE5<$tXjNrG&LCHAn-yl#># zdl_2V1HxP-@E?TO4#nT$8W25JegM!Q-8l-3AIt-citoGvD@NRnx>8f5#d7kGS-C|t z&pk%8kM_6?c+bk22q{phlFGajPWY8JB-#JMPe5#oyHPg8y300ZAwxk92*sqZAW(4N zbis3ill*Z~S;&`RlZACip1N;-533DrB1WuP9mLy?rU7K+TgpwS=NolHvRfG9Z^zlj zVNjp?jcynkRA#b%j~Fzn(-c-^Ho2@DWdww4Ddg@8+;b$1)HTrJdE+L zNWhom=t;~O@wC;^ebN8I@cb~%c79xjI=iF;wxER30M-W#7kBz}j2X+Ry0T%y$nFUW zWKkwLs*s4Pw29(tg!Fagz_b(DxH?~+KE2a+i`gxu&!|X%K_`L#GXZpPB!~58u`=u% zpfW|BguxIbn}d)r=zF{iia?ks+OP4*FxUN_{hZZc?NL|Iw^}QgM%R0r*O#PI$bV~U zV2lX7k%HV&tYR5WnZW@YSuuixw!E!*;|vxF_WAz_f?E*8F-L((#5PCC13Lg=$&WUJ zvN1g+WBDrj_qPy%xY#x=L~7FiXuCB9n>kzB^JZ(yXWhr^#^)r<3z~75z&~aT2&(Nu zr;~{kI?TyNUwqy+DJHX63U?Qp;uIJ$t@wa~AD3Bn5LeJysKBs={4&87lR5J%XK&cI!3r3@UtVd=Vbg%w_EWF>I9)I|O8-Lc z&lc1rPyP}ku#u1Hd?{fQC^lS#zJQ?|vum5f^xm;wiCxi4zKxpR?`itA?CVknC%{MF zI?dVNzpa$c_FfnC>A^4Dz-u5AaNE>~_{;$bi6VetJE?2wk9F-hUJ9`E?&-_o{`y|s zxF)bDH-amtaS9%RBh(-WmK>P1*V^m>`ZIx1e(S9PVqciyzrNq!I<%!@37t2LwOd7r09GcYVPz zQ6dCPL3&Vq5+rx8_HhTCFf>T=Z%)?|MrhMDc>Zx%B~c5Q8J0zx0$|9q3XcR5vL>)- z7H=uwG=;Ir;AcvaOhVM%yu=2P#eZ}0c+7#(h4?TzL@$UwZBJ^19LEeBbMtK=-dQt zFbn03o*XUPO-P%^4Z}qz%Zu!|RqQgel`^$ZbC7KcGHj~3BJV#M+r3p06Ah?w%6C!o zGbC;PCiJo72gkF`$hAajomr}RWoxZfe>x2u-;RtCSoSvNZq4=*JqEjpAv8+7k~Rno zCIt)W+@EKN#1dx{8DDhNvXa^8!9)XAVU)jPO78n?=+^=&^0WRtbD+zT)3n7HDGRu zwa(XtA&I0Nx?ce^7cJ>hsO;uioJ&hHO}S;SyfTT3j&6cYZHo4i*Q1khV-geE~>7b14q zsWTJBnPoy5QX(K&Q+_f036R~9rcOqmf>Ay|^Q`91jM~WzY?0HJm4_+=uQSLx273xF z6WJA@+wVM{c`7@_o?dD~t4J2t#%nRk(}?3&r(~a&AXU3pN=pP*#m;kT_iK<-J>~>k zt%YpdR!rrnzrGyPTo`^gK3bPU?j&N=7i~-vv}EyB?5X4k*h-(g~C(uCj`(dsL7a@?cO9p4b^ebLQWI zK&f5?vqaqXzIZr*j8X?Q=fSdLY?YJ6mX%FUFa*>NU{KJmT+YA#&p3o?$UFG@g*Qh* z`NXFs2(s$2ZbUThap)vt5xG(t)RfB()yRJm!Aq8jMru^p%#xrX&FC2+Z2HKiO8Lr( zs3+NrMKxN$L|n1Qp!qDDi61pRH=YDSn=5FG{w<`p6YK3&zbstT6#3ydQ`J1ezuym@ z7c%TXEBWCp&Hua}_jNAv2!@si{(0_z`~}VW?9nmUAm9_42L+Gj$|hvVx>qmb2h(Yx z-X?~|7L$agbR@*J;>f*q_xX?}W){8G@=7a@@+L~|Ih%H=o*;18p8ga6snOFt z68(wwOEd~K!MGqe9Q&xPA~UjDn_Mkgo?4QOZd~dqB|R~xo?}#Poo8Pwt$PaonBPl) zUX_B=7&&49x|sD8kUFwFI+j)&R(XuzQ0rub_r>j&@{v)<`AMdMR0aDlK@MqldcW}OEpr?2@vz&*~I zDX2{7G=N|(@~M%#I+aY8>KKtcB5@_*5LYTm`4-ji^+#HCng*uVtlNUzsd`Cu-qI3| z#w;Pv-_C-r90wCa0Y7F)C~vq|Hd?;{wEKA&6RR`iV2QMFkc5KEN%MuXg+f+)_|=5^ zmv%Jr7IKsvg{w-&&b=sFVJh7_nMFXlR*H@-d6AMTE+q9Zd>mwASvigGw#T#O)=2u1 zPHvU3N%Kd`%W;;{%2$csPP#{c$av?uQV&N{PqVYl=y~obS0~2ItHn-Mwv#qqWiYA6 z1xzWMTjdrcPLxR_g@D(K&`uNeqehSXm>q4#+A_1-`U~*V@xQMYaiURHQCt@Uh@R57MDZ#M}clC)tAz`M6`UP=v{>`pAzLvlrtykC-MGq!gYq%#&%jju^b1<=S^hA9oiZdx8O}c}}vd!e(JD0nD?)=(o-t#DDcs_eR zJUaiKbGiLH?y|QJwI|wKf^zdWG1o5Cr;aEXc?G5l2lNWVM5GL*q2LdTCNj?yHM3+# zEa7Z4B~vDbvsSN+yoM$q|EkZnq;rjkUJ^==GQoMw>wV!1lQV1EaC5s!@ygwK;QbdI zIuW=60apX<2%KYKO$zRQ7E0gKMpheOn;lL)FYY%>Ke`9_XxQ^L#@Hn+pGWr_pE`X< z+<5Mm+?4pvcA>VVyO6RXGYjXNix(@VD<=L$Ifn^nN#k9CD-57=Sz=VFvHaTTH#AwTjjZ9TD37M5%+oW8>&Y zp1A?=S&*GflcibNY*x!al^OJ)IR5ec3Jf?HU63Q?du$47oj{g%Q3)x zg*d}54&R#cleYxm%~6MXo-OMeFpyVP5qU7&ekT(yNU*dS+KJ_Ha*lRV8p+koXc4O8 zcyDiH-FesPn7_m_7p6qOT{@&6qZIx%XHq9UJp**Ah^w?u<?6L;hB=GPG*&hBZ;dI!&ywBny;kP4Pe!o zVvEj1e8s4J zM|t8AT)MeOSi9U>VdU`Vb&JK(2weV{U!$%rk7gMkb<%MH#%%OoxG$?>;D~DymLtN- zX&HlkgxgRJ*7j&~x?3$TJ!JPM&ZF1ObM6;_5HM&?;gXM#Bnk@U3D>xQ@X((pQImn; zJP{&55I%`KiNjcLxo%pxX5ctSVOwfq;AzpAmHl4F09Vh$ z5^AqU@z>BqREOkv$I=nshr`j62o@pd;+_41A47BRD29$)&ehNB=jd*KHdK9UU%fMJ zwh+YaUpoqQ6ex4EDEne-^o^7K(_#x#A_H#L(vn7A@f;$C^N7nRN!Kn~CgQ!KAo4Li z3nKDtASz@n#j!-P^hZ0#AJBk!Wh)2 zR^cuO4F}_QXmND)IniR#uN}E|JfI~|QVpU{*mM3+PumAGYZJrdor&f*C@_9fHDjzf zrqylX)Td!oZk*RAV3^g*Y}x@a$F^1Tjo8>aen@S6{1}$8E&UByHs{V!-L926S$YgU zWt`Fox@!z2yxT%zm2w>`n1ZqFp=e{Nmw1-D?>TkZ7w{+5KW50BDoy%eg}2BS*m3Q? z8$(gKrd$7fTy|^!B+RX{)KG3fS>?@^|XFZ88e3o2b`aJ+&uWgs}@&v{Wf)+r}xJs5rSOF18G8?N_&C zdzhZ*ZeH84u4?Rw{YvQTT&|mZJG#d?iL^%DA?rO&nkM>XxjW*S1GQB20ID;WBZUE` z(UI4k)OS7^NoE>>6<&cAqN>H47S1yMWH=vXa5W>+^hI(WGA89=F}J>YyMz?bkAQ9# z=L&ZuX@uC_X3%7CA9O57L@p)ZbfLCB&+ME22=Ws!v=^ch<~>xJ0=hpYPe;IKd-o92 zeK*c#ec9INXYc(wRX)>QDtB|nJN#FP{b-44d7qLH?akRob9Apkp8rtP$VdrybWmQ9q(#w`^wX zXzgmNoH;$6K7MQV?sDNdVzwsouJ9avE4n&%RA9NNH=$Ctvyk{T5$K&QO4JN~9aN8t-{|_%wZT`XY&uVSUDrF7JXYSfs`_OqGpn>GvTt6~nMk0rXrW|E!Nk#@Me84y#*l=Hy?j9K^OUdI50}&NRQvbO3tjmg zQZzX-`(TYR&lE_ zZEs^W*NYYj)hhLdX|0)&oz+&)yL8dtEpGPDIL{Q36Q*bq>XTVx`1*s}w}uYUZPXo1 zU8KBZ1n7to@?O4xr{AF@@1Mmz>&q1v{AT`ZeT;Zys>jFh4_Nl)lW2w)3p{MB-6j~QQvUtw}l4iyz@Y>^B@$ZV01 z)=u*!MRTdd&}a^~dNm@_FqimcNKYFETU6~{Q?lTGTMD^R^_n1eBNA+o+j1uKXmjT5 z>PZL#e{s9lUdUzpuMeN|u=eLys=5M!5IE8bo5+JX0)15w2oc2_kOO^R)n;UCvLzYN zUKk1NLotvPg=qNiM&Po!3G*;%E3CQ8s5!gR`A`J>fJg1~HHkHu*wXSL{?Tyv0-SM{ zd2^nWJ6Eg+fa?{FnY9}3Y>t!PPv2ZCuHopmU$xI$!6G6L;&<0?!uZ@ZwnaSv0G0DI z@&MPZ+wb;V!dT<>tRKHJMNHbrC6>_A%7b1bUe`z8%tFFVLWxZMIKJR%GPI*p&i0)u zC(-=-MrPs-=XLiHJkDN1bRRpOe%6sSMAq1=fdm;c$=qK4iBP=XPIOkDaA>nKZ-__nP=!8Gu@YxJi5^5AzMQHL7@K83REQ&F_)0= zr6}>pE^Cos?T+GMF*1m-?PET&adcVrjjkpvXAc5*6mb%>PyUI{QHbJ@YP`)tf(G7> z;)+|j8e(iD*Lyzs{WBtUjj+*&EOYn(c-}gx$BL1 zvTTpn*W)D>kLS2BJk|>6V zi6lE14v26Hr&nQQz2)rkR)A`oh&vy8O^Q=xnd@V~NGYqtqtlMjqiO0;?a+E;8&P!& zy<_dwS+(FD^$Fc!(B7r*_!Z@6pBpKaniEu%ppbYSq9lFk-TMmX8YI# zvEZg+7qW%+HxQ_|a>bq$b@1fuYSO2Rj;eXwLhmtpwz{TG>fsQIP2%+y#`Ik7(Up0O z*?yAag0Et)=pCCfxk#;~B|31I0L(w)UE<-8AdmtqTBKBM0Dvpa^UI5(*0F$|GNE#?ey#OmO zZI6PCh_j`vY=Wq-S{2%Y3yKH`8gU3N6h)H{ilHfrBLDYg2oo3%DQ_GW!4g>@ATX3- zw0FlGh~TCRMX&q}5e(MkuR5=R))HGYY(4=F&R<<^_YM%%ej~a{1KA5ypsTu?LR5C^ z%_i&)g72drCBr?mV*{xCVf`MUjQUxdTlCW)*;_Jibk{z5EdTD?eS8ISew{QfA*BX z;95oX%U(fb5kW!>xf#Kn{7J;zRT5|*pZO{w;_4trAZX@7LEzru4ElC=kKPd!WaH{*$A|Z;i6fr>qHxB}PGH!qZ2ZAzgPjU&4WbN%5Q(`=^G zj@Qf9QRgHg$Q%xX5b@XAUAK{=gvlp?WOV96{Q}I^Fyct>1t?r4D5c%{07|Es`h zj*^ctp{jyvVM4E?8c#>~kmVR%C%;7R0XTVydO~;iQIGrg>wH zy!Eo#;9k0kuIkm1%R}PR0R!I4cuaX(SS@lON*0LIS38cPG+$v`7!ow zU=q|1n6OzCBP{Vsu8;Y~?_jhKB)_;G`|XwYd7_&NkLe%$-@pro206*bF4oEh*ca!0 z5md%a!9yn2l)J*+?wH=@!IxC3*&o2Od&WkzFZ+G72C&}^!*?1RL%LvQ(KHwqa2ruD&F+337eRW%El5? zw@~ke1tVs@Eu ztn3m(&IH)EqB-&>~eLZ&8NTKs$pf`PLv;*g94eO#wP7 zt*Y!5TZ^B+si)}g2$dU&2jwVH8=2kHd#0oTWTW8$GuGwbV(QfG+JR4oKCy@Oz$f7O z7j47@ta~xWyO0fGm^Q)O3V7s_zFMDS1-#S+%oRn5rwq#SYNrre2HA9**^u^lzit&~ z_JTi4<~Ba5ILe=?g~cksD};T@5Goclaj($%1RDqoOV4b5s*5K8Hqmu4b;s+UHlqYD z-k-&zdk!A=d>6bt(~M4KTx-smnN!urx@XBE$2-%J$2xYhl;wDS;Z&j>i~w#TA!Y%X zS%Zi8bp~O`Y1xb*n$Axa;0^QPI-|Vwpaz`(t8>DBWB%6 zEe{UD-9P{~<{OOPpj&b;P8C48y#jDk8M}CL4(lT8Q+;hEm*1}0?W$o{8#|AAuJzRY zF7y>oK9gWl-n`kMS(ROFuE#tH-aMT^@StR?I2BaEXmdFBD9(D^@=|z?j(dqf(2XI9%6y+AQ zm228Hs~iZwqA>CrEU@udG3(bAjn6Kcq=TI3^@@}<{f=l_Ix0ZdDZWxNXcqD*JcXsYoj+Pn~Qa%M-^=e1b=mL>Y zjo|}zaz_VQ?`&$+rH(DHk|zoS6m|zOUFp)rd&0)+*Ts_5eZ7BED=Zi*&eFW02hx!v zz@3K*IMYJn>67tF3_bW&%*UMrQ8sL_m2j+MNqRt~?Cqr1?gS`tMWP~)hfJi+FIaHwar z^iZzo_xskI;he4MmnnnuujA5;t%}mAL}}~zGiDqarJ@Bj$y8&bB$*V=Dn>*pfvMEB z6e_(U>WJjpzewp4#mpWv6HToXqCM136)~py@xSAi4AFUvQ%Wv2>bNaVgNlZNi0>Q% zA>q9#TKsy`dVD-zB4Q#g*AC90%-quoy~?_^R_KZQvw6V5UExmWdUUjY*yWpTk4`R( z8a16|nTV-}<1>snvbaKyoujajw;J5qj{3eD1MvpwCCYn~m@c_=nLZfE6Ga_IexxYA zDAOMk$=)^&kO}ckQsgeVbG5=)BF#c3uTMcz{Yi1Lde(ZJf~O9T0{d? zo-@k6XlN|I;xkd#sAuC(aE;;Fa<&wAbT zw1(d|`sb4oH>8vA{SrkBi&Gy%8AHIKm4d1pXLSAph718;+zb$1cn57HvjJ|NqaI^4 zN*_9hU}{8$Lbi{iHp2e}ppChr6rr0p#Py{e-}XJZ_L{WKqjSv|Z#~)ex}I%6`H#&6 zf{W6eE?(xm8c0wRB8a0 z3te*?q|{BmeUy(blqDffDU)o~_+o1Ox_(4RRk(;+0ps2{IGnzHKFku@x-FhR(Og^l z!Fx8I@##=~EyQHkf`Da?`TitNyEyDpQPkm7Ud4PZ7fpA+4T}-P_nWVdYKJ2@^b^Gd%|3?|Gzrm8&!QR8AHUE+unz9Z% z{tNN^-)xX|O>0#F#V!>*xXn(A3i*=ZJC#GW4h&*CG9$A~XOS6>G%N*ul-sd%o}T*Q z?hZhvCb|tED7IAK@oC^@uX@?~o^pAaiH8=C>7InL60&9*5_z9+@j|wgICX)^tY0^_ zG+ALOoUfJO>>HG=Fn06wD$+lnh)D_@Gx4c`Q%Qs!mBNU2f6Ta zP9>eZ79(E@QH)+8w3I5&3b3J)%M|}j>RB~iy?&c2f3724b7@XRC%II6eHmWT6Q!0+ zbEa|^p;88~hP@LKFIG8hSq(yHa@2=cna*DiV-X+oQn4+Acsk9Df0a5kTc-WXxZLy{ z(L=rN>OLYL`eQhb-siJ#AiAkl_W zLV@A|>uZrZ312)V3Mv6}Zkw1t5x<7Eo$!l0PcQf#Ib{wX#p*D0pJhGT^Vi7FV6qsW zxgU%T?=}AAflYUuZot&Qd+%UYqk$5~B^Ep!Q^u+77*pJvr&H33w{BIwa};(VruatQ zMdgte_9byLw#Vt_Z_r(p+r7Oe`0Sfe7(qXEeoG;B}U77KXWmd8x0q+~|AZ zr4L8B&qK}?U;S5$>Jia($aa`E%og98+&s;( z9oUF#_8%!kCV=Gg`Sd!*YlY6@JeV4)HNW`7l#e_4^8D3iiQs*gyAV6p7As^2?}f*d z%5T)C&b~%#%f(b=L)z$(RqZMc5Xs;j@kk~0&Xfv9-3pHx%AFZ-h$5tJ(~t6ap99N+ zUqm;8JGJ^NsizNa5SI@i?YsmRv7xhO_w7~>g}8aMAy=^=!G^NVEVoWkHxMs=!7Y1~ zgu~p4mo6mG%mbUhgM9cAxbZ1>I2IWE+4T{vv7xL%CKP+o9l_i=AdlqHF=4~gYSS7+ zFXH@6Z5bi;Z^&BsS|Hz2_E)Jgz-K;D__ZMyff2Ptt!#Eb4`1GT7|oV^!l!+b+lR9p z$R4!fO3vukcieNQ%G(Y*SAH9zA$r{GrjXiXHflt4rLl&MPmv2*-5=N@*igO=fHJZm!mZGe(Np)3RuUaq2 z3(W20E35sA9@3ck1HbVxW&@{|+A?riv_Soxm3I}_UI5GRMnBD}b%?p&wQSLH8te4t zxrQmHml7qq#bNWKm*;2PGRK_sW9Yhf?fe(xGFkhii3d2A^luNQInYSSp~VJ3)e?Dy z*D;V|t8b7qlw?67QS29bB

@JePT{86PA;brJJxrTB}*uwk*PLGzre5xF7n^1MJn zFkBAd{kN4jK)drJLm6+PS8m<=iiYdhY14)5A^m0r{?K>K&cRmDJErW@AFJA*7dVHm z!6V%udE(2E9zODcCA@T3BPtiAYcrfHcv|8I{!lTceiP(+__{py0esYPyBD9(iA&ru zYjDer>+9cU#6dInP{uoPktmgie8k_jMjzF(O~FQgG=$lnHN>*q{#cc4o_gxJs$W<{w!?gE z$lMq*Kqe#39}=!2T3#ZW;LIMuj6pD|_l)`|3lKEw+Uon&#iIE1mg2l$R6C;H&`3~Y!Qk%mU#W$=OuCZZ@BegA%RZd^`GSZN*b0ch#Q>SGhQjW-5Iej#lz`pG~~fCBm&J6`N54tjddel(j7*eGw=hWw_l1xy~`J8 zo$nZLS$E8INdM45hZF)1*KtrouJ_#d+`O*Y(;~HLbZ5b~!-aj2=5TgP^jO8pXW}K? zSfW(8l+^ldG`63{NB?>q0(P7ugQ?csQStyA7kkjm3xfyRjcxMqXKF1Q9(>$`=c@wQ z7@saXHip;(pQ*&uutN)?UlfI(^tlrbI>S}W8TzuKw4SM-b3THL8xWVmJHHfefOUo1 zf%@Vob+P}J{s9Nt{_GBAlm(BAe18#zfNwdF!GAC0;s#a^@TH6E4gSRI>*6y5n%d~Z zY9l;i0K&Uj3S=s~my7a%d0-VbUAyWP_e=6>E#!r~R~@VFgToD+b0wS;pzxYu6sYw| z{rowKe)uaZ&GQo#F7@{0!gZ86){vPX#WlwD^FxunIj_d;YkzMZ!1qIcLN0|=Op1)B z#nt1WeY84qmvj(LszPwmHqs7i=Q+l>zY6_i6XHHnpLCGE2Kr5U{T2CI0dKp{IoRoC zwq@Y7ye8QYR=?bEG|SQwZ#~`+&i7QDH$m#@ta;jeVA0@(BKGBB`qAsxqnuy@0f2V2`Mu7OkcUJo{rIHqJBy&+cy zpBzE)1Vlr|$=YRKt#{c+%|J)Favb5cgD!So|CB{;L@}PT)sGG#ppsIsr%B2-Wu!6P z0gKo+?jfib5;&$t|2xjjggDTryB^To6zev%3)=+wp;ITNAp(!|fAYUOr2n+-zoDqg zfFBHn%?N}>QB*|U^autoz@a0OxTQi9LeaG@2qZoe3k8bA+W)Q$E%L)lc*aX8K(P=f zfZ~)r#M)1l$tuP0C~71)3ne(~Bq(1Y?cR+~aW7&<#BG9W7tEPO@-yCtr06M0X)BVT zKeMAho25Ui`Tbt~d;KcGwXH}^d)_jYRot2qsAIuWSMZ&Lhz?GY9GFV%GPTNqCWA%% zk`f_&Fho^Ysc31AQlW3o@{IG2B)V@s!85Q&tk6jkzn~4|9p;vMS95_O-mI z^URHyaCRgas|R~b)%vwS5Mi)8uH=>hZW^4`!rTs6hogxVf7EDA`n5txFF5KI#+Vnv z2lP#Yf;Zsv6<>erHnzXaV9<|%B8Xx4>Qu%42hAPxR%1{Ha*rjX6Z=$T5Ff;I$G$cc z<)(iF|MJp*1Lv}HbqYuZ zyV1(}%;iACLs~G$4CfvMxkCIfkvd=!{00`@?a?YpR8Rgw_He&rO8V|}2W$sAWh?`* za3AG~YT9IO=2*W9sk(&)o(Kzb+mzh1g?^BjsjAZ-ac!ce(Z66SN2olll62$(zvoi} zKs+8#dXT=xR)lK@=U@V3f=5Itdcs-*Uq`8`bhpF>>`Tu+rl~$-EQ@dY%e&!!|9l-| zugU;;mHAI?^Fgg&(ce4lz_%uo)K2B9BYa^g0u1I%ZMe1$`NcV2RToY~j4n~~u%tU@t; zraoY@0S@oH^il~{hMs~_B|%e`-C|Pb0~MIu5{%zMm~!VznF@|Z<=^JA9xx}qUmkp= zydh5mWYRU!TtZceh4yMyS2BBWxDIXV4AwVz!CTbsuhWJjdxLhaE(Vf2p?F>-Gm-{c zLiSRhy?r4X$~gpbM*;|?fPx>&_7bHZDXG+JlV}+!H9)PV(!1daC6{yz*?ysMoTAzZ z<#SwN_|nwB_7r^_TLyC%{-#3-e@3#+&_+7kb$fJ4)mBnJJu?*ZDglHnwni*v;vYZ0 z#D0~T^G{RmMea;F-tfDz)*12^_AYFu5DkU;st={0*d_Dy($qaVjEl#krva5^hP&h`o?QPKLE zXUxXSIJc&BH$eZ|aA;)hp5e7pQmOM<`w@*<%8vt(#DDwf(~Q)K{v6d% zi~rg``NzKrIbgI7T_aA=6`L|t-r#~9;RvS60lV<6fZPmaAIyOhp%$`OU8s&ec0hiB z<|x$QN(xIXk4^wWeesmu9#a{p@7SLp)ln&S3GWe{`lwX@vug^DBe@ZsYxm={ew}oj zGc3R{vwFG*Zre9iBk?}u9JB@Wx%EMQRc>|mD7PiM<$`^S-wq*z6xFH+jFftB8my3H z3Nv}Sb!FZ9i@B?uvcWh}Wn(i8E_!F}g$EBRxwtK8eN5{(^!~o6!crr_BD;?@Kr;<9 z9fKK!D%hu10t+Q1Sjs>XDafqi$f^i90oO8zwO5)tp~6w`8{!htQT>n7()Dar5~0h@ zP(;C&8NUaN*!3U-tw5JRniAsor_Vk7C;pq0*&rM>B^(AAQ(hcH=wKkNvymd{_4No3 z)5*(67eXiPzqQ?py59Ek3ILR{e&{T&Iq9@)@{vh^7*QZ5chB1MdaK>%Wg`pKrOPS? z*u(7v!zeCwCSSjg)zUh->=7H6R&JICW>?+AWbcpfC3z1?dtbWUL4`=J-(^E8cI*qC z4nZvsf*RhEvFWR=`Uf}K2;KQOj+U&s!-Bg~#gm?Ms*g496ZYth+sR8SPwtghq~1(V z)k-2Ku_+;hfhu}SIl{Kc!^6L zOwwY4s~+g9Gzz*R%KiunPnFNb}txBKJ%oY>$);vqyem)HX%!TS@cTVY5r` z^Oh-per41?Aimo_32U+G9XjC(U%>WpCyUfnk=_@DrG=pm)tXR+gw>| z^}763yR)NUeOg_K=mmnX*vOiaV&bx3RqtN_m&J1P^Ev9p_3Hqhe^-mr1Ryf#cRfzv z^{#^UF&yZ4V8(+Y9A!yK@7uacu#}pE|C?j-rBI}g2UOQ9oclM}Ufol;E~RLTL5e?*Zp)5v1)NqZfh~n%@!JW~9+YKHU=N!#FiiQj8C6ku)HA z8n>Lf1(PCK3KaqiwWk>Z>Oo@|5F35ms_CyZ=xMp6RW`}L=(J-&>V5jWx_Iic==5zB zs5$z`;e}wkVd5+n=6k5HTHBsUka-F>fg5X} z$3{0BAN!{^EAOGxt{rc?tFx;sua#;03GL7Ua30EHcLz)A15$P2c=Rk~D!kBq_HD;VgiF&-h=5zN1z&5_nwd!}$gOUND z(QOX42`mmK%;k`xW&_KSGKG1M?z1)O20=di; zQnZ%*v6%$?0d?MNbdCJyx<84{-!EGiFIpFn5Rt+Ce-3&d8W3t*%h591+6*FJk^~5f zL2V!NJbv`+Im7%?H8CH=au*~jJ3oKtJ~dT(Jf_+PN9KznFvP>amAIa6QJ&9rt_6XP z$2T=Z9g}D{jB8&j<7k3bm59G7ag!v-VP(T?jN~@FBBvl?3 zXq!-%bFknaO9rQq-nYq&GZTwWtM(Jaz%}!Y zi-r#F=-g!yjevb$h|!*ZZgw$^($0{dAhAIDK*Cpj*m$DqHJtHd=kUI&P&W7$y8we! zp#*2N$uwIgNwYoGzv>c{fB|zU!KPM)pe7@~!Jy?<|!+bGgyybvs=&g7A|&;jG|G_var51 zmuY=smqTuWSlVMAcfn3#;&5Qz&|lCd5Hr3A5RHSL5TafUl1#8+skSRg~bcyPI;}rI=mI94Y=Jpkmb1!Mq3SU$YzBN7ct2cH&9rvTFb&0C!CU zd`SsD8AUhXw95KV9fHmC{GAr04049M3z@apkTS|of{CND0qZjjUVau`^Zyk0-C^!r z)u9+;^Ygfd7_cd3M_r>fy{L_Pmqr@(GLlBps7s>?HUwe=F^SEKd0;==1Use#Fd;kx z$qP6McIyM8ATI`zGeMDDtizv~B&efF`( zuKdxPHm~|`x8D)F`}X_qioUa(dgTM&+YMhT{O%Xx_x$tQ7`*=RKN1JS-+sg}eg2;& zgKw4parwjLKgWL%9}O1l<}P>Y#m~PjY1DMTb{g?dPZST1C%laQ6 zH{9`H{E0U{cCRpNR(EbMv2n!uy+FeB$GM-+Ld@{cWfCk>}j@ zhmRWnZ+`Wa>F@r=eNSHW*oVzGZ(shEZ@=w}ul&eI|4?}Oqv0nX{}J&{BKiB*)tqtj{nyhN(aCHp5GjQ`~Js_-@K_Rw7>hTdw>4WZ$5VLsf+IaS@n*au6^Alw=Zv0?z;ay zS3U59%aD)V_u*5wf9}TTKKK^sgCDr-zSlqSmIE~T4peyfWzXGU*qvX(tv{K*>5?xZ zoyPZN1pdpnJ?E$2|F4feaPPMC@*lk5IfnUP-~90V{;2*J&TH7@bT%to$6lk{EIJs_}PE?@b{2Y-+u13AAkGxSKs!JIrlBmADFH?^G6Elw>#}; z{iGhg<}SZAVm|114^G{6i3NT}af7#ua=`T~BeDcDN`=7Y_;G?G=dh*F@E_mx(f9J9r{Xc$E+x#>3nlIk> zv%9Xn{U)9E%NPB%@09$(3##+`uIYU9S+_j?jM>c(+anQ zk$?WX4KI1Ow&um_&mP2TALefa8Y z{^Wgc`TkAs|Jbu`>3!l7-?djf@8HshUh{>^MyY`Bdy5Q~uhTud^5f1=JxSk>{_ahGSa{Xvp8V>^KK%NRUGk}m z{y_i0r=M}b#m`v0`;O8HIby_9xl@;)sooc!gF<(s`2gfyg+~3pvQp+SHHY?!S(a&ZnJ&U`Jt}_zd`)` z?l;wMdG=dA(Y@!1?|t}&Xa4-U%Ol@;9{b8a`38UYH9xs({-L)eKY!!x?M45IAHL_W zey@hTYcl!fS0DWR3%~a2FJ5y;{i>h6^NwqsmpuNNCtviPe|hnje&foC`KIA(-*ER; zp{s`vmo*Rn$avM;Y|oYM$vkvx?}kr*gZ=yHw_mdQ@pavoiuOY44b$)Z>++$0xbXgW zeDYNnUGt33-LW>Gz!vH_)#?Whe?AzGv((v2gy)wflnxx_Q4f%xp${Bq$}4i*fg`9+ z)m45Wca;MS+c6uIJ9Gp_n{`%M1=ZO?o$rb-vS-uccHMVv&M#!hx@r>a(hph#-4Y!S zC+SuqKlaW#b&aP&tnEA%)u-~A02-Q&ea^J6ZB1B4F{RJjI);*h=7l=M6mYpSGZY20 zJv}h8tM(`}nc8r(q}%_$_IuV?&s_IA=yjFPAMr!NG{@WIm*1QUW*B8NW!d7pn$@6B(PcGJ*qS%VG`%VY15Hm{y=Y`3(KToCDS#e|z*~4;WZnC8; z>k!0?aZTDl+G<4+$#z$fY}E8B@2+m-(Sn$V6x^jF;w(sGJX0l;VV*XIvL`aM+R~-W zvNl($dlu=TR+q+^el$zg;zeV|tOQ^f)~W`+-%lyNTvW(Z>Eg3W#A{BPi?x?`xPZ8m~QlV#U!LLTD+0%tS_oTY94Tj82K(E;V zt|i^=NVYK63#~g`&Q@de#^uri!?Q4BS&EJlrOAv?M(H9>jRWB{l?BvnU{X7yvZj@G zRLG48BrysvFeRp|R=L)shlSeuW(iiqrom`oTXyQBj1e=h6UoRRR$S_c#2kW=x+-$* zlX!SYwL?i}Koag5NoLQ>D*hES@pS6%9up;)vrH!%-J+fBtgSfQ<`LPPRY$t;LeK_6 zLAx=H`Ve@%G!*@tAgqV&wO&&WI%W%E#W@Ve+*l9A@7)gBwz zx~k`bN~jr_V1VRFlrOPZ6mcb0o!G2#*Um13#Iw%Am>CZ&#Q zS7W7TY}lF&alA~)b}@j-UWolI+!xdApWoT-o6A1jR-KawF<6n9!wy+j%mlw6(6~ zSZKvCt-qisUR>lW`hio6q&)>ywwXQfQcTRlxkfjNCR6@dn=`K<)5asW<0W*#d0Nx5 zWr(q`olE$Q+i?#M!={QxAFVY^feq{qT6p(%c%rVRl*4we6`eCT( zh6*?XB*~nznk|N@2bqVYuqmSY1ChE{H}YnEB!>rL(V8GfI?h!JNlsO<l zx*UZjnvLU73QtGZA}vH}0$`J+t|z^Ix$kVyE}JUAIa?~vWhPl}QK+OB%cZn&jfc|0 z;tA$;-L5um#c+tM_hA)@lPPOm5)`CEFO7m-$VgMZz_=O8Czd>8sf89PC)M)lNYlhQ z?$7o1st;|6?X@CNkZwKF`$Ia;ZL%dScrp{RktI6E1TC1A=()kxYMxD28(&|Nlcm5w zFs{9kbj1|!Oif{PaIhF{piD<=m#m#?&tRZu8#}vNdl&UsicR-ynZ(S5&d2$-lN=>x zVv(+%C~jw6OOia#JUwlm6MLfP)L^{KHirXoQ>;`-o*6lJ8e8jTQ^b=j8{v4!E)4yh zcsbHewc<&GZ<4o0sr4kVCdVv;K`moqj#4E-X7sopRoFq@AFM^2kr6SQ_Y&whwNR#U zj|E=9#Q+uQM)IhOk0xhHlN!O5s#Ebnjd9JHkRrKRA~JI7Z3^D+jiyc0nwY58vc))+ zd%@8xDtF5q5*Rm@;M3K)meHr$8v0bUQDu=Nq|Q2C!6J1PtIOt#ZVih-zr;oYPKVAr z9$2e|sy=B&9QHIWQq$lxkXUbctCY4l{nmC{icTF2l-afeYOjsPoYZW)jQd#8sr4bo zWzQ#jBvGpSxv(5hRA!o5lV4z)3T+SdYt>aVmK%y1tc~&zTJ^dUiLJ(wE2q6=#cl93 zysp}GNu?5PEMGKO^sGx)Oc=`!dXOfY-hO^g<*f89l(r|E+a)JJwJ~g$tK+dr-=?C0 zx>qtqS4AwI(gmYvh1FQNVmKa*GRv5M4P4U7P(T+=k#kq$eB?yo+i`ohHn7SvxQJ;RO$hNxrZ7d;HQz9~=tVMox1DM0gJCD- z?cP=+&rIIE1i9n~9NvY3%6eDeH!F2CX43SJfa{Sy~l*Ilg1gq!F8L>7Ix$5Km5wee+MZ!frE zSEv?P!UmiR!86+;M+LZUYy(Zrj39)tSv)FN%FQNRsC!G%ic3EX(@wRA@!DE0VTY@N zx4dnOBZkQ~wE0TOXG?lUHO2?0GElvgg4^|2qoGx+)`;Ch5%tw5NFv2ibH=Naaaw|{ zNj2f~4*0FL+Sr8JE=UD#Xjw!x*+dJnQbFB z&3wIF8zzprH<$HRwzy$3Esmpdq*<}C=pN@ONJb5Cn<+ix)>5OCYJu6S0Jq8Dt-t{zbjN1av7 zt%asWl^uC%$sZD#5^O=94bu~A!SL$2(M6hU+6j1>5! z-?5L&{c55x?iV=lXN9DPtlIp>5$iUiOrdMpMh%|qvYqv%H4TAqG9^=Q(XxrAjACE1 zhTJ-q(N9Sz*Qg_r)ygj|k#e3-&3T#dHHeanQ8k@yNA)x#zMfFTRkTFf*dXCAA%35; zWMWKa^T=mUR#1pvx);S^H`stB3{Q{X-rQ90_=yo`D_aK>YBM!x4be_9+!z(|=t}Aa zyv+^I%%|2_yVsxRj09A5tNhxcUm&h{1Pd2LnDuMh`bnJW>H2lv-ZR%^Q@^vFO_Pdc zxCo6)#!0sP1C2kD-)#guk+)MvtDhl%+b1gNh%w06}AUUA@3BPuloMJW7*cM zBh9&sl?%n7Z90u4Gx@2W4b&?Jn5LkK!!*jIwrw^gxmx8Z>g~s~t(Gh0K$ljEi7<$( zrVr`-7LCnSp&JE_2h<#K_xu@ucd&)^f^lYuohU-*e0p%2bk?Wmo;IJJ`{h1;tv%pd zlbPPSnMAx5Sm88<ZE#XvW=}!aq7~gs6v9(TVkFOx-r(pt)8z`OAQ*=7=6;9+aWlgvD_-OAb}DKMW3gT zcJ!EqU2Evzi)@`J*q83CegQZ8Qe(|6Y#!Wc)MY{r65aLk(OD(aR6D&fn&BZCH78as z!C2jDIV_=Jjd{=rO<4*Vt+{VSOo;}?)&m2YtH9Y{exda+ML!=AjctuZv)F8OLr6%r zb$(CQ!-b0(f!re55MuMNo@OOD9;B=DKm*OX(T3tcoJVl}V^} zpma?xq-@eG-8Y7Nriig(x3ZX90>=fuP+5=8;FPwgTTY66oXzNmsa0VX>eTIm)XST@ zxwz4UL7_Pna1(i9DE82SzEyUV11WBiUHVLwcG`p2QCaV;3`?>O?HE&~@+cEDPrO3I zDMS=>+zqYUP;eX$+M}>wZo>|aGc30!3gtP^ADl*<6UwK}^XGo4=WkcNS-x#BXs4z1 zW=&JtrPUOZgrL{aUB+l~?G?L|4w7nUjkCtw=>!jqR;iQ%>4M&vwv{iYr$}n3GX{DR ztWZmr0bhkDitLJGf>lAIfo^bCx5?&i!lVsnrF2^`ck*Jb+jI-iU^R<`gEMWhC;8)( zDe0bvot-h8DJ9c&aEjZ;O>MCjvla%cD9`|l?nMhR#cN4N(gNiWY ziSZRDGO0&5m?;u>;8bo73R0CC6I?%-!b?}V<1P@ISe<8V)@+8|6iiHKC6Azp#ZgD5 z+XSl&5H{7Nz|KhbEo?3!YE$*mDrQ9d;b9t-z!+smOQyBz^LA>ovX@qkgeDS9Q)Z~| z-WulCWdt0qb*GbMq$5|nUh8ny(?(kUt=T-)NxVFEM72@DXVk=aa{|t(g@UtdHYIf4 zoNfX65XV5{2)Mc%gB@=Vx(?QB4eF;3MF}9!giL7>U}*B*o0M6(c|;*3@<=c~o1tGG2}n>GV|qhyU|8U;G)(~SdU5U)2&qws)n`Z|GH*%z&*;{6g| z9hexU8}trp6@W`pu*!L_BCMjIM4?La@^3r%`mMGbbcrqu{@wrq^C$?$Qj zYq%gqn@7P_y*UnLW3!mQycx+evo^e_)k_nbcQEVQkZ5C5(8hHOEDBp-!Q)$^8I4L5 zr?eujajk8umlsa0Rg;Hgd%$ZodWx%A$O>1o?QJv9s!snHr%9=4O-4(3A2&0^bpz7M z&C_lT7uI*Ejs_uxb+4#Rl19j!m^nnYtU7}zyd17Ht(;R?m{r7=Xb+o7Gp+NF5KnIs z7?tSaM69|Qeo8bN_Ga3VH0vgI%M5DPaLOR9wD~S?tEN_qrVrK6s3m-&WS#Th@uv>R z!4~^8xn>x8q66QcdAo&AfYXbrsafVxy%f;<`M7c1D6XWDedcuAiHX%TH)gcJW$Aj- z<$<3;W9iOnSup!2@ zx3ZjiYT8bQmI{tq8&S){Q9cN~cwZ){bwIe+?hdHYc4VfwP|9klXokq5+}egDS!c4F zNXbU?gP2Q6SPMfj)u>tW@pPz0ua@?4H{Z6oB&eEIDB9mZv2cy)n@9O1GUCdG0n?O{ z+BDKNHna+z@cHDGi7ltQ(Qe#8s${<8P0)0|N;$bcw6HQ-E6iRr< zCrS2cQQAcv6#10Ph@nqg*ny!Z#~m7%UWqf{PP1uV`Fgms;Tm>%C%l$T!5O=(+2+(L zH^{|eYsnm5Pt zl>9o+2EqtJtU5I6z@nNty_#yucCiUc88)~6DmcGia5iN$qsMt?z9G!hB;g6twYuNl z>(x{GSt~*C8J~{vks3?QoitDpgHLwWjEru+gby4AJF&MQJ zy9Ica4_Vo|CN|F&`nh%rmXSox+v=oiMzgEQWh;s~0}X3id2SfS#i}@d=4RbraC5>L{^@vR%>EftZCkTk~mcwQ^Z!blQ}{ zEY?Wnds3yE?Ij(#1l^=V46?Gi^C{!dQLtD?IakgaAh+8wH4O~{HApt*U`N0nl_!Y4 z8F6s>DC4VWXsxiCZ6bqwc5RP2jCOzCJ$6`ot6Iub_tk4TlIDZqb-X>oBxoqM76G9; z8Hs`EAnW!wsSO=;Y{LQXnofl=R1oy~irwjmP_UwEd!D*wN+iA3`Lw{>Q>fb|LZz6C ztq*jF7<0`nX$CE4imqZ8SF!HO6I6;bl?_$sQY_Gkb=IB*$1^BAfOX+m)UCMM!8ja& z0vkEeMN1A}%+|>^=O=5%*Qj)}Qz z&Gl1$Kaa57l3wr&o+xw{x)4yoY{A#>WK+R{anO#XOKK3BCpO-})SOT>B$~Uh@_vq6KrPIt~QNfnk2%;devh~92+2?+V2!!um?|h?=ggJ! zj+XN(5t|@U``BdBN?{6jm}0?9Vwo?S8JzVhTRIs~8Uty?>$4?tJ%OagR4JLmqE%hw zHwF-7X*(X;DKE5{LQ)sV0)ZQu8nvNY$Zn)6I9U!PIj3R8ic^aN#D^|e3)#^?!j!Zx z%4LQ$a8%REPgf%4Br;iTLGTyt9dIe)3bf_}Le$1Z&Q51e7QJ&J6ZMq8 zfuT=Z%!Gl*qE7H-CC%Y&u3k$-^QUifVRP8MES1foK2e<@qLBo5bo~_{aKdu4l2&S| zIi4f8y>8w_`k-=Mj!PzAh-;JL8q@WR_HZ@@a}n=qx@ZmLEp5TToBOWX+}R0aYp6oC z2HJX1>jt-HczV@yji7XgQ#P>8BI#C0%c>XsL17k1MF*C!YG^bv_327#wC7lmuZR7d zrL2mnWQtmWOCp_{7LlPko=y%!)p^zyp7jeJ3UlHxUM~?9v#oEWiBz!7 zRZS)+)$1?1Y1?L@HOB%eO;fh!3gI z6}&UI8B=Dc>L90sP$idk=Q3&?%Nt3bqpdMv%f84lv_EIaDN-*hgNS-#fz9?#r0FH8 z041h~QFhf{nhH=^6li;9rm^#izZD6iU2^4iN;RJ&tifZFR#X0!=xV-WRk z7R@eS80sC7fZ+A^6a+$?OHYvV#B*XKlXRq~qeW#VEX3?8KCo8cOr)$u9TH1)P2-k* zB3SYPvx%+R8qrd8>DI@>GDyIx5p~97Cxu)~2{5`ABe=S{b+gx*lUZ-o21m`2Vc$_3 z5p!|0=#I23!~6S!zmxo-ByxLMa-&Q+Fm!1w)^{SPDBamI9`2mw2FC z;_Jq0O9X?9T!_rO2+H9>)25_#BD4)|uVzz7HRo|Hp0_Rewr!RQ7%9T+sX>^#%By%~ zY^bIQ@3b#y7XFnqF(Ps;lD81XNy}!(y=*TP*O?MrDjWbwKv*s@=G%pJA?79~7ATfk z=uH-y{35*<3N4)?l zL6fn?5uG-z+Tp5|FN|XrU)>v68R}TmA#S?vO&JdHOeYkWk=BvFiZr?@XQQ&2yc}ec zX`C`so*SVUGB=xxGae1Kwu7#;a2I2WLDS1so%}il*GQl`MKxPFk#C#Dy43gk>k zCDjznCS`57Wc8Kc#+a=|Itw}+c5~giCqs|jX*S2#wTz~>G-6(K-glV{u3VAs6hlUH z*VlkJTdxuFd%86==N-h;I-RTA!v&u~c2%sIc}sTlC0n)>*7NzkH0s6ZvRGTjqD!eZ zb8mwqjl@Iw&A{Xylx#6B6L9DKje=*LF~_HRQy>(VCyXOzn3dqkEL2pqgC2!Uw z#W7jznvz&^t9YS7#9^{TWsromoGYnvXqD5ts7Bt@&@GK*&dO448|%uOJT*-@9}r4N zByA?Gd_b~_?m;J;@n|7o7EiimXG3KzBUP}$<&&lDtXp0O8MEhW(d_Bn z3zg@!&aTwnwyUfTO#bdl?Z}&h&}h9Gft2jk0cl4M`s(TcoWS(dm#xjJDYlGp4Lws_do%|I2SXW2L(}FbNA~9#mH#Lp+WL57LLZ;0N)nZ3jC5Gsx?qqHI8q z!e}!E(}7mDGp!Drzf9)MH1!yh|tft2aplcqs+3sR*) zr^_8#86?Gn-?7s!$5E8dZbyd#P`F{C9Dw#mQ948$%ynk6^F{~HtL_pU&+cM}4R$8) z7Y~M?#^KB=iPH!Zr-9^|MW0?Zc&T-_80z%0pPF>{r0XwR5x(ni4v7%p`B9MpFEd~6 zNEFflepVchatS|cq8)|d2(aet>JEu~Zs1_{$N<1D6b93}VhqiGZ*!XKT3rg0F9 z@56TaWP31xN!LH!RUP$cZ_cwfgR%; zVEM82a@_7g>%H+fe0QRJbY70w-2$Hv1INzXPW_I;2y}Oew+F+SJz2xRZVcRuy><+~ zGXh8ZGUU!WAAtdtB==+kC=9-HJoeg=#Ibe+e!MS19`8%g$NK^X@5vC@AjzGHJUTB6 zG-(fpqdQA{v>jmO?!yL0`r;V7+Y*k#aCEm1@4;A*7q<`Nc3b_?b_BgI2f!Gh`?|1$ z?duzWvBWW4C>nfLVs8$LImS0|ElD41M>D%4jHCE5$7B-Nbc)$u8_gWECBRyd)V^E+ zsvKJfOB2WN<0zKe$AtqbxGzH-jqmF|#({P0&kJB+KRCKJj^=hx)E`+dfbH_rj>3S9 z@6(E7$YXNKF&ulW9Sf9Ue>^~hefi^9`k1cn%AoCY)qZjQBM_V;8^ z!hk)_H=5no4`8l= zeSHHk;`qEQah#?sNgl(G1$V&5<^^uvaoBMhu=M%3Y(TCM2x38$0|Lv@%YnN~pdjcD z)!hWw@5ro-lCr{3N~ePXquY_YB&*P5pJG|>|G$L '1' ) + port map ( + -- wishbone signals + wb_clk_i => wb_clk_i, + wb_rst_i => wb_rst_i, + arst_i => wb_rst_i, + wb_adr_i => std_logic_vector(wb_adr), + wb_dat_i => wb_dati, + wb_dat_o => wb_dato, + wb_we_i => wb_we, + wb_stb_i => wb_stb, + wb_cyc_i => wb_cyc, + wb_ack_o => wb_ack, + wb_inta_o => wb_inta, + + -- i2c lines + scl_pad_i => scl_i, + scl_pad_o => scl, + scl_padoen_o => scl_oen, + sda_pad_i => sda_i, + sda_pad_o => sda, + sda_padoen_o => sda_oen + ); + + i2c_write: process (wb_clk_i, wb_rst_i) + begin + if rising_edge(wb_clk_i) then + if wb_rst_i = '1' then + wb_dat_oq <= (others => '0'); + cnt <= (others => '0'); + i2c_init_done <= '0'; + wb_dowrite <= '0'; + wb_doread <= '0'; + end_cnt <= 0; + else + dat <= dat; + + if wb_ack = '1' and i2c_sm = I2C_GO then + cnt <= cnt + "1"; + elsif i2c_sm = IDLE and i2c_init_done = '1' then + cnt <= "0011"; + elsif i2c_sm = IDLE and i2c_init_done = '0' then + cnt <= "0000"; + end if; + + if i2c_sm = IDLE and wb_stb_i = '1' then + if wb_we_i = '1' then + -- PRESCALE Register enable core and interrupt + dat <= (("000", prescale(7 downto 0),'0'), ("001", prescale(15 downto 8),'0'), ("010", x"c0",'0'), + -- ADDRESS STA and WR bit DATA/REG STA and WR + ("011", x"EC", '0'), ("100", x"90",'1'), ("011", x"ff", '0'), ("100", x"90",'1'), + -- DATA STO and WR + ("011", x"ff",'0'), ("100", x"50", '1')); + dat(3).dat <= wb_adr_i(15 downto 0); + dat(5).dat <= wb_adr_i( 7 downto 0); + dat(8).dat <= wb_dat_i; + end_cnt <= 9; + else + dat <= (("000", prescale(7 downto 0),'0'), ("001", prescale(15 downto 8),'0'), ("010", x"c0",'0'), + -- ADDRESS STA and WR bit DATA/REG WR + ("011", x"EC", '0'), ("100", x"91",'1'), ("011", x"ff", '0'), ("100", x"11", '1'), + -- ADDRESS STA,WR STO, RD, NACK + ("011", x"ED", '0'), ("100", x"91",'1'), ("100", x"69", '1'), ("111", x"00", '0'), ("111", x"00", '0')); + dat(3).dat <= wb_adr_i(15 downto 9) & '0'; -- address write + dat(5).dat <= wb_adr_i( 7 downto 0); -- memory location + dat(7).dat <= wb_adr_i(15 downto 9) & '1'; -- address read + end_cnt <= 10; + end if; + end if; + + i2c_init_done <= i2c_init_done; + if i2c_sm = I2C_GO and cnt = "0010" then + i2c_init_done <= '1'; + end if; + + if i2c_sm = I2C_GET_RXDAT and wb_ack = '1' then + wb_dat_oq <= wb_dato; + end if; + + case i2c_sm is + when IDLE => + if (wb_stb_i = '1') then + i2c_sm <= I2C_GO; + end if; + when I2C_GO => + wb_dowrite <= '1'; + + if wb_ack = '1' and dat(to_integer(cnt)).int = '1' then + i2c_sm <= I2C_WAIT_INT; + wb_dowrite <= '0'; + elsif wb_ack = '1' and dat(to_integer(cnt)).int = '0' then + if to_integer(cnt) = end_cnt then + i2c_sm <= I2C_GET_RXDAT; + end if; + wb_dowrite <= '0'; + end if; + when I2C_WAIT_INT => + wb_doread <= '1'; + + if wb_ack = '1' and wb_dato(1) = '0' then + wb_doread <= '0'; + if to_integer(cnt) = end_cnt then + i2c_sm <= I2C_GET_RXDAT; + else + i2c_sm <= I2C_GO; + end if; + end if; + when I2C_GET_RXDAT => + wb_doread <= '1'; + if wb_ack = '1' then + wb_doread <= '0'; + i2c_sm <= I2C_WB_ACK; + end if; + when I2C_WB_ACK => + i2c_sm <= IDLE; + end case; + end if; + end if; + end process; + + wb_ack_o <= '1' when i2c_sm = I2C_WB_ACK else '0'; + wb_dati <= dat(to_integer(cnt)).dat; + wb_adr <= dat(to_integer(cnt)).adr when wb_dowrite = '1' else + "011" when i2c_sm = I2C_GET_RXDAT else + "100"; + wb_cyc <= wb_stb; + wb_stb <= '1' when (wb_dowrite = '1' or wb_doread = '1') and wb_ack = '0' else '0'; + wb_we <= wb_dowrite; + + debug(3 downto 0) <= std_logic_vector(cnt); + +end i2c_wrapper; diff --git a/fpga/src/i2c/sim/sim_tb.vhd b/fpga/src/i2c/sim/sim_tb.vhd new file mode 100644 index 0000000..e3a6ccb --- /dev/null +++ b/fpga/src/i2c/sim/sim_tb.vhd @@ -0,0 +1,131 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity sim_tb is +end sim_tb; + +architecture rtl of sim_tb is + constant CLK_PERIOD : time := 10 ns; + signal clk : std_logic; + signal rst : std_logic; + signal rst_n : std_logic; + + component i2c_wrapper is + generic ( prescale : std_logic_vector(15 downto 0) := x"00c8"); + port ( + wb_clk_i : in std_logic; + wb_rst_i : in std_logic; + wb_adr_i : in std_logic_vector(15 downto 0); + wb_dat_i : in std_logic_vector(7 downto 0); + wb_dat_o : out std_logic_vector(7 downto 0); + wb_we_i : in std_logic; + wb_stb_i : in std_logic; + wb_ack_o : out std_logic; + scl_i : in std_logic; + scl_o : out std_logic; + sda_i : in std_logic; + sda_o : out std_logic; + debug : out std_logic_vector(3 downto 0) + ); + end component; + + component i2c_rom is + port ( + clk : in std_logic; + rst_n : in std_logic; + sda_i : in std_logic; + sda_o : out std_logic; + scl_i : in std_logic + ); + end component; + + signal wb_clk_i : std_logic; + signal wb_rst_i : std_logic; + signal wb_adr_i : std_logic_vector(15 downto 0); + signal wb_dat_i : std_logic_vector(7 downto 0); + signal wb_dat_o : std_logic_vector(7 downto 0); + signal wb_we_i : std_logic; + signal wb_stb_i : std_logic; + signal wb_ack_o : std_logic; + signal scl_wi : std_logic; + signal scl_wo : std_logic; + signal sda_wi : std_logic; + signal sda_wo : std_logic; + signal debug : std_logic_vector(3 downto 0); + signal sda_ro : std_logic; +begin + rst <= transport '1', '0' after (4 * CLK_PERIOD); + rst_n <= not rst; + clock: process begin + clk <= '1', '0' after CLK_PERIOD/2; + wait for CLK_PERIOD; + end process; + wb_clk_i <= clk; + wb_rst_i <= rst; + + + beh_mst: process + begin + wb_dat_i <= x"00"; + wb_we_i <= '0'; + wb_adr_i <= x"6a08"; + wb_stb_i <= '0'; + wait for 20*CLK_PERIOD; + wb_stb_i <= '1'; + wait until wb_ack_o = '1'; + wb_stb_i <= '0'; + wait; + end process beh_mst; + + DUT_MST: i2c_wrapper + port map ( + wb_clk_i => wb_clk_i, + wb_rst_i => wb_rst_i, + wb_adr_i => wb_adr_i, + wb_dat_i => wb_dat_i, + wb_dat_o => wb_dat_o, + wb_we_i => wb_we_i, + wb_stb_i => wb_stb_i, + wb_ack_o => wb_ack_o, + scl_i => scl_wi, + scl_o => scl_wo, + sda_i => sda_wi, + sda_o => sda_wo + ); + + scl_wi <= scl_wo; + sda_wi <= '1' when sda_ro = 'Z' else + '0' when sda_ro = '0' else sda_wo; + + DUT: i2c_rom + port map ( + clk => wb_clk_i, + rst_n => rst_n, + sda_i => sda_wo, + sda_o => sda_ro, + scl_i => scl_wo + ); + +end rtl; diff --git a/fpga/src/i2c/slave/hdmi_in.dat b/fpga/src/i2c/slave/hdmi_in.dat new file mode 100644 index 0000000..ce26889 --- /dev/null +++ b/fpga/src/i2c/slave/hdmi_in.dat @@ -0,0 +1,256 @@ +00 +ff +ff +ff +ff +ff +ff +00 +4d +29 +58 +47 +00 +00 +00 +00 +33 +14 +01 +03 +80 +1d +0d +78 +07 +0d +c2 +a0 +57 +47 +98 +27 +12 +48 +4f +00 +00 +00 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +06 +18 +a0 +dd +50 +1c +22 +20 +51 +3c +82 +04 +26 +71 +10 +00 +00 +18 +00 +00 +00 +fe +00 +48 +44 +4d +49 +49 +4e +0a +20 +20 +20 +20 +20 +20 +2e +18 +a0 +dd +50 +1c +22 +20 +51 +3c +82 +04 +27 +71 +10 +00 +00 +18 +00 +00 +00 +fa +00 +01 +00 +01 +00 +01 +00 +01 +00 +01 +00 +01 +00 +0a +00 +0e +02 +03 +04 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +f7 diff --git a/fpga/src/i2c/slave/hdmi_in_syncmaster191t.dat b/fpga/src/i2c/slave/hdmi_in_syncmaster191t.dat new file mode 100644 index 0000000..1740943 --- /dev/null +++ b/fpga/src/i2c/slave/hdmi_in_syncmaster191t.dat @@ -0,0 +1,128 @@ +00 +ff +ff +ff +ff +ff +ff +00 +4c +2d +14 +00 +39 +31 +48 +47 +0d +0d +01 +03 +80 +26 +1f +8c +2a +6f +8b +a2 +5a +4d +94 +24 +1a +51 +56 +bf +ef +80 +81 +80 +61 +40 +45 +40 +31 +40 +01 +01 +01 +01 +01 +01 +01 +01 +30 +2a +00 +98 +51 +00 +2a +40 +30 +70 +13 +00 +78 +2d +11 +00 +00 +1e +00 +00 +00 +fd +00 +38 +55 +1e +51 +0d +00 +0a +20 +20 +20 +20 +20 +20 +00 +00 +00 +fc +00 +53 +79 +6e +63 +4d +61 +73 +74 +65 +72 +0a +20 +20 +00 +00 +00 +ff +00 +48 +4a +47 +57 +33 +30 +33 +34 +33 +33 +0a +20 +20 +00 +61 diff --git a/fpga/src/i2c/slave/hdmi_in_syncmaster940t.dat b/fpga/src/i2c/slave/hdmi_in_syncmaster940t.dat new file mode 100644 index 0000000..880a7a8 --- /dev/null +++ b/fpga/src/i2c/slave/hdmi_in_syncmaster940t.dat @@ -0,0 +1,256 @@ +00 +ff +ff +ff +ff +ff +ff +00 +4c +2d +bb +01 +39 +31 +41 +48 +14 +11 +01 +03 +80 +26 +1e +78 +2a +de +95 +a3 +54 +4c +99 +26 +0f +50 +54 +bf +ef +80 +81 +80 +81 +40 +71 +4f +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +30 +2a +00 +98 +51 +00 +2a +40 +30 +70 +13 +00 +78 +2d +11 +00 +00 +1e +00 +00 +00 +fd +00 +38 +4b +1e +51 +0e +00 +0a +20 +20 +20 +20 +20 +20 +00 +00 +00 +fc +00 +53 +79 +6e +63 +4d +61 +73 +74 +65 +72 +0a +20 +20 +00 +00 +00 +ff +00 +48 +4d +45 +50 +35 +31 +31 +34 +30 +32 +0a +20 +20 +00 +83 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 diff --git a/fpga/src/i2c/slave/i2c_rom.vhd b/fpga/src/i2c/slave/i2c_rom.vhd new file mode 100644 index 0000000..c250897 --- /dev/null +++ b/fpga/src/i2c/slave/i2c_rom.vhd @@ -0,0 +1,80 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use std.textio.all; +use ieee.std_logic_textio.all; + +entity i2c_rom is + port ( + clk : in std_logic; + rst_n : in std_logic; + sda_i : in std_logic; + sda_o : out std_logic; + scl_i : in std_logic + ); +end i2c_rom; + +architecture i2c_rom of i2c_rom is + --type rom_t is array (0 to 255) of std_logic_vector (7 downto 0); + type rom_t is array (0 to 127) of std_logic_vector (7 downto 0); + impure function init_rom_from_file(filename : in string) return rom_t is + file romfile : text is in filename; + variable rline : line; + variable rom : rom_t; + begin + for i in rom_t'range loop + readline(romfile, rline); + hread(rline, rom(i)); + end loop; + return rom; + end function; + --signal rom : rom_t := init_rom_from_file("hdmi_in_syncmaster940t.dat"); + signal rom : rom_t := init_rom_from_file("hdmi_in_syncmaster191t.dat"); + + signal rd_data : std_logic_vector(7 downto 0); + signal wr_data : std_logic_vector(7 downto 0); + signal address : std_logic_vector(7 downto 0); + signal wr_pulse : std_logic; + signal rd_pulse : std_logic; + signal rd_wr : std_logic; +begin + rd_data <= rom(to_integer(unsigned(address))); + + i2c_blk_0: entity work.i2c_slave + generic map ( ADDRESS => "0101000" ) -- 6A write, 6B read + port map ( + clk => clk, + rst_n => rst_n, + sda_i => sda_i, + sda_o => sda_o, + scl_i => scl_i, + rd_dat_i => rd_data, + addr_o => address, + wr_dat_o => wr_data, + wr_pulse_o => wr_pulse, + rd_pulse_o => rd_pulse, + rd_wr_o => rd_wr + ); + +end i2c_rom; diff --git a/fpga/src/i2c/slave/i2c_slave.vhd b/fpga/src/i2c/slave/i2c_slave.vhd new file mode 100644 index 0000000..a6a5471 --- /dev/null +++ b/fpga/src/i2c/slave/i2c_slave.vhd @@ -0,0 +1,282 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- +-- Verilog to VHDL translation of: +-- http://www.eda365.com/thread-31086-1-1.html +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity i2c_slave is + generic (ADDRESS : std_logic_vector(6 downto 0) := "0110101"); -- 6A write, 6B read + port ( + clk : in std_logic; + rst_n : in std_logic; + sda_i : in std_logic; + sda_o : out std_logic; + scl_i : in std_logic; + rd_dat_i : in std_logic_vector(7 downto 0); + addr_o : out std_logic_vector(7 downto 0); + wr_dat_o : out std_logic_vector(7 downto 0); + wr_pulse_o : out std_logic; + rd_pulse_o : out std_logic; + rd_wr_o : out std_logic + ); +end i2c_slave; + +architecture i2c_slave of i2c_slave is + signal sda_sr : std_logic_vector(3 downto 0); + signal scl_sr : std_logic_vector(3 downto 0); + signal sda, was_sda : std_logic; + signal sda_in : std_logic; + signal scl, was_scl : std_logic; + signal scl_in : std_logic; + signal i2c_start : std_logic; + signal i2c_stop : std_logic; + signal ack_cyc : std_logic; + signal byte_count : unsigned(3 downto 0); + signal was_ack : std_logic; + signal addr_byte : std_logic; + signal addr_ack : std_logic; + signal subad_byte : std_logic; + signal subad_ack : std_logic; + signal wr_pulse : std_logic; + signal rd_pulse : std_logic; + signal rd_wr : std_logic; + signal wr_dat : std_logic_vector(7 downto 0); + signal addr : unsigned(7 downto 0); + signal out_sr : std_logic_vector(7 downto 0); + signal in_sr : std_logic_vector(7 downto 0); + signal wr_pls_dly : std_logic; + signal rd_pls_dly : std_logic; + signal drive_sda : std_logic; + signal my_cyc : std_logic; + signal data_byte : std_logic; +begin + wr_dat_o <= wr_dat; + addr_o <= std_logic_vector(addr); + rd_wr_o <= rd_wr; + wr_pulse_o <= wr_pulse; + rd_pulse_o <= rd_pulse; + sda_o <= '0' when drive_sda = '1' else '1'; + + -- Debounce, then delay debounced signals for edge detection + debounce: process (clk, rst_n) + begin + if rst_n = '0' then + sda_sr <= "1111"; -- Start up assuming quiescent state of inputs + sda <= '1'; + was_sda <= '0'; + scl_sr <= "1111"; -- Start up assuming quiescent state of inputs + scl <= '1'; + was_scl <= '0'; + sda_in <= '1'; + elsif rising_edge(clk) then + sda_in <= sda_i; + scl_in <= scl_i; + + sda_sr <= sda_sr(2 downto 0) & sda_in; + if sda_sr = "0000" then + sda <= '0'; + elsif sda_sr = "1111" then + sda <= '1'; + end if; + was_sda <= sda; + + scl_sr <= scl_sr(2 downto 0) & scl_in; + if scl_sr = "0000" then + scl <= '0'; + elsif scl_sr = "1111" then + scl <= '1'; + end if; + was_scl <= scl; + end if; + end process; + + ack_cyc <= byte_count(3); + process (clk, rst_n) + begin + if rst_n = '0' then + i2c_start <= '0'; + i2c_stop <= '0'; + byte_count <= (others => '0'); + was_ack <= '0'; + addr_byte <= '0'; + addr_ack <= '0'; + subad_byte <= '0'; + subad_ack <= '0'; + wr_pulse <= '0'; + rd_pulse <= '0'; + wr_dat <= (others => '0'); + addr <= (others => '0'); + out_sr <= (others => '1'); + in_sr <= (others => '0'); + wr_pls_dly <= '0'; + rd_pls_dly <= '0'; + rd_wr <= '0'; + drive_sda <= '0'; + my_cyc <= '0'; + elsif rising_edge(clk) then + -- Falling edge of SDA with SCL high + if scl = '1' and was_scl = '1' and sda = '0' and was_sda = '1' then + i2c_start <= '1'; + elsif scl = '0' and was_scl = '0' then -- Hold until SCL has fallen + i2c_start <= '0'; + end if; + + -- Rising edge of SDA with SCL high + -- i2c_stop is only on for one clock cycle + i2c_stop <= scl and was_scl and sda and not was_sda; + + + -- Increment bit counter on falling edges of the + -- SCL signal after the first in a packet. + -- Count bit position within bytes: + if i2c_start = '1' then + byte_count <= (others => '0'); + elsif scl = '0' and was_scl = '1' and i2c_start = '0' then + if ack_cyc = '1' then + byte_count <= (others => '0'); + else + byte_count <= byte_count + "1"; + end if; + end if; + + -- For edge detection of ack cycles: + was_ack <= ack_cyc; + + -- addr_byte is on during the first byte transmitted after + -- a START condition. + if i2c_start = '1' then + addr_byte <= '1'; + elsif ack_cyc = '1' then + addr_byte <= '0'; + end if; + + -- addr_ack is on during acknowledge cycle of the address + -- byte. + if addr_byte = '1' and ack_cyc = '1' then + addr_ack <= '1'; + elsif ack_cyc = '0' then + addr_ack <= '0'; + end if; + + -- subad_byte is on for the second byte of my write cycle. + if addr_ack = '1' and ack_cyc = '0' and rd_wr = '0' and my_cyc = '1' then + subad_byte <= '1'; + elsif ack_cyc = '1' then + subad_byte <= '0'; + end if; + + -- subad_ack is on during the acknowledge cycle of the + -- subaddress byte. + if subad_byte = '1' and ack_cyc = '1' then + subad_ack <= '1'; + elsif ack_cyc = '0' then + subad_ack <= '0'; + end if; + + -- data_byte is on for my read or write data cycles. This is + -- any read cycle after the address, or write cycles after + -- the subaddress. It remains on until the I2C STOP event or + -- any NACK. + if (addr_ack = '1' and ack_cyc = '0' and rd_wr = '1' and my_cyc = '1') + or (subad_ack = '1' and ack_cyc = '0') then + data_byte <= '1'; + elsif i2c_stop = '1' or (ack_cyc = '1' and scl = '1' and sda = '1') then + data_byte <= '0'; + end if; + + -- wr_pulse_o is on for one clock cycle while the data + -- on the output bus is valid. + wr_pulse <= data_byte and not ack_cyc and was_ack and not rd_wr; + -- rd_pulse_o is on for one clock cycle when external + -- read data is transfered into the output shift register + -- for transmission to the I2C bus. + rd_pulse <= (addr_ack and not ack_cyc and rd_wr and my_cyc) -- First read cycle + or (data_byte and not ack_cyc and was_ack and rd_wr); -- Subsequent read cycles + + + -- wr_dat_o is loaded from the I2C input S/R at the + -- end of each write data cycle. + if data_byte = '1' and ack_cyc = '1' and was_ack = '0' and rd_wr = '0' then + wr_dat <= in_sr; + end if; + + -- out_sr shifts data out to the I2C bus during read + -- data cycles. Transitions occur after the falling + -- edge of SCL. Fills with 1's from right. + if rd_pulse = '1' then + out_sr <= rd_dat_i; + elsif scl = '0' and was_scl = '1' then + out_sr <= out_sr(6 downto 0) & '1'; + end if; + + -- Delayed pulses for incrementing subaddress: + wr_pls_dly <= wr_pulse; + rd_pls_dly <= rd_pulse; + + -- addr_o is loaded after the second byte of a write + -- cycle has fully shifted in. It increments after each + -- read or write access. + if subad_byte = '1' and ack_cyc = '1' then + addr <= unsigned(in_sr); + elsif wr_pls_dly = '1' or rd_pls_dly = '1' then + -- Leave Out this else clause for simple single register version + -- In this case addr_o becomes the register output and should be + -- wrapped back to rd_dat_i externally + addr <= addr + "1"; + end if; + + -- Shift I2C data in after rising edge of SCL. + if scl = '1' and was_scl = '0' then + in_sr <= in_sr(6 downto 0) & sda; + end if; + + -- Read / not Write. For external bus drivers if necessary. + -- Latch the Read bit of the address cycle. + if addr_byte = '1' and ack_cyc = '1' then + rd_wr <= in_sr(0); + end if; + + -- Decode address. My cycle if address upper 7 bits + -- match with i2c_address defined above. + if i2c_start = '1' then + my_cyc <= '0'; --- ??!?!? + elsif addr_byte = '1' and ack_cyc = '1' then + if in_sr(7 downto 1) = ADDRESS then + my_cyc <= '1'; + else + my_cyc <= '1'; + end if; + end if; + + -- I2C data output drive low signal (1 = drive SDA low) + -- Invert this signal for T input of OBUFT or IOBUF + -- or use it directly for OBUFE. + drive_sda <= (my_cyc and addr_ack) -- Address acknowledge + or (my_cyc and not rd_wr and ack_cyc) -- Write byte acknowledge + or (data_byte and rd_wr and not ack_cyc and not out_sr(7)); -- Read Data + end if; + end process; + +end i2c_slave; diff --git a/fpga/src/sig/ddr2dvi.vhd b/fpga/src/sig/ddr2dvi.vhd new file mode 100644 index 0000000..d59ce75 --- /dev/null +++ b/fpga/src/sig/ddr2dvi.vhd @@ -0,0 +1,194 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.dvi_package.all; + +library UNISIM; +use UNISIM.Vcomponents.all; + +entity ddr2dvi is + port ( + clk : in std_logic; + rst_n : in std_logic; + rst_pll : in std_logic; + + tx_tmds : out std_logic_vector(3 downto 0); + tx_tmds_n : out std_logic_vector(3 downto 0); + tx_pll_locked_o : out std_logic; + + -- memory interface + ddr2_cmd_en_o : out std_logic; + ddr2_cmd_instr_o : out std_logic_vector( 2 downto 0); + ddr2_cmd_bl_o : out std_logic_vector( 5 downto 0); + ddr2_cmd_byte_addr_o : out std_logic_vector(29 downto 0); + ddr2_cmd_empty_i : in std_logic; + ddr2_cmd_full_i : in std_logic; + + ddr2_rd_en_o : out std_logic; + ddr2_rd_data_i : in std_logic_vector(31 downto 0); + ddr2_rd_full_i : in std_logic; + ddr2_rd_empty_i : in std_logic; + ddr2_rd_count_i : in std_logic_vector( 6 downto 0); + ddr2_rd_overflow_i : in std_logic; + ddr2_rd_error_i : in std_logic + ); +end ddr2dvi; + +architecture ddr2dvi of ddr2dvi is + signal pclk : std_logic; + signal pclk_buf : std_logic; + signal tx_hsync : std_logic; + signal tx_vsync : std_logic; + signal tx_color_en : std_logic; + signal tx_color : color_t(COLOR_CNT-1 downto 0); + signal tx_pclkx2 : std_logic; + signal tx_pclkx10 : std_logic; + signal tx_reset_n : std_logic; + signal tx_serdesstrobe : std_logic; + signal tx_clkfbout : std_logic; + signal tx_clkfbin : std_logic; + signal tx_plllckd : std_logic; + signal tx_pllclk0 : std_logic; + signal tx_pllclk2 : std_logic; + signal tx_bufpll_lock : std_logic; +begin + tx_pll_locked_o <= tx_plllckd; + + -- ---------------------------------------------------------------------------- + -- DDR2 READ Signal Generator + -- ---------------------------------------------------------------------------- + sig_read_0: entity work.sig_read + generic map ( + MEM_START_ADR => "00" & x"0000000", + H_ACTIVE_PIXEL => x"500", + H_BLANKING => x"198", + H_SYNC_WIDTH => x"070", + H_SYNC_OFFSET => x"030", + V_ACTIVE_LINES => x"400", + V_BLANKING => x"02a", + V_SYNC_WIDTH => x"01", + V_SYNC_OFFSET => x"03" + ) + port map ( + clk => pclk, + rst_n => rst_n, + + -- memory interface + ddr2_clk => clk, + ddr2_cmd_en_o => ddr2_cmd_en_o, + ddr2_cmd_instr_o => ddr2_cmd_instr_o, + ddr2_cmd_bl_o => ddr2_cmd_bl_o, + ddr2_cmd_byte_addr_o => ddr2_cmd_byte_addr_o, + ddr2_cmd_empty_i => ddr2_cmd_empty_i, + ddr2_cmd_full_i => ddr2_cmd_full_i, + + ddr2_rd_en_o => ddr2_rd_en_o, + ddr2_rd_data_i => ddr2_rd_data_i, + ddr2_rd_full_i => ddr2_rd_full_i, + ddr2_rd_empty_i => ddr2_rd_empty_i, + ddr2_rd_count_i => ddr2_rd_count_i, + ddr2_rd_overflow_i => ddr2_rd_overflow_i, + ddr2_rd_error_i => ddr2_rd_error_i, + + en_stb_i => '1', + hsync_o => tx_hsync, + vsync_o => tx_vsync, + color_en_o => tx_color_en, + color_o => tx_color + ); + + -- ---------------------------------------------------------------------------- + -- Instantiate a dedicate PLL for output port + -- ---------------------------------------------------------------------------- + --pclk <= ddr2_clk_out; + pll_oserdes_0: PLL_BASE + generic map ( + CLKIN_PERIOD => 9.0, + CLKFBOUT_MULT => 29, --10 --set VCO to 10x of CLKIN + DIVCLK_DIVIDE => 3, + CLKOUT0_DIVIDE => 1, + CLKOUT1_DIVIDE => 10, + CLKOUT2_DIVIDE => 5, + COMPENSATION => "SOURCE_SYNCHRONOUS" + ) + port map ( + CLKFBOUT => tx_clkfbout, + CLKOUT0 => tx_pllclk0, + CLKOUT1 => pclk_buf, + CLKOUT2 => tx_pllclk2, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => tx_plllckd, + CLKFBIN => tx_clkfbin, + CLKIN => clk, + RST => rst_pll + ); + + pclk_buf_0: BUFG port map(I => pclk_buf, O => pclk); + + -- ---------------------------------------------------------------------------- + -- This BUFG is needed in order to deskew between PLL clkin and clkout + -- So the tx0 pclkx2 and pclkx10 will have the same phase as the pclk input + -- ---------------------------------------------------------------------------- + tx_clkfb_buf: BUFG port map(I => tx_clkfbout, O => tx_clkfbin); + + -- -------------------------------- + -- regenerate pclkx2 for TX + -- -------------------------------- + tx_pclkx2_buf: BUFG port map(I => tx_pllclk2, O => tx_pclkx2); + + -- -------------------------------- + -- regenerate pclkx10 for TX + -- -------------------------------- + tx_ioclk_buf: BUFPLL + generic map ( DIVIDE => 5 ) + port map ( + PLLIN => tx_pllclk0, + GCLK => tx_pclkx2, + LOCKED => tx_plllckd, + IOCLK => tx_pclkx10, + SERDESSTROBE => tx_serdesstrobe, + LOCK => tx_bufpll_lock + ); + tx_reset_n <= tx_bufpll_lock; + + dvi_encoder_0: entity work.dvi_encoder + port map ( + rst_n => tx_reset_n, + pclk => pclk, + pclkx2 => tx_pclkx2, + pclkx10 => tx_pclkx10, + serdesstrobe_i => tx_serdesstrobe, + color_i => tx_color, + hsync_i => tx_hsync, + vsync_i => tx_vsync, + dat_en_i => tx_color_en, + tmds_p => tx_tmds, + tmds_n => tx_tmds_n + ); + +end ddr2dvi; diff --git a/fpga/src/sig/dvi2ddr.vhd b/fpga/src/sig/dvi2ddr.vhd new file mode 100644 index 0000000..5aac210 --- /dev/null +++ b/fpga/src/sig/dvi2ddr.vhd @@ -0,0 +1,112 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.dvi_package.all; + +library UNISIM; +use UNISIM.Vcomponents.all; + +entity dvi2ddr is + port ( + clk : in std_logic; + rst : in std_logic; + + ctrl_disable_wr : in std_logic; + + rx_tmds : in std_logic_vector(3 downto 0); + rx_tmds_n : in std_logic_vector(3 downto 0); + + -- memory interface + ddr2_cmd_en_o : out std_logic; + ddr2_cmd_instr_o : out std_logic_vector( 2 downto 0); + ddr2_cmd_bl_o : out std_logic_vector( 5 downto 0); + ddr2_cmd_byte_addr_o : out std_logic_vector(29 downto 0); + ddr2_cmd_empty_i : in std_logic; + ddr2_cmd_full_i : in std_logic; + ddr2_wr_en_o : out std_logic; + ddr2_wr_mask_o : out std_logic_vector( 3 downto 0); + ddr2_wr_data_o : out std_logic_vector(31 downto 0); + ddr2_wr_full_i : in std_logic; + ddr2_wr_empty_i : in std_logic; + ddr2_wr_count_i : in std_logic_vector( 6 downto 0); + ddr2_wr_underrun_i : in std_logic; + ddr2_wr_error_i : in std_logic + ); +end dvi2ddr; + +architecture dvi2ddr of dvi2ddr is + signal rx_tmds_s : std_logic_vector(3 downto 0); + signal rx_color : color_t(COLOR_CNT-1 downto 0); + signal rx_color_en : std_logic; + signal rx_pll_lckd : std_logic; + signal rx_rst_n : std_logic; + signal rx_pclk : std_logic; + signal rx_hsync : std_logic; + signal rx_vsync : std_logic; +begin + -- ---------------------------------------------------------------------------- + -- HDMI to DDR2 + -- ---------------------------------------------------------------------------- + dvi_decoder_0: entity work.dvi_decoder + port map ( + ext_rst => rst, + + tmdsclk_p => rx_tmds(3), + tmdsclk_n => rx_tmds_n(3), + din_p => rx_tmds(2 downto 0), + din_n => rx_tmds_n(2 downto 0), + + reset_n => rx_rst_n, -- rx reset + pclk_o => rx_pclk, -- regenerated pixel clock + pclkx2_o => open, -- double rate pixel clock + pclkx10_o => open, -- 10x pixel as IOCLK + + pll_lckd_o => rx_pll_lckd, -- send pll_lckd out so it can be fed into a different BUFPLL + serdesstrobe_o => open, -- BUFPLL serdesstrobe output + tmdsclk_o => open, -- TMDS cable clock + + hsync_o => rx_hsync, -- hsync data + vsync_o => rx_vsync, -- vsync data + valid_o => open, + ready_o => open, + psalgnerr_o => open, + sdout_o => open, + dat_en_o => rx_color_en, -- data enable + color_o => rx_color + ); + + sig_write_0: entity work.sig_write + generic map (MEM_START_ADR => "00" & x"0000000") + port map ( + clk => rx_pclk, + rst_n => rx_rst_n, + ctrl_disable_wr => ctrl_disable_wr, + + -- memory interface + ddr2_clk => clk, + ddr2_cmd_en_o => ddr2_cmd_en_o, + ddr2_cmd_instr_o => ddr2_cmd_instr_o, + ddr2_cmd_bl_o => ddr2_cmd_bl_o, + ddr2_cmd_byte_addr_o => ddr2_cmd_byte_addr_o, + ddr2_cmd_empty_i => ddr2_cmd_empty_i, + ddr2_cmd_full_i => ddr2_cmd_full_i, + + ddr2_wr_en_o => ddr2_wr_en_o, + ddr2_wr_mask_o => ddr2_wr_mask_o, + ddr2_wr_data_o => ddr2_wr_data_o, + ddr2_wr_full_i => ddr2_wr_full_i, + ddr2_wr_empty_i => ddr2_wr_empty_i, + ddr2_wr_count_i => ddr2_wr_count_i, + ddr2_wr_underrun_i => ddr2_wr_underrun_i, + ddr2_wr_error_i => ddr2_wr_error_i, + + -- display output + hsync_i => rx_hsync, + vsync_i => rx_vsync, + color_en_i => rx_color_en, + color_i => rx_color + ); + +end dvi2ddr; diff --git a/fpga/src/sig/sig.vhd b/fpga/src/sig/sig.vhd new file mode 100644 index 0000000..137a018 --- /dev/null +++ b/fpga/src/sig/sig.vhd @@ -0,0 +1,127 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.dvi_package.all; + +entity sig is + generic ( + H_ACTIVE_PIXEL : unsigned(11 downto 0) := x"5a0"; + H_BLANKING : unsigned(11 downto 0) := x"0dd"; + H_SYNC_WIDTH : unsigned(11 downto 0) := x"03c"; + H_SYNC_OFFSET : unsigned(11 downto 0) := x"050"; -- front porch + V_ACTIVE_LINES : unsigned(11 downto 0) := x"21c"; + V_BLANKING : unsigned(11 downto 0) := x"022"; + V_SYNC_WIDTH : unsigned( 7 downto 0) := x"02"; + V_SYNC_OFFSET : unsigned( 7 downto 0) := x"18" -- front porch + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + + -- memory interface + --address_o : out std_logic_vector(); + + -- display output + en_stb_i : in std_logic; + hsync_o : out std_logic; + vsync_o : out std_logic; + color_en_o : out std_logic; + color_o : out color_t + ); +end sig; + +architecture sig of sig is + signal h_cnt : unsigned(11 downto 0); + signal v_cnt : unsigned(11 downto 0); + signal one_screen : std_logic; + signal h_state : unsigned(1 downto 0); + signal h_state_i : unsigned(1 downto 0); + signal v_state : unsigned(1 downto 0); + signal v_state_i : unsigned(1 downto 0); + constant SYNC_OFF : unsigned(1 downto 0) := "00"; + constant SYNC : unsigned(1 downto 0) := "01"; + constant SYNC_BACK : unsigned(1 downto 0) := "10"; + constant ACTIVE_LINE : unsigned(1 downto 0) := "11"; + + constant H_SYNC_BACK : unsigned(11 downto 0) := H_BLANKING - H_SYNC_OFFSET - H_SYNC_WIDTH; + constant V_SYNC_BACK : unsigned(11 downto 0) := V_BLANKING - V_SYNC_OFFSET - V_SYNC_WIDTH; +begin + hsync_o <= '1' when h_state = SYNC and v_state = ACTIVE_LINE else '0'; + vsync_o <= '1' when v_state = SYNC else '0'; + color_en_o <= '1' when h_state = ACTIVE_LINE and v_state = ACTIVE_LINE else '0'; + color_o <= ((others => v_cnt(3)), (others => v_cnt(2)), (others => v_cnt(1))); + + process (clk, rst_n) + begin + if rst_n = '0' then + h_cnt <= x"000"; + v_cnt <= x"000"; + v_state <= "00"; + v_state_i <= "00"; + h_state <= "00"; + h_state_i <= "00"; + one_screen <= '0'; + elsif rising_edge(clk) then + if v_state = ACTIVE_LINE and v_cnt = x"000" then + one_screen <= '0'; + elsif en_stb_i = '1' then + one_screen <= '1'; + end if; + + if one_screen = '1' and h_cnt = x"000" then + h_state <= h_state_i; + case h_state_i is + when SYNC_OFF => h_cnt <= H_SYNC_OFFSET-1; + when SYNC => h_cnt <= H_SYNC_WIDTH-1; + when SYNC_BACK => h_cnt <= H_SYNC_BACK-1; + when ACTIVE_LINE => h_cnt <= H_ACTIVE_PIXEL-1; + when others => h_cnt <= x"000"; + end case; + elsif h_cnt /= x"000" then + h_cnt <= h_cnt - "1"; + end if; + + if one_screen = '1' and h_cnt = x"000" then + h_state_i <= h_state_i + "01"; + end if; + + if one_screen = '1' and v_cnt = x"000" and h_state = SYNC_OFF then + v_state <= v_state_i; + case v_state_i is + when SYNC_OFF => v_cnt <= x"0" & V_SYNC_OFFSET; + when SYNC => v_cnt <= x"0" & V_SYNC_WIDTH; + when SYNC_BACK => v_cnt <= V_SYNC_BACK; + when ACTIVE_LINE => v_cnt <= V_ACTIVE_LINES; + when others => v_cnt <= x"000"; + end case; + elsif v_cnt /= x"000" and (h_state = ACTIVE_LINE and h_cnt = x"000") then + v_cnt <= v_cnt - "1"; + end if; + + if one_screen = '1' and v_cnt = x"000" then + v_state_i <= v_state_i + "01"; + end if; + end if; + end process; +end sig; diff --git a/fpga/src/sig/sig_read.vhd b/fpga/src/sig/sig_read.vhd new file mode 100644 index 0000000..699b064 --- /dev/null +++ b/fpga/src/sig/sig_read.vhd @@ -0,0 +1,281 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.dvi_package.all; + +entity sig_read is + generic ( + MEM_START_ADR : unsigned(29 downto 0) := "00" & x"0000000"; + H_ACTIVE_PIXEL : unsigned(11 downto 0) := x"5a0"; + H_BLANKING : unsigned(11 downto 0) := x"0dd"; + H_SYNC_WIDTH : unsigned(11 downto 0) := x"03c"; + H_SYNC_OFFSET : unsigned(11 downto 0) := x"050"; -- front porch + V_ACTIVE_LINES : unsigned(11 downto 0) := x"21c"; + V_BLANKING : unsigned(11 downto 0) := x"022"; + V_SYNC_WIDTH : unsigned( 7 downto 0) := x"02"; + V_SYNC_OFFSET : unsigned( 7 downto 0) := x"18" -- front porch + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + + -- memory interface + ddr2_clk : in std_logic; + ddr2_cmd_en_o : out std_logic; + ddr2_cmd_instr_o : out std_logic_vector( 2 downto 0); + ddr2_cmd_bl_o : out std_logic_vector( 5 downto 0); + ddr2_cmd_byte_addr_o : out std_logic_vector(29 downto 0); + ddr2_cmd_empty_i : in std_logic; + ddr2_cmd_full_i : in std_logic; + + ddr2_rd_en_o : out std_logic; + ddr2_rd_data_i : in std_logic_vector(31 downto 0); + ddr2_rd_full_i : in std_logic; + ddr2_rd_empty_i : in std_logic; + ddr2_rd_count_i : in std_logic_vector( 6 downto 0); + ddr2_rd_overflow_i : in std_logic; + ddr2_rd_error_i : in std_logic; + + -- display output + en_stb_i : in std_logic; + hsync_o : out std_logic; + vsync_o : out std_logic; + color_en_o : out std_logic; + color_o : out color_t(COLOR_CNT-1 downto 0) + ); +end sig_read; + +architecture sig_read of sig_read is + signal rst : std_logic; + signal h_cnt : unsigned(11 downto 0); + signal v_cnt : unsigned(11 downto 0); + signal one_screen : std_logic; + signal h_state : unsigned(1 downto 0); + signal h_state_m : unsigned(1 downto 0); + signal h_state_v : unsigned(1 downto 0); + signal h_state_i : unsigned(1 downto 0); + signal v_state : unsigned(1 downto 0); + signal v_state_m : unsigned(1 downto 0); + signal v_state_v : unsigned(1 downto 0); + signal v_state_i : unsigned(1 downto 0); + constant SYNC_OFF : unsigned(1 downto 0) := "00"; + constant SYNC : unsigned(1 downto 0) := "01"; + constant SYNC_BACK : unsigned(1 downto 0) := "10"; + constant ACTIVE_LINE : unsigned(1 downto 0) := "11"; + + constant H_SYNC_BACK : unsigned(11 downto 0) := H_BLANKING - H_SYNC_OFFSET - H_SYNC_WIDTH; + constant V_SYNC_BACK : unsigned(11 downto 0) := V_BLANKING - V_SYNC_OFFSET - V_SYNC_WIDTH; + + signal disp_rd_en : std_logic; + signal disp_rd_data : color_t(COLOR_CNT-1 downto 0); + + signal px_fifo_rd_en : std_logic; + signal px_fifo_full : std_logic; + signal px_fifo_empty : std_logic; + signal px_fifo_cnt : std_logic_vector(10 downto 0); + signal px_fifo_dat_out : std_logic_vector(31 downto 0); + + -- memory + signal mem_address : unsigned(27 downto 0); + signal mem_burst_len : unsigned( 5 downto 0); + signal mem_cmd_en : std_logic; + signal mem_rd_en : std_logic; + signal mem_rd_data : std_logic_vector(31 downto 0); + signal mem_rd_cnt : unsigned( 6 downto 0); + signal mem_fetch_cnt : unsigned( 5 downto 0); + signal mem_read_cnt : unsigned( 6 downto 0); + signal mem_read_wait : std_logic; + + signal new_line : std_logic; + signal new_line_q0 : std_logic; + signal new_line_q1 : std_logic; + signal new_line_q2 : std_logic; + signal new_line_q3 : std_logic; + signal new_line_s : std_logic; +begin + rst <= not rst_n; + -- ------------------------------------------------------------------------------- + -- MEMORY + -- ------------------------------------------------------------------------------- + ddr2_cmd_byte_addr_o <= std_logic_vector(mem_address(27 downto 0) & "00"); + ddr2_cmd_bl_o <= std_logic_vector(mem_burst_len); + ddr2_cmd_instr_o <= "001"; -- only read from this interface + ddr2_cmd_en_o <= mem_cmd_en; + ddr2_rd_en_o <= mem_rd_en; + mem_rd_cnt <= unsigned(ddr2_rd_count_i); + + new_line <= '1' when h_state_v = SYNC and v_state_v = ACTIVE_LINE else '0'; + new_line_s <= new_line and new_line_q0 and not new_line_q1 and not new_line_q2; + process (ddr2_clk, rst_n) + begin + if rst_n = '0' then + mem_address <= (others => '0'); + mem_cmd_en <= '0'; + mem_burst_len <= (others => '0'); + mem_fetch_cnt <= (others => '0'); + h_state_m <= (others => '0'); + h_state_v <= (others => '0'); + v_state_m <= (others => '0'); + v_state_v <= (others => '0'); + new_line_q0 <= '0'; + new_line_q1 <= '0'; + new_line_q2 <= '0'; + new_line_q3 <= '0'; + mem_read_cnt <= (others => '0'); + mem_read_wait <= '0'; + elsif rising_edge(ddr2_clk) then + new_line_q0 <= new_line; + new_line_q1 <= new_line_q0; + new_line_q2 <= new_line_q1; + new_line_q3 <= new_line_q2; + + -- synchronizer + h_state_m <= h_state; + h_state_v <= h_state_m; + v_state_m <= v_state; + v_state_v <= v_state_m; + + -- calculate memory fetch count + if new_line_s = '1' then + mem_fetch_cnt <= H_ACTIVE_PIXEL(11 downto 6); + elsif mem_cmd_en = '1' then + mem_fetch_cnt <= mem_fetch_cnt - "1"; + end if; + + -- wait state + if mem_cmd_en = '1' then + mem_read_wait <= '1'; + elsif mem_read_cnt = "0101111" and mem_read_wait = '1' then + mem_read_wait <= '0'; + end if; + + -- mem raw read count + if mem_read_cnt = x"40" and mem_rd_en = '1' then + mem_read_cnt <= "0000001"; + elsif mem_read_cnt = x"40" then + mem_read_cnt <= (others => '0'); + elsif mem_rd_en = '1' then + mem_read_cnt <= mem_read_cnt + "1"; + end if; + + mem_cmd_en <= '0'; + if ddr2_cmd_full_i = '0' and mem_fetch_cnt /= "000000" and mem_cmd_en = '0' and mem_read_wait = '0' then + mem_cmd_en <= '1'; + mem_burst_len <= "111111"; + end if; + + if v_state_v = SYNC then + mem_address <= MEM_START_ADR(29 downto 2); + elsif mem_cmd_en = '1' then + mem_address <= mem_address + x"040"; + end if; + + end if; + end process; + mem_rd_data <= ddr2_rd_data_i; + mem_rd_en <= not ddr2_rd_empty_i; + + px_fifo_0: entity work.px_fifo + port map ( + wr_clk => ddr2_clk, + rd_clk => clk, + rst => rst, + din => mem_rd_data, + wr_en => mem_rd_en, + rd_en => px_fifo_rd_en, + dout => px_fifo_dat_out, + full => px_fifo_full, + empty => px_fifo_empty, + rd_data_count => px_fifo_cnt + ); + + px_fifo_rd_en <= disp_rd_en and not px_fifo_empty; + disp_rd_en <= '1' when h_state = ACTIVE_LINE and v_state = ACTIVE_LINE else '0'; + disp_rd_data <= (px_fifo_dat_out(23 downto 16), px_fifo_dat_out(15 downto 8), px_fifo_dat_out(7 downto 0)) + when px_fifo_empty = '0' else + (x"ff", x"00", x"00"); + + -- ------------------------------------------------------------------------------- + -- DISPLAY + -- ------------------------------------------------------------------------------- + hsync_o <= '1' when h_state = SYNC and v_state = ACTIVE_LINE else '0'; + vsync_o <= '1' when v_state = SYNC else '0'; + color_en_o <= disp_rd_en; + color_o <= disp_rd_data; + --color_en_o <= '1' when h_state = ACTIVE_LINE and v_state = ACTIVE_LINE else '0'; + --color_o <= ((others => v_cnt(3)), (others => v_cnt(2)), (others => v_cnt(1))); + + process (clk, rst_n) + begin + if rst_n = '0' then + h_cnt <= x"000"; + v_cnt <= x"000"; + v_state <= "00"; + v_state_i <= "00"; + h_state <= "00"; + h_state_i <= "00"; + one_screen <= '0'; + elsif rising_edge(clk) then + if v_state = ACTIVE_LINE and v_cnt = x"000" then + one_screen <= '0'; + elsif en_stb_i = '1' then + one_screen <= '1'; + end if; + + if one_screen = '1' and h_cnt = x"000" then + h_state <= h_state_i; + case h_state_i is + when SYNC_OFF => h_cnt <= H_SYNC_OFFSET-1; + when SYNC => h_cnt <= H_SYNC_WIDTH-1; + when SYNC_BACK => h_cnt <= H_SYNC_BACK-1; + when ACTIVE_LINE => h_cnt <= H_ACTIVE_PIXEL-1; + when others => h_cnt <= x"000"; + end case; + elsif h_cnt /= x"000" then + h_cnt <= h_cnt - "1"; + end if; + + if one_screen = '1' and h_cnt = x"000" then + h_state_i <= h_state_i + "01"; + end if; + + if one_screen = '1' and v_cnt = x"000" and h_state = SYNC_OFF then + v_state <= v_state_i; + case v_state_i is + when SYNC_OFF => v_cnt <= x"0" & V_SYNC_OFFSET; + when SYNC => v_cnt <= x"0" & V_SYNC_WIDTH; + when SYNC_BACK => v_cnt <= V_SYNC_BACK; + when ACTIVE_LINE => v_cnt <= V_ACTIVE_LINES; + when others => v_cnt <= x"000"; + end case; + elsif v_cnt /= x"000" and (h_state = ACTIVE_LINE and h_cnt = x"000") then + v_cnt <= v_cnt - "1"; + end if; + + if one_screen = '1' and v_cnt = x"000" then + v_state_i <= v_state_i + "01"; + end if; + end if; + end process; +end sig_read; diff --git a/fpga/src/sig/sig_read_tb.vhd b/fpga/src/sig/sig_read_tb.vhd new file mode 100644 index 0000000..ccba289 --- /dev/null +++ b/fpga/src/sig/sig_read_tb.vhd @@ -0,0 +1,263 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.dvi_package.all; + +ENTITY sig_read_tb IS +END sig_read_tb; + +ARCHITECTURE rtl OF sig_read_tb IS + constant CLK_PERIOD : time := 10 ns; + constant CLK_PERIOD2: time := 5 ns; + signal clk : std_logic; + signal ddr2_clk : std_logic; + signal rst : std_logic; + signal rst_n : std_logic; + + signal en_stb_i : std_logic; + signal hsync_o : std_logic; + signal vsync_o : std_logic; + signal color_en_o : std_logic; + signal color_o : color_t(COLOR_CNT-1 downto 0); + signal ddr2_rd_cmd_en_o : std_logic; + signal ddr2_rd_cmd_instr_o : std_logic_vector( 2 downto 0); + signal ddr2_rd_cmd_bl_o : std_logic_vector( 5 downto 0); + signal ddr2_rd_cmd_byte_addr_o : std_logic_vector(29 downto 0); + signal ddr2_rd_cmd_empty_i : std_logic; + signal ddr2_rd_cmd_full_i : std_logic; + signal ddr2_rd_en_o : std_logic; + signal ddr2_rd_data_i : std_logic_vector(31 downto 0); + signal ddr2_rd_full_i : std_logic; + signal ddr2_rd_empty_i : std_logic; + signal ddr2_rd_count_i : std_logic_vector( 6 downto 0); + signal ddr2_rd_overflow_i : std_logic; + signal ddr2_rd_error_i : std_logic; + signal ddr2_wr_cmd_en_o : std_logic; + signal ddr2_wr_cmd_instr_o : std_logic_vector( 2 downto 0); + signal ddr2_wr_cmd_bl_o : std_logic_vector( 5 downto 0); + signal ddr2_wr_cmd_byte_addr_o : std_logic_vector(29 downto 0); + signal ddr2_wr_cmd_empty_i : std_logic; + signal ddr2_wr_cmd_full_i : std_logic; + signal ddr2_wr_en_o : std_logic; + signal ddr2_wr_mask_o : std_logic_vector( 3 downto 0); + signal ddr2_wr_data_o : std_logic_vector(31 downto 0); + signal ddr2_wr_full_i : std_logic; + signal ddr2_wr_empty_i : std_logic; + signal ddr2_wr_count_i : std_logic_vector( 6 downto 0); + signal ddr2_wr_underrun_i : std_logic; + signal ddr2_wr_error_i : std_logic; + signal wr_cnt : unsigned( 7 downto 0); + signal wr_lat : unsigned( 7 downto 0); + + signal en_stb_iq : std_logic; + signal hsync_oq : std_logic; + signal vsync_oq : std_logic; + signal color_en_oq : std_logic; + signal color_oq : color_t(COLOR_CNT-1 downto 0); + + signal req_cnt : unsigned(15 downto 0); + signal req_save_cnt : unsigned(15 downto 0); + signal lat_cnt : unsigned(15 downto 0); + signal latency_done : std_logic; + signal latency : std_logic; +BEGIN + rst <= transport '1', '0' after ( 4 * CLK_PERIOD); + rst_n <= not rst; + + clock: process + begin + clk <= '1', '0' after CLK_PERIOD/2; + wait for CLK_PERIOD; + end process; + ddr_clk: process + begin + ddr2_clk <= '1', '0' after CLK_PERIOD2/2; + wait for CLK_PERIOD2; + end process; + + reg: process begin + wait until rising_edge(clk); + en_stb_iq <= en_stb_i; + hsync_o <= hsync_oq; + vsync_o <= vsync_oq; + color_o <= color_oq; + color_en_o <= color_en_oq; + end process; + + dut_writ: entity work.sig_write + port map ( + clk => clk, + rst_n => rst_n, + ctrl_disable_wr => '0', + + ddr2_clk => ddr2_clk, + ddr2_cmd_en_o => ddr2_wr_cmd_en_o, + ddr2_cmd_instr_o => ddr2_wr_cmd_instr_o, + ddr2_cmd_bl_o => ddr2_wr_cmd_bl_o, + ddr2_cmd_byte_addr_o => ddr2_wr_cmd_byte_addr_o, + ddr2_cmd_empty_i => ddr2_wr_cmd_empty_i, + ddr2_cmd_full_i => ddr2_wr_cmd_full_i, + ddr2_wr_en_o => ddr2_wr_en_o, + ddr2_wr_mask_o => ddr2_wr_mask_o, + ddr2_wr_data_o => ddr2_wr_data_o, + ddr2_wr_full_i => ddr2_wr_full_i, + ddr2_wr_empty_i => ddr2_wr_empty_i, + ddr2_wr_count_i => ddr2_wr_count_i, + ddr2_wr_underrun_i => ddr2_wr_underrun_i, + ddr2_wr_error_i => ddr2_wr_error_i, + + hsync_i => hsync_o, + vsync_i => vsync_o, + color_en_i => color_en_o, + color_i => color_o + ); + + mem_wr: process begin + ddr2_wr_cmd_empty_i <= '1'; + ddr2_wr_underrun_i <= '0'; + ddr2_wr_error_i <= '0'; + wait; + end process; + + ddr2_wr_empty_i <= '1' when wr_cnt = 0 else '0'; + ddr2_wr_full_i <= wr_cnt(7); + ddr2_wr_count_i <= std_logic_vector(wr_cnt(6 downto 0)); + ddr2_wr_cmd_full_i <= '1' when wr_lat /= x"00" else '0'; + mem_wr_l: process (ddr2_clk, rst_n) + begin + if rst_n = '0' then + wr_cnt <= (others => '0'); + wr_lat <= (others => '0'); + elsif rising_edge(ddr2_clk) then + if wr_lat <= x"10" and wr_lat > x"00" and ddr2_wr_en_o = '1' then + wr_cnt <= wr_cnt - x"03"; + elsif wr_lat <= x"10" and wr_lat > x"00" then + wr_cnt <= wr_cnt - x"04"; + elsif ddr2_wr_en_o = '1' then + wr_cnt <= wr_cnt + "1"; + end if; + + if ddr2_wr_cmd_en_o = '1' then + wr_lat <= x"11"; + end if; + + if wr_lat /= x"00" then + wr_lat <= wr_lat - "1"; + end if; + end if; + end process; + + dut_read: entity work.sig_read + generic map ( + H_ACTIVE_PIXEL => x"500", + H_BLANKING => x"198", + H_SYNC_WIDTH => x"070", + H_SYNC_OFFSET => x"030", + V_ACTIVE_LINES => x"400", + V_BLANKING => x"02a", + V_SYNC_WIDTH => x"01", + V_SYNC_OFFSET => x"03" + ) + port map ( + clk => clk, + rst_n => rst_n, + + ddr2_clk => ddr2_clk, + ddr2_cmd_en_o => ddr2_rd_cmd_en_o, + ddr2_cmd_instr_o => ddr2_rd_cmd_instr_o, + ddr2_cmd_bl_o => ddr2_rd_cmd_bl_o, + ddr2_cmd_byte_addr_o => ddr2_rd_cmd_byte_addr_o, + ddr2_cmd_empty_i => ddr2_rd_cmd_empty_i, + ddr2_cmd_full_i => ddr2_rd_cmd_full_i, + ddr2_rd_en_o => ddr2_rd_en_o, + ddr2_rd_data_i => ddr2_rd_data_i, + ddr2_rd_full_i => ddr2_rd_full_i, + ddr2_rd_empty_i => ddr2_rd_empty_i, + ddr2_rd_count_i => ddr2_rd_count_i, + ddr2_rd_overflow_i => ddr2_rd_overflow_i, + ddr2_rd_error_i => ddr2_rd_error_i, + + en_stb_i => en_stb_iq, + hsync_o => hsync_oq, + vsync_o => vsync_oq, + color_en_o => color_en_oq, + color_o => color_oq + ); + + beh: process begin + en_stb_i <= '0'; + wait for 20*CLK_PERIOD; + en_stb_i <= '1'; + --wait for CLK_PERIOD; + --en_stb_i <= '0'; + wait; + end process; + + mem_rd: process begin + ddr2_rd_cmd_empty_i <= '1'; + ddr2_rd_data_i <= (others => '0'); + ddr2_rd_overflow_i <= '0'; + ddr2_rd_error_i <= '0'; + wait; + end process; + ddr2_rd_count_i <= std_logic_vector(req_cnt(6 downto 0)); + ddr2_rd_empty_i <= '0' when req_cnt /= x"0000" else '1'; + ddr2_rd_cmd_full_i <= '1' when req_save_cnt /= x"0000" else '0'; + ddr2_rd_full_i <= '1' when req_cnt = x"0040" else '0'; + + latency_done <= '1' when lat_cnt = x"0001" else '0'; + mem_rd_l: process (ddr2_clk, rst_n) + begin + if rst_n = '0' then + req_cnt <= (others => '0'); + req_save_cnt <= (others => '0'); + lat_cnt <= (others => '0'); + latency <= '1'; + elsif rising_edge(ddr2_clk) then + if ddr2_rd_cmd_en_o = '1' then + req_save_cnt <= x"00" & "00" & unsigned(ddr2_rd_cmd_bl_o) + "1"; + lat_cnt <= x"0020"; + elsif latency_done = '1' then + req_save_cnt <= (others => '0'); + end if; + + if lat_cnt /= x"0000" then + lat_cnt <= lat_cnt - "1"; + end if; + + if latency_done = '1' and ddr2_rd_en_o = '1' then + req_cnt <= req_cnt + req_save_cnt - "1"; + elsif latency_done = '1' then + req_cnt <= req_cnt + req_save_cnt; + elsif ddr2_rd_en_o = '1' and req_cnt /= x"0000" then + req_cnt <= req_cnt - "1"; + end if; + end if; + end process; +end rtl; + +configuration sig_read_tb_rtl_cfg of sig_read_tb is + for rtl + end for; +end sig_read_tb_rtl_cfg; diff --git a/fpga/src/sig/sig_tb.vhd b/fpga/src/sig/sig_tb.vhd new file mode 100644 index 0000000..631b34a --- /dev/null +++ b/fpga/src/sig/sig_tb.vhd @@ -0,0 +1,112 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.dvi_package.all; + +ENTITY sig_tb IS +END sig_tb; + +ARCHITECTURE rtl OF sig_tb IS + constant CLK_PERIOD : time := 20 ns; + signal clk : std_logic; + signal rst : std_logic; + signal rst_n : std_logic; + + signal en_stb_i : std_logic; + signal hsync_o : std_logic; + signal vsync_o : std_logic; + signal color_en_o : std_logic; + signal color_o : color_t(COLOR_CNT-1 downto 0); + + signal en_stb_iq : std_logic; + signal hsync_oq : std_logic; + signal vsync_oq : std_logic; + signal color_en_oq : std_logic; + signal color_oq : color_t(COLOR_CNT-1 downto 0); +BEGIN + rst <= transport '1', '0' after ( 4 * CLK_PERIOD); + rst_n <= not rst; + + clock: process + begin + clk <= '1', '0' after CLK_PERIOD/2; + wait for CLK_PERIOD; + end process; + + reg: process begin + wait until rising_edge(clk); + en_stb_iq <= en_stb_i; + hsync_o <= hsync_oq; + vsync_o <= vsync_oq; + color_o <= color_oq; + color_en_o <= color_en_oq; + end process; + + dut: entity work.sig + generic map ( + H_ACTIVE_PIXEL => x"500", + H_BLANKING => x"198", + H_SYNC_WIDTH => x"070", + H_SYNC_OFFSET => x"030", + V_ACTIVE_LINES => x"400", + V_BLANKING => x"02a", + V_SYNC_WIDTH => x"01", + V_SYNC_OFFSET => x"03" + ) + port map ( + clk => clk, + rst_n => rst_n, + + en_stb_i => en_stb_iq, + hsync_o => hsync_oq, + vsync_o => vsync_oq, + color_en_o => color_en_oq, + color_o => color_oq + ); + + dut2: entity work.vga + port map ( + pixelClock => clk, + Red => open, + Green => open, + Blue => open, + hSync => open, + vSync => open, + blank => open + ); + + beh: process begin + en_stb_i <= '0'; + wait for 20*CLK_PERIOD; + en_stb_i <= '1'; + --wait for CLK_PERIOD; + --en_stb_i <= '0'; + wait; + end process; +end rtl; + +configuration sig_tb_rtl_cfg of sig_tb is + for rtl + end for; +end sig_tb_rtl_cfg; diff --git a/fpga/src/sig/sig_write.vhd b/fpga/src/sig/sig_write.vhd new file mode 100644 index 0000000..0966e53 --- /dev/null +++ b/fpga/src/sig/sig_write.vhd @@ -0,0 +1,171 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.dvi_package.all; + +entity sig_write is + generic ( + MEM_START_ADR : unsigned(29 downto 0) := "00" & x"0000000" + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + ctrl_disable_wr : in std_logic; + + -- memory interface + ddr2_clk : in std_logic; + ddr2_cmd_en_o : out std_logic; + ddr2_cmd_instr_o : out std_logic_vector( 2 downto 0); + ddr2_cmd_bl_o : out std_logic_vector( 5 downto 0); + ddr2_cmd_byte_addr_o : out std_logic_vector(29 downto 0); + ddr2_cmd_empty_i : in std_logic; + ddr2_cmd_full_i : in std_logic; + + ddr2_wr_en_o : out std_logic; + ddr2_wr_mask_o : out std_logic_vector( 3 downto 0); + ddr2_wr_data_o : out std_logic_vector(31 downto 0); + ddr2_wr_full_i : in std_logic; + ddr2_wr_empty_i : in std_logic; + ddr2_wr_count_i : in std_logic_vector( 6 downto 0); + ddr2_wr_underrun_i : in std_logic; + ddr2_wr_error_i : in std_logic; + + -- display output + hsync_i : in std_logic; + vsync_i : in std_logic; + color_en_i : in std_logic; + color_i : in color_t(COLOR_CNT-1 downto 0) + ); +end sig_write; + +architecture sig_write of sig_write is + signal color_en_l : std_logic; + signal color_en_iq : std_logic; + signal rst : std_logic; + signal px_fifo_wr : std_logic; + signal px_fifo_full : std_logic; + signal px_fifo_empty : std_logic; + signal px_fifo_cnt : std_logic_vector(10 downto 0); + signal px_fifo_din : std_logic_vector(31 downto 0); + signal enabled : std_logic; + signal vsync : std_logic; + signal vsync_m : std_logic; + signal vsync_v : std_logic; + signal vsync_vq : std_logic; + signal vsync_sh : std_logic_vector( 3 downto 0); + + -- memory + signal mem_address : unsigned(27 downto 0); + signal mem_cmd_en : std_logic; + signal mem_wr_en : std_logic; + signal mem_wr_data : std_logic_vector(31 downto 0); + signal px_cnt : unsigned( 7 downto 0); +begin + rst <= not rst_n; + + -- ------------------------------------------------------------------------------- + -- MEMORY + -- ------------------------------------------------------------------------------- + ddr2_cmd_byte_addr_o <= std_logic_vector(mem_address(27 downto 0) & "00"); + ddr2_cmd_bl_o <= "111111"; + ddr2_cmd_instr_o <= "000"; + ddr2_cmd_en_o <= mem_cmd_en; + ddr2_wr_data_o <= mem_wr_data; + ddr2_wr_en_o <= mem_wr_en; + ddr2_wr_mask_o <= (others => '0'); + + process (clk, rst_n) + begin + if rst_n = '0' then + enabled <= '0'; + vsync <= '0'; + elsif rising_edge(clk) then + -- eliminate glitches + vsync_sh <= vsync_sh(2 downto 0) & vsync_i; + if vsync_sh = "1111" then + vsync <= '1'; + elsif vsync_sh = "0000" then + vsync <= '0'; + end if; + + -- freeze frame switch + if vsync = '1' then + if ctrl_disable_wr = '1' then + enabled <= '0'; + else + enabled <= '1'; + end if; + end if; + end if; + end process; + + px_fifo_wr <= color_en_i and enabled; + px_fifo_din <= (31 downto 24 => '0') & color_i(RED) & color_i(GREEN) & color_i(BLUE); + px_fifo_0: entity work.px_fifo + port map ( + wr_clk => clk, + rd_clk => ddr2_clk, + rst => rst, + din => px_fifo_din, + wr_en => px_fifo_wr, + rd_en => mem_wr_en, + dout => mem_wr_data, + full => px_fifo_full, + empty => px_fifo_empty, + rd_data_count => px_fifo_cnt + ); + + mem_wr_en <= '1' when px_fifo_empty = '0' and ddr2_wr_full_i = '0' else '0'; + mem_cmd_en <= '1' when px_cnt = x"40" else '0'; + process (ddr2_clk, rst_n) + begin + if rst_n = '0' then + px_cnt <= (others => '0'); + mem_address <= (others => '0'); + vsync_m <= '0'; + vsync_v <= '0'; + vsync_vq <= '0'; + elsif rising_edge(ddr2_clk) then + -- signal synchronizer + vsync_m <= vsync; + vsync_v <= vsync_m; + vsync_vq <= vsync_v; + + if mem_cmd_en = '1' and mem_wr_en = '1' then + px_cnt <= x"01"; + elsif mem_cmd_en = '1' then + px_cnt <= (others => '0'); + elsif mem_wr_en = '1' then + px_cnt <= px_cnt + "1"; + end if; + + if vsync_vq = '1' and vsync_v = '0' then + mem_address <= MEM_START_ADR(29 downto 2); + elsif mem_cmd_en = '1' then + mem_address <= mem_address + x"040"; + end if; + end if; + end process; + +end sig_write; diff --git a/fpga/src/snippets b/fpga/src/snippets new file mode 160000 index 0000000..8893270 --- /dev/null +++ b/fpga/src/snippets @@ -0,0 +1 @@ +Subproject commit 8893270fc31fcf66f3da8d233ec515120bb14f71 diff --git a/fpga/src/top/atlys.ucf b/fpga/src/top/atlys.ucf new file mode 100644 index 0000000..2ac82fa --- /dev/null +++ b/fpga/src/top/atlys.ucf @@ -0,0 +1,93 @@ +#FPGA_PART=xc6slx45-3-csg324 +CONFIG VCCAUX = 3.3; + +############################################################################## +# SYSCLK Input +############################################################################## +NET "clk100" LOC = "L15" | IOSTANDARD = LVCMOS33 | TNM_NET = clk100; +TIMESPEC TS_clk100 = PERIOD "clk100" 100 MHz HIGH 50%; + +# Constraint for RX0 +NET "dvi_decoder_0/rxclk" TNM_NET = DVI_CLOCK0; +TIMESPEC TS_DVI_CLOCK0 = PERIOD "DVI_CLOCK0" 100 MHz HIGH 50%; + +############################################################################## +# Mechanical Switches (SW) +############################################################################## +#NET "switch<0>" LOC = "A10" |IOSTANDARD = LVCMOS33 ; +#NET "switch<1>" LOC = "D14" |IOSTANDARD = LVCMOS33 ; +#NET "switch<2>" LOC = "C14" | IOSTANDARD = LVCMOS33 ; +#NET "switch<3>" LOC = "P15" | IOSTANDARD = LVCMOS33 ; + +############################################# +## TMDS pairs for Atlys top OUT: J2 - Bank 0 +############################################# +NET "tx0_tmds(3)" LOC = "B6" |IOSTANDARD = TMDS_33 ; # Clock +NET "tx0_tmds_n(3)" LOC = "A6" |IOSTANDARD = TMDS_33 ; +NET "tx0_tmds(2)" LOC = "B8" |IOSTANDARD = TMDS_33 ; # Red +NET "tx0_tmds_n(2)" LOC = "A8" |IOSTANDARD = TMDS_33 ; +NET "tx0_tmds(1)" LOC = "C7" |IOSTANDARD = TMDS_33 ; # Green +NET "tx0_tmds_n(1)" LOC = "A7" |IOSTANDARD = TMDS_33 ; +NET "tx0_tmds(0)" LOC = "D8" |IOSTANDARD = TMDS_33 ; # Blue +NET "tx0_tmds_n(0)" LOC = "C8" |IOSTANDARD = TMDS_33 ; +# +############################################### +## TMDS pairs for Atlys top OUT: JA - Bank 2 +## Use TML_33 to add output series termination +############################################### +#NET "tx1_tmds(3)" LOC = "T9" |IOSTANDARD = TML_33; #TMDS_33 ; ## Clock +#NET "tx1_tmds_n(3)" LOC = "V9" |IOSTANDARD = TML_33; #TMDS_33 ; # +#NET "tx1_tmds(2)" LOC = "N5" |IOSTANDARD = TML_33; #TMDS_33 ; ## Red +#NET "tx1_tmds_n(2)" LOC = "P6" |IOSTANDARD = TML_33; #TMDS_33 ; # +#NET "tx1_tmds(1)" LOC = "T4" |IOSTANDARD = TML_33; #TMDS_33 ; ## Green +#NET "tx1_tmds_n(1)" LOC = "V4" |IOSTANDARD = TML_33; #TMDS_33 ; # +#NET "tx1_tmds(0)" LOC = "R3" |IOSTANDARD = TML_33; #TMDS_33 ; ## Blue +#NET "tx1_tmds_n(0)" LOC = "T3" |IOSTANDARD = TML_33; #TMDS_33 ; # +# +################################################### +## TMDS pairs for Atlys IN (FPGA Bank 1): J3 +################################################### +#NET "rx1_tmds(3)" LOC = "H17" |IOSTANDARD = TMDS_33 ; # CLK +#NET "rx1_tmds_n(3)" LOC = "H18" |IOSTANDARD = TMDS_33 ; +#NET "rx1_tmds(2)" LOC = "J16" |IOSTANDARD = TMDS_33 ; # Red +#NET "rx1_tmds_n(2)" LOC = "J18" |IOSTANDARD = TMDS_33 ; +#NET "rx1_tmds(1)" LOC = "L17" |IOSTANDARD = TMDS_33 ; # Green +#NET "rx1_tmds_n(1)" LOC = "L18" |IOSTANDARD = TMDS_33 ; +#NET "rx1_tmds(0)" LOC = "K17" |IOSTANDARD = TMDS_33 ; # Blue +#NET "rx1_tmds_n(0)" LOC = "K18" |IOSTANDARD = TMDS_33 ; +# +############################################### +## TMDS pairs for Atlys IN (FPGA Bank 0): J1 +############################################### +NET "rx0_tmds(3)" LOC = "D11" |IOSTANDARD = TMDS_33 ; # CLK +NET "rx0_tmds_n(3)" LOC = "C11" |IOSTANDARD = TMDS_33 ; +NET "rx0_tmds(2)" LOC = "B12" |IOSTANDARD = TMDS_33 ; # Red +NET "rx0_tmds_n(2)" LOC = "A12" |IOSTANDARD = TMDS_33 ; +NET "rx0_tmds(1)" LOC = "B11" |IOSTANDARD = TMDS_33 ; # Green +NET "rx0_tmds_n(1)" LOC = "A11" |IOSTANDARD = TMDS_33 ; +NET "rx0_tmds(0)" LOC = "G9" |IOSTANDARD = TMDS_33 ; # Blue +NET "rx0_tmds_n(0)" LOC = "F9" |IOSTANDARD = TMDS_33 ; +NET "rx0_scl" LOC = "C13" |IOSTANDARD = LVCMOS33 ; +NET "rx0_sda" LOC = "A13" |IOSTANDARD = LVCMOS33 ; + + +######################################## +# Reset button and LEDs and Mechanical Switches (SW) +######################################## +NET "rstbtn_n" LOC = "T15" |IOSTANDARD = LVCMOS33; +NET "led<0>" LOC = "U18" |IOSTANDARD = LVCMOS33; +NET "led<1>" LOC = "M14" |IOSTANDARD = LVCMOS33; +NET "led<2>" LOC = "N14" |IOSTANDARD = LVCMOS33; +NET "led<3>" LOC = "L14" |IOSTANDARD = LVCMOS33; +NET "led<4>" LOC = "M13" |IOSTANDARD = LVCMOS33; +NET "led<5>" LOC = "D4" |IOSTANDARD = LVCMOS33; +NET "led<6>" LOC = "P16" |IOSTANDARD = LVCMOS33; +NET "led<7>" LOC = "N12" |IOSTANDARD = LVCMOS33; + +# Multi-cycle paths for TX0 / encoder_0 +#TIMEGRP "bramgrp_0" = RAMS(dvi_encoder_0/pixel2x/data_i<*>); +#TIMEGRP "fddbgrp_0" = FFS(dvi_encoder_0/pixel2x/db<*>); +#TIMEGRP "bramra_0" = FFS(dvi_encoder_0/pixel2x/ra<*>); +# +#TIMESPEC "TS_ramdo_0" = FROM "bramgrp_0" TO "fddbgrp_0" TS_DVI_CLOCK0; +#TIMESPEC "TS_ramra_0" = FROM "bramra_0" TO "fddbgrp_0" TS_DVI_CLOCK0; diff --git a/fpga/src/top/atlys.vhd b/fpga/src/top/atlys.vhd new file mode 100644 index 0000000..b31b7d5 --- /dev/null +++ b/fpga/src/top/atlys.vhd @@ -0,0 +1,275 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.dvi_package.all; + +library work; +use work.all; + +library UNISIM; +use UNISIM.Vcomponents.all; + +entity atlys is + generic ( MODE : string := "encode"); + --generic ( MODE : string := "direct"); + port ( + rstbtn_n : in std_logic; -- The pink reset button + clk100 : in std_logic; -- 100 MHz osicallator + + tx0_tmds : out std_logic_vector(3 downto 0); + tx0_tmds_n : out std_logic_vector(3 downto 0); + rx0_tmds : in std_logic_vector(3 downto 0); + rx0_tmds_n : in std_logic_vector(3 downto 0); + rx0_sda : inout std_logic; + rx0_scl : in std_logic; + + tx1_tmds : out std_logic_vector(3 downto 0); + tx1_tmds_n : out std_logic_vector(3 downto 0); + rx1_tmds : in std_logic_vector(3 downto 0); + rx1_tmds_n : in std_logic_vector(3 downto 0); + + switch : in std_logic_vector(1 downto 0); + led : out std_logic_vector(7 downto 0) + ); +end atlys; + +architecture top of atlys is + signal rstbtn : std_logic; + signal rst_n : std_logic; + signal rst : std_logic; + signal pclk : std_logic; + signal pclkx2 : std_logic; + signal pclkx10 : std_logic; + signal pllclk1 : std_logic; + signal pllclk1bg : std_logic; + signal pll_lckd : std_logic; + signal serdesstrobe : std_logic; + signal tmdsclk : std_logic; + signal hsync : std_logic; + signal vsync : std_logic; + signal dat_en : std_logic; + signal valid : std_logic_vector(COLOR_CNT-1 downto 0); + signal ready : std_logic_vector(COLOR_CNT-1 downto 0); + signal psalgnerr : std_logic; + signal color : color_t(COLOR_CNT-1 downto 0); + signal sdout : sdat_t(COLOR_CNT-1 downto 0); + signal rx0_sda_i : std_logic; + signal rx0_sda_o : std_logic; + signal rx0_tmds_s : std_logic_vector(3 downto 0); + + signal toggle : std_logic; + signal tmdsclkint : std_logic_vector(4 downto 0); + type tmds_data_t is array(natural range <>) of std_logic_vector(4 downto 0); + signal tmds_data : tmds_data_t(COLOR_CNT-1 downto 0); + signal tmdsint : std_logic_vector(2 downto 0); + signal tmds_clk : std_logic; + signal sdata : std_logic_vector(29 downto 0); + + signal tx0_pclkx2 : std_logic; + signal tx0_pclkx10 : std_logic; + signal tx0_reset_n : std_logic; + signal tx0_serdesstrobe : std_logic; + signal tx0_clkfbout : std_logic; + signal tx0_clkfbin : std_logic; + signal tx0_plllckd : std_logic; + signal tx0_pllclk0 : std_logic; + signal tx0_pllclk2 : std_logic; + signal tx0_bufpll_lock : std_logic; +begin + rstbtn <= not rstbtn_n; + rst <= not rst_n; + led <= ready(RED) & ready(GREEN) & ready(BLUE) & valid(RED) & valid(GREEN) & valid(BLUE) & dat_en & rst_n; + + dvi_decoder_0: entity work.dvi_decoder + port map ( + ext_rst => rstbtn, + + tmdsclk_p => rx0_tmds(3), + tmdsclk_n => rx0_tmds_n(3), + din_p => rx0_tmds(2 downto 0), + din_n => rx0_tmds_n(2 downto 0), + + reset_n => rst_n, -- rx reset + pclk_o => pclk, -- regenerated pixel clock + pclkx2_o => pclkx2, -- double rate pixel clock + pclkx10_o => pclkx10, -- 10x pixel as IOCLK + + pll_lckd_o => pll_lckd, -- send pll_lckd out so it can be fed into a different BUFPLL + serdesstrobe_o => serdesstrobe, -- BUFPLL serdesstrobe output + tmdsclk_o => tmdsclk, -- TMDS cable clock + + hsync_o => hsync, -- hsync data + vsync_o => vsync, -- vsync data + dat_en_o => dat_en, -- data enable + valid_o => valid, + ready_o => ready, + psalgnerr_o => psalgnerr, + sdout_o => sdout, + color_o => color + ); + +direct: if MODE = "direct" generate + -- ---------------------------------------------------------- + -- Forward TMDS Clock Using OSERDES2 block + -- ---------------------------------------------------------- + process (pclkx2, rst_n) + begin + if rst_n = '0' then + toggle <= '0'; + tmdsclkint <= (others => '0'); + elsif rising_edge(pclkx2) then + toggle <= not toggle; + if toggle = '1' then + tmdsclkint <= (others => '1'); + else + tmdsclkint <= (others => '0'); + end if; + end if; + end process; + + clkout: entity work.serdes_n_to_1 + generic map (SF => 5) + port map ( + ioclk => pclkx10, + gclk => pclkx2, + rst => rst, + serdesstrobe_i => serdesstrobe, + data_i => tmdsclkint, + data_o => tmds_clk + ); + + TMDS3: OBUFDS port map (I => tmds_clk, O => tx0_tmds(3), OB => tx0_tmds_n(3)); -- clock + + d: for I in 0 to COLOR_CNT-1 generate + outI: entity work.serdes_n_to_1 + generic map (SF => 5) + port map ( + ioclk => pclkx10, + gclk => pclkx2, + rst => rst, + serdesstrobe_i => serdesstrobe, + data_i => tmds_data(I), + data_o => tmdsint(I) + ); + tx_tmdsI: OBUFDS port map (i => tmdsint(I), o => tx0_tmds(I), ob => tx0_tmds_n(I)); + end generate; + + sdata <= sdout(RED)(9 downto 5) & sdout(GREEN)(9 downto 5) & sdout(BLUE)(9 downto 5) + & sdout(RED)(4 downto 0) & sdout(GREEN)(4 downto 0) & sdout(BLUE)(4 downto 0); + pixel2x: entity work.convert_30to15_fifo + port map ( + rst => rst, + clk => pclk, + clkx2 => pclkx2, + data_i => sdata, + data_o( 4 downto 0) => tmds_data(0), + data_o( 9 downto 5) => tmds_data(1), + data_o(14 downto 10) => tmds_data(2) + ); +end generate; + +decode: if MODE = "encode" generate + -- ---------------------------------------------------------------------------- + -- Instantiate a dedicate PLL for output port + -- ---------------------------------------------------------------------------- + pll_oserdes_0: PLL_BASE + generic map ( + CLKIN_PERIOD => 10.0, + CLKFBOUT_MULT => 10, --set VCO to 10x of CLKIN + CLKOUT0_DIVIDE => 1, + CLKOUT1_DIVIDE => 10, + CLKOUT2_DIVIDE => 5, + COMPENSATION => "SOURCE_SYNCHRONOUS" + ) + port map ( + CLKFBOUT => tx0_clkfbout, + CLKOUT0 => tx0_pllclk0, + CLKOUT1 => open, + CLKOUT2 => tx0_pllclk2, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => tx0_plllckd, + CLKFBIN => tx0_clkfbin, + CLKIN => pclk, -- pllclk1bg, + RST => rst + ); + + -- ---------------------------------------------------------------------------- + -- This BUFG is needed in order to deskew between PLL clkin and clkout + -- So the tx0 pclkx2 and pclkx10 will have the same phase as the pclk input + -- ---------------------------------------------------------------------------- + tx0_clkfb_buf: BUFG port map(I => tx0_clkfbout, O => tx0_clkfbin); + + -- -------------------------------- + -- regenerate pclkx2 for TX + -- -------------------------------- + tx0_pclkx2_buf: BUFG port map(I => tx0_pllclk2, O => tx0_pclkx2); + + -- -------------------------------- + -- regenerate pclkx10 for TX + -- -------------------------------- + tx0_ioclk_buf: BUFPLL + generic map ( DIVIDE => 5 ) + port map ( + PLLIN => tx0_pllclk0, + GCLK => tx0_pclkx2, + LOCKED => tx0_plllckd, + IOCLK => tx0_pclkx10, + SERDESSTROBE => tx0_serdesstrobe, + LOCK => tx0_bufpll_lock + ); + tx0_reset_n <= tx0_bufpll_lock; + + dvi_encoder_0: entity work.dvi_encoder + port map ( + rst_n => tx0_reset_n, + pclk => pclk, + pclkx2 => tx0_pclkx2, + pclkx10 => tx0_pclkx10, + serdesstrobe_i => tx0_serdesstrobe, + color_i => color, + hsync_i => hsync, + vsync_i => vsync, + dat_en_i => dat_en, + tmds_p => tx0_tmds, + tmds_n => tx0_tmds_n + ); +end generate; + + -- ---------------------------------------------------------------------------- + -- I2C EDID Emulation + -- ---------------------------------------------------------------------------- + rx0_sda_i <= rx0_sda; + rx0_sda <= '0' when rx0_sda_o = '0' else 'Z'; + i2c_rom_0: entity work.i2c_rom + port map ( + clk => clk100, + rst_n => rstbtn_n, + sda_i => rx0_sda_i, + sda_o => rx0_sda_o, + scl_i => rx0_scl + ); + +end top; diff --git a/fpga/src/top/atlys_sig.ucf b/fpga/src/top/atlys_sig.ucf new file mode 100644 index 0000000..7345344 --- /dev/null +++ b/fpga/src/top/atlys_sig.ucf @@ -0,0 +1,196 @@ +#FPGA_PART=xc6slx45-3-csg324 +CONFIG VCCAUX = 3.3; + +############################################################################## +# SYSCLK Input +############################################################################## +NET "clk100" LOC = "L15" | IOSTANDARD = LVCMOS33 | TNM_NET = clk100; +TIMESPEC TS_clk100 = PERIOD "clk100" 100 MHz HIGH 50%; + +# Constraint for RX0 +NET "dvi2ddr_0/dvi_decoder_0/rxclk" TNM_NET = DVI_CLOCK0; +TIMESPEC TS_DVI_CLOCK0 = PERIOD "DVI_CLOCK0" 100 MHz HIGH 50%; + +############################################################################## +# Mechanical Switches (SW) +############################################################################## +NET "switch<0>" LOC = "A10" |IOSTANDARD = LVCMOS33 ; +#NET "switch<1>" LOC = "D14" |IOSTANDARD = LVCMOS33 ; +#NET "switch<2>" LOC = "C14" | IOSTANDARD = LVCMOS33 ; +#NET "switch<3>" LOC = "P15" | IOSTANDARD = LVCMOS33 ; + +############################################# +## TMDS pairs for Atlys top OUT: J2 - Bank 0 +############################################# +NET "tx0_tmds(3)" LOC = "B6" | IOSTANDARD = TMDS_33 ; # Clock +NET "tx0_tmds_n(3)" LOC = "A6" | IOSTANDARD = TMDS_33 ; +NET "tx0_tmds(2)" LOC = "B8" | IOSTANDARD = TMDS_33 ; # Red +NET "tx0_tmds_n(2)" LOC = "A8" | IOSTANDARD = TMDS_33 ; +NET "tx0_tmds(1)" LOC = "C7" | IOSTANDARD = TMDS_33 ; # Green +NET "tx0_tmds_n(1)" LOC = "A7" | IOSTANDARD = TMDS_33 ; +NET "tx0_tmds(0)" LOC = "D8" | IOSTANDARD = TMDS_33 ; # Blue +NET "tx0_tmds_n(0)" LOC = "C8" | IOSTANDARD = TMDS_33 ; + +############################################### +## TMDS pairs for Atlys top OUT: JA - Bank 2 +## Use TML_33 to add output series termination +############################################### +#NET "tx1_tmds(3)" LOC = "T9" |IOSTANDARD = TML_33; #TMDS_33 ; ## Clock +#NET "tx1_tmds_n(3)" LOC = "V9" |IOSTANDARD = TML_33; #TMDS_33 ; # +#NET "tx1_tmds(2)" LOC = "N5" |IOSTANDARD = TML_33; #TMDS_33 ; ## Red +#NET "tx1_tmds_n(2)" LOC = "P6" |IOSTANDARD = TML_33; #TMDS_33 ; # +#NET "tx1_tmds(1)" LOC = "T4" |IOSTANDARD = TML_33; #TMDS_33 ; ## Green +#NET "tx1_tmds_n(1)" LOC = "V4" |IOSTANDARD = TML_33; #TMDS_33 ; # +#NET "tx1_tmds(0)" LOC = "R3" |IOSTANDARD = TML_33; #TMDS_33 ; ## Blue +#NET "tx1_tmds_n(0)" LOC = "T3" |IOSTANDARD = TML_33; #TMDS_33 ; # +# +################################################### +## TMDS pairs for Atlys IN (FPGA Bank 1): J3 +################################################### +#NET "rx1_tmds(3)" LOC = "H17" |IOSTANDARD = TMDS_33 ; # CLK +#NET "rx1_tmds_n(3)" LOC = "H18" |IOSTANDARD = TMDS_33 ; +#NET "rx1_tmds(2)" LOC = "J16" |IOSTANDARD = TMDS_33 ; # Red +#NET "rx1_tmds_n(2)" LOC = "J18" |IOSTANDARD = TMDS_33 ; +#NET "rx1_tmds(1)" LOC = "L17" |IOSTANDARD = TMDS_33 ; # Green +#NET "rx1_tmds_n(1)" LOC = "L18" |IOSTANDARD = TMDS_33 ; +#NET "rx1_tmds(0)" LOC = "K17" |IOSTANDARD = TMDS_33 ; # Blue +#NET "rx1_tmds_n(0)" LOC = "K18" |IOSTANDARD = TMDS_33 ; +# +############################################### +## TMDS pairs for Atlys IN (FPGA Bank 0): J1 +############################################### +NET "rx0_tmds(3)" LOC = "D11" |IOSTANDARD = TMDS_33 ; # CLK +NET "rx0_tmds_n(3)" LOC = "C11" |IOSTANDARD = TMDS_33 ; +NET "rx0_tmds(2)" LOC = "B12" |IOSTANDARD = TMDS_33 ; # Red +NET "rx0_tmds_n(2)" LOC = "A12" |IOSTANDARD = TMDS_33 ; +NET "rx0_tmds(1)" LOC = "B11" |IOSTANDARD = TMDS_33 ; # Green +NET "rx0_tmds_n(1)" LOC = "A11" |IOSTANDARD = TMDS_33 ; +NET "rx0_tmds(0)" LOC = "G9" |IOSTANDARD = TMDS_33 ; # Blue +NET "rx0_tmds_n(0)" LOC = "F9" |IOSTANDARD = TMDS_33 ; +NET "rx0_scl" LOC = "C13" |IOSTANDARD = LVCMOS33 ; +NET "rx0_sda" LOC = "A13" |IOSTANDARD = LVCMOS33 ; + + +######################################## +# Reset button and LEDs and Mechanical Switches (SW) +######################################## +NET "rstbtn_n" LOC = "T15" | IOSTANDARD = LVCMOS33; +NET "led<0>" LOC = "U18" | IOSTANDARD = LVCMOS33; +NET "led<1>" LOC = "M14" | IOSTANDARD = LVCMOS33; +NET "led<2>" LOC = "N14" | IOSTANDARD = LVCMOS33; +NET "led<3>" LOC = "L14" | IOSTANDARD = LVCMOS33; +NET "led<4>" LOC = "M13" | IOSTANDARD = LVCMOS33; +NET "led<5>" LOC = "D4" | IOSTANDARD = LVCMOS33; +NET "led<6>" LOC = "P16" | IOSTANDARD = LVCMOS33; +NET "led<7>" LOC = "N12" | IOSTANDARD = LVCMOS33; + +# Multi-cycle paths for TX0 / encoder_0 +TIMEGRP "bramgrp_0" = RAMS(ddr2dvi_0/dvi_encoder_0/pixel2x/data_int<*>); +TIMEGRP "fddbgrp_0" = FFS(ddr2dvi_0/dvi_encoder_0/pixel2x/db<*>); +TIMEGRP "bramra_0" = FFS(ddr2dvi_0/dvi_encoder_0/pixel2x/ra<*>); +TIMESPEC "TS_ramdo_0" = FROM "bramgrp_0" TO "fddbgrp_0" TS_DVI_CLOCK0; +TIMESPEC "TS_ramra_0" = FROM "bramra_0" TO "fddbgrp_0" TS_DVI_CLOCK0; + +####################################################################################### +#### onBoard USB controller +####################################################################################### +####NET "UsbMode" LOC = "A5"; # Bank = 0, Pin name = IO_L6N, Sch name = U1-INT0# +NET "usb_clk" LOC = "C10" | IOSTANDARD = LVCMOS33 | TNM_NET = clk48; # Bank = 0, Pin name = IO_L37P_GCLK13, Sch name = U1-IFCLK +TIMESPEC TS_clk48 = PERIOD "clk48" 48 MHz HIGH 50%; +NET "usb_flag_a" LOC = "B9" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L35P_GCLK17, Sch name = U1-FLAGA +NET "usb_flag_b" LOC = "A9" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L35N_GCLK16, Sch name = U1-FLAGB +NET "usb_flag_c" LOC = "C15" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L64P_SCP5, Sch name = U1-FLAGC +NET "usb_cs" LOC = "B2" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L2P, Sch name = U1-SLCS +NET "usb_oe" LOC = "A15" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L64N_SCP4, Sch name = U1-SLOE +NET "usb_rd" LOC = "F13" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L63P_SCP7, Sch name = U1-SLRD +NET "usb_wr" LOC = "E13" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L63N_SCP6, Sch name = U1-SLWR +NET "usb_pktend" LOC = "C4" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L1N_VREF, Sch name = U1-PKTEND +NET "usb_adr<0>" LOC = "A14" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L62N_VREF, Sch name = U1-FIFOAD0 +NET "usb_adr<1>" LOC = "B14" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L62P, Sch name = U1-FIFOAD1 +NET "usb_dat<0>" LOC = "A2" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L2N, Sch name = U1-FD0 +NET "usb_dat<1>" LOC = "D6" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L3P, Sch name = U1-FD1 +NET "usb_dat<2>" LOC = "C6" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L3N, Sch name = U1-FD2 +NET "usb_dat<3>" LOC = "B3" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L4P, Sch name = U1-FD3 +NET "usb_dat<4>" LOC = "A3" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L4N, Sch name = U1-FD4 +NET "usb_dat<5>" LOC = "B4" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L5P, Sch name = U1-FD5 +NET "usb_dat<6>" LOC = "A4" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L5N, Sch name = U1-FD6 +NET "usb_dat<7>" LOC = "C5" | IOSTANDARD = LVCMOS33; # Bank = 0, Pin name = IO_L6P, Sch name = U1-FD7 + +####################################################################################### +#### SIG READ +####################################################################################### +# FIXME: for now just TIG between the FIFO clocks +TIMESPEC "TS_async_0" = FROM "ddr2dvi_0_pclk_buf" TO "ddr2_0_memc3_infrastructure_inst_clk0_bufg_in" TIG; +TIMESPEC "TS_async_1" = FROM "ddr2_0_memc3_infrastructure_inst_clk0_bufg_in" TO "ddr2dvi_0_pclk_buf" TIG; + +####################################################################################### +#### DDR2 +####################################################################################### +CONFIG MCB_PERFORMANCE= STANDARD; +NET "ddr2_0/memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/selfrefresh_mcb_mode" TIG; +#NET "c?_pll_lock" TIG; +#INST "ddr2_0/memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/gen_term_calib.mcb_soft_calibration_top_inst/mcb_soft_calibration_inst/DONE_SOFTANDHARD_CAL*" TIG; + +#Please uncomment the below TIG if used in a design which enables self-refresh mode +#NET "ddr2_0/memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/gen_term_calib.mcb_soft_calibration_top_inst/mcb_soft_calibration_inst/SELFREFRESH_MCB_REQ" TIG; + +NET "ddr2_0/memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/gen_term_calib.mcb_soft_calibration_top_inst/mcb_soft_calibration_inst/CKE_Train" TIG; ## This path exists for DDR2 only +NET "ddr2_dq[*]" IN_TERM = NONE; +NET "ddr2_dqs" IN_TERM = NONE; +NET "ddr2_dqs_n" IN_TERM = NONE; +NET "ddr2_udqs" IN_TERM = NONE; +NET "ddr2_udqs_n" IN_TERM = NONE; +NET "ddr2_clk" LOC = "G3" | IOSTANDARD = DIFF_SSTL18_I; # Bank = 3, Pin name = IO_L46P_M3CLK, Sch name = DDR-CK_P +NET "ddr2_clk_n" LOC = "G1" | IOSTANDARD = DIFF_SSTL18_I; # Bank = 3, Pin name = IO_L46N_M3CLKN, Sch name = DDR-CK_N +NET "ddr2_cke" LOC = "H7" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L53P_M3CKE, Sch name = DDR-CKE +NET "ddr2_ras_n" LOC = "L5" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L43P_GCLK23_M3RASN, Sch name = DDR-RAS +NET "ddr2_cas_n" LOC = "K5" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L43N_GCLK22_IRDY2_M3CASN, Sch name = DDR-CAS +NET "ddr2_we_n" LOC = "E3" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L50P_M3WE, Sch name = DDR-WE +NET "ddr2_rzq" LOC = "L6" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L31P, Sch name = RZQ +NET "ddr2_zio" LOC = "C2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L83P, Sch name = ZIO + +NET "ddr2_ba<0>" LOC = "F2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L48P_M3BA0, Sch name = DDR-BA0 +NET "ddr2_ba<1>" LOC = "F1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L48N_M3BA1, Sch name = DDR-BA1 +NET "ddr2_ba<2>" LOC = "E1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L50N_M3BA2, Sch name = DDR-BA2 + +NET "ddr2_a<0>" LOC = "J7" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L47P_M3A0, Sch name = DDR-A0 +NET "ddr2_a<1>" LOC = "J6" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L47N_M3A1, Sch name = DDR-A1 +NET "ddr2_a<2>" LOC = "H5" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L49N_M3A2, Sch name = DDR-A2 +NET "ddr2_a<3>" LOC = "L7" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L45P_M3A3, Sch name = DDR-A3 +NET "ddr2_a<4>" LOC = "F3" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L51N_M3A4, Sch name = DDR-A4 +NET "ddr2_a<5>" LOC = "H4" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L44P_GCLK21_M3A5, Sch name = DDR-A5 +NET "ddr2_a<6>" LOC = "H3" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L44N_GCLK20_M3A6, Sch name = DDR-A6 +NET "ddr2_a<7>" LOC = "H6" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L49P_M3A7, Sch name = DDR-A7 +NET "ddr2_a<8>" LOC = "D2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L52P_M3A8, Sch name = DDR-A8 +NET "ddr2_a<9>" LOC = "D1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L52N_M3A9, Sch name = DDR-A9 +NET "ddr2_a<10>" LOC = "F4" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L51P_M3A10, Sch name = DDR-A10 +NET "ddr2_a<11>" LOC = "D3" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L54N_M3A11, Sch name = DDR-A11 +NET "ddr2_a<12>" LOC = "G6" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L53N_M3A12, Sch name = DDR-A12 + +NET "ddr2_dq<0>" LOC = "L2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L37P_M3DQ0, Sch name = DDR-DQ0 +NET "ddr2_dq<1>" LOC = "L1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L37N_M3DQ1, Sch name = DDR-DQ1 +NET "ddr2_dq<2>" LOC = "K2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L38P_M3DQ2, Sch name = DDR-DQ2 +NET "ddr2_dq<3>" LOC = "K1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L38N_M3DQ3, Sch name = DDR-DQ3 +NET "ddr2_dq<4>" LOC = "H2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L41P_GCLK27_M3DQ4, Sch name = DDR-DQ4 +NET "ddr2_dq<5>" LOC = "H1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L41N_GCLK26_M3DQ5, Sch name = DDR-DQ5 +NET "ddr2_dq<6>" LOC = "J3" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L40P_M3DQ6, Sch name = DDR-DQ6 +NET "ddr2_dq<7>" LOC = "J1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L40N_M3DQ7, Sch name = DDR-DQ7 +NET "ddr2_dq<8>" LOC = "M3" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L36P_M3DQ8, Sch name = DDR-DQ8 +NET "ddr2_dq<9>" LOC = "M1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L36N_M3DQ9, Sch name = DDR-DQ9 +NET "ddr2_dq<10>" LOC = "N2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L35P_M3DQ10, Sch name = DDR-DQ10 +NET "ddr2_dq<11>" LOC = "N1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L35N_M3DQ11, Sch name = DDR-DQ11 +NET "ddr2_dq<12>" LOC = "T2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L33P_M3DQ12, Sch name = DDR-DQ12 +NET "ddr2_dq<13>" LOC = "T1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L33N_M3DQ13, Sch name = DDR-DQ13 +NET "ddr2_dq<14>" LOC = "U2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L32P_M3DQ14, Sch name = DDR-DQ14 +NET "ddr2_dq<15>" LOC = "U1" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L32N_M3DQ15, Sch name = DDR-DQ15 + +NET "ddr2_udqs" LOC="P2" | IOSTANDARD = DIFF_SSTL18_I; # Bank = 3, Pin name = IO_L34P_M3UDQS, Sch name = DDR-UDQS_P +NET "ddr2_udqs_n" LOC="P1" | IOSTANDARD = DIFF_SSTL18_I; # Bank = 3, Pin name = IO_L34N_M3UDQSN, Sch name = DDR-UDQS_N +NET "ddr2_dqs" LOC="L4" | IOSTANDARD = DIFF_SSTL18_I; # Bank = 3, Pin name = IO_L39P_M3LDQS, Sch name = DDR-LDQS_P +NET "ddr2_dqs_n" LOC="L3" | IOSTANDARD = DIFF_SSTL18_I; # Bank = 3, Pin name = IO_L39N_M3LDQSN, Sch name = DDR-LDQS_N +NET "ddr2_dm" LOC="K3" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L42N_GCLK24_M3LDM, Sch name = DDR-LDM +NET "ddr2_udm" LOC="K4" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L42P_GCLK25_TRDY2_M3UDM, Sch name = DDR-UDM +NET "ddr2_odt" LOC="K6" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L45N_M3ODT, Sch name = DDR-ODT + +NET "ddr2_zio" LOC="C2" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L83P, Sch name = DDR-ODT +# NET "ddr2_rzm" LOC="L6" | IOSTANDARD = SSTL18_I; # Bank = 3, Pin name = IO_L31P, Sch name = DDR-ODT diff --git a/fpga/src/top/atlys_sig.vhd b/fpga/src/top/atlys_sig.vhd new file mode 100644 index 0000000..6313731 --- /dev/null +++ b/fpga/src/top/atlys_sig.vhd @@ -0,0 +1,466 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.dvi_package.all; +use work.strm_package.all; + +library UNISIM; +use UNISIM.Vcomponents.all; + +entity atlys_sig is + port ( + rstbtn_n : in std_logic; -- The pink reset button + clk100 : in std_logic; -- 100 MHz osicallator + + -- HDMI + tx0_tmds : out std_logic_vector(3 downto 0); + tx0_tmds_n : out std_logic_vector(3 downto 0); + rx0_tmds : in std_logic_vector(3 downto 0); + rx0_tmds_n : in std_logic_vector(3 downto 0); + rx0_sda : inout std_logic; + rx0_scl : in std_logic; + + -- DDR2 + ddr2_dq : inout std_logic_vector(15 downto 0); + ddr2_a : out std_logic_vector(12 downto 0); + ddr2_ba : out std_logic_vector( 2 downto 0); + ddr2_ras_n : out std_logic; + ddr2_cas_n : out std_logic; + ddr2_we_n : out std_logic; + ddr2_odt : out std_logic; + ddr2_cke : out std_logic; + ddr2_dm : out std_logic; + ddr2_udqs : inout std_logic; + ddr2_udqs_n : inout std_logic; + ddr2_rzq : inout std_logic; + ddr2_zio : inout std_logic; + ddr2_udm : out std_logic; + ddr2_dqs : inout std_logic; + ddr2_dqs_n : inout std_logic; + ddr2_clk : out std_logic; + ddr2_clk_n : out std_logic; + + -- cypress interface + usb_clk : in std_logic; + usb_flag_a : in std_logic; -- programmable flag + usb_flag_b : in std_logic; -- full flag + usb_flag_c : in std_logic; -- empty flag + usb_cs : inout std_logic; -- put to GND, not need for this application + usb_oe : out std_logic; -- active_low + usb_rd : out std_logic; -- active_low + usb_wr : out std_logic; -- active_low + usb_pktend : out std_logic; -- active_low + usb_adr : out std_logic_vector(1 downto 0); -- 00 ep2, 01 ep4, 10 ep6, 11 ep8 + usb_dat : inout std_logic_vector(7 downto 0); + + switch : in std_logic_vector(0 downto 0); + led : out std_logic_vector(7 downto 0) + ); +end atlys_sig; + +architecture top of atlys_sig is + signal rstbtn : std_logic; + signal rst_n : std_logic; + signal rst : std_logic; + signal rst_pll : std_logic; + + -- hdmi rx0 + signal rx0_sda_i : std_logic; + signal rx0_sda_o : std_logic; + signal rx0_ddr2_cmd_en : std_logic; + signal rx0_ddr2_cmd_instr : std_logic_vector( 2 downto 0); + signal rx0_ddr2_cmd_bl : std_logic_vector( 5 downto 0); + signal rx0_ddr2_cmd_byte_addr : std_logic_vector(29 downto 0); + signal rx0_ddr2_cmd_empty : std_logic; + signal rx0_ddr2_cmd_full : std_logic; + signal rx0_ddr2_wr_en : std_logic; + signal rx0_ddr2_wr_mask : std_logic_vector( 3 downto 0); + signal rx0_ddr2_wr_data : std_logic_vector(31 downto 0); + signal rx0_ddr2_wr_full : std_logic; + signal rx0_ddr2_wr_empty : std_logic; + signal rx0_ddr2_wr_count : std_logic_vector( 6 downto 0); + signal rx0_ddr2_wr_underrun : std_logic; + signal rx0_ddr2_wr_error : std_logic; + + -- hdmi tx0 + signal tx0_pll_locked : std_logic; + signal tx0_ddr2_cmd_en : std_logic; + signal tx0_ddr2_cmd_instr : std_logic_vector( 2 downto 0); + signal tx0_ddr2_cmd_bl : std_logic_vector( 5 downto 0); + signal tx0_ddr2_cmd_byte_addr : std_logic_vector(29 downto 0); + signal tx0_ddr2_cmd_empty : std_logic; + signal tx0_ddr2_cmd_full : std_logic; + signal tx0_ddr2_rd_en : std_logic; + signal tx0_ddr2_rd_data : std_logic_vector(31 downto 0); + signal tx0_ddr2_rd_full : std_logic; + signal tx0_ddr2_rd_empty : std_logic; + signal tx0_ddr2_rd_count : std_logic_vector( 6 downto 0); + signal tx0_ddr2_rd_overflow : std_logic; + signal tx0_ddr2_rd_error : std_logic; + + -- ddr2 + signal clk333 : std_logic; + signal clk333in : std_logic; + signal ddr2_calib_done : std_logic; + signal ddr2_clk_out : std_logic; + signal ddr2_rst_out : std_logic; + + -- strm cy_usb + constant STRM_DDR2_BUS : integer := 0; + constant STRM_OUT_SLV_CNT : integer := 1; + signal strm_in_data : std_logic_vector(31 downto 0); + signal strm_in_eop : std_logic; + signal strm_in_sop : std_logic; + signal strm_in_en : std_logic; + signal strm_in_busy : std_logic; + signal strm_out_slv_reqs : std_logic_vector(STRM_OUT_SLV_CNT-1 downto 0); + signal strm_out_slv_busy : std_logic_vector(STRM_OUT_SLV_CNT-1 downto 0); + signal strm_out_data : strm_dat_bus_t(STRM_OUT_SLV_CNT-1 downto 0); + signal strm_out_eop : std_logic_vector(STRM_OUT_SLV_CNT-1 downto 0); + signal strm_out_en : std_logic_vector(STRM_OUT_SLV_CNT-1 downto 0); + + -- strm ddr2 + signal strm_ddr2_cmd_en : std_logic; + signal strm_ddr2_cmd_instr : std_logic_vector( 2 downto 0); + signal strm_ddr2_cmd_bl : std_logic_vector( 5 downto 0); + signal strm_ddr2_cmd_byte_addr : std_logic_vector(29 downto 0); + signal strm_ddr2_cmd_empty : std_logic; + signal strm_ddr2_cmd_full : std_logic; + signal strm_ddr2_wr_en : std_logic; + signal strm_ddr2_wr_mask : std_logic_vector( 3 downto 0); + signal strm_ddr2_wr_data : std_logic_vector(31 downto 0); + signal strm_ddr2_wr_full : std_logic; + signal strm_ddr2_wr_empty : std_logic; + signal strm_ddr2_wr_count : std_logic_vector( 6 downto 0); + signal strm_ddr2_wr_underrun : std_logic; + signal strm_ddr2_wr_error : std_logic; + signal strm_ddr2_rd_en : std_logic; + signal strm_ddr2_rd_data : std_logic_vector(31 downto 0); + signal strm_ddr2_rd_full : std_logic; + signal strm_ddr2_rd_empty : std_logic; + signal strm_ddr2_rd_count : std_logic_vector( 6 downto 0); + signal strm_ddr2_rd_overflow : std_logic; + signal strm_ddr2_rd_error : std_logic; + signal ddr2_strm_in_busy : std_logic; + signal ddr2_strm_out_req : std_logic; + signal ddr2_strm_out_busy : std_logic; + signal ddr2_strm_out_data : std_logic_vector(31 downto 0); + signal ddr2_strm_out_eop : std_logic; + signal ddr2_strm_out_en : std_logic; + + signal debug_usb : std_logic_vector( 7 downto 0); + signal debug_strm_ddr2 : std_logic_vector( 7 downto 0); +begin + rstbtn <= not rstbtn_n; + rst_pll <= ddr2_rst_out; + rst_n <= not ddr2_rst_out and tx0_pll_locked; + rst <= not rst_n; + led <= (others => '0'); + + dvi2ddr_0: entity work.dvi2ddr + port map ( + clk => ddr2_clk_out, + rst => ddr2_rst_out, + + ctrl_disable_wr => switch(0), + + rx_tmds => rx0_tmds, + rx_tmds_n => rx0_tmds_n, + + -- memory interface + ddr2_cmd_en_o => rx0_ddr2_cmd_en, + ddr2_cmd_instr_o => rx0_ddr2_cmd_instr, + ddr2_cmd_bl_o => rx0_ddr2_cmd_bl, + ddr2_cmd_byte_addr_o => rx0_ddr2_cmd_byte_addr, + ddr2_cmd_empty_i => rx0_ddr2_cmd_empty, + ddr2_cmd_full_i => rx0_ddr2_cmd_full, + ddr2_wr_en_o => rx0_ddr2_wr_en, + ddr2_wr_mask_o => rx0_ddr2_wr_mask, + ddr2_wr_data_o => rx0_ddr2_wr_data, + ddr2_wr_full_i => rx0_ddr2_wr_full, + ddr2_wr_empty_i => rx0_ddr2_wr_empty, + ddr2_wr_count_i => rx0_ddr2_wr_count, + ddr2_wr_underrun_i => rx0_ddr2_wr_underrun, + ddr2_wr_error_i => rx0_ddr2_wr_error + ); + + -- ---------------------------------------------------------------------------- + -- I2C EDID Emulation + -- ---------------------------------------------------------------------------- + rx0_sda_i <= rx0_sda; + rx0_sda <= '0' when rx0_sda_o = '0' else 'Z'; + i2c_rom_0: entity work.i2c_rom + port map ( + clk => ddr2_clk_out, + rst_n => rst_n, + sda_i => rx0_sda_i, + sda_o => rx0_sda_o, + scl_i => rx0_scl + ); + + -- ---------------------------------------------------------------------------- + -- DDR2 + -- ---------------------------------------------------------------------------- + ddr2_0: entity work.ddr2 + port map ( + c3_sys_clk => clk100, + c3_sys_rst_i => rstbtn, + c3_calib_done => ddr2_calib_done, + c3_clk0 => ddr2_clk_out, + c3_rst0 => ddr2_rst_out, + mcb3_dram_dq => ddr2_dq, + mcb3_dram_a => ddr2_a, + mcb3_dram_ba => ddr2_ba, + mcb3_dram_ras_n => ddr2_ras_n, + mcb3_dram_cas_n => ddr2_cas_n, + mcb3_dram_we_n => ddr2_we_n, + mcb3_dram_odt => ddr2_odt, + mcb3_dram_cke => ddr2_cke, + mcb3_dram_dm => ddr2_dm, + mcb3_dram_udqs => ddr2_udqs, + mcb3_dram_udqs_n => ddr2_udqs_n, + mcb3_rzq => ddr2_rzq, + mcb3_zio => ddr2_zio, + mcb3_dram_udm => ddr2_udm, + mcb3_dram_dqs => ddr2_dqs, + mcb3_dram_dqs_n => ddr2_dqs_n, + mcb3_dram_ck => ddr2_clk, + mcb3_dram_ck_n => ddr2_clk_n, + + c3_p0_cmd_clk => ddr2_clk_out, + c3_p0_cmd_en => tx0_ddr2_cmd_en, + c3_p0_cmd_instr => tx0_ddr2_cmd_instr, + c3_p0_cmd_bl => tx0_ddr2_cmd_bl, + c3_p0_cmd_byte_addr => tx0_ddr2_cmd_byte_addr, + c3_p0_cmd_empty => tx0_ddr2_cmd_empty, + c3_p0_cmd_full => tx0_ddr2_cmd_full, + c3_p0_wr_clk => ddr2_clk_out, + c3_p0_wr_en => '0', + c3_p0_wr_mask => (others => '0'), + c3_p0_wr_data => (others => '0'), + c3_p0_wr_full => open, + c3_p0_wr_empty => open, + c3_p0_wr_count => open, + c3_p0_wr_underrun => open, + c3_p0_wr_error => open, + c3_p0_rd_clk => ddr2_clk_out, + c3_p0_rd_en => tx0_ddr2_rd_en, + c3_p0_rd_data => tx0_ddr2_rd_data, + c3_p0_rd_full => tx0_ddr2_rd_full, + c3_p0_rd_empty => tx0_ddr2_rd_empty, + c3_p0_rd_count => tx0_ddr2_rd_count, + c3_p0_rd_overflow => tx0_ddr2_rd_overflow, + c3_p0_rd_error => tx0_ddr2_rd_error, + + c3_p1_cmd_clk => ddr2_clk_out, + c3_p1_cmd_en => rx0_ddr2_cmd_en, + c3_p1_cmd_instr => rx0_ddr2_cmd_instr, + c3_p1_cmd_bl => rx0_ddr2_cmd_bl, + c3_p1_cmd_byte_addr => rx0_ddr2_cmd_byte_addr, + c3_p1_cmd_empty => rx0_ddr2_cmd_empty, + c3_p1_cmd_full => rx0_ddr2_cmd_full, + c3_p1_wr_clk => ddr2_clk_out, + c3_p1_wr_en => rx0_ddr2_wr_en, + c3_p1_wr_mask => rx0_ddr2_wr_mask, + c3_p1_wr_data => rx0_ddr2_wr_data, + c3_p1_wr_full => rx0_ddr2_wr_full, + c3_p1_wr_empty => rx0_ddr2_wr_empty, + c3_p1_wr_count => rx0_ddr2_wr_count, + c3_p1_wr_underrun => rx0_ddr2_wr_underrun, + c3_p1_wr_error => rx0_ddr2_wr_error, + c3_p1_rd_clk => ddr2_clk_out, + c3_p1_rd_en => '0', + c3_p1_rd_data => open, + c3_p1_rd_full => open, + c3_p1_rd_empty => open, + c3_p1_rd_count => open, + c3_p1_rd_overflow => open, + c3_p1_rd_error => open, + + c3_p2_cmd_clk => ddr2_clk_out, + c3_p2_cmd_en => strm_ddr2_cmd_en, + c3_p2_cmd_instr => strm_ddr2_cmd_instr, + c3_p2_cmd_bl => strm_ddr2_cmd_bl, + c3_p2_cmd_byte_addr => strm_ddr2_cmd_byte_addr, + c3_p2_cmd_empty => strm_ddr2_cmd_empty, + c3_p2_cmd_full => strm_ddr2_cmd_full, + c3_p2_wr_clk => ddr2_clk_out, + c3_p2_wr_en => strm_ddr2_wr_en, + c3_p2_wr_mask => strm_ddr2_wr_mask, + c3_p2_wr_data => strm_ddr2_wr_data, + c3_p2_wr_full => strm_ddr2_wr_full, + c3_p2_wr_empty => strm_ddr2_wr_empty, + c3_p2_wr_count => strm_ddr2_wr_count, + c3_p2_wr_underrun => strm_ddr2_wr_underrun, + c3_p2_wr_error => strm_ddr2_wr_error, + c3_p2_rd_clk => ddr2_clk_out, + c3_p2_rd_en => strm_ddr2_rd_en, + c3_p2_rd_data => strm_ddr2_rd_data, + c3_p2_rd_full => strm_ddr2_rd_full, + c3_p2_rd_empty => strm_ddr2_rd_empty, + c3_p2_rd_count => strm_ddr2_rd_count, + c3_p2_rd_overflow => strm_ddr2_rd_overflow, + c3_p2_rd_error => strm_ddr2_rd_error, + + c3_p3_cmd_clk => '0', + c3_p3_cmd_en => '0', + c3_p3_cmd_instr => (others => '0'), + c3_p3_cmd_bl => (others => '0'), + c3_p3_cmd_byte_addr => (others => '0'), + c3_p3_cmd_empty => open, + c3_p3_cmd_full => open, + c3_p3_wr_clk => '0', + c3_p3_wr_en => '0', + c3_p3_wr_mask => (others => '0'), + c3_p3_wr_data => (others => '0'), + c3_p3_wr_full => open, + c3_p3_wr_empty => open, + c3_p3_wr_count => open, + c3_p3_wr_underrun => open, + c3_p3_wr_error => open, + c3_p3_rd_clk => '0', + c3_p3_rd_en => '0', + c3_p3_rd_data => open, + c3_p3_rd_full => open, + c3_p3_rd_empty => open, + c3_p3_rd_count => open, + c3_p3_rd_overflow => open, + c3_p3_rd_error => open + ); + + ddr2dvi_0: entity work.ddr2dvi + port map ( + clk => ddr2_clk_out, + rst_n => rst_n, + rst_pll => rst_pll, + + tx_tmds => tx0_tmds, + tx_tmds_n => tx0_tmds_n, + tx_pll_locked_o => tx0_pll_locked, + + -- memory interface + ddr2_cmd_en_o => tx0_ddr2_cmd_en, + ddr2_cmd_instr_o => tx0_ddr2_cmd_instr, + ddr2_cmd_bl_o => tx0_ddr2_cmd_bl, + ddr2_cmd_byte_addr_o => tx0_ddr2_cmd_byte_addr, + ddr2_cmd_empty_i => tx0_ddr2_cmd_empty, + ddr2_cmd_full_i => tx0_ddr2_cmd_full, + + ddr2_rd_en_o => tx0_ddr2_rd_en, + ddr2_rd_data_i => tx0_ddr2_rd_data, + ddr2_rd_full_i => tx0_ddr2_rd_full, + ddr2_rd_empty_i => tx0_ddr2_rd_empty, + ddr2_rd_count_i => tx0_ddr2_rd_count, + ddr2_rd_overflow_i => tx0_ddr2_rd_overflow, + ddr2_rd_error_i => tx0_ddr2_rd_error + ); + + -- ---------------------------------------------------------------------------- + -- USB + -- ---------------------------------------------------------------------------- + f2p_strm_top_0: entity work.f2p_strm_top + generic map (STRM_OUT_SLV_CNT => STRM_OUT_SLV_CNT) + port map ( + clk => ddr2_clk_out, + rst_n => rst_n, + debug => debug_usb, + + -- cypress interface + usb_clk => usb_clk, + usb_flag_a_i => usb_flag_a, + usb_flag_b_i => usb_flag_b, + usb_flag_c_i => usb_flag_c, + usb_cs_o => usb_cs, + usb_oe_o => usb_oe, + usb_rd_o => usb_rd, + usb_wr_o => usb_wr, + usb_pktend_o => usb_pktend, + usb_adr_o => usb_adr, + usb_dat_io => usb_dat, + + -- streaming bus + strm_in_data_o => strm_in_data, + strm_in_eop_o => strm_in_eop, + strm_in_sop_o => strm_in_sop, + strm_in_en_o => strm_in_en, + strm_in_busy_i => strm_in_busy, + strm_out_slv_reqs_i => strm_out_slv_reqs, + strm_out_slv_busy_o => strm_out_slv_busy, + strm_out_data_i => strm_out_data, + strm_out_eop_i => strm_out_eop, + strm_out_en_i => strm_out_en + ); + + strm_out_slv_reqs(STRM_DDR2_BUS) <= ddr2_strm_out_req; + strm_out_eop(STRM_DDR2_BUS) <= ddr2_strm_out_eop; + strm_out_en(STRM_DDR2_BUS) <= ddr2_strm_out_en; + strm_out_data(STRM_DDR2_BUS) <= ddr2_strm_out_data; + ddr2_strm_out_busy <= strm_out_slv_busy(STRM_DDR2_BUS); + strm_in_busy <= ddr2_strm_in_busy; + + strm_ddr2_0: entity work.strm_ddr2 + port map ( + clk => ddr2_clk_out, + rst_n => rst_n, + debug => debug_strm_ddr2, + + -- streaming bus + strm_in_data_i => strm_in_data, + strm_in_eop_i => strm_in_eop, + strm_in_sop_i => strm_in_sop, + strm_in_en_i => strm_in_en, + strm_in_busy_o => ddr2_strm_in_busy, + strm_out_req_o => ddr2_strm_out_req, + strm_out_busy_i => ddr2_strm_out_busy, + strm_out_data_o => ddr2_strm_out_data, + strm_out_eop_o => ddr2_strm_out_eop, + strm_out_en_o => ddr2_strm_out_en, + + -- memory interface + ddr2_cmd_en_o => strm_ddr2_cmd_en, + ddr2_cmd_instr_o => strm_ddr2_cmd_instr, + ddr2_cmd_bl_o => strm_ddr2_cmd_bl, + ddr2_cmd_byte_addr_o => strm_ddr2_cmd_byte_addr, + ddr2_cmd_empty_i => strm_ddr2_cmd_empty, + ddr2_cmd_full_i => strm_ddr2_cmd_full, + ddr2_wr_en_o => strm_ddr2_wr_en, + ddr2_wr_mask_o => strm_ddr2_wr_mask, + ddr2_wr_data_o => strm_ddr2_wr_data, + ddr2_wr_full_i => strm_ddr2_wr_full, + ddr2_wr_empty_i => strm_ddr2_wr_empty, + ddr2_wr_count_i => strm_ddr2_wr_count, + ddr2_wr_underrun_i => strm_ddr2_wr_underrun, + ddr2_wr_error_i => strm_ddr2_wr_error, + ddr2_rd_en_o => strm_ddr2_rd_en, + ddr2_rd_data_i => strm_ddr2_rd_data, + ddr2_rd_full_i => strm_ddr2_rd_full, + ddr2_rd_empty_i => strm_ddr2_rd_empty, + ddr2_rd_count_i => strm_ddr2_rd_count, + ddr2_rd_overflow_i => strm_ddr2_rd_overflow, + ddr2_rd_error_i => strm_ddr2_rd_error + ); + +end top; diff --git a/fpga/src/top/dmb.ucf b/fpga/src/top/dmb.ucf new file mode 100644 index 0000000..22d255e --- /dev/null +++ b/fpga/src/top/dmb.ucf @@ -0,0 +1,98 @@ +#FPGA_PART=xc6slx9-2tqg144 +CONFIG VCCAUX = 3.3; + +############################################################################### +## SYSCLK/RESET Input +############################################################################### + +NET "clk100_i" LOC = "P84" | IOSTANDARD = LVCMOS33 | TNM_NET = "clk100_i"; +TIMESPEC TS_clk100_i = PERIOD "clk100_i" 100 MHz HIGH 50%; + +NET "usb_clk_i" TNM_NET = "usb_clk_i"; +TIMESPEC "TS_usb_clk_i" = PERIOD "usb_clk_i" 20.833 ns HIGH 50% INPUT_JITTER 208.33ps; + +## Constraint for RX0 +NET "dvi_decoder_0/rxclk" TNM_NET = DVI_CLOCK0; +TIMESPEC TS_DVI_CLOCK0 = PERIOD "DVI_CLOCK0" 100 MHz HIGH 50%; + +## allow +#PIN "dvi_decoder_0/pclkbufg.O" CLOCK_DEDICATED_ROUTE = FALSE; + +################################################ +### TMDS pairs +################################################ +NET "rx0_tmds(3)" LOC = "P132" |IOSTANDARD = TMDS_33 ; # CLK +NET "rx0_tmds_n(3)" LOC = "P131" |IOSTANDARD = TMDS_33 ; +NET "rx0_tmds(2)" LOC = "P134" |IOSTANDARD = TMDS_33 ; # Red +NET "rx0_tmds_n(2)" LOC = "P133" |IOSTANDARD = TMDS_33 ; +NET "rx0_tmds(1)" LOC = "P140" |IOSTANDARD = TMDS_33 ; # Green +NET "rx0_tmds_n(1)" LOC = "P139" |IOSTANDARD = TMDS_33 ; +NET "rx0_tmds(0)" LOC = "P144" |IOSTANDARD = TMDS_33 ; # Blue +NET "rx0_tmds_n(0)" LOC = "P143" |IOSTANDARD = TMDS_33 ; +##NET "rx0_scl" LOC = "C13" |IOSTANDARD = LVCMOS33 ; +##NET "rx0_sda" LOC = "A13" |IOSTANDARD = LVCMOS33 ; + +####################################################################################### +#### onBoard USB controller +####################################################################################### +NET "usb_clk_i" LOC = "P16" | IOSTANDARD = LVCMOS33; +NET "usb_flag_a_i" LOC = "P10" | IOSTANDARD = LVCMOS33; +NET "usb_flag_b_i" LOC = "P9" | IOSTANDARD = LVCMOS33; +NET "usb_flag_c_i" LOC = "P8" | IOSTANDARD = LVCMOS33; +NET "usb_cs_io" LOC = "P142" | IOSTANDARD = LVCMOS33; +NET "usb_oe_o" LOC = "P6" | IOSTANDARD = LVCMOS33; +NET "usb_rd_o" LOC = "P116" | IOSTANDARD = LVCMOS33; +NET "usb_wr_o" LOC = "P117" | IOSTANDARD = LVCMOS33; +NET "usb_pktend_o" LOC = "P1" | IOSTANDARD = LVCMOS33; +NET "usb_adr_o<0>" LOC = "P5" | IOSTANDARD = LVCMOS33; +NET "usb_adr_o<1>" LOC = "P2" | IOSTANDARD = LVCMOS33; +NET "usb_dat_io<0>" LOC = "P23" | IOSTANDARD = LVCMOS33; +NET "usb_dat_io<1>" LOC = "P22" | IOSTANDARD = LVCMOS33; +NET "usb_dat_io<2>" LOC = "P21" | IOSTANDARD = LVCMOS33; +NET "usb_dat_io<3>" LOC = "P17" | IOSTANDARD = LVCMOS33; +NET "usb_dat_io<4>" LOC = "P15" | IOSTANDARD = LVCMOS33; +NET "usb_dat_io<5>" LOC = "P14" | IOSTANDARD = LVCMOS33; +NET "usb_dat_io<6>" LOC = "P12" | IOSTANDARD = LVCMOS33; +NET "usb_dat_io<7>" LOC = "P11" | IOSTANDARD = LVCMOS33; + +######################################### +## VMC header +######################################### +NET "vmc_clk_o" LOC = "P55" | IOSTANDARD = LVCMOS33; +NET "vmc_hsync_o" LOC = "P61" | IOSTANDARD = LVCMOS33; +NET "vmc_vsync_o" LOC = "P62" | IOSTANDARD = LVCMOS33; +NET "vmc_de_o" LOC = "P66" | IOSTANDARD = LVCMOS33; +NET "vmc_red_o<0>" LOC = "P59" | IOSTANDARD = LVCMOS33; +NET "vmc_red_o<1>" LOC = "P51" | IOSTANDARD = LVCMOS33; +NET "vmc_red_o<2>" LOC = "P58" | IOSTANDARD = LVCMOS33; +NET "vmc_red_o<3>" LOC = "P50" | IOSTANDARD = LVCMOS33; +NET "vmc_red_o<4>" LOC = "P57" | IOSTANDARD = LVCMOS33; +NET "vmc_red_o<5>" LOC = "P48" | IOSTANDARD = LVCMOS33; +NET "vmc_red_o<6>" LOC = "P56" | IOSTANDARD = LVCMOS33; +NET "vmc_red_o<7>" LOC = "P47" | IOSTANDARD = LVCMOS33; +NET "vmc_green_o<0>" LOC = "P46" | IOSTANDARD = LVCMOS33; +NET "vmc_green_o<1>" LOC = "P41" | IOSTANDARD = LVCMOS33; +NET "vmc_green_o<2>" LOC = "P45" | IOSTANDARD = LVCMOS33; +NET "vmc_green_o<3>" LOC = "P40" | IOSTANDARD = LVCMOS33; +NET "vmc_green_o<4>" LOC = "P44" | IOSTANDARD = LVCMOS33; +NET "vmc_green_o<5>" LOC = "P39" | IOSTANDARD = LVCMOS33; +NET "vmc_green_o<6>" LOC = "P43" | IOSTANDARD = LVCMOS33; +NET "vmc_green_o<7>" LOC = "P38" | IOSTANDARD = LVCMOS33; +NET "vmc_blue_o<0>" LOC = "P35" | IOSTANDARD = LVCMOS33; +NET "vmc_blue_o<1>" LOC = "P30" | IOSTANDARD = LVCMOS33; +NET "vmc_blue_o<2>" LOC = "P34" | IOSTANDARD = LVCMOS33; +NET "vmc_blue_o<3>" LOC = "P29" | IOSTANDARD = LVCMOS33; +NET "vmc_blue_o<4>" LOC = "P33" | IOSTANDARD = LVCMOS33; +NET "vmc_blue_o<5>" LOC = "P27" | IOSTANDARD = LVCMOS33; +NET "vmc_blue_o<6>" LOC = "P32" | IOSTANDARD = LVCMOS33; +NET "vmc_blue_o<7>" LOC = "P26" | IOSTANDARD = LVCMOS33; + +######################################### +## Reset button and LEDs and Mechanical Switches (SW) +######################################### +#PIN "rstbtn_n" TIG; +#NET "rstbtn_n" LOC = "" |IOSTANDARD = LVCMOS33; +NET "led_o<0>" LOC = "P75" | IOSTANDARD = LVCMOS33; +NET "led_o<1>" LOC = "P78" | IOSTANDARD = LVCMOS33; +NET "led_o<2>" LOC = "P79" | IOSTANDARD = LVCMOS33; +NET "led_o<3>" LOC = "P80" | IOSTANDARD = LVCMOS33; diff --git a/fpga/src/top/dmb.vhd b/fpga/src/top/dmb.vhd new file mode 100644 index 0000000..18bfb39 --- /dev/null +++ b/fpga/src/top/dmb.vhd @@ -0,0 +1,345 @@ +-- ----------------------------------------------------------------------------- +-- Copyright (c) 2013 Benjamin Krill +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. +-- ----------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.dvi_package.all; +use work.strm_package.all; + +library work; +use work.all; + +library UNISIM; +use UNISIM.Vcomponents.all; + +entity dmb is + port ( + clk100_i : in std_logic; -- 100 MHz osicallator + + -- HDMI + rx0_tmds : in std_logic_vector(3 downto 0); + rx0_tmds_n : in std_logic_vector(3 downto 0); + --rx0_sda : inout std_logic; + --rx0_scl : in std_logic; + + -- vcm + vmc_clk_o : out std_logic; + vmc_red_o : out std_logic_vector(7 downto 0); + vmc_green_o : out std_logic_vector(7 downto 0); + vmc_blue_o : out std_logic_vector(7 downto 0); + vmc_hsync_o : out std_logic; + vmc_vsync_o : out std_logic; + vmc_de_o : out std_logic; + + -- cypress interface + usb_clk_i : in std_logic; + usb_flag_a_i : in std_logic; -- programmable flag + usb_flag_b_i : in std_logic; -- full flag + usb_flag_c_i : in std_logic; -- empty flag + usb_cs_io : inout std_logic; -- put to GND, not need for this application + usb_oe_o : out std_logic; -- active_low + usb_rd_o : out std_logic; -- active_low + usb_wr_o : out std_logic; -- active_low + usb_pktend_o : out std_logic; -- active_low + usb_adr_o : out std_logic_vector(1 downto 0); -- 00 ep2, 01 ep4, 10 ep6, 11 ep8 + usb_dat_io : inout std_logic_vector(7 downto 0); + + led_o : out std_logic_vector(3 downto 0) + ); +end dmb; + +architecture top of dmb is + signal rst_n : std_logic; + signal rstbtn : std_logic; + + -- hdmi + signal pclk : std_logic; + signal pclkx2 : std_logic; + signal pclkx10 : std_logic; + signal pll_lckd : std_logic; + signal serdesstrobe : std_logic; + signal tmdsclk : std_logic; + signal hsync : std_logic; + signal vsync : std_logic; + signal dat_en : std_logic; + signal valid : std_logic_vector(COLOR_CNT-1 downto 0); + signal ready : std_logic_vector(COLOR_CNT-1 downto 0); + signal psalgnerr : std_logic; + signal color : color_t(COLOR_CNT-1 downto 0); + signal sdout : sdat_t(COLOR_CNT-1 downto 0); + + -- clockinga + signal usb_rst_n : std_logic; + signal usb_clk_locked : std_logic; + signal usb_clk_gb : std_logic; + signal usb_clk_ib : std_logic; + signal usb_clk : std_logic; + signal rst100_n : std_logic; + signal clk100_locked : std_logic; + signal clk100_ib : std_logic; + signal clk100_gb : std_logic; + signal clk48_gb : std_logic; + signal clk100 : std_logic; + signal clk48 : std_logic; + + + -- strm cy_usb + constant STRM_REGFILE_BUS : integer := 0; + constant STRM_OUT_SLV_CNT : integer := 1; + signal strm_in_data : std_logic_vector(31 downto 0); + signal strm_in_eop : std_logic; + signal strm_in_sop : std_logic; + signal strm_in_en : std_logic; + signal strm_in_busy : std_logic; + signal strm_out_slv_reqs : std_logic_vector(STRM_OUT_SLV_CNT-1 downto 0); + signal strm_out_slv_busy : std_logic_vector(STRM_OUT_SLV_CNT-1 downto 0); + signal strm_out_data : strm_dat_bus_t(STRM_OUT_SLV_CNT-1 downto 0); + signal strm_out_eop : std_logic_vector(STRM_OUT_SLV_CNT-1 downto 0); + signal strm_out_en : std_logic_vector(STRM_OUT_SLV_CNT-1 downto 0); + -- regfile + signal rf_strm_in_busy : std_logic; + signal rf_strm_out_req : std_logic; + signal rf_strm_out_busy : std_logic; + signal rf_strm_out_data : std_logic_vector(31 downto 0); + signal rf_strm_out_eop : std_logic; + signal rf_strm_out_en : std_logic; + constant REG_CNT : integer := 8; + signal regfile : std_logic_vector((32*REG_CNT)-1 downto 0); + + signal test : std_logic; +begin + rstbtn <= '0'; + usb_rst_n <= usb_clk_locked; + rst100_n <= clk100_locked; + led_o <= regfile(2 downto 0) & test; + + -- ---------------------------------------------------------------------------- + -- clocking + -- ---------------------------------------------------------------------------- + -- USB + ibufg_usb_clk: IBUFG port map (O => usb_clk_ib, I => usb_clk_i); + bufg_usb_clk: BUFG port map (O => usb_clk, I => usb_clk_gb); + dcm_usb_clk: DCM_SP + generic map ( + CLKDV_DIVIDE => 2.000, + CLKFX_DIVIDE => 1, + CLKFX_MULTIPLY => 4, + CLKIN_DIVIDE_BY_2 => FALSE, + CLKIN_PERIOD => 20.833, + CLKOUT_PHASE_SHIFT => "NONE", + CLK_FEEDBACK => "1X", + DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", + PHASE_SHIFT => 0, + STARTUP_WAIT => FALSE + ) + port map ( + CLKIN => usb_clk_ib, + CLKFB => usb_clk, + -- Output clocks + CLK0 => usb_clk_gb, + CLK90 => open, + CLK180 => open, + CLK270 => open, + CLK2X => open, + CLK2X180 => open, + CLKFX => open, + CLKFX180 => open, + CLKDV => open, + -- Ports for dynamic phase shift + PSCLK => '0', + PSEN => '0', + PSINCDEC => '0', + PSDONE => open, + -- Other control and status signals + LOCKED => usb_clk_locked, + STATUS => open, + RST => rstbtn, + -- Unused pin, tie low + DSSEN => '0' + ); + + -- MAIN + process (clk100, rst100_n) + begin + if rst100_n = '0' then + test <= '0'; + elsif rising_edge(clk100) then + test <= not test; + end if; + end process; + ibufg_clk100: IBUFG port map (O => clk100_ib, I => clk100_i); + bufg_clk100: BUFG port map (O => clk100, I => clk100_gb); + bufg_clk48: BUFG port map (O => clk48, I => clk48_gb); + dcm_clk100: DCM_SP + generic map ( + CLKDV_DIVIDE => 2.000, + CLKFX_DIVIDE => 25, + CLKFX_MULTIPLY => 12, + CLKIN_DIVIDE_BY_2 => FALSE, + CLKIN_PERIOD => 10.0, + CLKOUT_PHASE_SHIFT => "NONE", + CLK_FEEDBACK => "1X", + DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", + PHASE_SHIFT => 0, + STARTUP_WAIT => FALSE + ) + port map ( + CLKIN => clk100_ib, + CLKFB => clk100, + -- Output clocks + CLK0 => clk100_gb, + CLK90 => open, + CLK180 => open, + CLK270 => open, + CLK2X => open, + CLK2X180 => open, + CLKFX => clk48_gb, + CLKFX180 => open, + CLKDV => open, + -- Ports for dynamic phase shift + PSCLK => '0', + PSEN => '0', + PSINCDEC => '0', + PSDONE => open, + -- Other control and status signals + LOCKED => clk100_locked, + STATUS => open, + RST => rstbtn, + -- Unused pin, tie low + DSSEN => '0' + ); + + + dvi_decoder_0: entity work.dvi_decoder + port map ( + ext_rst => rstbtn, + + tmdsclk_p => rx0_tmds(3), + tmdsclk_n => rx0_tmds_n(3), + din_p => rx0_tmds(2 downto 0), + din_n => rx0_tmds_n(2 downto 0), + + reset_n => rst_n, -- rx reset + pclk_o => pclk, -- regenerated pixel clock + pclkx2_o => pclkx2, -- double rate pixel clock + pclkx10_o => pclkx10, -- 10x pixel as IOCLK + + pll_lckd_o => pll_lckd, -- send pll_lckd out so it can be fed into a different BUFPLL + serdesstrobe_o => serdesstrobe, -- BUFPLL serdesstrobe output + tmdsclk_o => tmdsclk, -- TMDS cable clock + + hsync_o => hsync, -- hsync data + vsync_o => vsync, -- vsync data + dat_en_o => dat_en, -- data enable + valid_o => valid, + ready_o => ready, + psalgnerr_o => psalgnerr, + sdout_o => sdout, + color_o => color + ); + + vmc_clk_ddr: ODDR2 + port map ( + Q => vmc_clk_o, -- 1-bit DDR output data + C0 => pclk, -- clock input + C1 => not pclk, -- clock input, inverted + CE => '1', -- clock enable always + D0 => '1', -- sampled on clock posedge, output when clock is HIGH + D1 => '0', -- sampled on clock negedge, output when clock is LOW + R => '0', -- set/reset disabled + S => '1' -- set/reset disabled + ); + --vmc_clk_o <= pclk; + vmc_red_o <= color(RED); + vmc_green_o <= color(GREEN); + vmc_blue_o <= color(BLUE); + vmc_hsync_o <= hsync; + vmc_vsync_o <= vsync; + vmc_de_o <= dat_en; + + -- ---------------------------------------------------------------------------- + -- core logic + -- ---------------------------------------------------------------------------- + f2p_strm_top_0: entity work.f2p_strm_top + generic map (STRM_OUT_SLV_CNT => STRM_OUT_SLV_CNT) + port map ( + clk => usb_clk, + rst_n => usb_rst_n, + debug => open, + + -- cypress interface + usb_clk => usb_clk, + usb_flag_a_i => usb_flag_a_i, + usb_flag_b_i => usb_flag_b_i, + usb_flag_c_i => usb_flag_c_i, + usb_cs_o => usb_cs_io, + usb_oe_o => usb_oe_o, + usb_rd_o => usb_rd_o, + usb_wr_o => usb_wr_o, + usb_pktend_o => usb_pktend_o, + usb_adr_o => usb_adr_o, + usb_dat_io => usb_dat_io, + + -- streaming bus + strm_in_data_o => strm_in_data, + strm_in_eop_o => strm_in_eop, + strm_in_sop_o => strm_in_sop, + strm_in_en_o => strm_in_en, + strm_in_busy_i => strm_in_busy, + strm_out_slv_reqs_i => strm_out_slv_reqs, + strm_out_slv_busy_o => strm_out_slv_busy, + strm_out_data_i => strm_out_data, + strm_out_eop_i => strm_out_eop, + strm_out_en_i => strm_out_en + ); + strm_out_slv_reqs(STRM_REGFILE_BUS) <= rf_strm_out_req; + strm_out_eop(STRM_REGFILE_BUS) <= rf_strm_out_eop; + strm_out_en(STRM_REGFILE_BUS) <= rf_strm_out_en; + strm_out_data(STRM_REGFILE_BUS) <= rf_strm_out_data; + rf_strm_out_busy <= strm_out_slv_busy(STRM_REGFILE_BUS); + strm_in_busy <= rf_strm_in_busy; + + strm_regfile_0: entity work.strm_regfile + generic map ( REGISTER_CNT => REG_CNT ) + port map ( + clk => usb_clk, + rst_n => usb_rst_n, + debug => open, + + -- streaming bus + strm_in_data_i => strm_in_data, + strm_in_eop_i => strm_in_eop, + strm_in_sop_i => strm_in_sop, + strm_in_en_i => strm_in_en, + strm_in_busy_o => rf_strm_in_busy, + strm_out_req_o => rf_strm_out_req, + strm_out_busy_i => rf_strm_out_busy, + strm_out_data_o => rf_strm_out_data, + strm_out_eop_o => rf_strm_out_eop, + strm_out_en_o => rf_strm_out_en, + + -- regfile + regfile_i => regfile, + regfile_o => regfile + ); + +end top; diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/coregen.cgp b/fpga/src/vendor/xilinx/atlys_ddr2/coregen.cgp new file mode 100644 index 0000000..7e78087 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/coregen.cgp @@ -0,0 +1,9 @@ +SET busformat = BusFormatAngleBracketNotRipped +SET designentry = VHDL +SET device = xc6slx45 +SET devicefamily = spartan6 +SET flowvendor = Other +SET package = csg324 +SET speedgrade = -3 +SET verilogsim = false +SET vhdlsim = true diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/create_ddr2.tcl b/fpga/src/vendor/xilinx/atlys_ddr2/create_ddr2.tcl new file mode 100644 index 0000000..613cb63 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/create_ddr2.tcl @@ -0,0 +1,37 @@ +## +## Core Generator Run Script, generator for Project Navigator create command +## + +proc findRtfPath { relativePath } { + set xilenv "" + if { [info exists ::env(XILINX) ] } { + if { [info exists ::env(MYXILINX)] } { + set xilenv [join [list $::env(MYXILINX) $::env(XILINX)] $::xilinx::path_sep ] + } else { + set xilenv $::env(XILINX) + } + } + foreach path [ split $xilenv $::xilinx::path_sep ] { + set fullPath [ file join $path $relativePath ] + if { [ file exists $fullPath ] } { + return $fullPath + } + } + return "" +} + +source [ findRtfPath "data/projnav/scripts/dpm_cgUtils.tcl" ] + +set result [ run_cg_create "xilinx.com:ip:mig:3.92" "ddr2" "MIG Virtex-6 and Spartan-6" "MIG Virtex-6 and Spartan-6 (xilinx.com:ip:mig:3.92) generated by Project Navigator" xc6slx45-3csg324 VHDL ] + +if { $result == 0 } { + puts "Core Generator create command completed successfully." +} elseif { $result == 1 } { + puts "Core Generator create command failed." +} elseif { $result == 3 || $result == 4 } { + # convert 'version check' result to real return range, bypassing any messages. + set result [ expr $result - 3 ] +} else { + puts "Core Generator create cancelled." +} +exit $result diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.gise b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.gise new file mode 100644 index 0000000..e2f75fc --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.gise @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + 11.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.ncf b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.ncf new file mode 100644 index 0000000..b45f564 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.ncf @@ -0,0 +1,164 @@ +############################################################################ +## +## Xilinx, Inc. 2006 www.xilinx.com +## Sun Jul 28 12:10:25 2013 +## Generated by MIG Version 3.92 +## +############################################################################ +## File name : ddr2.ucf +## +## Details : Constraints file +## FPGA family: spartan6 +## FPGA: xc6slx45-csg324 +## Speedgrade: -3 +## Design Entry: VHDL +## Design: without Test bench +## DCM Used: Enable +## No.Of Memory Controllers: 1 +## +############################################################################ +############################################################################ +# VCC AUX VOLTAGE +############################################################################ +CONFIG VCCAUX=2.5; # Valid values are 2.5 and 3.3 + +############################################################################ +# DDR2 requires the MCB to operate in Extended performance mode with higher Vccint +# specification to achieve maximum frequency. Therefore, the following CONFIG constraint +# follows the corresponding GUI option setting. However, DDR3 can operate at higher +# frequencies with any Vcciint value by operating MCB in extended mode. Please do not +# remove/edit the below constraint to avoid false errors. +############################################################################ +CONFIG MCB_PERFORMANCE= STANDARD; + + +################################################################################## +# Timing Ignore constraints for paths crossing the clock domain +################################################################################## +NET "memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/selfrefresh_mcb_mode" TIG; +NET "c?_pll_lock" TIG; +INST "memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/gen_term_calib.mcb_soft_calibration_top_inst/mcb_soft_calibration_inst/DONE_SOFTANDHARD_CAL*" TIG; + +#Please uncomment the below TIG if used in a design which enables self-refresh mode +#NET "memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/gen_term_calib.mcb_soft_calibration_top_inst/mcb_soft_calibration_inst/SELFREFRESH_MCB_REQ" TIG; + +NET "memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/gen_term_calib.mcb_soft_calibration_top_inst/mcb_soft_calibration_inst/CKE_Train" TIG; ## This path exists for DDR2 only + + +############################################################################ +## Memory Controller 3 +## Memory Device: DDR2_SDRAM->MT47H64M16XX-25E +## Frequency: 333.333 MHz +## Time Period: 3000 ps +## Supported Part Numbers: MT47H64M16HR-25E +############################################################################ + +############################################################################ +## Clock constraints +############################################################################ +NET "memc3_infrastructure_inst/sys_clk_ibufg" TNM_NET = "SYS_CLK3"; +TIMESPEC "TS_SYS_CLK3" = PERIOD "SYS_CLK3" 3 ns HIGH 50 %; +############################################################################ + +############################################################################ +## I/O TERMINATION +############################################################################ +NET "mcb3_dram_dq[*]" IN_TERM = NONE; +NET "mcb3_dram_dqs" IN_TERM = NONE; +NET "mcb3_dram_dqs_n" IN_TERM = NONE; +NET "mcb3_dram_udqs" IN_TERM = NONE; +NET "mcb3_dram_udqs_n" IN_TERM = NONE; + +############################################################################ +# I/O STANDARDS +############################################################################ + +NET "mcb3_dram_dq[*]" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_a[*]" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_ba[*]" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_dqs" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_udqs" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_dqs_n" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_udqs_n" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_ck" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_ck_n" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_cke" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_ras_n" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_cas_n" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_we_n" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_odt" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_dm" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_udm" IOSTANDARD = SSTL18_II ; +NET "mcb3_rzq" IOSTANDARD = SSTL18_II ; +NET "mcb3_zio" IOSTANDARD = SSTL18_II ; +NET "c3_sys_clk" IOSTANDARD = LVCMOS25 ; +NET "c3_sys_rst_i" IOSTANDARD = LVCMOS18 ; +############################################################################ +# MCB 3 +# Pin Location Constraints for Clock, Masks, Address, and Controls +############################################################################ + +NET "mcb3_dram_a[0]" LOC = "J7" ; +NET "mcb3_dram_a[10]" LOC = "F4" ; +NET "mcb3_dram_a[11]" LOC = "D3" ; +NET "mcb3_dram_a[12]" LOC = "G6" ; +NET "mcb3_dram_a[1]" LOC = "J6" ; +NET "mcb3_dram_a[2]" LOC = "H5" ; +NET "mcb3_dram_a[3]" LOC = "L7" ; +NET "mcb3_dram_a[4]" LOC = "F3" ; +NET "mcb3_dram_a[5]" LOC = "H4" ; +NET "mcb3_dram_a[6]" LOC = "H3" ; +NET "mcb3_dram_a[7]" LOC = "H6" ; +NET "mcb3_dram_a[8]" LOC = "D2" ; +NET "mcb3_dram_a[9]" LOC = "D1" ; +NET "mcb3_dram_ba[0]" LOC = "F2" ; +NET "mcb3_dram_ba[1]" LOC = "F1" ; +NET "mcb3_dram_ba[2]" LOC = "E1" ; +NET "mcb3_dram_cas_n" LOC = "K5" ; +NET "mcb3_dram_ck" LOC = "G3" ; +NET "mcb3_dram_ck_n" LOC = "G1" ; +NET "mcb3_dram_cke" LOC = "H7" ; +NET "mcb3_dram_dm" LOC = "K3" ; +NET "mcb3_dram_dq[0]" LOC = "L2" ; +NET "mcb3_dram_dq[10]" LOC = "N2" ; +NET "mcb3_dram_dq[11]" LOC = "N1" ; +NET "mcb3_dram_dq[12]" LOC = "T2" ; +NET "mcb3_dram_dq[13]" LOC = "T1" ; +NET "mcb3_dram_dq[14]" LOC = "U2" ; +NET "mcb3_dram_dq[15]" LOC = "U1" ; +NET "mcb3_dram_dq[1]" LOC = "L1" ; +NET "mcb3_dram_dq[2]" LOC = "K2" ; +NET "mcb3_dram_dq[3]" LOC = "K1" ; +NET "mcb3_dram_dq[4]" LOC = "H2" ; +NET "mcb3_dram_dq[5]" LOC = "H1" ; +NET "mcb3_dram_dq[6]" LOC = "J3" ; +NET "mcb3_dram_dq[7]" LOC = "J1" ; +NET "mcb3_dram_dq[8]" LOC = "M3" ; +NET "mcb3_dram_dq[9]" LOC = "M1" ; +NET "mcb3_dram_dqs" LOC = "L4" ; +NET "mcb3_dram_dqs_n" LOC = "L3" ; +NET "mcb3_dram_odt" LOC = "K6" ; +NET "mcb3_dram_ras_n" LOC = "L5" ; +NET "c3_sys_clk" LOC = "R10" ; +NET "c3_sys_rst_i" LOC = "M8" ; +NET "mcb3_dram_udm" LOC = "K4" ; +NET "mcb3_dram_udqs" LOC = "P2" ; +NET "mcb3_dram_udqs_n" LOC = "P1" ; +NET "mcb3_dram_we_n" LOC = "E3" ; + +################################################################################## +#RZQ is required for all MCB designs. Do not move the location # +#of this pin for ES devices.For production devices, RZQ can be moved to any # +#valid package pin within the MCB bank.For designs using Calibrated Input Termination, # +#a 2R resistor should be connected between RZQand ground, where R is the desired# +#input termination value. Otherwise, RZQ should be left as a no-connect (NC) pin.# +################################################################################## +NET "mcb3_rzq" LOC = "N4" ; +################################################################################## +#ZIO is only required for MCB designs using Calibrated Input Termination.# +#ZIO can be moved to any valid package pin (i.e. bonded IO) within the# +#MCB bank but must be left as a no-connect (NC) pin.# +################################################################################## +NET "mcb3_zio" LOC = "P4" ; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.vho b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.vho new file mode 100644 index 0000000..7ca2304 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.vho @@ -0,0 +1,365 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor : Xilinx +-- \ \ \/ Version : 3.92 +-- \ \ Application : MIG +-- / / Filename : ddr2.vho +-- /___/ /\ Date Last Modified : $Date: 2011/06/02 07:19:03 $ +-- \ \ / \ Date Created : Fri Aug 7 2009 +-- \___\/\___\ +-- +-- Purpose : Template file containing code that can be used as a model +-- for instantiating a CORE Generator module in a HDL design. +-- Revision History: +--***************************************************************************** + +-- The following code must appear in the VHDL architecture header: + +------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG + +component ddr2 + generic( + C3_P0_MASK_SIZE : integer := 4; + C3_P0_DATA_PORT_SIZE : integer := 32; + C3_P1_MASK_SIZE : integer := 4; + C3_P1_DATA_PORT_SIZE : integer := 32; + C3_MEMCLK_PERIOD : integer := 3000; + C3_RST_ACT_LOW : integer := 0; + C3_INPUT_CLK_TYPE : string := "SINGLE_ENDED"; + C3_CALIB_SOFT_IP : string := "TRUE"; + C3_SIMULATION : string := "FALSE"; + DEBUG_EN : integer := 0; + C3_MEM_ADDR_ORDER : string := "BANK_ROW_COLUMN"; + C3_NUM_DQ_PINS : integer := 16; + C3_MEM_ADDR_WIDTH : integer := 13; + C3_MEM_BANKADDR_WIDTH : integer := 3 +); + port ( + mcb3_dram_dq : inout std_logic_vector(C3_NUM_DQ_PINS-1 downto 0); + mcb3_dram_a : out std_logic_vector(C3_MEM_ADDR_WIDTH-1 downto 0); + mcb3_dram_ba : out std_logic_vector(C3_MEM_BANKADDR_WIDTH-1 downto 0); + mcb3_dram_ras_n : out std_logic; + mcb3_dram_cas_n : out std_logic; + mcb3_dram_we_n : out std_logic; + mcb3_dram_odt : out std_logic; + mcb3_dram_cke : out std_logic; + mcb3_dram_dm : out std_logic; + mcb3_dram_udqs : inout std_logic; + mcb3_dram_udqs_n : inout std_logic; + mcb3_rzq : inout std_logic; + mcb3_zio : inout std_logic; + mcb3_dram_udm : out std_logic; + c3_sys_clk : in std_logic; + c3_sys_rst_i : in std_logic; + c3_calib_done : out std_logic; + c3_clk0 : out std_logic; + c3_rst0 : out std_logic; + mcb3_dram_dqs : inout std_logic; + mcb3_dram_dqs_n : inout std_logic; + mcb3_dram_ck : out std_logic; + mcb3_dram_ck_n : out std_logic; + c3_p0_cmd_clk : in std_logic; + c3_p0_cmd_en : in std_logic; + c3_p0_cmd_instr : in std_logic_vector(2 downto 0); + c3_p0_cmd_bl : in std_logic_vector(5 downto 0); + c3_p0_cmd_byte_addr : in std_logic_vector(29 downto 0); + c3_p0_cmd_empty : out std_logic; + c3_p0_cmd_full : out std_logic; + c3_p0_wr_clk : in std_logic; + c3_p0_wr_en : in std_logic; + c3_p0_wr_mask : in std_logic_vector(C3_P0_MASK_SIZE - 1 downto 0); + c3_p0_wr_data : in std_logic_vector(C3_P0_DATA_PORT_SIZE - 1 downto 0); + c3_p0_wr_full : out std_logic; + c3_p0_wr_empty : out std_logic; + c3_p0_wr_count : out std_logic_vector(6 downto 0); + c3_p0_wr_underrun : out std_logic; + c3_p0_wr_error : out std_logic; + c3_p0_rd_clk : in std_logic; + c3_p0_rd_en : in std_logic; + c3_p0_rd_data : out std_logic_vector(C3_P0_DATA_PORT_SIZE - 1 downto 0); + c3_p0_rd_full : out std_logic; + c3_p0_rd_empty : out std_logic; + c3_p0_rd_count : out std_logic_vector(6 downto 0); + c3_p0_rd_overflow : out std_logic; + c3_p0_rd_error : out std_logic; + c3_p1_cmd_clk : in std_logic; + c3_p1_cmd_en : in std_logic; + c3_p1_cmd_instr : in std_logic_vector(2 downto 0); + c3_p1_cmd_bl : in std_logic_vector(5 downto 0); + c3_p1_cmd_byte_addr : in std_logic_vector(29 downto 0); + c3_p1_cmd_empty : out std_logic; + c3_p1_cmd_full : out std_logic; + c3_p1_wr_clk : in std_logic; + c3_p1_wr_en : in std_logic; + c3_p1_wr_mask : in std_logic_vector(C3_P1_MASK_SIZE - 1 downto 0); + c3_p1_wr_data : in std_logic_vector(C3_P1_DATA_PORT_SIZE - 1 downto 0); + c3_p1_wr_full : out std_logic; + c3_p1_wr_empty : out std_logic; + c3_p1_wr_count : out std_logic_vector(6 downto 0); + c3_p1_wr_underrun : out std_logic; + c3_p1_wr_error : out std_logic; + c3_p1_rd_clk : in std_logic; + c3_p1_rd_en : in std_logic; + c3_p1_rd_data : out std_logic_vector(C3_P1_DATA_PORT_SIZE - 1 downto 0); + c3_p1_rd_full : out std_logic; + c3_p1_rd_empty : out std_logic; + c3_p1_rd_count : out std_logic_vector(6 downto 0); + c3_p1_rd_overflow : out std_logic; + c3_p1_rd_error : out std_logic; + c3_p2_cmd_clk : in std_logic; + c3_p2_cmd_en : in std_logic; + c3_p2_cmd_instr : in std_logic_vector(2 downto 0); + c3_p2_cmd_bl : in std_logic_vector(5 downto 0); + c3_p2_cmd_byte_addr : in std_logic_vector(29 downto 0); + c3_p2_cmd_empty : out std_logic; + c3_p2_cmd_full : out std_logic; + c3_p2_wr_clk : in std_logic; + c3_p2_wr_en : in std_logic; + c3_p2_wr_mask : in std_logic_vector(3 downto 0); + c3_p2_wr_data : in std_logic_vector(31 downto 0); + c3_p2_wr_full : out std_logic; + c3_p2_wr_empty : out std_logic; + c3_p2_wr_count : out std_logic_vector(6 downto 0); + c3_p2_wr_underrun : out std_logic; + c3_p2_wr_error : out std_logic; + c3_p2_rd_clk : in std_logic; + c3_p2_rd_en : in std_logic; + c3_p2_rd_data : out std_logic_vector(31 downto 0); + c3_p2_rd_full : out std_logic; + c3_p2_rd_empty : out std_logic; + c3_p2_rd_count : out std_logic_vector(6 downto 0); + c3_p2_rd_overflow : out std_logic; + c3_p2_rd_error : out std_logic; + c3_p3_cmd_clk : in std_logic; + c3_p3_cmd_en : in std_logic; + c3_p3_cmd_instr : in std_logic_vector(2 downto 0); + c3_p3_cmd_bl : in std_logic_vector(5 downto 0); + c3_p3_cmd_byte_addr : in std_logic_vector(29 downto 0); + c3_p3_cmd_empty : out std_logic; + c3_p3_cmd_full : out std_logic; + c3_p3_wr_clk : in std_logic; + c3_p3_wr_en : in std_logic; + c3_p3_wr_mask : in std_logic_vector(3 downto 0); + c3_p3_wr_data : in std_logic_vector(31 downto 0); + c3_p3_wr_full : out std_logic; + c3_p3_wr_empty : out std_logic; + c3_p3_wr_count : out std_logic_vector(6 downto 0); + c3_p3_wr_underrun : out std_logic; + c3_p3_wr_error : out std_logic; + c3_p3_rd_clk : in std_logic; + c3_p3_rd_en : in std_logic; + c3_p3_rd_data : out std_logic_vector(31 downto 0); + c3_p3_rd_full : out std_logic; + c3_p3_rd_empty : out std_logic; + c3_p3_rd_count : out std_logic_vector(6 downto 0); + c3_p3_rd_overflow : out std_logic; + c3_p3_rd_error : out std_logic +); +end component; + +-- COMP_TAG_END ------ End COMPONENT Declaration ------------ + +-- The following code must appear in the VHDL architecture +-- body. Substitute your own instance name and net names. + +------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG + u_ddr2 : ddr2 + generic map ( + C3_P0_MASK_SIZE => C3_P0_MASK_SIZE, + C3_P0_DATA_PORT_SIZE => C3_P0_DATA_PORT_SIZE, + C3_P1_MASK_SIZE => C3_P1_MASK_SIZE, + C3_P1_DATA_PORT_SIZE => C3_P1_DATA_PORT_SIZE, + C3_MEMCLK_PERIOD => C3_MEMCLK_PERIOD, + C3_RST_ACT_LOW => C3_RST_ACT_LOW, + C3_INPUT_CLK_TYPE => C3_INPUT_CLK_TYPE, + C3_CALIB_SOFT_IP => C3_CALIB_SOFT_IP, + C3_SIMULATION => C3_SIMULATION, + DEBUG_EN => DEBUG_EN, + C3_MEM_ADDR_ORDER => C3_MEM_ADDR_ORDER, + C3_NUM_DQ_PINS => C3_NUM_DQ_PINS, + C3_MEM_ADDR_WIDTH => C3_MEM_ADDR_WIDTH, + C3_MEM_BANKADDR_WIDTH => C3_MEM_BANKADDR_WIDTH +) + port map ( + + c3_sys_clk => c3_sys_clk, + c3_sys_rst_i => c3_sys_rst_i, + + mcb3_dram_dq => mcb3_dram_dq, + mcb3_dram_a => mcb3_dram_a, + mcb3_dram_ba => mcb3_dram_ba, + mcb3_dram_ras_n => mcb3_dram_ras_n, + mcb3_dram_cas_n => mcb3_dram_cas_n, + mcb3_dram_we_n => mcb3_dram_we_n, + mcb3_dram_odt => mcb3_dram_odt, + mcb3_dram_cke => mcb3_dram_cke, + mcb3_dram_ck => mcb3_dram_ck, + mcb3_dram_ck_n => mcb3_dram_ck_n, + mcb3_dram_dqs => mcb3_dram_dqs, + mcb3_dram_dqs_n => mcb3_dram_dqs_n, + mcb3_dram_udqs => mcb3_dram_udqs, -- for X16 parts + mcb3_dram_udqs_n => mcb3_dram_udqs_n, -- for X16 parts + mcb3_dram_udm => mcb3_dram_udm, -- for X16 parts + mcb3_dram_dm => mcb3_dram_dm, + c3_clk0 => c3_clk0, + c3_rst0 => c3_rst0, + + + c3_calib_done => c3_calib_done, + mcb3_rzq => rzq3, + + mcb3_zio => zio3, + + c3_p0_cmd_clk => c3_p0_cmd_clk, + c3_p0_cmd_en => c3_p0_cmd_en, + c3_p0_cmd_instr => c3_p0_cmd_instr, + c3_p0_cmd_bl => c3_p0_cmd_bl, + c3_p0_cmd_byte_addr => c3_p0_cmd_byte_addr, + c3_p0_cmd_empty => c3_p0_cmd_empty, + c3_p0_cmd_full => c3_p0_cmd_full, + c3_p0_wr_clk => c3_p0_wr_clk, + c3_p0_wr_en => c3_p0_wr_en, + c3_p0_wr_mask => c3_p0_wr_mask, + c3_p0_wr_data => c3_p0_wr_data, + c3_p0_wr_full => c3_p0_wr_full, + c3_p0_wr_empty => c3_p0_wr_empty, + c3_p0_wr_count => c3_p0_wr_count, + c3_p0_wr_underrun => c3_p0_wr_underrun, + c3_p0_wr_error => c3_p0_wr_error, + c3_p0_rd_clk => c3_p0_rd_clk, + c3_p0_rd_en => c3_p0_rd_en, + c3_p0_rd_data => c3_p0_rd_data, + c3_p0_rd_full => c3_p0_rd_full, + c3_p0_rd_empty => c3_p0_rd_empty, + c3_p0_rd_count => c3_p0_rd_count, + c3_p0_rd_overflow => c3_p0_rd_overflow, + c3_p0_rd_error => c3_p0_rd_error, + c3_p1_cmd_clk => c3_p1_cmd_clk, + c3_p1_cmd_en => c3_p1_cmd_en, + c3_p1_cmd_instr => c3_p1_cmd_instr, + c3_p1_cmd_bl => c3_p1_cmd_bl, + c3_p1_cmd_byte_addr => c3_p1_cmd_byte_addr, + c3_p1_cmd_empty => c3_p1_cmd_empty, + c3_p1_cmd_full => c3_p1_cmd_full, + c3_p1_wr_clk => c3_p1_wr_clk, + c3_p1_wr_en => c3_p1_wr_en, + c3_p1_wr_mask => c3_p1_wr_mask, + c3_p1_wr_data => c3_p1_wr_data, + c3_p1_wr_full => c3_p1_wr_full, + c3_p1_wr_empty => c3_p1_wr_empty, + c3_p1_wr_count => c3_p1_wr_count, + c3_p1_wr_underrun => c3_p1_wr_underrun, + c3_p1_wr_error => c3_p1_wr_error, + c3_p1_rd_clk => c3_p1_rd_clk, + c3_p1_rd_en => c3_p1_rd_en, + c3_p1_rd_data => c3_p1_rd_data, + c3_p1_rd_full => c3_p1_rd_full, + c3_p1_rd_empty => c3_p1_rd_empty, + c3_p1_rd_count => c3_p1_rd_count, + c3_p1_rd_overflow => c3_p1_rd_overflow, + c3_p1_rd_error => c3_p1_rd_error, + c3_p2_cmd_clk => c3_p2_cmd_clk, + c3_p2_cmd_en => c3_p2_cmd_en, + c3_p2_cmd_instr => c3_p2_cmd_instr, + c3_p2_cmd_bl => c3_p2_cmd_bl, + c3_p2_cmd_byte_addr => c3_p2_cmd_byte_addr, + c3_p2_cmd_empty => c3_p2_cmd_empty, + c3_p2_cmd_full => c3_p2_cmd_full, + c3_p2_wr_clk => c3_p2_wr_clk, + c3_p2_wr_en => c3_p2_wr_en, + c3_p2_wr_mask => c3_p2_wr_mask, + c3_p2_wr_data => c3_p2_wr_data, + c3_p2_wr_full => c3_p2_wr_full, + c3_p2_wr_empty => c3_p2_wr_empty, + c3_p2_wr_count => c3_p2_wr_count, + c3_p2_wr_underrun => c3_p2_wr_underrun, + c3_p2_wr_error => c3_p2_wr_error, + c3_p2_rd_clk => c3_p2_rd_clk, + c3_p2_rd_en => c3_p2_rd_en, + c3_p2_rd_data => c3_p2_rd_data, + c3_p2_rd_full => c3_p2_rd_full, + c3_p2_rd_empty => c3_p2_rd_empty, + c3_p2_rd_count => c3_p2_rd_count, + c3_p2_rd_overflow => c3_p2_rd_overflow, + c3_p2_rd_error => c3_p2_rd_error, + c3_p3_cmd_clk => c3_p3_cmd_clk, + c3_p3_cmd_en => c3_p3_cmd_en, + c3_p3_cmd_instr => c3_p3_cmd_instr, + c3_p3_cmd_bl => c3_p3_cmd_bl, + c3_p3_cmd_byte_addr => c3_p3_cmd_byte_addr, + c3_p3_cmd_empty => c3_p3_cmd_empty, + c3_p3_cmd_full => c3_p3_cmd_full, + c3_p3_wr_clk => c3_p3_wr_clk, + c3_p3_wr_en => c3_p3_wr_en, + c3_p3_wr_mask => c3_p3_wr_mask, + c3_p3_wr_data => c3_p3_wr_data, + c3_p3_wr_full => c3_p3_wr_full, + c3_p3_wr_empty => c3_p3_wr_empty, + c3_p3_wr_count => c3_p3_wr_count, + c3_p3_wr_underrun => c3_p3_wr_underrun, + c3_p3_wr_error => c3_p3_wr_error, + c3_p3_rd_clk => c3_p3_rd_clk, + c3_p3_rd_en => c3_p3_rd_en, + c3_p3_rd_data => c3_p3_rd_data, + c3_p3_rd_full => c3_p3_rd_full, + c3_p3_rd_empty => c3_p3_rd_empty, + c3_p3_rd_count => c3_p3_rd_count, + c3_p3_rd_overflow => c3_p3_rd_overflow, + c3_p3_rd_error => c3_p3_rd_error +); + +-- INST_TAG_END ------ End INSTANTIATION Template ------------ + +-- You must compile the wrapper file ddr2.vhd when simulating +-- the core, ddr2. When compiling the wrapper file, be sure to +-- reference the XilinxCoreLib VHDL simulation library. For detailed +-- instructions, please refer to the "CORE Generator Help". + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xco b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xco new file mode 100644 index 0000000..f0e69a4 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xco @@ -0,0 +1,49 @@ +############################################################## +# +# Xilinx Core Generator version 14.6 +# Date: Sun Jul 28 10:10:27 2013 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# Generated from component: xilinx.com:ip:mig:3.92 +# +############################################################## +# +# BEGIN Project Options +SET addpads = false +SET asysymbol = true +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = false +SET designentry = VHDL +SET device = xc6slx45 +SET devicefamily = spartan6 +SET flowvendor = Other +SET formalverification = false +SET foundationsym = false +SET implementationfiletype = Ngc +SET package = csg324 +SET removerpms = false +SET simulationfiles = Behavioral +SET speedgrade = -3 +SET verilogsim = false +SET vhdlsim = true +# END Project Options +# BEGIN Select +SELECT MIG_Virtex-6_and_Spartan-6 family Xilinx,_Inc. 3.92 +# END Select +# BEGIN Parameters +CSET component_name=ddr2 +CSET xml_input_file=./ddr2/user_design/mig.prj +# END Parameters +# BEGIN Extra information +MISC pkg_timestamp=2013-06-08T23:00:50Z +# END Extra information +GENERATE +# CRC: ede738a9 diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xise b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xise new file mode 100644 index 0000000..0ef39db --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2.xise @@ -0,0 +1,123 @@ + + + +

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/docs/ug388.pdf b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/docs/ug388.pdf new file mode 100755 index 0000000000000000000000000000000000000000..6153345385f048a08b4cad0e22c57c391d57ddf2 GIT binary patch literal 2172724 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

(r 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⪼?uf*x%;UyfNlbQR(DRDUwmXpataK4L~ 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

f!Y?&Ie_#T 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�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
z
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

4TO9o|T`-Xuq{@=&&!F{4$4m5X068_zM)*S3l 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

Tu!tUXT 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 HK3)A67(NYt literal 0 HcmV?d00001 diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/datasheet.txt b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/datasheet.txt new file mode 100644 index 0000000..b80460d --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/datasheet.txt @@ -0,0 +1,72 @@ + + +CORE Generator Options: + Target Device : xc6slx45-csg324 + Speed Grade : -3 + HDL : vhdl + Synthesis Tool : Foundation_ISE + +MIG Output Options: + Component Name : ddr2 + No of Controllers : 1 + Hardware Test Bench : enabled + + +/*******************************************************/ +/* Controller 3 */ +/*******************************************************/ +Controller Options : + Memory : DDR2_SDRAM + Interface : NATIVE + Design Clock Frequency : 3000 ps (333.33 MHz) + Memory Type : Components + Memory Part : MT47H64M16XX-25E + Equivalent Part(s) : MT47H64M16HR-25E + Row Address : 13 + Column Address : 10 + Bank Address : 3 + Data Mask : enabled + +Memory Options : + Burst Length : 4(010) + CAS Latency : 5 + DQS# Enable : Enable + DLL Enable : Enable-Normal + OCD Operation : OCD Exit + Output Drive Strength : Fullstrength + Outputs : Enable + Additive Latency (AL) : 0 + RDQS Enable : Disable + RTT (nominal) - ODT : 50ohms + High Temparature Self Refresh Rate : Disable + +User Interface Parameters : + Configuration Type : Four 32-bit bi-directional ports + Ports Selected : Port0, Port1, Port2, Port3 + Memory Address Mapping : BANK_ROW_COLUMN + + Arbitration Algorithm : Round Robin + + Arbitration : + Time Slot0 : 0123 + Time Slot1 : 1230 + Time Slot2 : 2301 + Time Slot3 : 3012 + Time Slot4 : 0123 + Time Slot5 : 1230 + Time Slot6 : 2301 + Time Slot7 : 3012 + Time Slot8 : 0123 + Time Slot9 : 1230 + Time Slot10: 2301 + Time Slot11: 3012 + +FPGA Options : + Class for Address and Control : II + Class for Data : II + Memory Interface Pin Termination : CALIB_TERM + DQ/DQS : 25 Ohms + Bypass Calibration : enabled + Debug Signals for Memory Controller : Disable + Input Clock Type : Single-Ended + \ No newline at end of file diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/create_ise.sh b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/create_ise.sh new file mode 100755 index 0000000..d71e95f --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/create_ise.sh @@ -0,0 +1,72 @@ +#!/bin/csh -f +#***************************************************************************** +# (c) Copyright 2009 Xilinx, Inc. All rights reserved. +# +# This file contains confidential and proprietary information +# of Xilinx, Inc. and is protected under U.S. and +# international copyright and other intellectual property +# laws. +# +# DISCLAIMER +# This disclaimer is not a license and does not grant any +# rights to the materials distributed herewith. Except as +# otherwise provided in a valid license issued to you by +# Xilinx, and to the maximum extent permitted by applicable +# law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +# WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +# AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +# BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +# INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +# (2) Xilinx shall not be liable (whether in contract or tort, +# including negligence, or under any other theory of +# liability) for any loss or damage of any kind or nature +# related to, arising under or in connection with these +# materials, including for any direct, or any indirect, +# special, incidental, or consequential loss or damage +# (including loss of data, profits, goodwill, or any type of +# loss or damage suffered as a result of any action brought +# by a third party) even if such damage or loss was +# reasonably foreseeable or Xilinx had been advised of the +# possibility of the same. +# +# CRITICAL APPLICATIONS +# Xilinx products are not designed or intended to be fail- +# safe, or for use in any application requiring fail-safe +# performance, such as life-support or safety devices or +# systems, Class III medical devices, nuclear facilities, +# applications related to the deployment of airbags, or any +# other applications that could lead to death, personal +# injury, or severe property or environmental damage +# (individually and collectively, "Critical +# Applications"). Customer assumes the sole risk and +# liability of any use of Xilinx products in Critical +# Applications, subject only to applicable laws and +# regulations governing limitations on product liability. +# +# THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +# PART OF THIS FILE AT ALL TIMES. +# +# **************************************************************************** +# ____ ____ +# / /\/ / +# /___/ \ / Vendor : Xilinx +# \ \ \/ Version : 3.92 +# \ \ Application : MIG +# / / Filename : create_ise.bat +# /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:55 $ +# \ \ / \ Date Created : Fri Feb 06 2009 +# \___\/\___\ +# +# Device : Spartan-6 +# Design Name : DDR/DDR2/DDR3/LPDDR +# Purpose : Batch file to run PAR through ISE +# Reference : +# Revision History : +# **************************************************************************** + +./rem_files.sh + + + + +xtclsh set_ise_prop.tcl diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/example_top.ucf b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/example_top.ucf new file mode 100644 index 0000000..b344cc7 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/example_top.ucf @@ -0,0 +1,172 @@ +############################################################################ +## +## Xilinx, Inc. 2006 www.xilinx.com +## Sun Jul 28 12:10:23 2013 +## Generated by MIG Version 3.92 +## +############################################################################ +## File name : example_top.ucf +## +## Details : Constraints file +## FPGA family: spartan6 +## FPGA: xc6slx45-csg324 +## Speedgrade: -3 +## Design Entry: VHDL +## Design: with Test bench +## DCM Used: Enable +## No.Of Memory Controllers: 1 +## +############################################################################ +############################################################################ +# VCC AUX VOLTAGE +############################################################################ +CONFIG VCCAUX=2.5; # Valid values are 2.5 and 3.3 + +############################################################################ +# DDR2 requires the MCB to operate in Extended performance mode with higher Vccint +# specification to achieve maximum frequency. Therefore, the following CONFIG constraint +# follows the corresponding GUI option setting. However, DDR3 can operate at higher +# frequencies with any Vcciint value by operating MCB in extended mode. Please do not +# remove/edit the below constraint to avoid false errors. +############################################################################ +CONFIG MCB_PERFORMANCE= STANDARD; + + +################################################################################## +# Timing Ignore constraints for paths crossing the clock domain +################################################################################## +NET "memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/selfrefresh_mcb_mode" TIG; +NET "c?_pll_lock" TIG; +INST "memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/gen_term_calib.mcb_soft_calibration_top_inst/mcb_soft_calibration_inst/DONE_SOFTANDHARD_CAL*" TIG; + +#Please uncomment the below TIG if used in a design which enables self-refresh mode +#NET "memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/gen_term_calib.mcb_soft_calibration_top_inst/mcb_soft_calibration_inst/SELFREFRESH_MCB_REQ" TIG; + +NET "memc?_wrapper_inst/memc?_mcb_raw_wrapper_inst/gen_term_calib.mcb_soft_calibration_top_inst/mcb_soft_calibration_inst/CKE_Train" TIG; ## This path exists for DDR2 only + + +############################################################################ +## Memory Controller 3 +## Memory Device: DDR2_SDRAM->MT47H64M16XX-25E +## Frequency: 333.333 MHz +## Time Period: 3000 ps +## Supported Part Numbers: MT47H64M16HR-25E +############################################################################ + +############################################################################ +## Clock constraints +############################################################################ +NET "memc3_infrastructure_inst/sys_clk_ibufg" TNM_NET = "SYS_CLK3"; +TIMESPEC "TS_SYS_CLK3" = PERIOD "SYS_CLK3" 3 ns HIGH 50 %; +############################################################################ + +############################################################################ +## I/O TERMINATION +############################################################################ +NET "mcb3_dram_dq[*]" IN_TERM = NONE; +NET "mcb3_dram_dqs" IN_TERM = NONE; +NET "mcb3_dram_dqs_n" IN_TERM = NONE; +NET "mcb3_dram_udqs" IN_TERM = NONE; +NET "mcb3_dram_udqs_n" IN_TERM = NONE; + +############################################################################ +# Status Signals +############################################################################ + +NET "error" IOSTANDARD = LVCMOS18 ; +NET "calib_done" IOSTANDARD = LVCMOS18 ; +NET "calib_done" LOC = "B2" ; +NET "error" LOC = "A2" ; + +############################################################################ +# I/O STANDARDS +############################################################################ + +NET "mcb3_dram_dq[*]" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_a[*]" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_ba[*]" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_dqs" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_udqs" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_dqs_n" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_udqs_n" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_ck" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_ck_n" IOSTANDARD = DIFF_SSTL18_II ; +NET "mcb3_dram_cke" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_ras_n" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_cas_n" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_we_n" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_odt" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_dm" IOSTANDARD = SSTL18_II ; +NET "mcb3_dram_udm" IOSTANDARD = SSTL18_II ; +NET "mcb3_rzq" IOSTANDARD = SSTL18_II ; +NET "mcb3_zio" IOSTANDARD = SSTL18_II ; +NET "c3_sys_clk" IOSTANDARD = LVCMOS25 ; +NET "c3_sys_rst_i" IOSTANDARD = LVCMOS18 ; +############################################################################ +# MCB 3 +# Pin Location Constraints for Clock, Masks, Address, and Controls +############################################################################ + +NET "mcb3_dram_a[0]" LOC = "J7" ; +NET "mcb3_dram_a[10]" LOC = "F4" ; +NET "mcb3_dram_a[11]" LOC = "D3" ; +NET "mcb3_dram_a[12]" LOC = "G6" ; +NET "mcb3_dram_a[1]" LOC = "J6" ; +NET "mcb3_dram_a[2]" LOC = "H5" ; +NET "mcb3_dram_a[3]" LOC = "L7" ; +NET "mcb3_dram_a[4]" LOC = "F3" ; +NET "mcb3_dram_a[5]" LOC = "H4" ; +NET "mcb3_dram_a[6]" LOC = "H3" ; +NET "mcb3_dram_a[7]" LOC = "H6" ; +NET "mcb3_dram_a[8]" LOC = "D2" ; +NET "mcb3_dram_a[9]" LOC = "D1" ; +NET "mcb3_dram_ba[0]" LOC = "F2" ; +NET "mcb3_dram_ba[1]" LOC = "F1" ; +NET "mcb3_dram_ba[2]" LOC = "E1" ; +NET "mcb3_dram_cas_n" LOC = "K5" ; +NET "mcb3_dram_ck" LOC = "G3" ; +NET "mcb3_dram_ck_n" LOC = "G1" ; +NET "mcb3_dram_cke" LOC = "H7" ; +NET "mcb3_dram_dm" LOC = "K3" ; +NET "mcb3_dram_dq[0]" LOC = "L2" ; +NET "mcb3_dram_dq[10]" LOC = "N2" ; +NET "mcb3_dram_dq[11]" LOC = "N1" ; +NET "mcb3_dram_dq[12]" LOC = "T2" ; +NET "mcb3_dram_dq[13]" LOC = "T1" ; +NET "mcb3_dram_dq[14]" LOC = "U2" ; +NET "mcb3_dram_dq[15]" LOC = "U1" ; +NET "mcb3_dram_dq[1]" LOC = "L1" ; +NET "mcb3_dram_dq[2]" LOC = "K2" ; +NET "mcb3_dram_dq[3]" LOC = "K1" ; +NET "mcb3_dram_dq[4]" LOC = "H2" ; +NET "mcb3_dram_dq[5]" LOC = "H1" ; +NET "mcb3_dram_dq[6]" LOC = "J3" ; +NET "mcb3_dram_dq[7]" LOC = "J1" ; +NET "mcb3_dram_dq[8]" LOC = "M3" ; +NET "mcb3_dram_dq[9]" LOC = "M1" ; +NET "mcb3_dram_dqs" LOC = "L4" ; +NET "mcb3_dram_dqs_n" LOC = "L3" ; +NET "mcb3_dram_odt" LOC = "K6" ; +NET "mcb3_dram_ras_n" LOC = "L5" ; +NET "c3_sys_clk" LOC = "R10" ; +NET "c3_sys_rst_i" LOC = "M8" ; +NET "mcb3_dram_udm" LOC = "K4" ; +NET "mcb3_dram_udqs" LOC = "P2" ; +NET "mcb3_dram_udqs_n" LOC = "P1" ; +NET "mcb3_dram_we_n" LOC = "E3" ; + +################################################################################## +#RZQ is required for all MCB designs. Do not move the location # +#of this pin for ES devices.For production devices, RZQ can be moved to any # +#valid package pin within the MCB bank.For designs using Calibrated Input Termination, # +#a 2R resistor should be connected between RZQand ground, where R is the desired# +#input termination value. Otherwise, RZQ should be left as a no-connect (NC) pin.# +################################################################################## +NET "mcb3_rzq" LOC = "N4" ; +################################################################################## +#ZIO is only required for MCB designs using Calibrated Input Termination.# +#ZIO can be moved to any valid package pin (i.e. bonded IO) within the# +#MCB bank but must be left as a no-connect (NC) pin.# +################################################################################## +NET "mcb3_zio" LOC = "P4" ; + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/icon_coregen.xco b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/icon_coregen.xco new file mode 100644 index 0000000..ac21f7c --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/icon_coregen.xco @@ -0,0 +1,48 @@ +############################################################## +# +# Xilinx Core Generator version 11.1 +# Date: Wed Mar 11 07:09:11 2009 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# BEGIN Project Options +SET addpads = False +SET asysymbol = True +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = False +SET designentry = vhdl +SET device = xc6slx45 +SET devicefamily = spartan6 +SET flowvendor = Foundation_ISE +SET formalverification = False +SET foundationsym = False +SET implementationfiletype = Ngc +SET package = csg324 +SET removerpms = False +SET simulationfiles = Structural +SET speedgrade = -3 +SET verilogsim = False +SET vhdlsim = False +# END Project Options +# BEGIN Select +SELECT ICON_(ChipScope_Pro_-_Integrated_Controller) family Xilinx,_Inc. 1.04.a +# END Select +# BEGIN Parameters +CSET component_name=icon +CSET enable_jtag_bufg=true +CSET number_control_ports=2 +CSET use_ext_bscan=false +CSET use_softbscan=false +CSET use_unused_bscan=false +CSET user_scan_chain=USER1 +# END Parameters +GENERATE +# CRC: 7da1f376 + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ila_coregen.xco b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ila_coregen.xco new file mode 100644 index 0000000..888c551 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ila_coregen.xco @@ -0,0 +1,131 @@ +############################################################## +# +# Xilinx Core Generator version 11.1 +# Date: Wed Mar 11 06:55:40 2009 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# BEGIN Project Options +SET addpads = False +SET asysymbol = False +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = False +SET designentry = vhdl +SET device = xc6slx45 +SET devicefamily = spartan6 +SET flowvendor = Foundation_ISE +SET formalverification = False +SET foundationsym = False +SET implementationfiletype = Ngc +SET package = csg324 +SET removerpms = False +SET simulationfiles = Structural +SET speedgrade = -3 +SET verilogsim = False +SET vhdlsim = False +# END Project Options +# BEGIN Select +SELECT ILA_(ChipScope_Pro_-_Integrated_Logic_Analyzer) family Xilinx,_Inc. 1.03.a +# END Select +# BEGIN Parameters +CSET component_name=ila +CSET counter_width_1=Disabled +CSET counter_width_10=Disabled +CSET counter_width_11=Disabled +CSET counter_width_12=Disabled +CSET counter_width_13=Disabled +CSET counter_width_14=Disabled +CSET counter_width_15=Disabled +CSET counter_width_16=Disabled +CSET counter_width_2=Disabled +CSET counter_width_3=Disabled +CSET counter_width_4=Disabled +CSET counter_width_5=Disabled +CSET counter_width_6=Disabled +CSET counter_width_7=Disabled +CSET counter_width_8=Disabled +CSET counter_width_9=Disabled +CSET data_port_width=256 +CSET data_same_as_trigger=false +CSET enable_storage_qualification=true +CSET enable_trigger_output_port=false +CSET exclude_from_data_storage_1=true +CSET exclude_from_data_storage_10=true +CSET exclude_from_data_storage_11=true +CSET exclude_from_data_storage_12=true +CSET exclude_from_data_storage_13=true +CSET exclude_from_data_storage_14=true +CSET exclude_from_data_storage_15=true +CSET exclude_from_data_storage_16=true +CSET exclude_from_data_storage_2=true +CSET exclude_from_data_storage_3=true +CSET exclude_from_data_storage_4=true +CSET exclude_from_data_storage_5=true +CSET exclude_from_data_storage_6=true +CSET exclude_from_data_storage_7=true +CSET exclude_from_data_storage_8=true +CSET exclude_from_data_storage_9=true +CSET match_type_1=basic_with_edges +CSET match_type_10=basic +CSET match_type_11=basic +CSET match_type_12=basic +CSET match_type_13=basic +CSET match_type_14=basic +CSET match_type_15=basic +CSET match_type_16=basic +CSET match_type_2=basic +CSET match_type_3=basic +CSET match_type_4=basic +CSET match_type_5=basic +CSET match_type_6=basic +CSET match_type_7=basic +CSET match_type_8=basic +CSET match_type_9=basic +CSET match_units_1=1 +CSET match_units_10=1 +CSET match_units_11=1 +CSET match_units_12=1 +CSET match_units_13=1 +CSET match_units_14=1 +CSET match_units_15=1 +CSET match_units_16=1 +CSET match_units_2=1 +CSET match_units_3=1 +CSET match_units_4=1 +CSET match_units_5=1 +CSET match_units_6=1 +CSET match_units_7=1 +CSET match_units_8=1 +CSET match_units_9=1 +CSET max_sequence_levels=1 +CSET number_of_trigger_ports=1 +CSET sample_data_depth=1024 +CSET sample_on=Rising +CSET trigger_port_width_1=2 +CSET trigger_port_width_10=8 +CSET trigger_port_width_11=8 +CSET trigger_port_width_12=8 +CSET trigger_port_width_13=8 +CSET trigger_port_width_14=8 +CSET trigger_port_width_15=8 +CSET trigger_port_width_16=8 +CSET trigger_port_width_2=8 +CSET trigger_port_width_3=8 +CSET trigger_port_width_4=8 +CSET trigger_port_width_5=8 +CSET trigger_port_width_6=8 +CSET trigger_port_width_7=8 +CSET trigger_port_width_8=8 +CSET trigger_port_width_9=8 +CSET use_rpms=true +# END Parameters +GENERATE +# CRC: eff89f81 + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ise_flow.sh b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ise_flow.sh new file mode 100755 index 0000000..98494b7 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ise_flow.sh @@ -0,0 +1,86 @@ +#!/bin/csh -f +#***************************************************************************** +# (c) Copyright 2009 Xilinx, Inc. All rights reserved. +# +# This file contains confidential and proprietary information +# of Xilinx, Inc. and is protected under U.S. and +# international copyright and other intellectual property +# laws. +# +# DISCLAIMER +# This disclaimer is not a license and does not grant any +# rights to the materials distributed herewith. Except as +# otherwise provided in a valid license issued to you by +# Xilinx, and to the maximum extent permitted by applicable +# law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +# WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +# AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +# BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +# INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +# (2) Xilinx shall not be liable (whether in contract or tort, +# including negligence, or under any other theory of +# liability) for any loss or damage of any kind or nature +# related to, arising under or in connection with these +# materials, including for any direct, or any indirect, +# special, incidental, or consequential loss or damage +# (including loss of data, profits, goodwill, or any type of +# loss or damage suffered as a result of any action brought +# by a third party) even if such damage or loss was +# reasonably foreseeable or Xilinx had been advised of the +# possibility of the same. +# +# CRITICAL APPLICATIONS +# Xilinx products are not designed or intended to be fail- +# safe, or for use in any application requiring fail-safe +# performance, such as life-support or safety devices or +# systems, Class III medical devices, nuclear facilities, +# applications related to the deployment of airbags, or any +# other applications that could lead to death, personal +# injury, or severe property or environmental damage +# (individually and collectively, "Critical +# Applications"). Customer assumes the sole risk and +# liability of any use of Xilinx products in Critical +# Applications, subject only to applicable laws and +# regulations governing limitations on product liability. +# +# THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +# PART OF THIS FILE AT ALL TIMES. +# +# **************************************************************************** +# ____ ____ +# / /\/ / +# /___/ \ / Vendor : Xilinx +# \ \ \/ Version : 3.92 +# \ \ Application : MIG +# / / Filename : ise_flow.bat +# /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:55 $ +# \ \ / \ Date Created : Fri Feb 06 2009 +# \___\/\___\ +# +# Device : Spartan-6 +# Design Name : DDR/DDR2/DDR3/LPDDR +# Purpose : Batch file to run PAR through ISE batch mode +# Reference : +# Revision History : +# **************************************************************************** + +./rem_files.sh + + + + +echo Synthesis Tool: XST + +mkdir "../synth/__projnav" > ise_flow_results.txt +mkdir "../synth/xst" >> ise_flow_results.txt +mkdir "../synth/xst/work" >> ise_flow_results.txt + +xst -ifn ise_run.txt -ofn mem_interface_top.syr -intstyle ise >> ise_flow_results.txt +ngdbuild -intstyle ise -dd ../synth/_ngo -uc example_top.ucf -p xc6slx45csg324-3 example_top.ngc example_top.ngd >> ise_flow_results.txt + +map -intstyle ise -detail -w -pr off -c 100 -o example_top_map.ncd example_top.ngd example_top.pcf >> ise_flow_results.txt +par -w -intstyle ise -ol std example_top_map.ncd example_top.ncd example_top.pcf >> ise_flow_results.txt +trce -e 100 example_top.ncd example_top.pcf >> ise_flow_results.txt +bitgen -intstyle ise -f mem_interface_top.ut example_top.ncd >> ise_flow_results.txt + +echo done! diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ise_run.txt b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ise_run.txt new file mode 100644 index 0000000..0d4338e --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/ise_run.txt @@ -0,0 +1,58 @@ +set -tmpdir ../synth/__projnav +set -xsthdpdir ../synth/xst +run +#Source Parameters +-ifn ../synth/example_top.prj +-ifmt mixed +-iuc No +#Target Parameters +-ofn example_top +-ofmt NGC +-p xc6slx45-3csg324 +#AXI_ENABLE definition is not required for NATIVE interface +#Source Options +-top example_top +-fsm_extract Yes +-fsm_encoding one-hot +-safe_implementation No +-fsm_style lut +-ram_extract Yes +-ram_style Auto +-rom_extract Yes +-rom_style Auto +-shreg_extract Yes +-resource_sharing Yes +-async_to_sync no +-mult_style auto +-register_balancing No +#Target Options +-iobuf Yes +#Max fanout value shouldn't be set below 64 for MCB design +-max_fanout 500 +-bufg 16 +-register_duplication yes +-optimize_primitives No +-use_clock_enable Auto +-use_sync_set Auto +-use_sync_reset Auto +-iob auto +-equivalent_register_removal yes +#General Options +-opt_mode Speed +-opt_level 1 +-lso ../synth/example_top.lso +-keep_hierarchy NO +-netlist_hierarchy as_optimized +-rtlview Yes +-glob_opt allclocknets +-read_cores Yes +-write_timing_constraints No +-cross_clock_analysis No +-hierarchy_separator / +-bus_delimiter <> +-case maintain +-slice_utilization_ratio 100 +-bram_utilization_ratio 100 +-auto_bram_packing No +-slice_utilization_ratio_maxmargin 5 +quit diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/makeproj.sh b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/makeproj.sh new file mode 100755 index 0000000..2f5c9f7 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/makeproj.sh @@ -0,0 +1,2 @@ +NEWPROJECT . +SETPROJECT . diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/mem_interface_top.ut b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/mem_interface_top.ut new file mode 100644 index 0000000..bc59a01 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/mem_interface_top.ut @@ -0,0 +1,22 @@ +-w +-g DebugBitstream:No +-g Binary:no +-g CRC:Enable +-g M2Pin:PullUp +-g ProgPin:PullUp +-g DonePin:PullUp +-g TckPin:PullUp +-g TdiPin:PullUp +-g TdoPin:PullUp +-g TmsPin:PullUp +-g UnusedPin:PullNone +-g UserID:0xFFFFFFFF +-g StartUpClk:CClk +-g DONE_cycle:4 +-g GTS_cycle:5 +-g GWE_cycle:6 +-g LCK_cycle:NoWait +-g Security:None +-g DonePipe:No +-g DriveDone:No +-g ConfigRate:6 diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/readme.txt b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/readme.txt new file mode 100644 index 0000000..97a4e9d --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/readme.txt @@ -0,0 +1,146 @@ +::**************************************************************************** +:: (c) Copyright 2009 Xilinx, Inc. All rights reserved. +:: +:: This file contains confidential and proprietary information +:: of Xilinx, Inc. and is protected under U.S. and +:: international copyright and other intellectual property +:: laws. +:: +:: DISCLAIMER +:: This disclaimer is not a license and does not grant any +:: rights to the materials distributed herewith. Except as +:: otherwise provided in a valid license issued to you by +:: Xilinx, and to the maximum extent permitted by applicable +:: law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +:: WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +:: AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +:: BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +:: INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +:: (2) Xilinx shall not be liable (whether in contract or tort, +:: including negligence, or under any other theory of +:: liability) for any loss or damage of any kind or nature +:: related to, arising under or in connection with these +:: materials, including for any direct, or any indirect, +:: special, incidental, or consequential loss or damage +:: (including loss of data, profits, goodwill, or any type of +:: loss or damage suffered as a result of any action brought +:: by a third party) even if such damage or loss was +:: reasonably foreseeable or Xilinx had been advised of the +:: possibility of the same. +:: +:: CRITICAL APPLICATIONS +:: Xilinx products are not designed or intended to be fail- +:: safe, or for use in any application requiring fail-safe +:: performance, such as life-support or safety devices or +:: systems, Class III medical devices, nuclear facilities, +:: applications related to the deployment of airbags, or any +:: other applications that could lead to death, personal +:: injury, or severe property or environmental damage +:: (individually and collectively, "Critical +:: Applications"). Customer assumes the sole risk and +:: liability of any use of Xilinx products in Critical +:: Applications, subject only to applicable laws and +:: regulations governing limitations on product liability. +:: +:: THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +:: PART OF THIS FILE AT ALL TIMES. +:: +::**************************************************************************** +:: ____ ____ +:: / /\/ / +:: /___/ \ / Vendor : Xilinx +:: \ \ \/ Version : 3.92 +:: \ \ Application : MIG +:: / / Filename : readme.txt +:: /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:55 $ +:: \ \ / \ Date Created : Fri Feb 06 2009 +:: \___\/\___\ +:: +:: Device : Spartan-6 +:: Design Name : DDR/DDR2/DDR3/LPDDR +:: Purpose : Information about par folder +:: Reference : +:: Revision History : +::**************************************************************************** + +This folder has the batch files to synthesize using XST or Synplify Pro and +implement the design either in "Command Line Mode" or in "GUI Mode". + +Steps to run the design using the ise_flow (batch mode): + +1. Executing the "ise_flow.bat" file synthesizes the design using XST or + Synplify Pro and does implement the design. + a. First it removes the XST/Synplify Pro report files, implementation + files, supporting scripts, the generated chipscope designs (if + enabled) and the ISE project files (if exist any on previous runs) + b. Synthesizes the design either with XST or Synplicity + c. Implements the design with ISE. + +2. After the design is run, it creates ise_flow_results.txt file that will have + the ISE log information. + +Steps to run the design using the create_ise (GUI mode - for XST cases only): + +1. This file will appear for XST cases only. + +2. On executing the "create_ise.bat" file creates "test.xise" project file + and set all the properties of the design selected. + +3. The design can be implemented in ISE Projnav GUI by invoking the "test.xise" project file. + +4. In Linux operating systems, test.xise project can be invoked by executing the command + 'ise test.xise' from the terminal. + +Other files in PAR folder : + +* "example_top.ucf" file is the constraint file for the design. + It has clock constraints, location constraints and IO standards. + +* "mem_interface_top.ut" file has the options for the Configuration file + generation i.e. the "example_top.bit" file to run in batch mode. + +* "rem_files.bat" file has all the ISE/Synplify Pro generated report files, + implementation files, supporting scripts, the generated chipscope designs + (if enabled) and the ISE project files. + +* "set_ise_prop.tcl" file has all the properties that are to be + set in GUI mode. + +* "ise_run.txt" file has synthesis options for the XST tool. + This file is used for batch mode. + +* "icon_coregen.xco", "ila_coregen.xco" and "vio_coregen.xco"files are used to + generate ChipScope ila,vio and icon EDIF/NGC files. In order to generate the + EDIF/NGC files, you must execute the following commands before starting + synthesis and PAR. + + coregen -b ila_coregen.xco + coregen -b icon_coregen.xco + coregen -b vio_coregen.xco + +Note : When you generate the design using "Debug Signals for Memory Controller" + option Enable, the above mentioned ChipScope coregen commands are printed + into ise_flow.bat and create_ise.bat files. The example_top rtl file + will have the design debug signals portmapped to vio and icon + ChipScope modules. + +* At the start of a Chip Scope Analyzer project, all of the signals in + every core have generic names. "example_top.cdc" is a file that contains + all the signal names of all cores. Upon importing this file, signal names are + renamed to the specified names in "example_top.cdc" file. This file will work + for the generated designs from MIG. If any of the design parameter values + are changed after generating the design, this file will not work. + For Multiple Controller designs, signal names provided in CDC file are of + the controller that is enabled for Debug in the GUI. + +synth folder: + +1. mem_interface_top_synp.sdc +2. script_synp.tcl +3. example_top.prj +4. example_top.lso + + mem_interface_top_synp.sdc and script_synp.tcl files are being used by + Synplify Pro and example_top.prj and example_top.lso are being used by XST. + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/rem_files.sh b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/rem_files.sh new file mode 100755 index 0000000..a7e5dec --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/rem_files.sh @@ -0,0 +1,169 @@ +##!/bin/csh -f +##**************************************************************************** +## (c) Copyright 2009 Xilinx, Inc. All rights reserved. +## +## This file contains confidential and proprietary information +## of Xilinx, Inc. and is protected under U.S. and +## international copyright and other intellectual property +## laws. +## +## DISCLAIMER +## This disclaimer is not a license and does not grant any +## rights to the materials distributed herewith. Except as +## otherwise provided in a valid license issued to you by +## Xilinx, and to the maximum extent permitted by applicable +## law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +## WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +## AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +## BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +## INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +## (2) Xilinx shall not be liable (whether in contract or tort, +## including negligence, or under any other theory of +## liability) for any loss or damage of any kind or nature +## related to, arising under or in connection with these +## materials, including for any direct, or any indirect, +## special, incidental, or consequential loss or damage +## (including loss of data, profits, goodwill, or any type of +## loss or damage suffered as a result of any action brought +## by a third party) even if such damage or loss was +## reasonably foreseeable or Xilinx had been advised of the +## possibility of the same. +## +## CRITICAL APPLICATIONS +## Xilinx products are not designed or intended to be fail- +## safe, or for use in any application requiring fail-safe +## performance, such as life-support or safety devices or +## systems, Class III medical devices, nuclear facilities, +## applications related to the deployment of airbags, or any +## other applications that could lead to death, personal +## injury, or severe property or environmental damage +## (individually and collectively, "Critical +## Applications"). Customer assumes the sole risk and +## liability of any use of Xilinx products in Critical +## Applications, subject only to applicable laws and +## regulations governing limitations on product liability. +## +## THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +## PART OF THIS FILE AT ALL TIMES. +## +##**************************************************************************** +## ____ ____ +## / /\/ / +## /___/ \ / Vendor : Xilinx +## \ \ \/ Version : 3.92 +## \ \ Application : MIG +## / / Filename : rem_files.bat +## /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:55 $ +## \ \ / \ Date Created : Fri Feb 06 2009 +## \___\/\___\ +## +## Device : Spartan-6 +## Design Name : DDR/DDR2/DDR3/LPDDR +## Purpose : Batch file to remove files generated from ISE +## Reference : +## Revision History : +##**************************************************************************** + +rm -rf "../synth/__projnav" +rm -rf "../synth/xst" +rm -rf "../synth/_ngo" + +rm -rf tmp +rm -rf _xmsgs +rm -rf ila_xdb +rm -rf icon_xdb +rm -rf vio_xdb + +rm -rf xlnx_auto_0_xdb + +rm -rf vio_xmdf.tcl +rm -rf vio_readme.txt +rm -rf vio_flist.txt +rm -rf vio.xise del +rm -rf vio.xco del +rm -rf vio.ngc del +rm -rf vio.ise del +rm -rf vio.gise del +rm -rf vio.cdc del + +rm -rf coregen.cgp +rm -rf coregen.cgc +rm -rf coregen.log +rm -rf ila.cdc +rm -rf ila.gise +rm -rf ila.ise +rm -rf ila.ngc +rm -rf ila.xco +rm -rf ila.xise +rm -rf ila_flist.txt +rm -rf ila_readme.txt +rm -rf ila_xmdf.tcl + +rm -rf icon.asy +rm -rf icon.gise +rm -rf icon.ise +rm -rf icon.ncf +rm -rf icon.ngc +rm -rf icon.xco +rm -rf icon.xise +rm -rf icon_flist.txt +rm -rf icon_readme.txt +rm -rf icon_xmdf.tcl + +rm -rf ise_flow_results.txt +rm -rf example_top_vhdl.prj +rm -rf mem_interface_top.syr +rm -rf example_top.ngc +rm -rf example_top.ngr +rm -rf example_top_xst.xrpt +rm -rf example_top.bld +rm -rf example_top.ngd +rm -rf example_top_ngdbuild.xrpt +rm -rf example_top_map.map +rm -rf example_top_map.mrp +rm -rf example_top_map.ngm +rm -rf example_top.pcf +rm -rf example_top_map.ncd +rm -rf example_top_map.xrpt +rm -rf example_top_summary.xml +rm -rf example_top_usage.xml +rm -rf example_top.ncd +rm -rf example_top.par +rm -rf example_top.xpi +rm -rf example_top.ptwx +rm -rf example_top.pad +rm -rf example_top.unroutes +rm -rf example_top_pad.csv +rm -rf example_top_pad.txt +rm -rf example_top_par.xrpt +rm -rf example_top.twx +rm -rf example_top.bgn +rm -rf example_top.twr +rm -rf example_top.drc +rm -rf example_top_bitgen.xwbt +rm -rf example_top.bit + +# Files and folders generated by create ise +rm -rf test_xdb +rm -rf _xmsgs +rm -rf test.gise +rm -rf test.xise +rm -rf test.xise + +# Files and folders generated by ISE through GUI mode +rm -rf _ngo +rm -rf xst +rm -rf example_top.lso +rm -rf example_top.prj +rm -rf example_top.xst +rm -rf example_top.stx +rm -rf example_top_prev_built.ngd +rm -rf test.ntrc_log +rm -rf example_top_guide.ncd +rm -rf example_top.cmd_log +rm -rf example_top_summary.html +rm -rf example_top.ut +rm -rf par_usage_statistics.html +rm -rf usage_statistics_webtalk.html +rm -rf webtalk.log +rm -rf device_usage_statistics.html diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/set_ise_prop.tcl b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/set_ise_prop.tcl new file mode 100644 index 0000000..f602216 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/set_ise_prop.tcl @@ -0,0 +1,106 @@ +project new test.xise + +project set "Device Family" "spartan6" + +project set "Device" "xc6slx45" + +project set "Package" "csg324" + +project set "Speed Grade" "-3" + +project set "Synthesis Tool" "XST (VHDL/Verilog)" + +project set "Simulator" "ISim (VHDL/Verilog)" + +xfile add "../rtl/example_top.vhd" +xfile add "../rtl/iodrp_controller.vhd" +xfile add "../rtl/iodrp_mcb_controller.vhd" +xfile add "../rtl/mcb_raw_wrapper.vhd" +xfile add "../rtl/mcb_soft_calibration.vhd" +xfile add "../rtl/mcb_soft_calibration_top.vhd" +xfile add "../rtl/memc3_infrastructure.vhd" +xfile add "../rtl/memc3_tb_top.vhd" +xfile add "../rtl/memc3_wrapper.vhd" +xfile add "../rtl/traffic_gen/afifo.vhd" +xfile add "../rtl/traffic_gen/cmd_gen.vhd" +xfile add "../rtl/traffic_gen/cmd_prbs_gen.vhd" +xfile add "../rtl/traffic_gen/data_prbs_gen.vhd" +xfile add "../rtl/traffic_gen/init_mem_pattern_ctr.vhd" +xfile add "../rtl/traffic_gen/mcb_flow_control.vhd" +xfile add "../rtl/traffic_gen/mcb_traffic_gen.vhd" +xfile add "../rtl/traffic_gen/rd_data_gen.vhd" +xfile add "../rtl/traffic_gen/read_data_path.vhd" +xfile add "../rtl/traffic_gen/read_posted_fifo.vhd" +xfile add "../rtl/traffic_gen/sp6_data_gen.vhd" +xfile add "../rtl/traffic_gen/tg_status.vhd" +xfile add "../rtl/traffic_gen/v6_data_gen.vhd" +xfile add "../rtl/traffic_gen/wr_data_gen.vhd" +xfile add "../rtl/traffic_gen/write_data_path.vhd" + +xfile add "example_top.ucf" + + +project set "FSM Encoding Algorithm" "Auto" -process "Synthesize - XST" +project set "Safe Implementation" "No" -process "Synthesize - XST" +project set "FSM Style" "LUT" -process "Synthesize - XST" +project set "RAM Extraction" "True" -process "Synthesize - XST" +project set "RAM Style" "Auto" -process "Synthesize - XST" +project set "ROM Extraction" "True" -process "Synthesize - XST" +project set "ROM Style" "Auto" -process "Synthesize - XST" +project set "Resource Sharing" "True" -process "Synthesize - XST" +project set "Asynchronous To Synchronous" "False" -process "Synthesize - XST" +project set "Register Balancing" "No" -process "Synthesize - XST" +project set "Add I/O Buffers" "True" -process "Synthesize - XST" +project set "Max Fanout" "500" -process "Synthesize - XST" +project set "Number of Clock Buffers" "8" -process "Synthesize - XST" +project set "Register Duplication" "True" -process "Synthesize - XST" +project set "Optimize Instantiated Primitives" "False" -process "Synthesize - XST" +project set "Use Clock Enable" "Yes" -process "Synthesize - XST" +project set "Use Synchronous Set" "Yes" -process "Synthesize - XST" +project set "Use Synchronous Reset" "Yes" -process "Synthesize - XST" +project set "Pack I/O Registers into IOBs" "Auto" -process "Synthesize - XST" +project set "Equivalent Register Removal" "True" -process "Synthesize - XST" +project set "Optimization Goal" "Speed" -process "Synthesize - XST" +project set "Optimization Effort" "Normal" -process "Synthesize - XST" +project set "Library Search Order" "../synth/example_top.lso" -process "Synthesize - XST" +project set "Keep Hierarchy" "Soft" -process "Synthesize - XST" +project set "Netlist Hierarchy" "As Optimized" -process "Synthesize - XST" +project set "Generate RTL Schematic" "Yes" -process "Synthesize - XST" +project set "Global Optimization Goal" "AllClockNets" -process "Synthesize - XST" +project set "Read Cores" "True" -process "Synthesize - XST" +project set "Write Timing Constraints" "False" -process "Synthesize - XST" +project set "Cross Clock Analysis" "False" -process "Synthesize - XST" +project set "Hierarchy Separator" "/" -process "Synthesize - XST" +project set "Bus Delimiter" "<>" -process "Synthesize - XST" +project set "Case" "Maintain" -process "Synthesize - XST" +project set "BRAM Utilization Ratio" "100" -process "Synthesize - XST" +project set "Automatic BRAM Packing" "False" -process "Synthesize - XST" +project set "Pack I/O Registers/Latches into IOBs" "Off" -process Map + +project set "Place & Route Effort Level (Overall)" "Standard" -process "Place & Route" + +project set "Number of Paths in Error/Verbose Report" "100" -process "Generate Post-Map Static Timing" + +project set "Enable Debugging of Serial Mode BitStream" "False" -process "Generate Programming File" +project set "Create Binary Configuration File" "False" -process "Generate Programming File" +project set "Enable Cyclic Redundancy Checking (CRC)" "True" -process "Generate Programming File" +project set "Configuration Rate" "6" -process "Generate Programming File" +project set "Configuration Pin Program" "Pull Up" -process "Generate Programming File" +project set "Configuration Pin Done" "Pull Up" -process "Generate Programming File" +project set "JTAG Pin TCK" "Pull Up" -process "Generate Programming File" +project set "JTAG Pin TDI" "Pull Up" -process "Generate Programming File" +project set "JTAG Pin TDO" "Pull Up" -process "Generate Programming File" +project set "JTAG Pin TMS" "Pull Up" -process "Generate Programming File" +project set "Unused IOB Pins" "Float" -process "Generate Programming File" +project set "UserID Code (8 Digit Hexadecimal)" "0xFFFFFFFF" -process "Generate Programming File" +project set "FPGA Start-Up Clock" "CCLK" -process "Generate Programming File" +project set "Done (Output Events)" "Default (4)" -process "Generate Programming File" +project set "Enable Outputs (Output Events)" "Default (5)" -process "Generate Programming File" +project set "Release Write Enable (Output Events)" "Default (6)" -process "Generate Programming File" +project set "Enable Internal Done Pipe" "False" -process "Generate Programming File" +project set "Drive Done Pin High" "False" -process "Generate Programming File" +project set "Security" "Enable Readback and Reconfiguration" -process "Generate Programming File" + +project close + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/vio_coregen.xco b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/vio_coregen.xco new file mode 100644 index 0000000..ec8adfb --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/par/vio_coregen.xco @@ -0,0 +1,51 @@ +############################################################## +# +# Xilinx Core Generator version 11.2 +# Date: Fri Jun 12 05:42:56 2009 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# BEGIN Project Options +SET addpads = False +SET asysymbol = False +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = False +SET designentry = vhdl +SET device = xc6slx45 +SET devicefamily = spartan6 +SET flowvendor = Foundation_ISE +SET formalverification = False +SET foundationsym = False +SET implementationfiletype = Ngc +SET package = csg324 +SET removerpms = False +SET simulationfiles = Structural +SET speedgrade = -3 +SET verilogsim = False +SET vhdlsim = False +# END Project Options +# BEGIN Select +SELECT VIO_(ChipScope_Pro_-_Virtual_Input/Output) family Xilinx,_Inc. 1.03.a +# END Select +# BEGIN Parameters +CSET asynchronous_input_port_width=8 +CSET asynchronous_output_port_width=7 +CSET component_name=vio +CSET enable_asynchronous_input_port=false +CSET enable_asynchronous_output_port=true +CSET enable_synchronous_input_port=false +CSET enable_synchronous_output_port=false +CSET invert_clock_input=false +CSET synchronous_input_port_width=8 +CSET synchronous_output_port_width=8 +# END Parameters +GENERATE +# CRC: 66fe39ed + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/example_top.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/example_top.vhd new file mode 100644 index 0000000..58b3e95 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/example_top.vhd @@ -0,0 +1,1059 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor : Xilinx +-- \ \ \/ Version : 3.92 +-- \ \ Application : MIG +-- / / Filename : example_top.vhd +-- /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:56 $ +-- \ \ / \ Date Created : Jul 03 2009 +-- \___\/\___\ +-- +--Device : Spartan-6 +--Design Name : DDR/DDR2/DDR3/LPDDR +--Purpose : This is the design top level. which instantiates top wrapper, +-- test bench top and infrastructure modules. +--Reference : +--Revision History : +--***************************************************************************** +library ieee; +use ieee.std_logic_1164.all; +entity example_top is +generic + ( + C3_P0_MASK_SIZE : integer := 4; + C3_P0_DATA_PORT_SIZE : integer := 32; + C3_P1_MASK_SIZE : integer := 4; + C3_P1_DATA_PORT_SIZE : integer := 32; + C3_MEMCLK_PERIOD : integer := 3000; + -- Memory data transfer clock period. + C3_RST_ACT_LOW : integer := 0; + -- # = 1 for active low reset, + -- # = 0 for active high reset. + C3_INPUT_CLK_TYPE : string := "SINGLE_ENDED"; + -- input clock type DIFFERENTIAL or SINGLE_ENDED. + C3_CALIB_SOFT_IP : string := "TRUE"; + -- # = TRUE, Enables the soft calibration logic, + -- # = FALSE, Disables the soft calibration logic. + C3_SIMULATION : string := "FALSE"; + -- # = TRUE, Simulating the design. Useful to reduce the simulation time, + -- # = FALSE, Implementing the design. + C3_HW_TESTING : string := "FALSE"; + -- Determines the address space accessed by the traffic generator, + -- # = FALSE, Smaller address space, + -- # = TRUE, Large address space. + DEBUG_EN : integer := 0; + -- # = 1, Enable debug signals/controls, + -- = 0, Disable debug signals/controls. + C3_MEM_ADDR_ORDER : string := "BANK_ROW_COLUMN"; + -- The order in which user address is provided to the memory controller, + -- ROW_BANK_COLUMN or BANK_ROW_COLUMN. + C3_NUM_DQ_PINS : integer := 16; + -- External memory data width. + C3_MEM_ADDR_WIDTH : integer := 13; + -- External memory address width. + C3_MEM_BANKADDR_WIDTH : integer := 3 + -- External memory bank address width. + ); + + port + ( + calib_done : out std_logic; + error : out std_logic; + mcb3_dram_dq : inout std_logic_vector(C3_NUM_DQ_PINS-1 downto 0); + mcb3_dram_a : out std_logic_vector(C3_MEM_ADDR_WIDTH-1 downto 0); + mcb3_dram_ba : out std_logic_vector(C3_MEM_BANKADDR_WIDTH-1 downto 0); + mcb3_dram_ras_n : out std_logic; + mcb3_dram_cas_n : out std_logic; + mcb3_dram_we_n : out std_logic; + mcb3_dram_odt : out std_logic; + mcb3_dram_cke : out std_logic; + mcb3_dram_dm : out std_logic; + mcb3_dram_udqs : inout std_logic; + mcb3_dram_udqs_n : inout std_logic; + mcb3_rzq : inout std_logic; + mcb3_zio : inout std_logic; + mcb3_dram_udm : out std_logic; + c3_sys_clk : in std_logic; + c3_sys_rst_i : in std_logic; + mcb3_dram_dqs : inout std_logic; + mcb3_dram_dqs_n : inout std_logic; + mcb3_dram_ck : out std_logic; + mcb3_dram_ck_n : out std_logic + ); +end example_top; + +architecture arc of example_top is + + + +component memc3_infrastructure is + generic ( + C_RST_ACT_LOW : integer; + C_INPUT_CLK_TYPE : string; + C_CLKOUT0_DIVIDE : integer; + C_CLKOUT1_DIVIDE : integer; + C_CLKOUT2_DIVIDE : integer; + C_CLKOUT3_DIVIDE : integer; + C_CLKFBOUT_MULT : integer; + C_DIVCLK_DIVIDE : integer; + C_INCLK_PERIOD : integer + + ); + port ( + sys_clk_p : in std_logic; + sys_clk_n : in std_logic; + sys_clk : in std_logic; + sys_rst_i : in std_logic; + clk0 : out std_logic; + rst0 : out std_logic; + async_rst : out std_logic; + sysclk_2x : out std_logic; + sysclk_2x_180 : out std_logic; + pll_ce_0 : out std_logic; + pll_ce_90 : out std_logic; + pll_lock : out std_logic; + mcb_drp_clk : out std_logic + + ); + end component; + + +component memc3_wrapper is + generic ( + C_MEMCLK_PERIOD : integer; + C_CALIB_SOFT_IP : string; + C_SIMULATION : string; + C_P0_MASK_SIZE : integer; + C_P0_DATA_PORT_SIZE : integer; + C_P1_MASK_SIZE : integer; + C_P1_DATA_PORT_SIZE : integer; + C_ARB_NUM_TIME_SLOTS : integer; + C_ARB_TIME_SLOT_0 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_1 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_2 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_3 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_4 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_5 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_6 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_7 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_8 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_9 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_10 : bit_vector(11 downto 0); + C_ARB_TIME_SLOT_11 : bit_vector(11 downto 0); + C_MEM_TRAS : integer; + C_MEM_TRCD : integer; + C_MEM_TREFI : integer; + C_MEM_TRFC : integer; + C_MEM_TRP : integer; + C_MEM_TWR : integer; + C_MEM_TRTP : integer; + C_MEM_TWTR : integer; + C_MEM_ADDR_ORDER : string; + C_NUM_DQ_PINS : integer; + C_MEM_TYPE : string; + C_MEM_DENSITY : string; + C_MEM_BURST_LEN : integer; + C_MEM_CAS_LATENCY : integer; + C_MEM_ADDR_WIDTH : integer; + C_MEM_BANKADDR_WIDTH : integer; + C_MEM_NUM_COL_BITS : integer; + C_MEM_DDR1_2_ODS : string; + C_MEM_DDR2_RTT : string; + C_MEM_DDR2_DIFF_DQS_EN : string; + C_MEM_DDR2_3_PA_SR : string; + C_MEM_DDR2_3_HIGH_TEMP_SR : string; + C_MEM_DDR3_CAS_LATENCY : integer; + C_MEM_DDR3_ODS : string; + C_MEM_DDR3_RTT : string; + C_MEM_DDR3_CAS_WR_LATENCY : integer; + C_MEM_DDR3_AUTO_SR : string; + C_MEM_DDR3_DYN_WRT_ODT : string; + C_MEM_MOBILE_PA_SR : string; + C_MEM_MDDR_ODS : string; + C_MC_CALIB_BYPASS : string; + C_MC_CALIBRATION_MODE : string; + C_MC_CALIBRATION_DELAY : string; + C_SKIP_IN_TERM_CAL : integer; + C_SKIP_DYNAMIC_CAL : integer; + C_LDQSP_TAP_DELAY_VAL : integer; + C_LDQSN_TAP_DELAY_VAL : integer; + C_UDQSP_TAP_DELAY_VAL : integer; + C_UDQSN_TAP_DELAY_VAL : integer; + C_DQ0_TAP_DELAY_VAL : integer; + C_DQ1_TAP_DELAY_VAL : integer; + C_DQ2_TAP_DELAY_VAL : integer; + C_DQ3_TAP_DELAY_VAL : integer; + C_DQ4_TAP_DELAY_VAL : integer; + C_DQ5_TAP_DELAY_VAL : integer; + C_DQ6_TAP_DELAY_VAL : integer; + C_DQ7_TAP_DELAY_VAL : integer; + C_DQ8_TAP_DELAY_VAL : integer; + C_DQ9_TAP_DELAY_VAL : integer; + C_DQ10_TAP_DELAY_VAL : integer; + C_DQ11_TAP_DELAY_VAL : integer; + C_DQ12_TAP_DELAY_VAL : integer; + C_DQ13_TAP_DELAY_VAL : integer; + C_DQ14_TAP_DELAY_VAL : integer; + C_DQ15_TAP_DELAY_VAL : integer + ); + port ( + mcb3_dram_dq : inout std_logic_vector((C_NUM_DQ_PINS-1) downto 0); + mcb3_dram_a : out std_logic_vector((C_MEM_ADDR_WIDTH-1) downto 0); + mcb3_dram_ba : out std_logic_vector((C_MEM_BANKADDR_WIDTH-1) downto 0); + mcb3_dram_ras_n : out std_logic; + mcb3_dram_cas_n : out std_logic; + mcb3_dram_we_n : out std_logic; + mcb3_dram_odt : out std_logic; + mcb3_dram_cke : out std_logic; + mcb3_dram_dm : out std_logic; + mcb3_dram_udqs : inout std_logic; + mcb3_dram_udqs_n : inout std_logic; + mcb3_rzq : inout std_logic; + mcb3_zio : inout std_logic; + mcb3_dram_udm : out std_logic; + calib_done : out std_logic; + async_rst : in std_logic; + sysclk_2x : in std_logic; + sysclk_2x_180 : in std_logic; + pll_ce_0 : in std_logic; + pll_ce_90 : in std_logic; + pll_lock : in std_logic; + mcb_drp_clk : in std_logic; + mcb3_dram_dqs : inout std_logic; + mcb3_dram_dqs_n : inout std_logic; + mcb3_dram_ck : out std_logic; + mcb3_dram_ck_n : out std_logic; + p0_cmd_clk : in std_logic; + p0_cmd_en : in std_logic; + p0_cmd_instr : in std_logic_vector(2 downto 0); + p0_cmd_bl : in std_logic_vector(5 downto 0); + p0_cmd_byte_addr : in std_logic_vector(29 downto 0); + p0_cmd_empty : out std_logic; + p0_cmd_full : out std_logic; + p0_wr_clk : in std_logic; + p0_wr_en : in std_logic; + p0_wr_mask : in std_logic_vector(C_P0_MASK_SIZE - 1 downto 0); + p0_wr_data : in std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0); + p0_wr_full : out std_logic; + p0_wr_empty : out std_logic; + p0_wr_count : out std_logic_vector(6 downto 0); + p0_wr_underrun : out std_logic; + p0_wr_error : out std_logic; + p0_rd_clk : in std_logic; + p0_rd_en : in std_logic; + p0_rd_data : out std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0); + p0_rd_full : out std_logic; + p0_rd_empty : out std_logic; + p0_rd_count : out std_logic_vector(6 downto 0); + p0_rd_overflow : out std_logic; + p0_rd_error : out std_logic; + p1_cmd_clk : in std_logic; + p1_cmd_en : in std_logic; + p1_cmd_instr : in std_logic_vector(2 downto 0); + p1_cmd_bl : in std_logic_vector(5 downto 0); + p1_cmd_byte_addr : in std_logic_vector(29 downto 0); + p1_cmd_empty : out std_logic; + p1_cmd_full : out std_logic; + p1_wr_clk : in std_logic; + p1_wr_en : in std_logic; + p1_wr_mask : in std_logic_vector(C_P1_MASK_SIZE - 1 downto 0); + p1_wr_data : in std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0); + p1_wr_full : out std_logic; + p1_wr_empty : out std_logic; + p1_wr_count : out std_logic_vector(6 downto 0); + p1_wr_underrun : out std_logic; + p1_wr_error : out std_logic; + p1_rd_clk : in std_logic; + p1_rd_en : in std_logic; + p1_rd_data : out std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0); + p1_rd_full : out std_logic; + p1_rd_empty : out std_logic; + p1_rd_count : out std_logic_vector(6 downto 0); + p1_rd_overflow : out std_logic; + p1_rd_error : out std_logic; + p2_cmd_clk : in std_logic; + p2_cmd_en : in std_logic; + p2_cmd_instr : in std_logic_vector(2 downto 0); + p2_cmd_bl : in std_logic_vector(5 downto 0); + p2_cmd_byte_addr : in std_logic_vector(29 downto 0); + p2_cmd_empty : out std_logic; + p2_cmd_full : out std_logic; + p2_wr_clk : in std_logic; + p2_wr_en : in std_logic; + p2_wr_mask : in std_logic_vector(3 downto 0); + p2_wr_data : in std_logic_vector(31 downto 0); + p2_wr_full : out std_logic; + p2_wr_empty : out std_logic; + p2_wr_count : out std_logic_vector(6 downto 0); + p2_wr_underrun : out std_logic; + p2_wr_error : out std_logic; + p2_rd_clk : in std_logic; + p2_rd_en : in std_logic; + p2_rd_data : out std_logic_vector(31 downto 0); + p2_rd_full : out std_logic; + p2_rd_empty : out std_logic; + p2_rd_count : out std_logic_vector(6 downto 0); + p2_rd_overflow : out std_logic; + p2_rd_error : out std_logic; + p3_cmd_clk : in std_logic; + p3_cmd_en : in std_logic; + p3_cmd_instr : in std_logic_vector(2 downto 0); + p3_cmd_bl : in std_logic_vector(5 downto 0); + p3_cmd_byte_addr : in std_logic_vector(29 downto 0); + p3_cmd_empty : out std_logic; + p3_cmd_full : out std_logic; + p3_wr_clk : in std_logic; + p3_wr_en : in std_logic; + p3_wr_mask : in std_logic_vector(3 downto 0); + p3_wr_data : in std_logic_vector(31 downto 0); + p3_wr_full : out std_logic; + p3_wr_empty : out std_logic; + p3_wr_count : out std_logic_vector(6 downto 0); + p3_wr_underrun : out std_logic; + p3_wr_error : out std_logic; + p3_rd_clk : in std_logic; + p3_rd_en : in std_logic; + p3_rd_data : out std_logic_vector(31 downto 0); + p3_rd_full : out std_logic; + p3_rd_empty : out std_logic; + p3_rd_count : out std_logic_vector(6 downto 0); + p3_rd_overflow : out std_logic; + p3_rd_error : out std_logic; + selfrefresh_enter : in std_logic; + selfrefresh_mode : out std_logic + + ); + end component; + + +component memc3_tb_top is + generic ( + C_SIMULATION : string; + C_P0_MASK_SIZE : integer; + C_P0_DATA_PORT_SIZE : integer; + C_P1_MASK_SIZE : integer; + C_P1_DATA_PORT_SIZE : integer; + C_NUM_DQ_PINS : integer; + C_MEM_BURST_LEN : integer; + C_MEM_NUM_COL_BITS : integer; + C_SMALL_DEVICE : string; + C_p0_BEGIN_ADDRESS : std_logic_vector(31 downto 0); + C_p0_DATA_MODE : std_logic_vector(3 downto 0); + C_p0_END_ADDRESS : std_logic_vector(31 downto 0); + C_p0_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0); + C_p0_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0); + C_p1_BEGIN_ADDRESS : std_logic_vector(31 downto 0); + C_p1_DATA_MODE : std_logic_vector(3 downto 0); + C_p1_END_ADDRESS : std_logic_vector(31 downto 0); + C_p1_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0); + C_p1_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0); + C_p2_BEGIN_ADDRESS : std_logic_vector(31 downto 0); + C_p2_DATA_MODE : std_logic_vector(3 downto 0); + C_p2_END_ADDRESS : std_logic_vector(31 downto 0); + C_p2_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0); + C_p2_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0); + C_p3_BEGIN_ADDRESS : std_logic_vector(31 downto 0); + C_p3_DATA_MODE : std_logic_vector(3 downto 0); + C_p3_END_ADDRESS : std_logic_vector(31 downto 0); + C_p3_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0); + C_p3_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) + + ); + port ( + error : out std_logic; + calib_done : in std_logic; + clk0 : in std_logic; + rst0 : in std_logic; + cmp_error : out std_logic; + cmp_data_valid : out std_logic; + vio_modify_enable : in std_logic; + error_status : out std_logic_vector(127 downto 0); + vio_data_mode_value : in std_logic_vector(2 downto 0); + vio_addr_mode_value : in std_logic_vector(2 downto 0); + cmp_data : out std_logic_vector(31 downto 0); + p0_mcb_cmd_en_o : out std_logic; + p0_mcb_cmd_instr_o : out std_logic_vector(2 downto 0); + p0_mcb_cmd_bl_o : out std_logic_vector(5 downto 0); + p0_mcb_cmd_addr_o : out std_logic_vector(29 downto 0); + p0_mcb_cmd_full_i : in std_logic; + p0_mcb_wr_en_o : out std_logic; + p0_mcb_wr_mask_o : out std_logic_vector(C_P0_MASK_SIZE - 1 downto 0); + p0_mcb_wr_data_o : out std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0); + p0_mcb_wr_full_i : in std_logic; + p0_mcb_wr_fifo_counts : in std_logic_vector(6 downto 0); + p0_mcb_rd_en_o : out std_logic; + p0_mcb_rd_data_i : in std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0); + p0_mcb_rd_empty_i : in std_logic; + p0_mcb_rd_fifo_counts : in std_logic_vector(6 downto 0); + p1_mcb_cmd_en_o : out std_logic; + p1_mcb_cmd_instr_o : out std_logic_vector(2 downto 0); + p1_mcb_cmd_bl_o : out std_logic_vector(5 downto 0); + p1_mcb_cmd_addr_o : out std_logic_vector(29 downto 0); + p1_mcb_cmd_full_i : in std_logic; + p1_mcb_wr_en_o : out std_logic; + p1_mcb_wr_mask_o : out std_logic_vector(C_P1_MASK_SIZE - 1 downto 0); + p1_mcb_wr_data_o : out std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0); + p1_mcb_wr_full_i : in std_logic; + p1_mcb_wr_fifo_counts : in std_logic_vector(6 downto 0); + p1_mcb_rd_en_o : out std_logic; + p1_mcb_rd_data_i : in std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0); + p1_mcb_rd_empty_i : in std_logic; + p1_mcb_rd_fifo_counts : in std_logic_vector(6 downto 0); + p2_mcb_cmd_en_o : out std_logic; + p2_mcb_cmd_instr_o : out std_logic_vector(2 downto 0); + p2_mcb_cmd_bl_o : out std_logic_vector(5 downto 0); + p2_mcb_cmd_addr_o : out std_logic_vector(29 downto 0); + p2_mcb_cmd_full_i : in std_logic; + p2_mcb_wr_en_o : out std_logic; + p2_mcb_wr_mask_o : out std_logic_vector(3 downto 0); + p2_mcb_wr_data_o : out std_logic_vector(31 downto 0); + p2_mcb_wr_full_i : in std_logic; + p2_mcb_wr_fifo_counts : in std_logic_vector(6 downto 0); + p2_mcb_rd_en_o : out std_logic; + p2_mcb_rd_data_i : in std_logic_vector(31 downto 0); + p2_mcb_rd_empty_i : in std_logic; + p2_mcb_rd_fifo_counts : in std_logic_vector(6 downto 0); + p3_mcb_cmd_en_o : out std_logic; + p3_mcb_cmd_instr_o : out std_logic_vector(2 downto 0); + p3_mcb_cmd_bl_o : out std_logic_vector(5 downto 0); + p3_mcb_cmd_addr_o : out std_logic_vector(29 downto 0); + p3_mcb_cmd_full_i : in std_logic; + p3_mcb_wr_en_o : out std_logic; + p3_mcb_wr_mask_o : out std_logic_vector(3 downto 0); + p3_mcb_wr_data_o : out std_logic_vector(31 downto 0); + p3_mcb_wr_full_i : in std_logic; + p3_mcb_wr_fifo_counts : in std_logic_vector(6 downto 0); + p3_mcb_rd_en_o : out std_logic; + p3_mcb_rd_data_i : in std_logic_vector(31 downto 0); + p3_mcb_rd_empty_i : in std_logic; + p3_mcb_rd_fifo_counts : in std_logic_vector(6 downto 0) + + ); + end component; + + + + function c3_sim_hw (val1:std_logic_vector( 31 downto 0); val2: std_logic_vector( 31 downto 0) ) return std_logic_vector is + begin + if (C3_HW_TESTING = "FALSE") then + return val1; + else + return val2; + end if; + end function; + + + + constant C3_CLKOUT0_DIVIDE : integer := 1; + constant C3_CLKOUT1_DIVIDE : integer := 1; + constant C3_CLKOUT2_DIVIDE : integer := 16; + constant C3_CLKOUT3_DIVIDE : integer := 8; + constant C3_CLKFBOUT_MULT : integer := 2; + constant C3_DIVCLK_DIVIDE : integer := 1; + constant C3_INCLK_PERIOD : integer := ((C3_MEMCLK_PERIOD * C3_CLKFBOUT_MULT) / (C3_DIVCLK_DIVIDE * C3_CLKOUT0_DIVIDE * 2)); + constant C3_ARB_NUM_TIME_SLOTS : integer := 12; + constant C3_ARB_TIME_SLOT_0 : bit_vector(11 downto 0) := o"0124"; + constant C3_ARB_TIME_SLOT_1 : bit_vector(11 downto 0) := o"1240"; + constant C3_ARB_TIME_SLOT_2 : bit_vector(11 downto 0) := o"2401"; + constant C3_ARB_TIME_SLOT_3 : bit_vector(11 downto 0) := o"4012"; + constant C3_ARB_TIME_SLOT_4 : bit_vector(11 downto 0) := o"0124"; + constant C3_ARB_TIME_SLOT_5 : bit_vector(11 downto 0) := o"1240"; + constant C3_ARB_TIME_SLOT_6 : bit_vector(11 downto 0) := o"2401"; + constant C3_ARB_TIME_SLOT_7 : bit_vector(11 downto 0) := o"4012"; + constant C3_ARB_TIME_SLOT_8 : bit_vector(11 downto 0) := o"0124"; + constant C3_ARB_TIME_SLOT_9 : bit_vector(11 downto 0) := o"1240"; + constant C3_ARB_TIME_SLOT_10 : bit_vector(11 downto 0) := o"2401"; + constant C3_ARB_TIME_SLOT_11 : bit_vector(11 downto 0) := o"4012"; + constant C3_MEM_TRAS : integer := 42500; + constant C3_MEM_TRCD : integer := 12500; + constant C3_MEM_TREFI : integer := 7800000; + constant C3_MEM_TRFC : integer := 127500; + constant C3_MEM_TRP : integer := 12500; + constant C3_MEM_TWR : integer := 15000; + constant C3_MEM_TRTP : integer := 7500; + constant C3_MEM_TWTR : integer := 7500; + constant C3_MEM_TYPE : string := "DDR2"; + constant C3_MEM_DENSITY : string := "1Gb"; + constant C3_MEM_BURST_LEN : integer := 4; + constant C3_MEM_CAS_LATENCY : integer := 5; + constant C3_MEM_NUM_COL_BITS : integer := 10; + constant C3_MEM_DDR1_2_ODS : string := "FULL"; + constant C3_MEM_DDR2_RTT : string := "50OHMS"; + constant C3_MEM_DDR2_DIFF_DQS_EN : string := "YES"; + constant C3_MEM_DDR2_3_PA_SR : string := "FULL"; + constant C3_MEM_DDR2_3_HIGH_TEMP_SR : string := "NORMAL"; + constant C3_MEM_DDR3_CAS_LATENCY : integer := 6; + constant C3_MEM_DDR3_ODS : string := "DIV6"; + constant C3_MEM_DDR3_RTT : string := "DIV2"; + constant C3_MEM_DDR3_CAS_WR_LATENCY : integer := 5; + constant C3_MEM_DDR3_AUTO_SR : string := "ENABLED"; + constant C3_MEM_DDR3_DYN_WRT_ODT : string := "OFF"; + constant C3_MEM_MOBILE_PA_SR : string := "FULL"; + constant C3_MEM_MDDR_ODS : string := "FULL"; + constant C3_MC_CALIB_BYPASS : string := "NO"; + constant C3_MC_CALIBRATION_MODE : string := "CALIBRATION"; + constant C3_MC_CALIBRATION_DELAY : string := "HALF"; + constant C3_SKIP_IN_TERM_CAL : integer := 0; + constant C3_SKIP_DYNAMIC_CAL : integer := 0; + constant C3_LDQSP_TAP_DELAY_VAL : integer := 0; + constant C3_LDQSN_TAP_DELAY_VAL : integer := 0; + constant C3_UDQSP_TAP_DELAY_VAL : integer := 0; + constant C3_UDQSN_TAP_DELAY_VAL : integer := 0; + constant C3_DQ0_TAP_DELAY_VAL : integer := 0; + constant C3_DQ1_TAP_DELAY_VAL : integer := 0; + constant C3_DQ2_TAP_DELAY_VAL : integer := 0; + constant C3_DQ3_TAP_DELAY_VAL : integer := 0; + constant C3_DQ4_TAP_DELAY_VAL : integer := 0; + constant C3_DQ5_TAP_DELAY_VAL : integer := 0; + constant C3_DQ6_TAP_DELAY_VAL : integer := 0; + constant C3_DQ7_TAP_DELAY_VAL : integer := 0; + constant C3_DQ8_TAP_DELAY_VAL : integer := 0; + constant C3_DQ9_TAP_DELAY_VAL : integer := 0; + constant C3_DQ10_TAP_DELAY_VAL : integer := 0; + constant C3_DQ11_TAP_DELAY_VAL : integer := 0; + constant C3_DQ12_TAP_DELAY_VAL : integer := 0; + constant C3_DQ13_TAP_DELAY_VAL : integer := 0; + constant C3_DQ14_TAP_DELAY_VAL : integer := 0; + constant C3_DQ15_TAP_DELAY_VAL : integer := 0; + constant C3_SMALL_DEVICE : string := "FALSE"; -- The parameter is set to TRUE for all packages of xc6slx9 device + -- as most of them cannot fit the complete example design when the + -- Chip scope modules are enabled + constant C3_p0_BEGIN_ADDRESS : std_logic_vector(31 downto 0) := c3_sim_hw (x"00000100", x"01000000"); + constant C3_p0_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + constant C3_p0_END_ADDRESS : std_logic_vector(31 downto 0) := c3_sim_hw (x"000002ff", x"02ffffff"); + constant C3_p0_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := c3_sim_hw (x"fffffc00", x"fc000000"); + constant C3_p0_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := c3_sim_hw (x"00000100", x"01000000"); + constant C3_p1_BEGIN_ADDRESS : std_logic_vector(31 downto 0) := c3_sim_hw (x"00000300", x"03000000"); + constant C3_p1_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + constant C3_p1_END_ADDRESS : std_logic_vector(31 downto 0) := c3_sim_hw (x"000004ff", x"04ffffff"); + constant C3_p1_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := c3_sim_hw (x"fffff800", x"f8000000"); + constant C3_p1_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := c3_sim_hw (x"00000300", x"03000000"); + constant C3_p2_BEGIN_ADDRESS : std_logic_vector(31 downto 0) := c3_sim_hw (x"00000500", x"05000000"); + constant C3_p2_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + constant C3_p2_END_ADDRESS : std_logic_vector(31 downto 0) := c3_sim_hw (x"000006ff", x"06ffffff"); + constant C3_p2_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := c3_sim_hw (x"fffff800", x"f8000000"); + constant C3_p2_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := c3_sim_hw (x"00000500", x"05000000"); + constant C3_p3_BEGIN_ADDRESS : std_logic_vector(31 downto 0) := c3_sim_hw (x"00000700", x"01000000"); + constant C3_p3_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + constant C3_p3_END_ADDRESS : std_logic_vector(31 downto 0) := c3_sim_hw (x"000008ff", x"02ffffff"); + constant C3_p3_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := c3_sim_hw (x"fffff000", x"fc000000"); + constant C3_p3_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := c3_sim_hw (x"00000700", x"01000000"); + + signal c3_sys_clk_p : std_logic; + signal c3_sys_clk_n : std_logic; + signal c3_error : std_logic; + signal c3_calib_done : std_logic; + signal c3_clk0 : std_logic; + signal c3_rst0 : std_logic; + signal c3_async_rst : std_logic; + signal c3_sysclk_2x : std_logic; + signal c3_sysclk_2x_180 : std_logic; + signal c3_pll_ce_0 : std_logic; + signal c3_pll_ce_90 : std_logic; + signal c3_pll_lock : std_logic; + signal c3_mcb_drp_clk : std_logic; + signal c3_cmp_error : std_logic; + signal c3_cmp_data_valid : std_logic; + signal c3_vio_modify_enable : std_logic; + signal c3_error_status : std_logic_vector(127 downto 0); + signal c3_vio_data_mode_value : std_logic_vector(2 downto 0); + signal c3_vio_addr_mode_value : std_logic_vector(2 downto 0); + signal c3_cmp_data : std_logic_vector(31 downto 0); + signal c3_p0_cmd_en : std_logic; + signal c3_p0_cmd_instr : std_logic_vector(2 downto 0); + signal c3_p0_cmd_bl : std_logic_vector(5 downto 0); + signal c3_p0_cmd_byte_addr : std_logic_vector(29 downto 0); + signal c3_p0_cmd_empty : std_logic; + signal c3_p0_cmd_full : std_logic; + signal c3_p0_wr_en : std_logic; + signal c3_p0_wr_mask : std_logic_vector(C3_P0_MASK_SIZE - 1 downto 0); + signal c3_p0_wr_data : std_logic_vector(C3_P0_DATA_PORT_SIZE - 1 downto 0); + signal c3_p0_wr_full : std_logic; + signal c3_p0_wr_empty : std_logic; + signal c3_p0_wr_count : std_logic_vector(6 downto 0); + signal c3_p0_wr_underrun : std_logic; + signal c3_p0_wr_error : std_logic; + signal c3_p0_rd_en : std_logic; + signal c3_p0_rd_data : std_logic_vector(C3_P0_DATA_PORT_SIZE - 1 downto 0); + signal c3_p0_rd_full : std_logic; + signal c3_p0_rd_empty : std_logic; + signal c3_p0_rd_count : std_logic_vector(6 downto 0); + signal c3_p0_rd_overflow : std_logic; + signal c3_p0_rd_error : std_logic; + + signal c3_p1_cmd_en : std_logic; + signal c3_p1_cmd_instr : std_logic_vector(2 downto 0); + signal c3_p1_cmd_bl : std_logic_vector(5 downto 0); + signal c3_p1_cmd_byte_addr : std_logic_vector(29 downto 0); + signal c3_p1_cmd_empty : std_logic; + signal c3_p1_cmd_full : std_logic; + signal c3_p1_wr_en : std_logic; + signal c3_p1_wr_mask : std_logic_vector(C3_P1_MASK_SIZE - 1 downto 0); + signal c3_p1_wr_data : std_logic_vector(C3_P1_DATA_PORT_SIZE - 1 downto 0); + signal c3_p1_wr_full : std_logic; + signal c3_p1_wr_empty : std_logic; + signal c3_p1_wr_count : std_logic_vector(6 downto 0); + signal c3_p1_wr_underrun : std_logic; + signal c3_p1_wr_error : std_logic; + signal c3_p1_rd_en : std_logic; + signal c3_p1_rd_data : std_logic_vector(C3_P1_DATA_PORT_SIZE - 1 downto 0); + signal c3_p1_rd_full : std_logic; + signal c3_p1_rd_empty : std_logic; + signal c3_p1_rd_count : std_logic_vector(6 downto 0); + signal c3_p1_rd_overflow : std_logic; + signal c3_p1_rd_error : std_logic; + + signal c3_p2_cmd_en : std_logic; + signal c3_p2_cmd_instr : std_logic_vector(2 downto 0); + signal c3_p2_cmd_bl : std_logic_vector(5 downto 0); + signal c3_p2_cmd_byte_addr : std_logic_vector(29 downto 0); + signal c3_p2_cmd_empty : std_logic; + signal c3_p2_cmd_full : std_logic; + signal c3_p2_wr_en : std_logic; + signal c3_p2_wr_mask : std_logic_vector(3 downto 0); + signal c3_p2_wr_data : std_logic_vector(31 downto 0); + signal c3_p2_wr_full : std_logic; + signal c3_p2_wr_empty : std_logic; + signal c3_p2_wr_count : std_logic_vector(6 downto 0); + signal c3_p2_wr_underrun : std_logic; + signal c3_p2_wr_error : std_logic; + signal c3_p2_rd_en : std_logic; + signal c3_p2_rd_data : std_logic_vector(31 downto 0); + signal c3_p2_rd_full : std_logic; + signal c3_p2_rd_empty : std_logic; + signal c3_p2_rd_count : std_logic_vector(6 downto 0); + signal c3_p2_rd_overflow : std_logic; + signal c3_p2_rd_error : std_logic; + + signal c3_p3_cmd_en : std_logic; + signal c3_p3_cmd_instr : std_logic_vector(2 downto 0); + signal c3_p3_cmd_bl : std_logic_vector(5 downto 0); + signal c3_p3_cmd_byte_addr : std_logic_vector(29 downto 0); + signal c3_p3_cmd_empty : std_logic; + signal c3_p3_cmd_full : std_logic; + signal c3_p3_wr_en : std_logic; + signal c3_p3_wr_mask : std_logic_vector(3 downto 0); + signal c3_p3_wr_data : std_logic_vector(31 downto 0); + signal c3_p3_wr_full : std_logic; + signal c3_p3_wr_empty : std_logic; + signal c3_p3_wr_count : std_logic_vector(6 downto 0); + signal c3_p3_wr_underrun : std_logic; + signal c3_p3_wr_error : std_logic; + signal c3_p3_rd_en : std_logic; + signal c3_p3_rd_data : std_logic_vector(31 downto 0); + signal c3_p3_rd_full : std_logic; + signal c3_p3_rd_empty : std_logic; + signal c3_p3_rd_count : std_logic_vector(6 downto 0); + signal c3_p3_rd_overflow : std_logic; + signal c3_p3_rd_error : std_logic; + + signal c3_selfrefresh_enter : std_logic; + signal c3_selfrefresh_mode : std_logic; + + + + +begin + error <= c3_error; +calib_done <= c3_calib_done; +c3_sys_clk_p <= '0'; +c3_sys_clk_n <= '0'; +c3_selfrefresh_enter <= '0'; +memc3_infrastructure_inst : memc3_infrastructure + +generic map + ( + C_RST_ACT_LOW => C3_RST_ACT_LOW, + C_INPUT_CLK_TYPE => C3_INPUT_CLK_TYPE, + C_CLKOUT0_DIVIDE => C3_CLKOUT0_DIVIDE, + C_CLKOUT1_DIVIDE => C3_CLKOUT1_DIVIDE, + C_CLKOUT2_DIVIDE => C3_CLKOUT2_DIVIDE, + C_CLKOUT3_DIVIDE => C3_CLKOUT3_DIVIDE, + C_CLKFBOUT_MULT => C3_CLKFBOUT_MULT, + C_DIVCLK_DIVIDE => C3_DIVCLK_DIVIDE, + C_INCLK_PERIOD => C3_INCLK_PERIOD + ) +port map + ( + sys_clk_p => c3_sys_clk_p, + sys_clk_n => c3_sys_clk_n, + sys_clk => c3_sys_clk, + sys_rst_i => c3_sys_rst_i, + clk0 => c3_clk0, + rst0 => c3_rst0, + async_rst => c3_async_rst, + sysclk_2x => c3_sysclk_2x, + sysclk_2x_180 => c3_sysclk_2x_180, + pll_ce_0 => c3_pll_ce_0, + pll_ce_90 => c3_pll_ce_90, + pll_lock => c3_pll_lock, + mcb_drp_clk => c3_mcb_drp_clk + ); + + +-- wrapper instantiation + memc3_wrapper_inst : memc3_wrapper + +generic map + ( + C_MEMCLK_PERIOD => C3_MEMCLK_PERIOD, + C_CALIB_SOFT_IP => C3_CALIB_SOFT_IP, + C_SIMULATION => C3_SIMULATION, + C_P0_MASK_SIZE => C3_P0_MASK_SIZE, + C_P0_DATA_PORT_SIZE => C3_P0_DATA_PORT_SIZE, + C_P1_MASK_SIZE => C3_P1_MASK_SIZE, + C_P1_DATA_PORT_SIZE => C3_P1_DATA_PORT_SIZE, + C_ARB_NUM_TIME_SLOTS => C3_ARB_NUM_TIME_SLOTS, + C_ARB_TIME_SLOT_0 => C3_ARB_TIME_SLOT_0, + C_ARB_TIME_SLOT_1 => C3_ARB_TIME_SLOT_1, + C_ARB_TIME_SLOT_2 => C3_ARB_TIME_SLOT_2, + C_ARB_TIME_SLOT_3 => C3_ARB_TIME_SLOT_3, + C_ARB_TIME_SLOT_4 => C3_ARB_TIME_SLOT_4, + C_ARB_TIME_SLOT_5 => C3_ARB_TIME_SLOT_5, + C_ARB_TIME_SLOT_6 => C3_ARB_TIME_SLOT_6, + C_ARB_TIME_SLOT_7 => C3_ARB_TIME_SLOT_7, + C_ARB_TIME_SLOT_8 => C3_ARB_TIME_SLOT_8, + C_ARB_TIME_SLOT_9 => C3_ARB_TIME_SLOT_9, + C_ARB_TIME_SLOT_10 => C3_ARB_TIME_SLOT_10, + C_ARB_TIME_SLOT_11 => C3_ARB_TIME_SLOT_11, + C_MEM_TRAS => C3_MEM_TRAS, + C_MEM_TRCD => C3_MEM_TRCD, + C_MEM_TREFI => C3_MEM_TREFI, + C_MEM_TRFC => C3_MEM_TRFC, + C_MEM_TRP => C3_MEM_TRP, + C_MEM_TWR => C3_MEM_TWR, + C_MEM_TRTP => C3_MEM_TRTP, + C_MEM_TWTR => C3_MEM_TWTR, + C_MEM_ADDR_ORDER => C3_MEM_ADDR_ORDER, + C_NUM_DQ_PINS => C3_NUM_DQ_PINS, + C_MEM_TYPE => C3_MEM_TYPE, + C_MEM_DENSITY => C3_MEM_DENSITY, + C_MEM_BURST_LEN => C3_MEM_BURST_LEN, + C_MEM_CAS_LATENCY => C3_MEM_CAS_LATENCY, + C_MEM_ADDR_WIDTH => C3_MEM_ADDR_WIDTH, + C_MEM_BANKADDR_WIDTH => C3_MEM_BANKADDR_WIDTH, + C_MEM_NUM_COL_BITS => C3_MEM_NUM_COL_BITS, + C_MEM_DDR1_2_ODS => C3_MEM_DDR1_2_ODS, + C_MEM_DDR2_RTT => C3_MEM_DDR2_RTT, + C_MEM_DDR2_DIFF_DQS_EN => C3_MEM_DDR2_DIFF_DQS_EN, + C_MEM_DDR2_3_PA_SR => C3_MEM_DDR2_3_PA_SR, + C_MEM_DDR2_3_HIGH_TEMP_SR => C3_MEM_DDR2_3_HIGH_TEMP_SR, + C_MEM_DDR3_CAS_LATENCY => C3_MEM_DDR3_CAS_LATENCY, + C_MEM_DDR3_ODS => C3_MEM_DDR3_ODS, + C_MEM_DDR3_RTT => C3_MEM_DDR3_RTT, + C_MEM_DDR3_CAS_WR_LATENCY => C3_MEM_DDR3_CAS_WR_LATENCY, + C_MEM_DDR3_AUTO_SR => C3_MEM_DDR3_AUTO_SR, + C_MEM_DDR3_DYN_WRT_ODT => C3_MEM_DDR3_DYN_WRT_ODT, + C_MEM_MOBILE_PA_SR => C3_MEM_MOBILE_PA_SR, + C_MEM_MDDR_ODS => C3_MEM_MDDR_ODS, + C_MC_CALIB_BYPASS => C3_MC_CALIB_BYPASS, + C_MC_CALIBRATION_MODE => C3_MC_CALIBRATION_MODE, + C_MC_CALIBRATION_DELAY => C3_MC_CALIBRATION_DELAY, + C_SKIP_IN_TERM_CAL => C3_SKIP_IN_TERM_CAL, + C_SKIP_DYNAMIC_CAL => C3_SKIP_DYNAMIC_CAL, + C_LDQSP_TAP_DELAY_VAL => C3_LDQSP_TAP_DELAY_VAL, + C_LDQSN_TAP_DELAY_VAL => C3_LDQSN_TAP_DELAY_VAL, + C_UDQSP_TAP_DELAY_VAL => C3_UDQSP_TAP_DELAY_VAL, + C_UDQSN_TAP_DELAY_VAL => C3_UDQSN_TAP_DELAY_VAL, + C_DQ0_TAP_DELAY_VAL => C3_DQ0_TAP_DELAY_VAL, + C_DQ1_TAP_DELAY_VAL => C3_DQ1_TAP_DELAY_VAL, + C_DQ2_TAP_DELAY_VAL => C3_DQ2_TAP_DELAY_VAL, + C_DQ3_TAP_DELAY_VAL => C3_DQ3_TAP_DELAY_VAL, + C_DQ4_TAP_DELAY_VAL => C3_DQ4_TAP_DELAY_VAL, + C_DQ5_TAP_DELAY_VAL => C3_DQ5_TAP_DELAY_VAL, + C_DQ6_TAP_DELAY_VAL => C3_DQ6_TAP_DELAY_VAL, + C_DQ7_TAP_DELAY_VAL => C3_DQ7_TAP_DELAY_VAL, + C_DQ8_TAP_DELAY_VAL => C3_DQ8_TAP_DELAY_VAL, + C_DQ9_TAP_DELAY_VAL => C3_DQ9_TAP_DELAY_VAL, + C_DQ10_TAP_DELAY_VAL => C3_DQ10_TAP_DELAY_VAL, + C_DQ11_TAP_DELAY_VAL => C3_DQ11_TAP_DELAY_VAL, + C_DQ12_TAP_DELAY_VAL => C3_DQ12_TAP_DELAY_VAL, + C_DQ13_TAP_DELAY_VAL => C3_DQ13_TAP_DELAY_VAL, + C_DQ14_TAP_DELAY_VAL => C3_DQ14_TAP_DELAY_VAL, + C_DQ15_TAP_DELAY_VAL => C3_DQ15_TAP_DELAY_VAL + ) +port map +( + mcb3_dram_dq => mcb3_dram_dq, + mcb3_dram_a => mcb3_dram_a, + mcb3_dram_ba => mcb3_dram_ba, + mcb3_dram_ras_n => mcb3_dram_ras_n, + mcb3_dram_cas_n => mcb3_dram_cas_n, + mcb3_dram_we_n => mcb3_dram_we_n, + mcb3_dram_odt => mcb3_dram_odt, + mcb3_dram_cke => mcb3_dram_cke, + mcb3_dram_dm => mcb3_dram_dm, + mcb3_dram_udqs => mcb3_dram_udqs, + mcb3_dram_udqs_n => mcb3_dram_udqs_n, + mcb3_rzq => mcb3_rzq, + mcb3_zio => mcb3_zio, + mcb3_dram_udm => mcb3_dram_udm, + calib_done => c3_calib_done, + async_rst => c3_async_rst, + sysclk_2x => c3_sysclk_2x, + sysclk_2x_180 => c3_sysclk_2x_180, + pll_ce_0 => c3_pll_ce_0, + pll_ce_90 => c3_pll_ce_90, + pll_lock => c3_pll_lock, + mcb_drp_clk => c3_mcb_drp_clk, + mcb3_dram_dqs => mcb3_dram_dqs, + mcb3_dram_dqs_n => mcb3_dram_dqs_n, + mcb3_dram_ck => mcb3_dram_ck, + mcb3_dram_ck_n => mcb3_dram_ck_n, + p0_cmd_clk => c3_clk0, + p0_cmd_en => c3_p0_cmd_en, + p0_cmd_instr => c3_p0_cmd_instr, + p0_cmd_bl => c3_p0_cmd_bl, + p0_cmd_byte_addr => c3_p0_cmd_byte_addr, + p0_cmd_empty => c3_p0_cmd_empty, + p0_cmd_full => c3_p0_cmd_full, + p0_wr_clk => c3_clk0, + p0_wr_en => c3_p0_wr_en, + p0_wr_mask => c3_p0_wr_mask, + p0_wr_data => c3_p0_wr_data, + p0_wr_full => c3_p0_wr_full, + p0_wr_empty => c3_p0_wr_empty, + p0_wr_count => c3_p0_wr_count, + p0_wr_underrun => c3_p0_wr_underrun, + p0_wr_error => c3_p0_wr_error, + p0_rd_clk => c3_clk0, + p0_rd_en => c3_p0_rd_en, + p0_rd_data => c3_p0_rd_data, + p0_rd_full => c3_p0_rd_full, + p0_rd_empty => c3_p0_rd_empty, + p0_rd_count => c3_p0_rd_count, + p0_rd_overflow => c3_p0_rd_overflow, + p0_rd_error => c3_p0_rd_error, + p1_cmd_clk => c3_clk0, + p1_cmd_en => c3_p1_cmd_en, + p1_cmd_instr => c3_p1_cmd_instr, + p1_cmd_bl => c3_p1_cmd_bl, + p1_cmd_byte_addr => c3_p1_cmd_byte_addr, + p1_cmd_empty => c3_p1_cmd_empty, + p1_cmd_full => c3_p1_cmd_full, + p1_wr_clk => c3_clk0, + p1_wr_en => c3_p1_wr_en, + p1_wr_mask => c3_p1_wr_mask, + p1_wr_data => c3_p1_wr_data, + p1_wr_full => c3_p1_wr_full, + p1_wr_empty => c3_p1_wr_empty, + p1_wr_count => c3_p1_wr_count, + p1_wr_underrun => c3_p1_wr_underrun, + p1_wr_error => c3_p1_wr_error, + p1_rd_clk => c3_clk0, + p1_rd_en => c3_p1_rd_en, + p1_rd_data => c3_p1_rd_data, + p1_rd_full => c3_p1_rd_full, + p1_rd_empty => c3_p1_rd_empty, + p1_rd_count => c3_p1_rd_count, + p1_rd_overflow => c3_p1_rd_overflow, + p1_rd_error => c3_p1_rd_error, + p2_cmd_clk => c3_clk0, + p2_cmd_en => c3_p2_cmd_en, + p2_cmd_instr => c3_p2_cmd_instr, + p2_cmd_bl => c3_p2_cmd_bl, + p2_cmd_byte_addr => c3_p2_cmd_byte_addr, + p2_cmd_empty => c3_p2_cmd_empty, + p2_cmd_full => c3_p2_cmd_full, + p2_wr_clk => c3_clk0, + p2_wr_en => c3_p2_wr_en, + p2_wr_mask => c3_p2_wr_mask, + p2_wr_data => c3_p2_wr_data, + p2_wr_full => c3_p2_wr_full, + p2_wr_empty => c3_p2_wr_empty, + p2_wr_count => c3_p2_wr_count, + p2_wr_underrun => c3_p2_wr_underrun, + p2_wr_error => c3_p2_wr_error, + p2_rd_clk => c3_clk0, + p2_rd_en => c3_p2_rd_en, + p2_rd_data => c3_p2_rd_data, + p2_rd_full => c3_p2_rd_full, + p2_rd_empty => c3_p2_rd_empty, + p2_rd_count => c3_p2_rd_count, + p2_rd_overflow => c3_p2_rd_overflow, + p2_rd_error => c3_p2_rd_error, + p3_cmd_clk => c3_clk0, + p3_cmd_en => c3_p3_cmd_en, + p3_cmd_instr => c3_p3_cmd_instr, + p3_cmd_bl => c3_p3_cmd_bl, + p3_cmd_byte_addr => c3_p3_cmd_byte_addr, + p3_cmd_empty => c3_p3_cmd_empty, + p3_cmd_full => c3_p3_cmd_full, + p3_wr_clk => c3_clk0, + p3_wr_en => c3_p3_wr_en, + p3_wr_mask => c3_p3_wr_mask, + p3_wr_data => c3_p3_wr_data, + p3_wr_full => c3_p3_wr_full, + p3_wr_empty => c3_p3_wr_empty, + p3_wr_count => c3_p3_wr_count, + p3_wr_underrun => c3_p3_wr_underrun, + p3_wr_error => c3_p3_wr_error, + p3_rd_clk => c3_clk0, + p3_rd_en => c3_p3_rd_en, + p3_rd_data => c3_p3_rd_data, + p3_rd_full => c3_p3_rd_full, + p3_rd_empty => c3_p3_rd_empty, + p3_rd_count => c3_p3_rd_count, + p3_rd_overflow => c3_p3_rd_overflow, + p3_rd_error => c3_p3_rd_error, + selfrefresh_enter => c3_selfrefresh_enter, + selfrefresh_mode => c3_selfrefresh_mode +); + + memc3_tb_top_inst : memc3_tb_top + +generic map + ( + C_SIMULATION => C3_SIMULATION, + C_P0_MASK_SIZE => C3_P0_MASK_SIZE, + C_P0_DATA_PORT_SIZE => C3_P0_DATA_PORT_SIZE, + C_P1_MASK_SIZE => C3_P1_MASK_SIZE, + C_P1_DATA_PORT_SIZE => C3_P1_DATA_PORT_SIZE, + C_NUM_DQ_PINS => C3_NUM_DQ_PINS, + C_MEM_BURST_LEN => C3_MEM_BURST_LEN, + C_MEM_NUM_COL_BITS => C3_MEM_NUM_COL_BITS, + C_SMALL_DEVICE => C3_SMALL_DEVICE, + C_p0_BEGIN_ADDRESS => C3_p0_BEGIN_ADDRESS, + C_p0_DATA_MODE => C3_p0_DATA_MODE, + C_p0_END_ADDRESS => C3_p0_END_ADDRESS, + C_p0_PRBS_EADDR_MASK_POS => C3_p0_PRBS_EADDR_MASK_POS, + C_p0_PRBS_SADDR_MASK_POS => C3_p0_PRBS_SADDR_MASK_POS, + C_p1_BEGIN_ADDRESS => C3_p1_BEGIN_ADDRESS, + C_p1_DATA_MODE => C3_p1_DATA_MODE, + C_p1_END_ADDRESS => C3_p1_END_ADDRESS, + C_p1_PRBS_EADDR_MASK_POS => C3_p1_PRBS_EADDR_MASK_POS, + C_p1_PRBS_SADDR_MASK_POS => C3_p1_PRBS_SADDR_MASK_POS, + C_p2_BEGIN_ADDRESS => C3_p2_BEGIN_ADDRESS, + C_p2_DATA_MODE => C3_p2_DATA_MODE, + C_p2_END_ADDRESS => C3_p2_END_ADDRESS, + C_p2_PRBS_EADDR_MASK_POS => C3_p2_PRBS_EADDR_MASK_POS, + C_p2_PRBS_SADDR_MASK_POS => C3_p2_PRBS_SADDR_MASK_POS, + C_p3_BEGIN_ADDRESS => C3_p3_BEGIN_ADDRESS, + C_p3_DATA_MODE => C3_p3_DATA_MODE, + C_p3_END_ADDRESS => C3_p3_END_ADDRESS, + C_p3_PRBS_EADDR_MASK_POS => C3_p3_PRBS_EADDR_MASK_POS, + C_p3_PRBS_SADDR_MASK_POS => C3_p3_PRBS_SADDR_MASK_POS + ) +port map +( + error => c3_error, + calib_done => c3_calib_done, + clk0 => c3_clk0, + rst0 => c3_rst0, + cmp_error => c3_cmp_error, + cmp_data_valid => c3_cmp_data_valid, + vio_modify_enable => c3_vio_modify_enable, + error_status => c3_error_status, + vio_data_mode_value => c3_vio_data_mode_value, + vio_addr_mode_value => c3_vio_addr_mode_value, + cmp_data => c3_cmp_data, + p0_mcb_cmd_en_o => c3_p0_cmd_en, + p0_mcb_cmd_instr_o => c3_p0_cmd_instr, + p0_mcb_cmd_bl_o => c3_p0_cmd_bl, + p0_mcb_cmd_addr_o => c3_p0_cmd_byte_addr, + p0_mcb_cmd_full_i => c3_p0_cmd_full, + p0_mcb_wr_en_o => c3_p0_wr_en, + p0_mcb_wr_mask_o => c3_p0_wr_mask, + p0_mcb_wr_data_o => c3_p0_wr_data, + p0_mcb_wr_full_i => c3_p0_wr_full, + p0_mcb_wr_fifo_counts => c3_p0_wr_count, + p0_mcb_rd_en_o => c3_p0_rd_en, + p0_mcb_rd_data_i => c3_p0_rd_data, + p0_mcb_rd_empty_i => c3_p0_rd_empty, + p0_mcb_rd_fifo_counts => c3_p0_rd_count, + p1_mcb_cmd_en_o => c3_p1_cmd_en, + p1_mcb_cmd_instr_o => c3_p1_cmd_instr, + p1_mcb_cmd_bl_o => c3_p1_cmd_bl, + p1_mcb_cmd_addr_o => c3_p1_cmd_byte_addr, + p1_mcb_cmd_full_i => c3_p1_cmd_full, + p1_mcb_wr_en_o => c3_p1_wr_en, + p1_mcb_wr_mask_o => c3_p1_wr_mask, + p1_mcb_wr_data_o => c3_p1_wr_data, + p1_mcb_wr_full_i => c3_p1_wr_full, + p1_mcb_wr_fifo_counts => c3_p1_wr_count, + p1_mcb_rd_en_o => c3_p1_rd_en, + p1_mcb_rd_data_i => c3_p1_rd_data, + p1_mcb_rd_empty_i => c3_p1_rd_empty, + p1_mcb_rd_fifo_counts => c3_p1_rd_count, + p2_mcb_cmd_en_o => c3_p2_cmd_en, + p2_mcb_cmd_instr_o => c3_p2_cmd_instr, + p2_mcb_cmd_bl_o => c3_p2_cmd_bl, + p2_mcb_cmd_addr_o => c3_p2_cmd_byte_addr, + p2_mcb_cmd_full_i => c3_p2_cmd_full, + p2_mcb_wr_en_o => c3_p2_wr_en, + p2_mcb_wr_mask_o => c3_p2_wr_mask, + p2_mcb_wr_data_o => c3_p2_wr_data, + p2_mcb_wr_full_i => c3_p2_wr_full, + p2_mcb_wr_fifo_counts => c3_p2_wr_count, + p2_mcb_rd_en_o => c3_p2_rd_en, + p2_mcb_rd_data_i => c3_p2_rd_data, + p2_mcb_rd_empty_i => c3_p2_rd_empty, + p2_mcb_rd_fifo_counts => c3_p2_rd_count, + p3_mcb_cmd_en_o => c3_p3_cmd_en, + p3_mcb_cmd_instr_o => c3_p3_cmd_instr, + p3_mcb_cmd_bl_o => c3_p3_cmd_bl, + p3_mcb_cmd_addr_o => c3_p3_cmd_byte_addr, + p3_mcb_cmd_full_i => c3_p3_cmd_full, + p3_mcb_wr_en_o => c3_p3_wr_en, + p3_mcb_wr_mask_o => c3_p3_wr_mask, + p3_mcb_wr_data_o => c3_p3_wr_data, + p3_mcb_wr_full_i => c3_p3_wr_full, + p3_mcb_wr_fifo_counts => c3_p3_wr_count, + p3_mcb_rd_en_o => c3_p3_rd_en, + p3_mcb_rd_data_i => c3_p3_rd_data, + p3_mcb_rd_empty_i => c3_p3_rd_empty, + p3_mcb_rd_fifo_counts => c3_p3_rd_count + ); + + + + + end arc; diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/iodrp_controller.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/iodrp_controller.vhd new file mode 100755 index 0000000..f0a4b52 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/iodrp_controller.vhd @@ -0,0 +1,372 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: iodrp_controller.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:17:25 $ +-- \ \ / \ Date Created: Mon Feb 9 2009 +-- \___\/\___\ +-- +--Device: Spartan6 +--Design Name: DDR/DDR2/DDR3/LPDDR +--Purpose: Xilinx reference design for IODRP controller for v0.9 device +-- +--Reference: +-- +-- Revision: Date: Comment +-- 1.0: 02/06/09: Initial version for MIG wrapper. +-- 1.1: 02/01/09: updates to indentations. +-- 1.2: 02/12/09: changed non-blocking assignments to blocking ones +-- for state machine always block. Also, assigned +-- intial value to load_shift_n to avoid latch +-- End Revision +--******************************************************************************* + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + +entity iodrp_controller is + --output to IODRP SDI pin + --input from IODRP SDO pin + + -- Register where memcell_address is captured during the READY state + -- Register which stores the write data until it is ready to be shifted out + -- The shift register which shifts out SDO and shifts in SDI. + -- This register is loaded before the address or data phase, but continues + -- to shift for a writeback of read data + -- The signal which causes shift_through_reg to load the new value from data_out_mux, or continue to shift data in from DRP_SDO + -- The signal which indicates where the shift_through_reg should load from. 0 -> data_reg 1 -> memcell_addr_reg + -- The counter for which bit is being shifted during address or data phase + -- This is set after the first address phase has executed + + -- (* FSM_ENCODING="GRAY" *) reg [2:0] state, nextstate; + + -- The mux which selects between data_reg and memcell_addr_reg for sending to shift_through_reg + -- added so that DRP_SDI output is only active when DRP_CS is active + + port ( + memcell_address : in std_logic_vector(7 downto 0); + write_data : in std_logic_vector(7 downto 0); + read_data : out std_logic_vector(7 downto 0); + rd_not_write : in std_logic; + cmd_valid : in std_logic; + rdy_busy_n : out std_logic; + use_broadcast : in std_logic; + sync_rst : in std_logic; + DRP_CLK : in std_logic; + DRP_CS : out std_logic; + DRP_SDI : out std_logic; + DRP_ADD : out std_logic; + DRP_BKST : out std_logic; + DRP_SDO : in std_logic + ); +end entity iodrp_controller; + +architecture trans of iodrp_controller is + + + constant READY : std_logic_vector(2 downto 0) := "000"; + constant DECIDE : std_logic_vector(2 downto 0) := "001"; + constant ADDR_PHASE : std_logic_vector(2 downto 0) := "010"; + constant ADDR_TO_DATA_GAP : std_logic_vector(2 downto 0) := "011"; + constant ADDR_TO_DATA_GAP2 : std_logic_vector(2 downto 0) := "100"; + constant ADDR_TO_DATA_GAP3 : std_logic_vector(2 downto 0) := "101"; + constant DATA_PHASE : std_logic_vector(2 downto 0) := "110"; + constant ALMOST_READY : std_logic_vector(2 downto 0) := "111"; + + constant IOI_DQ0 : std_logic_vector(4 downto 0) := "00001"; + constant IOI_DQ1 : std_logic_vector(4 downto 0) := "00000"; + constant IOI_DQ2 : std_logic_vector(4 downto 0) := "00011"; + constant IOI_DQ3 : std_logic_vector(4 downto 0) := "00010"; + constant IOI_DQ4 : std_logic_vector(4 downto 0) := "00101"; + constant IOI_DQ5 : std_logic_vector(4 downto 0) := "00100"; + constant IOI_DQ6 : std_logic_vector(4 downto 0) := "00111"; + constant IOI_DQ7 : std_logic_vector(4 downto 0) := "00110"; + constant IOI_DQ8 : std_logic_vector(4 downto 0) := "01001"; + constant IOI_DQ9 : std_logic_vector(4 downto 0) := "01000"; + constant IOI_DQ10 : std_logic_vector(4 downto 0) := "01011"; + constant IOI_DQ11 : std_logic_vector(4 downto 0) := "01010"; + constant IOI_DQ12 : std_logic_vector(4 downto 0) := "01101"; + constant IOI_DQ13 : std_logic_vector(4 downto 0) := "01100"; + constant IOI_DQ14 : std_logic_vector(4 downto 0) := "01111"; + constant IOI_DQ15 : std_logic_vector(4 downto 0) := "01110"; + constant IOI_UDQS_CLK : std_logic_vector(4 downto 0) := "11101"; + constant IOI_UDQS_PIN : std_logic_vector(4 downto 0) := "11100"; + constant IOI_LDQS_CLK : std_logic_vector(4 downto 0) := "11111"; + constant IOI_LDQS_PIN : std_logic_vector(4 downto 0) := "11110"; + + + + + signal memcell_addr_reg : std_logic_vector(7 downto 0); + signal data_reg : std_logic_vector(7 downto 0); + signal shift_through_reg : std_logic_vector(7 downto 0); + signal load_shift_n : std_logic; + signal addr_data_sel_n : std_logic; + signal bit_cnt : std_logic_vector(2 downto 0); + signal rd_not_write_reg : std_logic; + signal AddressPhase : std_logic; + signal capture_read_data : std_logic; + signal state : std_logic_vector(2 downto 0); + signal nextstate : std_logic_vector(2 downto 0); + signal data_out_mux : std_logic_vector(7 downto 0); + signal DRP_SDI_pre : std_logic; + + signal ALMOST_READY_ST : std_logic; + signal ADDR_PHASE_ST : std_logic; + signal BIT_CNT7 : std_logic; + signal ADDR_PHASE_ST1 : std_logic; + signal DATA_PHASE_ST : std_logic; + + signal state_ascii : std_logic_vector(32 * 8 - 1 downto 0); +begin + --synthesis translate_off + +-- process (state) +-- begin +-- case state is +-- when READY => +-- state_ascii <= "READY"; +-- when DECIDE => +-- state_ascii <= "DECIDE"; +-- when ADDR_PHASE => +-- state_ascii <= "ADDR_PHASE"; +-- when ADDR_TO_DATA_GAP => +-- state_ascii <= "ADDR_TO_DATA_GAP"; +-- when ADDR_TO_DATA_GAP2 => +-- state_ascii <= "ADDR_TO_DATA_GAP2"; +-- when ADDR_TO_DATA_GAP3 => +-- state_ascii <= "ADDR_TO_DATA_GAP3"; +-- when DATA_PHASE => +-- state_ascii <= "DATA_PHASE"; +-- when ALMOST_READY => -- case(state) +-- state_ascii <= "ALMOST_READY"; +-- when others => +-- null; +-- end case; +-- end process; + + --synthesis translate_on + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (state = READY) then + memcell_addr_reg <= memcell_address; + data_reg <= write_data; + rd_not_write_reg <= rd_not_write; + end if; + end if; + end process; + + + rdy_busy_n <= '1' when (state = READY) else '0'; + + data_out_mux <= memcell_addr_reg when (addr_data_sel_n = '1') else + data_reg; + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (sync_rst = '1') then + shift_through_reg <= "00000000"; + else + if (load_shift_n = '1') then --Assume the shifter is either loading or shifting, bit 0 is shifted out first + shift_through_reg <= data_out_mux; + else + shift_through_reg <= (DRP_SDO & shift_through_reg(7 downto 1)); + end if; + end if; + end if; + end process; + + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (((state = ADDR_PHASE) or (state = DATA_PHASE)) and (not(sync_rst)) = '1') then + bit_cnt <= bit_cnt + "001"; + else + bit_cnt <= "000"; + end if; + end if; + end process; + + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (sync_rst = '1') then + -- capture_read_data <= 1'b0; + read_data <= "00000000"; + else + -- capture_read_data <= (state == DATA_PHASE); + -- if(capture_read_data) + if (state = ALMOST_READY) then + -- else + -- read_data <= read_data; + read_data <= shift_through_reg; + end if; + end if; + end if; + end process; + + ALMOST_READY_ST <= '1' when state = ALMOST_READY else '0'; + ADDR_PHASE_ST <= '1' when state = ADDR_PHASE else '0'; + BIT_CNT7 <= '1' when bit_cnt = "111" else '0'; + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (sync_rst = '1') then + AddressPhase <= '0'; + else + if (AddressPhase = '1') then + -- Keep it set until we finish the cycle + AddressPhase <= AddressPhase and (not ALMOST_READY_ST); + else + -- set the address phase when ever we finish the address phase + AddressPhase <= (ADDR_PHASE_ST and BIT_CNT7); + end if; + end if; + end if; + end process; + +ADDR_PHASE_ST1 <= '1' when nextstate = ADDR_PHASE else '0'; +DATA_PHASE_ST <= '1' when nextstate = DATA_PHASE else '0'; + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + DRP_ADD <= ADDR_PHASE_ST1; + DRP_CS <= ADDR_PHASE_ST1 or DATA_PHASE_ST; + if (state = READY) then + DRP_BKST <= use_broadcast; + end if; + end if; + end process; + + + -- assign DRP_SDI_pre = (DRP_CS)? shift_through_reg[0] : 1'b0; //if DRP_CS is inactive, just drive 0 out - this is a possible place to pipeline for increased performance + -- assign DRP_SDI = (rd_not_write_reg & DRP_CS & !DRP_ADD)? DRP_SDO : DRP_SDI_pre; //If reading, then feed SDI back out SDO - this is a possible place to pipeline for increased performance + DRP_SDI <= shift_through_reg(0); -- The new read method only requires that we shift out the address and the write data + + process (state, cmd_valid, bit_cnt, rd_not_write_reg, AddressPhase,BIT_CNT7) + begin + addr_data_sel_n <= '0'; + load_shift_n <= '0'; + case state is + when READY => + if (cmd_valid = '1') then + nextstate <= DECIDE; + else + nextstate <= READY; + end if; + when DECIDE => + load_shift_n <= '1'; + addr_data_sel_n <= '1'; + nextstate <= ADDR_PHASE; + -- After the second pass go to end of statemachine + -- execute a second address phase for the read access. + when ADDR_PHASE => + if (BIT_CNT7 = '1') then + if (rd_not_write_reg = '1') then + if (AddressPhase = '1') then + nextstate <= ALMOST_READY; + else + nextstate <= DECIDE; + end if; + else + nextstate <= ADDR_TO_DATA_GAP; + end if; + else + nextstate <= ADDR_PHASE; + end if; + when ADDR_TO_DATA_GAP => + load_shift_n <= '1'; + nextstate <= ADDR_TO_DATA_GAP2; + when ADDR_TO_DATA_GAP2 => + load_shift_n <= '1'; + nextstate <= ADDR_TO_DATA_GAP3; + when ADDR_TO_DATA_GAP3 => + load_shift_n <= '1'; + nextstate <= DATA_PHASE; + when DATA_PHASE => + if (BIT_CNT7 = '1') then + nextstate <= ALMOST_READY; + else + nextstate <= DATA_PHASE; + end if; + when ALMOST_READY => + nextstate <= READY; + when others => + nextstate <= READY; + end case; + end process; + + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (sync_rst = '1') then + state <= READY; + else + state <= nextstate; + end if; + end if; + end process; + + +end architecture trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/iodrp_mcb_controller.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/iodrp_mcb_controller.vhd new file mode 100755 index 0000000..22451be --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/iodrp_mcb_controller.vhd @@ -0,0 +1,517 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: iodrp_mcb_controller.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:17:25 $ +-- \ \ / \ Date Created: Mon Feb 9 2009 +-- \___\/\___\ +-- +--Device: Spartan6 +--Design Name: DDR/DDR2/DDR3/LPDDR +--Purpose: Xilinx reference design for IODRP controller for v0.9 device +-- +--Reference: +-- +-- Revision: Date: Comment +-- 1.0: 03/19/09: Initial version for IODRP_MCB read operations. +-- 1.1: 04/03/09: SLH - Added left shift for certain IOI's +-- 1.2: 02/14/11: Change FSM encoding from one-hot to gray to match Verilog version. +-- End Revision +--******************************************************************************* + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + +entity iodrp_mcb_controller is + --output to IODRP SDI pin + --input from IODRP SDO pin + + -- Register where memcell_address is captured during the READY state + -- Register which stores the write data until it is ready to be shifted out + -- The shift register which shifts out SDO and shifts in SDI. + -- This register is loaded before the address or data phase, but continues to shift for a writeback of read data + -- The signal which causes shift_through_reg to load the new value from data_out_mux, or continue to shift data in from DRP_SDO + -- The signal which indicates where the shift_through_reg should load from. 0 -> data_reg 1 -> memcell_addr_reg + -- The counter for which bit is being shifted during address or data phase + -- This is set after the first address phase has executed + + -- The mux which selects between data_reg and memcell_addr_reg for sending to shift_through_reg + --added so that DRP_SDI output is only active when DRP_CS is active + port ( + memcell_address : in std_logic_vector(7 downto 0); + write_data : in std_logic_vector(7 downto 0); + read_data : out std_logic_vector(7 downto 0); + rd_not_write : in std_logic; + cmd_valid : in std_logic; + rdy_busy_n : out std_logic; + use_broadcast : in std_logic; + drp_ioi_addr : in std_logic_vector(4 downto 0); + sync_rst : in std_logic; + DRP_CLK : in std_logic; + DRP_CS : out std_logic; + DRP_SDI : out std_logic; + DRP_ADD : out std_logic; + DRP_BKST : out std_logic; + DRP_SDO : in std_logic; + MCB_UIREAD : out std_logic + ); +end entity iodrp_mcb_controller; + +architecture trans of iodrp_mcb_controller is + + + type StType is ( + + READY, + DECIDE , + ADDR_PHASE , + ADDR_TO_DATA_GAP , + ADDR_TO_DATA_GAP2, + ADDR_TO_DATA_GAP3, + DATA_PHASE , + + ALMOST_READY , + ALMOST_READY2 , + ALMOST_READY3 + + ); + + + + constant IOI_DQ0 : std_logic_vector(4 downto 0) := "00001"; + constant IOI_DQ1 : std_logic_vector(4 downto 0) := "00000"; + constant IOI_DQ2 : std_logic_vector(4 downto 0) := "00011"; + constant IOI_DQ3 : std_logic_vector(4 downto 0) := "00010"; + constant IOI_DQ4 : std_logic_vector(4 downto 0) := "00101"; + constant IOI_DQ5 : std_logic_vector(4 downto 0) := "00100"; + constant IOI_DQ6 : std_logic_vector(4 downto 0) := "00111"; + constant IOI_DQ7 : std_logic_vector(4 downto 0) := "00110"; + constant IOI_DQ8 : std_logic_vector(4 downto 0) := "01001"; + constant IOI_DQ9 : std_logic_vector(4 downto 0) := "01000"; + constant IOI_DQ10 : std_logic_vector(4 downto 0) := "01011"; + constant IOI_DQ11 : std_logic_vector(4 downto 0) := "01010"; + constant IOI_DQ12 : std_logic_vector(4 downto 0) := "01101"; + constant IOI_DQ13 : std_logic_vector(4 downto 0) := "01100"; + constant IOI_DQ14 : std_logic_vector(4 downto 0) := "01111"; + constant IOI_DQ15 : std_logic_vector(4 downto 0) := "01110"; + constant IOI_UDQS_CLK : std_logic_vector(4 downto 0) := "11101"; + constant IOI_UDQS_PIN : std_logic_vector(4 downto 0) := "11100"; + constant IOI_LDQS_CLK : std_logic_vector(4 downto 0) := "11111"; + constant IOI_LDQS_PIN : std_logic_vector(4 downto 0) := "11110"; + + + signal memcell_addr_reg : std_logic_vector(7 downto 0); + signal data_reg : std_logic_vector(7 downto 0); + signal shift_through_reg : std_logic_vector(8 downto 0); + signal load_shift_n : std_logic; + signal addr_data_sel_n : std_logic; + signal bit_cnt : std_logic_vector(2 downto 0); + signal rd_not_write_reg : std_logic; + signal AddressPhase : std_logic; + signal DRP_CS_pre : std_logic; + signal extra_cs : std_logic; + + + signal state,nextstate : StType; + + attribute fsm_encoding : string; + attribute fsm_encoding of state : signal is "gray"; + attribute fsm_encoding of nextstate : signal is "gray"; + + signal data_out : std_logic_vector(8 downto 0); + signal data_out_mux : std_logic_vector(8 downto 0); + signal DRP_SDI_pre : std_logic; + + --synthesis translate_off + signal state_ascii : std_logic_vector(32 * 8 - 1 downto 0); + -- case(state) + --synthesis translate_on + + -- The changes below are to compensate for an issue with 1.0 silicon. + -- It may still be necessary to add a clock cycle to the ADD and CS signals + + --`define DRP_v1_0_FIX // Uncomment out this line for synthesis + + procedure shift_n_expand( + data_in : in std_logic_vector(7 downto 0); + data_out : out std_logic_vector(8 downto 0)) is + + variable data_out_xilinx2 : std_logic_vector(8 downto 0); + begin + if ((data_in(0)) = '1') then + data_out_xilinx2(1 downto 0) := "11"; + else + + data_out_xilinx2(1 downto 0) := "00"; + end if; + if (data_in(1 downto 0) = "10") then + data_out_xilinx2(2 downto 1) := "11"; + else + + data_out_xilinx2(2 downto 1) := (data_in(1) & data_out_xilinx2(1)); + end if; + if (data_in(2 downto 1) = "10") then + data_out_xilinx2(3 downto 2) := "11"; + else + + data_out_xilinx2(3 downto 2) := (data_in(2) & data_out_xilinx2(2)); + end if; + if (data_in(3 downto 2) = "10") then + data_out_xilinx2(4 downto 3) := "11"; + else + + data_out_xilinx2(4 downto 3) := (data_in(3) & data_out_xilinx2(3)); + end if; + if (data_in(4 downto 3) = "10") then + data_out_xilinx2(5 downto 4) := "11"; + else + + data_out_xilinx2(5 downto 4) := (data_in(4) & data_out_xilinx2(4)); + end if; + if (data_in(5 downto 4) = "10") then + data_out_xilinx2(6 downto 5) := "11"; + else + + data_out_xilinx2(6 downto 5) := (data_in(5) & data_out_xilinx2(5)); + end if; + if (data_in(6 downto 5) = "10") then + data_out_xilinx2(7 downto 6) := "11"; + else + + data_out_xilinx2(7 downto 6) := (data_in(6) & data_out_xilinx2(6)); + end if; + if (data_in(7 downto 6) = "10") then + data_out_xilinx2(8 downto 7) := "11"; + else + data_out_xilinx2(8 downto 7) := (data_in(7) & data_out_xilinx2(7)); + end if; + end shift_n_expand; + + + -- Declare intermediate signals for referenced outputs + signal DRP_CS_xilinx1 : std_logic; + signal DRP_ADD_xilinx0 : std_logic; + + signal ALMOST_READY2_ST : std_logic; + signal ADDR_PHASE_ST : std_logic; + signal BIT_CNT7 : std_logic; + signal ADDR_PHASE_ST1 : std_logic; + signal DATA_PHASE_ST : std_logic; + +begin + -- Drive referenced outputs + DRP_CS <= DRP_CS_xilinx1; + DRP_ADD <= DRP_ADD_xilinx0; + + +-- process (state) +-- begin +-- case state is +-- when READY => +-- state_ascii <= "READY"; +-- when DECIDE => +-- state_ascii <= "DECIDE"; +-- when ADDR_PHASE => +-- state_ascii <= "ADDR_PHASE"; +-- when ADDR_TO_DATA_GAP => +-- state_ascii <= "ADDR_TO_DATA_GAP"; +-- when ADDR_TO_DATA_GAP2 => +-- state_ascii <= "ADDR_TO_DATA_GAP2"; +-- when ADDR_TO_DATA_GAP3 => +-- state_ascii <= "ADDR_TO_DATA_GAP3"; +-- when DATA_PHASE => +-- state_ascii <= "DATA_PHASE"; +-- when ALMOST_READY => +-- state_ascii <= "ALMOST_READY"; +-- when ALMOST_READY2 => +-- state_ascii <= "ALMOST_READY2"; +-- when ALMOST_READY3 => +-- state_ascii <= "ALMOST_READY3"; +-- when others => +-- null; +-- end case; +-- end process; + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (state = READY) then + memcell_addr_reg <= memcell_address; + data_reg <= write_data; + rd_not_write_reg <= rd_not_write; + end if; + end if; + end process; + + rdy_busy_n <= '1' when state = READY else '0'; + + process (drp_ioi_addr, data_out) + begin + + case drp_ioi_addr is + when IOI_DQ0 => + data_out_mux <= data_out; + when IOI_DQ1 => + data_out_mux <= data_out; + when IOI_DQ2 => + data_out_mux <= data_out; + when IOI_DQ3 => + data_out_mux <= data_out; + when IOI_DQ4 => + data_out_mux <= data_out; + when IOI_DQ5 => + data_out_mux <= data_out; + when IOI_DQ6 => + data_out_mux <= data_out; + when IOI_DQ7 => + data_out_mux <= data_out; + when IOI_DQ8 => + data_out_mux <= data_out; + when IOI_DQ9 => + data_out_mux <= data_out; + when IOI_DQ10 => + data_out_mux <= data_out; + when IOI_DQ11 => + data_out_mux <= data_out; + when IOI_DQ12 => + data_out_mux <= data_out; + when IOI_DQ13 => + data_out_mux <= data_out; + when IOI_DQ14 => + data_out_mux <= data_out; + when IOI_DQ15 => + data_out_mux <= data_out; + when IOI_UDQS_CLK => + data_out_mux <= data_out; + when IOI_UDQS_PIN => + data_out_mux <= data_out; + when IOI_LDQS_CLK => + data_out_mux <= data_out; + when IOI_LDQS_PIN => + data_out_mux <= data_out; + when others => + data_out_mux <= data_out; + end case; + end process; + + + data_out <= ('0' & memcell_addr_reg) when (addr_data_sel_n = '1') else + ('0' & data_reg); + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (sync_rst = '1') then + shift_through_reg <= "000000000"; + else + if (load_shift_n = '1') then --Assume the shifter is either loading or shifting, bit 0 is shifted out first + shift_through_reg <= data_out_mux; + else + shift_through_reg <= ('0' & DRP_SDO & shift_through_reg(7 downto 1)); + end if; + end if; + end if; + end process; + + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (((state = ADDR_PHASE) or (state = DATA_PHASE)) and (sync_rst = '0')) then + bit_cnt <= bit_cnt + "001"; + else + bit_cnt <= "000"; + end if; + end if; + end process; + + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (sync_rst = '1') then + read_data <= "00000000"; + else + if (state = ALMOST_READY3) then + read_data <= shift_through_reg(7 downto 0); + end if; + end if; + end if; + end process; + + ALMOST_READY2_ST <= '1' when state = ALMOST_READY2 else '0'; + ADDR_PHASE_ST <= '1' when state = ADDR_PHASE else '0'; + BIT_CNT7 <= '1' when bit_cnt = "111" else '0'; + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (sync_rst = '1') then + AddressPhase <= '0'; + else + if (AddressPhase = '1') then + -- Keep it set until we finish the cycle + AddressPhase <= AddressPhase and (not ALMOST_READY2_ST); + else + -- set the address phase when ever we finish the address phase + AddressPhase <= (ADDR_PHASE_ST and BIT_CNT7); + end if; + end if; + end if; + end process; + +ADDR_PHASE_ST1 <= '1' when nextstate = ADDR_PHASE else '0'; +DATA_PHASE_ST <= '1' when nextstate = DATA_PHASE else '0'; + + + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + DRP_ADD_xilinx0 <= ADDR_PHASE_ST1; + -- DRP_CS <= (drp_ioi_addr != IOI_DQ0) ? (nextstate == ADDR_PHASE) | (nextstate == DATA_PHASE) : (bit_cnt != 3'b111) && (nextstate == ADDR_PHASE) | (nextstate == DATA_PHASE); + DRP_CS_xilinx1 <= ADDR_PHASE_ST1 or DATA_PHASE_ST; + MCB_UIREAD <= DATA_PHASE_ST and rd_not_write_reg; + if (state = READY) then + DRP_BKST <= use_broadcast; + end if; + end if; + end process; + + + DRP_SDI_pre <= shift_through_reg(0) when (DRP_CS_xilinx1 = '1') else --if DRP_CS is inactive, just drive 0 out - this is a possible place to pipeline for increased performance + '0'; + DRP_SDI <= DRP_SDO when ((rd_not_write_reg and DRP_CS_xilinx1 and not(DRP_ADD_xilinx0)) = '1') else --If reading, then feed SDI back out SDO - this is a possible place to pipeline for increased performance + DRP_SDI_pre; + + process (state, cmd_valid, bit_cnt, rd_not_write_reg, AddressPhase,BIT_CNT7) + begin + addr_data_sel_n <= '0'; + load_shift_n <= '0'; + case state is + when READY => + load_shift_n <= '0'; + if (cmd_valid = '1') then + nextstate <= DECIDE; + else + nextstate <= READY; + end if; + when DECIDE => + load_shift_n <= '1'; + addr_data_sel_n <= '1'; + nextstate <= ADDR_PHASE; + -- After the second pass go to end of statemachine + -- execute a second address phase for the alternative access method. + when ADDR_PHASE => + load_shift_n <= '0'; + if (BIT_CNT7 = '1') then + if (('1' and rd_not_write_reg) = '1') then + if (AddressPhase = '1') then + nextstate <= ALMOST_READY; + else + nextstate <= DECIDE; + end if; + else + nextstate <= ADDR_TO_DATA_GAP; + end if; + else + nextstate <= ADDR_PHASE; + end if; + when ADDR_TO_DATA_GAP => + load_shift_n <= '1'; + nextstate <= ADDR_TO_DATA_GAP2; + when ADDR_TO_DATA_GAP2 => + load_shift_n <= '1'; + nextstate <= ADDR_TO_DATA_GAP3; + when ADDR_TO_DATA_GAP3 => + load_shift_n <= '1'; + nextstate <= DATA_PHASE; + when DATA_PHASE => + load_shift_n <= '0'; + if (BIT_CNT7 = '1') then + nextstate <= ALMOST_READY; + else + nextstate <= DATA_PHASE; + end if; + when ALMOST_READY => + load_shift_n <= '0'; + nextstate <= ALMOST_READY2; + when ALMOST_READY2 => + load_shift_n <= '0'; + nextstate <= ALMOST_READY3; + when ALMOST_READY3 => + load_shift_n <= '0'; + nextstate <= READY; + when others => + load_shift_n <= '0'; + nextstate <= READY; + end case; + end process; + + + process (DRP_CLK) + begin + if (DRP_CLK'event and DRP_CLK = '1') then + if (sync_rst = '1') then + state <= READY; + else + state <= nextstate; + end if; + end if; + end process; + + +end architecture trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_raw_wrapper.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_raw_wrapper.vhd new file mode 100755 index 0000000..51dc7cc --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_raw_wrapper.vhd @@ -0,0 +1,7117 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: mcb_raw_wrapper.v +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:17:04 $ +-- \ \ / \ Date Created: Thu June 24 2008 +-- \___\/\___\ +-- +--Device: Spartan6 +--Design Name: DDR/DDR2/DDR3/LPDDR +--Purpose: +--Reference: +-- This module is the intialization control logic of the memory interface. +-- All commands are issued from here acoording to the burst, CAS Latency and +-- the user commands. +-- +-- Revised History: +-- Rev 1.1 - added port_enable assignment for all configurations and rearrange +-- assignment siganls according to port number +-- - added timescale directive -SN 7-28-08 +-- - added C_ARB_NUM_TIME_SLOTS and removed the slot 12 through +-- 15 -SN 7-28-08 +-- - changed C_MEM_DDR2_WRT_RECOVERY = (C_MEM_TWR /C_MEMCLK_PERIOD) -SN 7-28-08 +-- - removed ghighb, gpwrdnb, gsr, gwe in port declaration. +-- For now tb need to force the signals inside the MCB and Wrapper +-- until a glbl.v is ready. Not sure how to do this in NCVerilog +-- flow. -SN 7-28-08 +-- +-- Rev 1.2 -- removed p*_cmd_error signals -SN 8-05-08 +-- Rev 1.3 -- Added gate logic for data port rd_en and wr_en in Config 3,4,5 - SN 8-8-08 +-- Rev 1.4 -- update changes that required by MCB core. - SN 9-11-09 +-- Rev 1.5 -- update. CMD delays has been removed in Sept 26 database. -- SN 9-28-08 +-- delay_cas_90,delay_ras_90,delay_cke_90,delay_odt_90,delay_rst_90 +-- delay_we_90 ,delay_address,delay_ba_90 = +-- --removed :assign #50 delay_dqnum = dqnum; +-- --removed :assign #50 delay_dqpum = dqpum; +-- --removed :assign #50 delay_dqnlm = dqnlm; +-- --removed :assign #50 delay_dqplm = dqplm; +-- --removed : delay_dqsIO_w_en_90_n +-- --removed : delay_dqsIO_w_en_90_p +-- --removed : delay_dqsIO_w_en_0 +-- -- corrected spelling error: C_MEM_RTRAS +-- Rev 1.6 -- update IODRP2 and OSERDES connection and was updated by Chip. 1-12-09 +-- -- rename the memc_wrapper.v to mcb_raw_wrapper.v +-- Rev 1.7 -- -- .READEN is removed in IODRP2_MCB 1-28-09 +-- -- connection has been updated +-- Rev 1.8 -- update memory parameter equations. 1-30_2009 +-- -- added portion of Soft IP +-- -- CAL_CLK_DIV is not used but MCB still has it +-- Rev 1.9 -- added Error checking for Invalid command to unidirectional port +-- Rev 1.10 -- changed the backend connection so that Simulation will work while +-- sw tools try to fix the model issues. 2-3-2009 +-- sysclk_2x_90 name is changed to sysclk_2x_180 . It created confusions. +-- It is acutally 180 degree difference. +-- Rev 1.11 -- Added MCB_Soft_Calibration_top. +-- Rev 1.12 -- fixed ui_clk connection to MCB when soft_calib_ip is on. 5-14-2009 +-- Rev 1.13 -- Added PULLUP/PULLDN for DQS/DQSN, UDQS/UDQSN lines. +-- Rev 1.14 -- Added minium condition for tRTP valud/ +-- REv 1.15 -- Bring the SKIP_IN_TERM_CAL and SKIP_DYNAMIC_CAL from calib_ip to top. 6-16-2009 +-- Rev 1.16 -- Fixed the WTR for DDR. 6-23-2009 +-- Rev 1.17 -- Fixed width mismatch for px_cmd_ra,px_cmd_ca,px_cmd_ba 7-02-2009 +-- Rev 1.18 -- Added lumpdelay parameters for 1.0 silicon support to bypass Calibration 7-10-2010 +-- Rev 1.19 -- Added soft fix to support refresh command. 7-15-2009. +-- Rev 1.20 -- Turned on the CALIB_SOFT_IP and C_MC_CALIBRATION_MODE is used to enable/disable +-- Dynamic DQS calibration in Soft Calibration module. +-- Rev 1.21 -- Added extra generate mcbx_dram_odt pin condition. It will not be generated if +-- RTT value is set to "disabled" +-- -- Corrected the UIUDQSDEC connection between soft_calib and MCB. +-- -- PLL_LOCK pin to MCB tie high. Soft Calib module asserts MCB_RST when pll_lock is deasserted. 1-19-2010 +-- Rev 1.22 -- Added DDR2 Initialization fix to meet 400 ns wait as outlined in step d) of JEDEC DDR2 spec . +-- Rev 1.23 -- Fixed CR 558661. In Config "B64B64" mode, mig_p5_wr_data <= p1_wr_data(63 downto 32). +-- Rev 1.24 -- Added DDR2 Initialization fix when C_CALIB_SOFT_IP set to "FALSE" +-- Rev 1.25 -- Fixed reset problem when MCB exits from SUSPEND SELFREFRESH mode. 10-20-2010 +-- Rev 1.26 -- Synchronize sys_rst before connecting to mcb_soft_calibration module to fix +-- CDC static timing issue. 2-14-2011 + + +--************************************************************************************************************************* +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +library unisim; +use unisim.vcomponents.all; + +entity mcb_raw_wrapper is +generic( + C_MEMCLK_PERIOD : integer := 2500; + C_PORT_ENABLE : std_logic_vector(5 downto 0) := (others => '1'); + + C_MEM_ADDR_ORDER : string := "BANK_ROW_COLUMN"; + + C_ARB_NUM_TIME_SLOTS : integer := 12; + C_ARB_TIME_SLOT_0 : bit_vector(17 downto 0):= "000" & "001" & "010" & "011" & "100" & "101"; + C_ARB_TIME_SLOT_1 : bit_vector(17 downto 0):= "001" & "010" & "011" & "100" & "101" & "000"; + C_ARB_TIME_SLOT_2 : bit_vector(17 downto 0):= "010" & "011" & "100" & "101" & "000" & "011"; + C_ARB_TIME_SLOT_3 : bit_vector(17 downto 0):= "011" & "100" & "101" & "000" & "001" & "010"; + C_ARB_TIME_SLOT_4 : bit_vector(17 downto 0):= "100" & "101" & "000" & "001" & "010" & "011"; + C_ARB_TIME_SLOT_5 : bit_vector(17 downto 0):= "101" & "000" & "001" & "010" & "011" & "100"; + C_ARB_TIME_SLOT_6 : bit_vector(17 downto 0):= "000" & "001" & "010" & "011" & "100" & "101"; + C_ARB_TIME_SLOT_7 : bit_vector(17 downto 0):= "001" & "010" & "011" & "100" & "101" & "000"; + C_ARB_TIME_SLOT_8 : bit_vector(17 downto 0):= "010" & "011" & "100" & "101" & "000" & "011"; + C_ARB_TIME_SLOT_9 : bit_vector(17 downto 0):= "011" & "100" & "101" & "000" & "001" & "010"; + C_ARB_TIME_SLOT_10 : bit_vector(17 downto 0):= "100" & "101" & "000" & "001" & "010" & "011"; + C_ARB_TIME_SLOT_11 : bit_vector(17 downto 0):= "101" & "000" & "001" & "010" & "011" & "100"; + C_PORT_CONFIG : string := "B32_B32_W32_W32_W32_W32"; + + + C_MEM_TRAS : integer := 45000; + C_MEM_TRCD : integer := 12500; + C_MEM_TREFI : integer := 7800; + C_MEM_TRFC : integer := 127500; + C_MEM_TRP : integer := 12500; + C_MEM_TWR : integer := 15000; + C_MEM_TRTP : integer := 7500; + C_MEM_TWTR : integer := 7500; + + C_NUM_DQ_PINS : integer := 8; + C_MEM_TYPE : string := "DDR3"; + C_MEM_DENSITY : string := "512M"; + C_MEM_BURST_LEN : integer := 8; + + C_MEM_CAS_LATENCY : integer := 4; + C_MEM_ADDR_WIDTH : integer := 13; + C_MEM_BANKADDR_WIDTH : integer := 3; + C_MEM_NUM_COL_BITS : integer := 11; + + C_MEM_DDR3_CAS_LATENCY : integer := 7; + C_MEM_MOBILE_PA_SR : string := "FULL"; + C_MEM_DDR1_2_ODS : string := "FULL"; + C_MEM_DDR3_ODS : string := "DIV6"; + C_MEM_DDR2_RTT : string := "50OHMS"; + C_MEM_DDR3_RTT : string := "DIV2"; + C_MEM_MDDR_ODS : string := "FULL"; + + C_MEM_DDR2_DIFF_DQS_EN : string := "YES"; + C_MEM_DDR2_3_PA_SR : string := "OFF"; + C_MEM_DDR3_CAS_WR_LATENCY : integer := 5; + + C_MEM_DDR3_AUTO_SR : string := "ENABLED"; + C_MEM_DDR2_3_HIGH_TEMP_SR : string := "NORMAL"; + C_MEM_DDR3_DYN_WRT_ODT : string := "OFF"; + C_MEM_TZQINIT_MAXCNT : std_logic_vector(9 downto 0) := "1000000000"; -- DDR3 Minimum delay between resets + + C_MC_CALIB_BYPASS : string := "NO"; + C_MC_CALIBRATION_RA : bit_vector(15 downto 0) := X"0000"; + C_MC_CALIBRATION_BA : bit_vector(2 downto 0) := "000"; + + C_CALIB_SOFT_IP : string := "TRUE"; + C_SKIP_IN_TERM_CAL : integer := 0; --provides option to skip the input termination calibration + C_SKIP_DYNAMIC_CAL : integer := 0; --provides option to skip the dynamic delay calibration + C_SKIP_DYN_IN_TERM : integer := 1; -- provides option to skip the input termination calibration + C_SIMULATION : string := "FALSE"; -- Tells us whether the design is being simulated or implemented + + +--- ADDED for 1.0 silicon support to bypass Calibration ////// +-- 07-10-09 chipl +--//////////////////////////////////////////////////////////// + LDQSP_TAP_DELAY_VAL : integer := 0; + UDQSP_TAP_DELAY_VAL : integer := 0; + LDQSN_TAP_DELAY_VAL : integer := 0; + UDQSN_TAP_DELAY_VAL : integer := 0; + DQ0_TAP_DELAY_VAL : integer := 0; + DQ1_TAP_DELAY_VAL : integer := 0; + DQ2_TAP_DELAY_VAL : integer := 0; + DQ3_TAP_DELAY_VAL : integer := 0; + DQ4_TAP_DELAY_VAL : integer := 0; + DQ5_TAP_DELAY_VAL : integer := 0; + DQ6_TAP_DELAY_VAL : integer := 0; + DQ7_TAP_DELAY_VAL : integer := 0; + DQ8_TAP_DELAY_VAL : integer := 0; + DQ9_TAP_DELAY_VAL : integer := 0; + DQ10_TAP_DELAY_VAL : integer := 0; + DQ11_TAP_DELAY_VAL : integer := 0; + DQ12_TAP_DELAY_VAL : integer := 0; + DQ13_TAP_DELAY_VAL : integer := 0; + DQ14_TAP_DELAY_VAL : integer := 0; + DQ15_TAP_DELAY_VAL : integer := 0; + + C_MC_CALIBRATION_CA : bit_vector(11 downto 0) := X"000"; + C_MC_CALIBRATION_CLK_DIV : integer := 1; + C_MC_CALIBRATION_MODE : string := "CALIBRATION"; + C_MC_CALIBRATION_DELAY : string := "HALF"; + + C_P0_MASK_SIZE : integer := 4; + C_P0_DATA_PORT_SIZE : integer := 32; + C_P1_MASK_SIZE : integer := 4; + C_P1_DATA_PORT_SIZE : integer := 32 + ); + PORT ( + + sysclk_2x : in std_logic; + sysclk_2x_180 : in std_logic; + pll_ce_0 : in std_logic; + pll_ce_90 : in std_logic; + pll_lock : in std_logic; + sys_rst : in std_logic; + + p0_arb_en : in std_logic; + p0_cmd_clk : in std_logic; + p0_cmd_en : in std_logic; + p0_cmd_instr : in std_logic_vector(2 downto 0); + p0_cmd_bl : in std_logic_vector(5 downto 0); + p0_cmd_byte_addr : in std_logic_vector(29 downto 0); + p0_cmd_empty : out std_logic; + p0_cmd_full : out std_logic; + + p0_wr_clk : in std_logic; + p0_wr_en : in std_logic; + p0_wr_mask : in std_logic_vector(C_P0_MASK_SIZE - 1 downto 0); + p0_wr_data : in std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0); + p0_wr_full : out std_logic; + p0_wr_empty : out std_logic; + p0_wr_count : out std_logic_vector(6 downto 0); + p0_wr_underrun : out std_logic; + p0_wr_error : out std_logic; + + p0_rd_clk : in std_logic; + p0_rd_en : in std_logic; + p0_rd_data : out std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0); + p0_rd_full : out std_logic; + p0_rd_empty : out std_logic; + p0_rd_count : out std_logic_vector(6 downto 0); + p0_rd_overflow : out std_logic; + p0_rd_error : out std_logic; + + p1_arb_en : in std_logic; + p1_cmd_clk : in std_logic; + p1_cmd_en : in std_logic; + p1_cmd_instr : in std_logic_vector(2 downto 0); + p1_cmd_bl : in std_logic_vector(5 downto 0); + p1_cmd_byte_addr : in std_logic_vector(29 downto 0); + p1_cmd_empty : out std_logic; + p1_cmd_full : out std_logic; + p1_wr_clk : in std_logic; + p1_wr_en : in std_logic; + p1_wr_mask : in std_logic_vector(C_P1_MASK_SIZE - 1 downto 0); + p1_wr_data : in std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0); + p1_wr_full : out std_logic; + p1_wr_empty : out std_logic; + p1_wr_count : out std_logic_vector(6 downto 0); + p1_wr_underrun : out std_logic; + p1_wr_error : out std_logic; + p1_rd_clk : in std_logic; + p1_rd_en : in std_logic; + p1_rd_data : out std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0); + p1_rd_full : out std_logic; + p1_rd_empty : out std_logic; + p1_rd_count : out std_logic_vector(6 downto 0); + p1_rd_overflow : out std_logic; + p1_rd_error : out std_logic; + + p2_arb_en : in std_logic; + p2_cmd_clk : in std_logic; + p2_cmd_en : in std_logic; + p2_cmd_instr : in std_logic_vector(2 downto 0); + p2_cmd_bl : in std_logic_vector(5 downto 0); + p2_cmd_byte_addr : in std_logic_vector(29 downto 0); + p2_cmd_empty : out std_logic; + p2_cmd_full : out std_logic; + p2_wr_clk : in std_logic; + p2_wr_en : in std_logic; + p2_wr_mask : in std_logic_vector(3 downto 0); + p2_wr_data : in std_logic_vector(31 downto 0); + p2_wr_full : out std_logic; + p2_wr_empty : out std_logic; + p2_wr_count : out std_logic_vector(6 downto 0); + p2_wr_underrun : out std_logic; + p2_wr_error : out std_logic; + p2_rd_clk : in std_logic; + p2_rd_en : in std_logic; + p2_rd_data : out std_logic_vector(31 downto 0); + p2_rd_full : out std_logic; + p2_rd_empty : out std_logic; + p2_rd_count : out std_logic_vector(6 downto 0); + p2_rd_overflow : out std_logic; + p2_rd_error : out std_logic; + + p3_arb_en : in std_logic; + p3_cmd_clk : in std_logic; + p3_cmd_en : in std_logic; + p3_cmd_instr : in std_logic_vector(2 downto 0); + p3_cmd_bl : in std_logic_vector(5 downto 0); + p3_cmd_byte_addr : in std_logic_vector(29 downto 0); + p3_cmd_empty : out std_logic; + p3_cmd_full : out std_logic; + p3_wr_clk : in std_logic; + p3_wr_en : in std_logic; + p3_wr_mask : in std_logic_vector(3 downto 0); + p3_wr_data : in std_logic_vector(31 downto 0); + p3_wr_full : out std_logic; + p3_wr_empty : out std_logic; + p3_wr_count : out std_logic_vector(6 downto 0); + p3_wr_underrun : out std_logic; + p3_wr_error : out std_logic; + p3_rd_clk : in std_logic; + p3_rd_en : in std_logic; + p3_rd_data : out std_logic_vector(31 downto 0); + p3_rd_full : out std_logic; + p3_rd_empty : out std_logic; + p3_rd_count : out std_logic_vector(6 downto 0); + p3_rd_overflow : out std_logic; + p3_rd_error : out std_logic; + + p4_arb_en : in std_logic; + p4_cmd_clk : in std_logic; + p4_cmd_en : in std_logic; + p4_cmd_instr : in std_logic_vector(2 downto 0); + p4_cmd_bl : in std_logic_vector(5 downto 0); + p4_cmd_byte_addr : in std_logic_vector(29 downto 0); + p4_cmd_empty : out std_logic; + p4_cmd_full : out std_logic; + p4_wr_clk : in std_logic; + p4_wr_en : in std_logic; + p4_wr_mask : in std_logic_vector(3 downto 0); + p4_wr_data : in std_logic_vector(31 downto 0); + p4_wr_full : out std_logic; + p4_wr_empty : out std_logic; + p4_wr_count : out std_logic_vector(6 downto 0); + p4_wr_underrun : out std_logic; + p4_wr_error : out std_logic; + p4_rd_clk : in std_logic; + p4_rd_en : in std_logic; + p4_rd_data : out std_logic_vector(31 downto 0); + p4_rd_full : out std_logic; + p4_rd_empty : out std_logic; + p4_rd_count : out std_logic_vector(6 downto 0); + p4_rd_overflow : out std_logic; + p4_rd_error : out std_logic; + + p5_arb_en : in std_logic; + p5_cmd_clk : in std_logic; + p5_cmd_en : in std_logic; + p5_cmd_instr : in std_logic_vector(2 downto 0); + p5_cmd_bl : in std_logic_vector(5 downto 0); + p5_cmd_byte_addr : in std_logic_vector(29 downto 0); + p5_cmd_empty : out std_logic; + p5_cmd_full : out std_logic; + p5_wr_clk : in std_logic; + p5_wr_en : in std_logic; + p5_wr_mask : in std_logic_vector(3 downto 0); + p5_wr_data : in std_logic_vector(31 downto 0); + p5_wr_full : out std_logic; + p5_wr_empty : out std_logic; + p5_wr_count : out std_logic_vector(6 downto 0); + p5_wr_underrun : out std_logic; + p5_wr_error : out std_logic; + p5_rd_clk : in std_logic; + p5_rd_en : in std_logic; + p5_rd_data : out std_logic_vector(31 downto 0); + p5_rd_full : out std_logic; + p5_rd_empty : out std_logic; + p5_rd_count : out std_logic_vector(6 downto 0); + p5_rd_overflow : out std_logic; + p5_rd_error : out std_logic; + + mcbx_dram_addr : out std_logic_vector(C_MEM_ADDR_WIDTH - 1 downto 0); + mcbx_dram_ba : out std_logic_vector(C_MEM_BANKADDR_WIDTH - 1 downto 0); + mcbx_dram_ras_n : out std_logic; + mcbx_dram_cas_n : out std_logic; + mcbx_dram_we_n : out std_logic; + mcbx_dram_cke : out std_logic; + mcbx_dram_clk : out std_logic; + mcbx_dram_clk_n : out std_logic; + mcbx_dram_dq : INOUT std_logic_vector(C_NUM_DQ_PINS-1 downto 0); + mcbx_dram_dqs : INOUT std_logic; + mcbx_dram_dqs_n : INOUT std_logic; + mcbx_dram_udqs : INOUT std_logic; + mcbx_dram_udqs_n : INOUT std_logic; + mcbx_dram_udm : out std_logic; + mcbx_dram_ldm : out std_logic; + mcbx_dram_odt : out std_logic; + mcbx_dram_ddr3_rst : out std_logic; + + calib_recal : in std_logic; + rzq : INOUT std_logic; + zio : INOUT std_logic; + ui_read : in std_logic; + ui_add : in std_logic; + ui_cs : in std_logic; + ui_clk : in std_logic; + ui_sdi : in std_logic; + ui_addr : in std_logic_vector(4 downto 0); + ui_broadcast : in std_logic; + ui_drp_update : in std_logic; + ui_done_cal : in std_logic; + ui_cmd : in std_logic; + ui_cmd_in : in std_logic; + ui_cmd_en : in std_logic; + ui_dqcount : in std_logic_vector(3 downto 0); + ui_dq_lower_dec : in std_logic; + ui_dq_lower_inc : in std_logic; + ui_dq_upper_dec : in std_logic; + ui_dq_upper_inc : in std_logic; + ui_udqs_inc : in std_logic; + ui_udqs_dec : in std_logic; + ui_ldqs_inc : in std_logic; + ui_ldqs_dec : in std_logic; + uo_data : out std_logic_vector(7 downto 0); + uo_data_valid : out std_logic; + uo_done_cal : out std_logic; + uo_cmd_ready_in : out std_logic; + uo_refrsh_flag : out std_logic; + uo_cal_start : out std_logic; + uo_sdo : out std_logic; + status : out std_logic_vector(31 downto 0); + selfrefresh_enter : in std_logic; + selfrefresh_mode : out std_logic + ); +end mcb_raw_wrapper; + + architecture aarch of mcb_raw_wrapper is + +component mcb_soft_calibration_top is + generic ( + C_MEM_TZQINIT_MAXCNT : std_logic_vector(9 downto 0) := "1000000000"; -- DDR3 Minimum delay between resets + C_MC_CALIBRATION_MODE : string := "CALIBRATION"; -- if set to CALIBRATION will reset DQS IDELAY to DQS_NUMERATOR/DQS_DENOMINATOR local_param values, + -- and does dynamic recal, + -- if set to NOCALIBRATION then defaults to hard cal blocks setting of C_MC_CALBRATION_DELAY *and* + -- no dynamic recal will be done + SKIP_IN_TERM_CAL : integer := 0; -- provides option to skip the input termination calibration + SKIP_DYNAMIC_CAL : integer := 0; -- provides option to skip the dynamic delay calibration + SKIP_DYN_IN_TERM : integer := 0; -- provides option to skip the dynamic delay calibration + C_SIMULATION : string := "FALSE"; -- Tells us whether the design is being simulated or implemented + C_MEM_TYPE : string := "DDR3" -- provides the memory device used for the design + + ); + port ( + UI_CLK : in std_logic; -- Input - global clock to be used for input_term_tuner and IODRP clock + RST : in std_logic; -- Input - reset for input_term_tuner - synchronous for input_term_tuner state machine, asynch for + -- IODRP (sub)controller + IOCLK : in std_logic; -- Input - IOCLK input to the IODRP's + DONE_SOFTANDHARD_CAL : out std_logic; -- active high flag signals soft calibration of input delays is complete and MCB_UODONECAL is high + -- (MCB hard calib complete) + PLL_LOCK : in std_logic; -- Lock signal from PLL + SELFREFRESH_REQ : in std_logic; + SELFREFRESH_MCB_MODE : in std_logic; + SELFREFRESH_MCB_REQ : out std_logic; + SELFREFRESH_MODE : out std_logic; + MCB_UIADD : out std_logic; -- to MCB's UIADD port + MCB_UISDI : out std_logic; -- to MCB's UISDI port + MCB_UOSDO : in std_logic; + MCB_UODONECAL : in std_logic; + MCB_UOREFRSHFLAG : in std_logic; + MCB_UICS : out std_logic; + MCB_UIDRPUPDATE : out std_logic; + MCB_UIBROADCAST : out std_logic; + MCB_UIADDR : out std_logic_vector(4 downto 0); + MCB_UICMDEN : out std_logic; + MCB_UIDONECAL : out std_logic; + MCB_UIDQLOWERDEC : out std_logic; + MCB_UIDQLOWERINC : out std_logic; + MCB_UIDQUPPERDEC : out std_logic; + MCB_UIDQUPPERINC : out std_logic; + MCB_UILDQSDEC : out std_logic; + MCB_UILDQSINC : out std_logic; + MCB_UIREAD : out std_logic; + MCB_UIUDQSDEC : out std_logic; + MCB_UIUDQSINC : out std_logic; + MCB_RECAL : out std_logic; + MCB_SYSRST : out std_logic; + MCB_UICMD : out std_logic; + MCB_UICMDIN : out std_logic; + MCB_UIDQCOUNT : out std_logic_vector(3 downto 0); + MCB_UODATA : in std_logic_vector(7 downto 0); + MCB_UODATAVALID : in std_logic; + MCB_UOCMDREADY : in std_logic; + MCB_UO_CAL_START : in std_logic; + RZQ_PIN : inout std_logic; + ZIO_PIN : inout std_logic; + CKE_Train : out std_logic + ); +end component; + +constant C_OSERDES2_DATA_RATE_OQ : STRING := "SDR"; +constant C_OSERDES2_DATA_RATE_OT : STRING := "SDR"; +constant C_OSERDES2_SERDES_MODE_MASTER : STRING := "MASTER"; +constant C_OSERDES2_SERDES_MODE_SLAVE : STRING := "SLAVE"; +constant C_OSERDES2_OUTPUT_MODE_SE : STRING := "SINGLE_ENDED"; +constant C_OSERDES2_OUTPUT_MODE_DIFF : STRING := "DIFFERENTIAL"; + +constant C_BUFPLL_0_LOCK_SRC : STRING := "LOCK_TO_0"; + +constant C_DQ_IODRP2_DATA_RATE : STRING := "SDR"; +constant C_DQ_IODRP2_SERDES_MODE_MASTER : STRING := "MASTER"; +constant C_DQ_IODRP2_SERDES_MODE_SLAVE : STRING := "SLAVE"; + +constant C_DQS_IODRP2_DATA_RATE : STRING := "SDR"; +constant C_DQS_IODRP2_SERDES_MODE_MASTER : STRING := "MASTER"; +constant C_DQS_IODRP2_SERDES_MODE_SLAVE : STRING := "SLAVE"; + +-- MIG always set the below ADD_LATENCY to zero +constant C_MEM_DDR3_ADD_LATENCY : STRING := "OFF"; +constant C_MEM_DDR2_ADD_LATENCY : INTEGER := 0; +constant C_MEM_MOBILE_TC_SR : INTEGER := 0; + +-- convert the memory timing to memory clock units. I +constant MEM_RAS_VAL : INTEGER := ((C_MEM_TRAS + C_MEMCLK_PERIOD - 1) / C_MEMCLK_PERIOD); +constant MEM_RCD_VAL : INTEGER := ((C_MEM_TRCD + C_MEMCLK_PERIOD - 1) / C_MEMCLK_PERIOD); +constant MEM_REFI_VAL : INTEGER := ((C_MEM_TREFI + C_MEMCLK_PERIOD - 1) / C_MEMCLK_PERIOD) - 25; +constant MEM_RFC_VAL : INTEGER := ((C_MEM_TRFC + C_MEMCLK_PERIOD - 1) / C_MEMCLK_PERIOD); +constant MEM_RP_VAL : INTEGER := ((C_MEM_TRP + C_MEMCLK_PERIOD - 1) / C_MEMCLK_PERIOD); +constant MEM_WR_VAL : INTEGER := ((C_MEM_TWR + C_MEMCLK_PERIOD - 1) / C_MEMCLK_PERIOD); + + function cdiv return integer is + begin + if ( (C_MEM_TRTP mod C_MEMCLK_PERIOD)>0) then + return (C_MEM_TRTP/C_MEMCLK_PERIOD)+1; + else + return (C_MEM_TRTP/C_MEMCLK_PERIOD); + end if; + end function cdiv; + +constant MEM_RTP_VAL1 : INTEGER := cdiv; + + +function MEM_RTP_CYC1 return integer is + begin + if (MEM_RTP_VAL1 < 4 and C_MEM_TYPE = "DDR3") then + return 4; + else if(MEM_RTP_VAL1 < 2) then + return 2; + else + return MEM_RTP_VAL1; + end if; + end if; + end function MEM_RTP_CYC1; + +constant MEM_RTP_VAL : INTEGER := MEM_RTP_CYC1; + +function MEM_WTR_CYC return integer is + begin + if (C_MEM_TYPE = "DDR") then + return 2; + elsif (C_MEM_TYPE = "DDR3") then + return 4; + elsif (C_MEM_TYPE = "MDDR" OR C_MEM_TYPE = "LPDDR") then + return C_MEM_TWTR; + elsif (C_MEM_TYPE = "DDR2" AND (((C_MEM_TWTR + C_MEMCLK_PERIOD -1) /C_MEMCLK_PERIOD) > 2)) then + return ((C_MEM_TWTR + C_MEMCLK_PERIOD -1) /C_MEMCLK_PERIOD); + elsif (C_MEM_TYPE = "DDR2")then + return 2; + else + return 3; + end if; + end function MEM_WTR_CYC; + +constant MEM_WTR_VAL : INTEGER := MEM_WTR_CYC; + +function DDR2_WRT_RECOVERY_CYC return integer is + begin + if (not(C_MEM_TYPE = "DDR2")) then + return 5; + else + return ((C_MEM_TWR + C_MEMCLK_PERIOD - 1) / C_MEMCLK_PERIOD); + end if; + end function DDR2_WRT_RECOVERY_CYC; + + +constant C_MEM_DDR2_WRT_RECOVERY : INTEGER := DDR2_WRT_RECOVERY_CYC; + +function DDR3_WRT_RECOVERY_CYC return integer is + begin + if (not(C_MEM_TYPE = "DDR3")) then + return 5; + else + return ((C_MEM_TWR + C_MEMCLK_PERIOD - 1) / C_MEMCLK_PERIOD); + end if; + end function DDR3_WRT_RECOVERY_CYC; + +constant C_MEM_DDR3_WRT_RECOVERY : INTEGER := DDR3_WRT_RECOVERY_CYC; + +--CR 596422 +constant allzero : std_logic_vector(127 downto 0) := (others => '0'); +--signal allzero : std_logic_vector(127 downto 0) := (others => '0'); + +---------------------------------------------------------------------------- +-- signal Declarations +---------------------------------------------------------------------------- +signal addr_in0 : std_logic_vector(31 downto 0); +signal dqs_out_p : std_logic; +signal dqs_out_n : std_logic; +signal dqs_sys_p : std_logic; --from dqs_gen to IOclk network +signal dqs_sys_n : std_logic; --from dqs_gen to IOclk network +signal udqs_sys_p: std_logic; +signal udqs_sys_n: std_logic; +signal dqs_p : std_logic; -- open net now ? +signal dqs_n : std_logic; -- open net now ? + +-- IOI and IOB enable/tristate interface +signal dqIO_w_en_0 : std_logic; --enable DQ pads +signal dqsIO_w_en_90_p : std_logic; --enable p side of DQS +signal dqsIO_w_en_90_n : std_logic; --enable n side of DQS + +--memory chip control interface +signal address_90 : std_logic_vector(14 downto 0); +signal ba_90 : std_logic_vector(2 downto 0); +signal ras_90 : std_logic; +signal cas_90 : std_logic; +signal we_90 : std_logic; +signal cke_90 : std_logic; +signal odt_90 : std_logic; +signal rst_90 : std_logic; + +-- calibration IDELAY control signals +signal ioi_drp_clk : std_logic; --DRP interface - synchronous clock output +signal ioi_drp_addr : std_logic_vector(4 downto 0); --DRP interface - IOI selection +signal ioi_drp_sdo : std_logic; --DRP interface - serial output for commmands +signal ioi_drp_sdi : std_logic; --DRP interface - serial input for commands +signal ioi_drp_cs : std_logic; --DRP interface - chip select doubles as DONE signal +signal ioi_drp_add : std_logic; --DRP interface - serial address signal +signal ioi_drp_broadcast : std_logic; +signal ioi_drp_train : std_logic; + +-- Calibration datacapture siganls +signal dqdonecount : std_logic_vector(3 downto 0); --select signal for the datacapture 16 to 1 mux +signal dq_in_p : std_logic; --positive signal sent to calibration logic +signal dq_in_n : std_logic; --negative signal sent to calibration logic +signal cal_done: std_logic; + +--DQS calibration interface +signal udqs_n : std_logic; +signal udqs_p : std_logic; +signal udqs_dqocal_p : std_logic; +signal udqs_dqocal_n : std_logic; + +-- MUI enable interface +signal df_en_n90 : std_logic; + +--INTERNAL signal FOR DRP chain +-- IOI <-> MUI +signal ioi_int_tmp : std_logic; + +signal dqo_n : std_logic_vector(15 downto 0); +signal dqo_p : std_logic_vector(15 downto 0); +signal dqnlm : std_logic; +signal dqplm : std_logic; +signal dqnum : std_logic; +signal dqpum : std_logic; + +-- IOI <-> IOB routes +signal ioi_addr : std_logic_vector(C_MEM_ADDR_WIDTH-1 downto 0); +signal ioi_ba : std_logic_vector(C_MEM_BANKADDR_WIDTH-1 downto 0); +signal ioi_cas : std_logic; +signal ioi_ck : std_logic; +signal ioi_ckn : std_logic; +signal ioi_cke : std_logic; +signal ioi_dq : std_logic_vector(C_NUM_DQ_PINS-1 downto 0); +signal ioi_dqs : std_logic; +signal ioi_dqsn : std_logic; +signal ioi_udqs : std_logic; +signal ioi_udqsn : std_logic; +signal ioi_odt : std_logic; +signal ioi_ras : std_logic; +signal ioi_rst : std_logic; +signal ioi_we : std_logic; +signal ioi_udm : std_logic; +signal ioi_ldm : std_logic; + +signal in_dq : std_logic_vector(15 downto 0); +signal in_pre_dq : std_logic_vector(C_NUM_DQ_PINS-1 downto 0); +signal in_dqs : std_logic; +signal in_pre_dqsp : std_logic; +signal in_pre_dqsn : std_logic; +signal in_pre_udqsp : std_logic; +signal in_pre_udqsn : std_logic; +signal in_udqs : std_logic; + +-- Memory tri-state control signals +signal t_addr : std_logic_vector(C_MEM_ADDR_WIDTH-1 downto 0); +signal t_ba : std_logic_vector(C_MEM_BANKADDR_WIDTH-1 downto 0); +signal t_cas : std_logic; +signal t_ck : std_logic; +signal t_ckn : std_logic; +signal t_cke : std_logic; +signal t_dq : std_logic_vector(C_NUM_DQ_PINS-1 downto 0); +signal t_dqs : std_logic; +signal t_dqsn : std_logic; +signal t_udqs : std_logic; +signal t_udqsn : std_logic; +signal t_odt : std_logic; +signal t_ras : std_logic; +signal t_rst : std_logic; +signal t_we : std_logic; + +signal t_udm : std_logic; +signal t_ldm : std_logic; + +signal idelay_dqs_ioi_s : std_logic; +signal idelay_dqs_ioi_m : std_logic; +signal idelay_udqs_ioi_s : std_logic; +signal idelay_udqs_ioi_m : std_logic; + +signal dqs_pin : std_logic; +signal udqs_pin : std_logic; + +-- USER Interface signals +-- translated memory addresses +signal p0_cmd_ra : std_logic_vector(14 downto 0); +signal p0_cmd_ba : std_logic_vector(2 downto 0); +signal p0_cmd_ca : std_logic_vector(11 downto 0); +signal p1_cmd_ra : std_logic_vector(14 downto 0); +signal p1_cmd_ba : std_logic_vector(2 downto 0); +signal p1_cmd_ca : std_logic_vector(11 downto 0); +signal p2_cmd_ra : std_logic_vector(14 downto 0); +signal p2_cmd_ba : std_logic_vector(2 downto 0); +signal p2_cmd_ca : std_logic_vector(11 downto 0); +signal p3_cmd_ra : std_logic_vector(14 downto 0); +signal p3_cmd_ba : std_logic_vector(2 downto 0); +signal p3_cmd_ca : std_logic_vector(11 downto 0); +signal p4_cmd_ra : std_logic_vector(14 downto 0); +signal p4_cmd_ba : std_logic_vector(2 downto 0); +signal p4_cmd_ca : std_logic_vector(11 downto 0); +signal p5_cmd_ra : std_logic_vector(14 downto 0); +signal p5_cmd_ba : std_logic_vector(2 downto 0); +signal p5_cmd_ca : std_logic_vector(11 downto 0); + + -- user command wires mapped from logical ports to physical ports +signal mig_p0_arb_en : std_logic; +signal mig_p0_cmd_clk : std_logic; +signal mig_p0_cmd_en : std_logic; +signal mig_p0_cmd_ra : std_logic_vector(14 downto 0); +signal mig_p0_cmd_ba : std_logic_vector(2 downto 0); +signal mig_p0_cmd_ca : std_logic_vector(11 downto 0); + +signal mig_p0_cmd_instr : std_logic_vector(2 downto 0); +signal mig_p0_cmd_bl : std_logic_vector(5 downto 0); +signal mig_p0_cmd_empty : std_logic; +signal mig_p0_cmd_full : std_logic; + +signal mig_p1_arb_en : std_logic; +signal mig_p1_cmd_clk : std_logic; +signal mig_p1_cmd_en : std_logic; +signal mig_p1_cmd_ra : std_logic_vector(14 downto 0); +signal mig_p1_cmd_ba : std_logic_vector(2 downto 0); +signal mig_p1_cmd_ca : std_logic_vector(11 downto 0); + +signal mig_p1_cmd_instr : std_logic_vector(2 downto 0); +signal mig_p1_cmd_bl : std_logic_vector(5 downto 0); +signal mig_p1_cmd_empty : std_logic; +signal mig_p1_cmd_full : std_logic; + +signal mig_p2_arb_en : std_logic; +signal mig_p2_cmd_clk : std_logic; +signal mig_p2_cmd_en : std_logic; +signal mig_p2_cmd_ra : std_logic_vector(14 downto 0); +signal mig_p2_cmd_ba : std_logic_vector(2 downto 0); +signal mig_p2_cmd_ca : std_logic_vector(11 downto 0); + +signal mig_p2_cmd_instr : std_logic_vector(2 downto 0); +signal mig_p2_cmd_bl : std_logic_vector(5 downto 0); +signal mig_p2_cmd_empty : std_logic; +signal mig_p2_cmd_full : std_logic; + +signal mig_p3_arb_en : std_logic; +signal mig_p3_cmd_clk : std_logic; +signal mig_p3_cmd_en : std_logic; +signal mig_p3_cmd_ra : std_logic_vector(14 downto 0); +signal mig_p3_cmd_ba : std_logic_vector(2 downto 0); +signal mig_p3_cmd_ca : std_logic_vector(11 downto 0); + +signal mig_p3_cmd_instr : std_logic_vector(2 downto 0); +signal mig_p3_cmd_bl : std_logic_vector(5 downto 0); +signal mig_p3_cmd_empty : std_logic; +signal mig_p3_cmd_full : std_logic; + +signal mig_p4_arb_en : std_logic; +signal mig_p4_cmd_clk : std_logic; +signal mig_p4_cmd_en : std_logic; +signal mig_p4_cmd_ra : std_logic_vector(14 downto 0); +signal mig_p4_cmd_ba : std_logic_vector(2 downto 0); +signal mig_p4_cmd_ca : std_logic_vector(11 downto 0); + +signal mig_p4_cmd_instr : std_logic_vector(2 downto 0); +signal mig_p4_cmd_bl : std_logic_vector(5 downto 0); +signal mig_p4_cmd_empty : std_logic; +signal mig_p4_cmd_full : std_logic; + +signal mig_p5_arb_en : std_logic; +signal mig_p5_cmd_clk : std_logic; +signal mig_p5_cmd_en : std_logic; +signal mig_p5_cmd_ra : std_logic_vector(14 downto 0); +signal mig_p5_cmd_ba : std_logic_vector(2 downto 0); +signal mig_p5_cmd_ca : std_logic_vector(11 downto 0); + +signal mig_p5_cmd_instr : std_logic_vector(2 downto 0); +signal mig_p5_cmd_bl : std_logic_vector(5 downto 0); +signal mig_p5_cmd_empty : std_logic; +signal mig_p5_cmd_full : std_logic; + +signal mig_p0_wr_clk : std_logic; +signal mig_p0_rd_clk : std_logic; +signal mig_p1_wr_clk : std_logic; +signal mig_p1_rd_clk : std_logic; +signal mig_p2_clk : std_logic; +signal mig_p3_clk : std_logic; +signal mig_p4_clk : std_logic; +signal mig_p5_clk : std_logic; + +signal mig_p0_wr_en : std_logic; +signal mig_p0_rd_en : std_logic; +signal mig_p1_wr_en : std_logic; +signal mig_p1_rd_en : std_logic; +signal mig_p2_en : std_logic; +signal mig_p3_en : std_logic; +signal mig_p4_en : std_logic; +signal mig_p5_en : std_logic; + +signal mig_p0_wr_data : std_logic_vector(31 downto 0); +signal mig_p1_wr_data : std_logic_vector(31 downto 0); +signal mig_p2_wr_data : std_logic_vector(31 downto 0); +signal mig_p3_wr_data : std_logic_vector(31 downto 0); +signal mig_p4_wr_data : std_logic_vector(31 downto 0); +signal mig_p5_wr_data : std_logic_vector(31 downto 0); + +signal mig_p0_wr_mask : std_logic_vector(C_P0_MASK_SIZE - 1 downto 0); +signal mig_p1_wr_mask : std_logic_vector(C_P1_MASK_SIZE - 1 downto 0); +signal mig_p2_wr_mask : std_logic_vector(3 downto 0); +signal mig_p3_wr_mask : std_logic_vector(3 downto 0); +signal mig_p4_wr_mask : std_logic_vector(3 downto 0); +signal mig_p5_wr_mask : std_logic_vector(3 downto 0); + +signal mig_p0_rd_data : std_logic_vector(31 downto 0); +signal mig_p1_rd_data : std_logic_vector(31 downto 0); +signal mig_p2_rd_data : std_logic_vector(31 downto 0); +signal mig_p3_rd_data : std_logic_vector(31 downto 0); +signal mig_p4_rd_data : std_logic_vector(31 downto 0); +signal mig_p5_rd_data : std_logic_vector(31 downto 0); + +signal mig_p0_rd_overflow : std_logic; +signal mig_p1_rd_overflow : std_logic; +signal mig_p2_overflow : std_logic; +signal mig_p3_overflow : std_logic; + +signal mig_p4_overflow : std_logic; +signal mig_p5_overflow : std_logic; + +signal mig_p0_wr_underrun : std_logic; +signal mig_p1_wr_underrun : std_logic; +signal mig_p2_underrun : std_logic; +signal mig_p3_underrun : std_logic; +signal mig_p4_underrun : std_logic; +signal mig_p5_underrun : std_logic; + +signal mig_p0_rd_error : std_logic; +signal mig_p0_wr_error : std_logic; +signal mig_p1_rd_error : std_logic; +signal mig_p1_wr_error : std_logic; +signal mig_p2_error : std_logic; +signal mig_p3_error : std_logic; +signal mig_p4_error : std_logic; +signal mig_p5_error : std_logic; + +signal mig_p0_wr_count : std_logic_vector(6 downto 0); +signal mig_p1_wr_count : std_logic_vector(6 downto 0); +signal mig_p0_rd_count : std_logic_vector(6 downto 0); +signal mig_p1_rd_count : std_logic_vector(6 downto 0); + +signal mig_p2_count : std_logic_vector(6 downto 0); +signal mig_p3_count : std_logic_vector(6 downto 0); +signal mig_p4_count : std_logic_vector(6 downto 0); +signal mig_p5_count : std_logic_vector(6 downto 0); + +signal mig_p0_wr_full : std_logic; +signal mig_p1_wr_full : std_logic; + +signal mig_p0_rd_empty : std_logic; +signal mig_p1_rd_empty : std_logic; +signal mig_p0_wr_empty : std_logic; +signal mig_p1_wr_empty : std_logic; +signal mig_p0_rd_full : std_logic; +signal mig_p1_rd_full : std_logic; +signal mig_p2_full : std_logic; +signal mig_p3_full : std_logic; +signal mig_p4_full : std_logic; +signal mig_p5_full : std_logic; +signal mig_p2_empty : std_logic; +signal mig_p3_empty : std_logic; +signal mig_p4_empty : std_logic; +signal mig_p5_empty : std_logic; + +-- SELFREESH control signal for suspend feature +signal selfrefresh_mcb_enter : std_logic; +signal selfrefresh_mcb_mode : std_logic; +signal selfrefresh_mode_sig : std_logic; + +signal MCB_SYSRST : std_logic; +signal ioclk0 : std_logic; +signal ioclk90 : std_logic; +signal hard_done_cal : std_logic; +signal uo_data_int : std_logic_vector(7 downto 0); +signal uo_data_valid_int : std_logic; +signal uo_cmd_ready_in_int : std_logic; +signal syn_uiclk_pll_lock : std_logic; +signal int_sys_rst : std_logic; + +--testing +signal ioi_drp_update : std_logic; +signal aux_sdi_sdo : std_logic_vector(7 downto 0); + + + signal mcb_recal : std_logic; + signal mcb_ui_read : std_logic; + signal mcb_ui_add : std_logic; + signal mcb_ui_cs : std_logic; + signal mcb_ui_clk : std_logic; + signal mcb_ui_sdi : std_logic; + signal mcb_ui_addr : STD_LOGIC_vector(4 downto 0); + signal mcb_ui_broadcast : std_logic; + signal mcb_ui_drp_update : std_logic; + signal mcb_ui_done_cal : std_logic; + signal mcb_ui_cmd : std_logic; + signal mcb_ui_cmd_in : std_logic; + signal mcb_ui_cmd_en : std_logic; + signal mcb_ui_dqcount : std_logic_vector(3 downto 0); + signal mcb_ui_dq_lower_dec : std_logic; + signal mcb_ui_dq_lower_inc : std_logic; + signal mcb_ui_dq_upper_dec : std_logic; + signal mcb_ui_dq_upper_inc : std_logic; + signal mcb_ui_udqs_inc : std_logic; + signal mcb_ui_udqs_dec : std_logic; + signal mcb_ui_ldqs_inc : std_logic; + signal mcb_ui_ldqs_dec : std_logic; + signal DONE_SOFTANDHARD_CAL : std_logic; + + signal ck_shiftout0_1 : std_logic; + signal ck_shiftout0_2 : std_logic; + signal ck_shiftout1_3 : std_logic; + signal ck_shiftout1_4 : std_logic; + + signal udm_oq : std_logic; + signal udm_t : std_logic; + signal ldm_oq : std_logic; + signal ldm_t : std_logic; + signal dqsp_oq : std_logic; + signal dqsp_tq : std_logic; + signal dqs_shiftout0_1 : std_logic; + signal dqs_shiftout0_2 : std_logic; + signal dqs_shiftout1_3 : std_logic; + signal dqs_shiftout1_4 : std_logic; + signal dqsn_oq : std_logic; + signal dqsn_tq : std_logic; + signal udqsp_oq : std_logic; + signal udqsp_tq : std_logic; + signal udqs_shiftout0_1 : std_logic; + signal udqs_shiftout0_2 : std_logic; + signal udqs_shiftout1_3 : std_logic; + signal udqs_shiftout1_4 : std_logic; + signal udqsn_oq : std_logic; + signal udqsn_tq : std_logic; + signal aux_sdi_out_dqsp : std_logic; + signal aux_sdi_out_udqsp : std_logic; + signal aux_sdi_out_udqsn : std_logic; + signal aux_sdi_out_0 : std_logic; + signal aux_sdi_out_1 : std_logic; + signal aux_sdi_out_2 : std_logic; + signal aux_sdi_out_3 : std_logic; + signal aux_sdi_out_5 : std_logic; + signal aux_sdi_out_6 : std_logic; + signal aux_sdi_out_7 : std_logic; + signal aux_sdi_out_9 : std_logic; + signal aux_sdi_out_10 : std_logic; + signal aux_sdi_out_11 : std_logic; + signal aux_sdi_out_12 : std_logic; + signal aux_sdi_out_13 : std_logic; + signal aux_sdi_out_14 : std_logic; + signal aux_sdi_out_15 : std_logic; + signal aux_sdi_out_8 : std_logic; + signal aux_sdi_out_dqsn : std_logic; + signal aux_sdi_out_4 : std_logic; + signal aux_sdi_out_udm : std_logic; + signal aux_sdi_out_ldm : std_logic; + signal uo_cal_start_int : std_logic; + + signal cke_train : std_logic; + signal dq_oq : std_logic_vector(C_NUM_DQ_PINS-1 downto 0); + signal dq_tq : std_logic_vector(C_NUM_DQ_PINS-1 downto 0); + + signal p0_wr_full_i : std_logic; + signal p0_rd_empty_i : std_logic; + signal p1_wr_full_i : std_logic; + signal p1_rd_empty_i : std_logic; + signal pllclk1 : std_logic_vector(1 downto 0); + signal pllce1 : std_logic_vector(1 downto 0); + signal uo_refrsh_flag_xhdl23 : std_logic; + signal uo_sdo_xhdl24 : STD_LOGIC; + signal Max_Value_Cal_Error : std_logic; + signal uo_done_cal_sig : std_logic; + signal wait_200us_counter : std_logic_vector(15 downto 0); + signal cke_train_reg : std_logic; + signal wait_200us_done_r1 : std_logic; + signal wait_200us_done_r2 : std_logic; + signal syn1_sys_rst : std_logic; + signal syn2_sys_rst : std_logic; + signal selfrefresh_enter_r1 : std_logic; + signal selfrefresh_enter_r2 : std_logic; + signal selfrefresh_enter_r3 : std_logic; + signal gated_pll_lock : std_logic; + signal soft_cal_selfrefresh_req : std_logic; + signal normal_operation_window : std_logic; + + attribute max_fanout : string; + attribute syn_maxfan : integer; + attribute max_fanout of int_sys_rst : signal is "1"; + attribute syn_maxfan of int_sys_rst : signal is 1; + +begin + uo_cmd_ready_in <= uo_cmd_ready_in_int; + uo_data_valid <= uo_data_valid_int; + uo_data <= uo_data_int; + uo_refrsh_flag <= uo_refrsh_flag_xhdl23; + uo_sdo <= uo_sdo_xhdl24; + + p0_wr_full <= p0_wr_full_i; + p0_rd_empty <= p0_rd_empty_i; + p1_wr_full <= p1_wr_full_i; + p1_rd_empty <= p1_rd_empty_i; + ioclk0 <= sysclk_2x; + ioclk90 <= sysclk_2x_180; + pllclk1 <= (ioclk90 & ioclk0); + pllce1 <= (pll_ce_90 & pll_ce_0); + + -- Assign the output signals with corresponding intermediate signals + uo_done_cal <= uo_done_cal_sig; + + -- Added 2/22 - Add flop to pll_lock status signal to improve timing + process (ui_clk) + begin + if (ui_clk'event and ui_clk = '1') then + if ((selfrefresh_enter = '0') and (gated_pll_lock = '0')) then + syn_uiclk_pll_lock <= pll_lock; + end if; + end if; + end process; + + -- logic to determine if Memory is SELFREFRESH mode operation or NORMAL mode. + process (ui_clk) + begin + if (ui_clk'event and ui_clk = '1') then + if (sys_rst = '1') then + normal_operation_window <= '1'; + elsif (selfrefresh_enter_r2 = '1' or selfrefresh_mode_sig = '1') then + normal_operation_window <= '0'; + elsif ((selfrefresh_enter_r2 = '0') and (selfrefresh_mode_sig = '0')) then + normal_operation_window <= '1'; + else + normal_operation_window <= normal_operation_window; + end if; + end if; + end process; + + + process(normal_operation_window,pll_lock,syn_uiclk_pll_lock) + begin + if (normal_operation_window = '1') then + gated_pll_lock <= pll_lock; + else + gated_pll_lock <= syn_uiclk_pll_lock; + end if; + end process; + +-- int_sys_rst will be asserted if pll lose lock during normal operation. +-- It uses the syn_uiclk_pll_lock version when it is entering suspend window , hence +-- reset will not be generated. + + int_sys_rst <= sys_rst or not(gated_pll_lock); + +-- synchronize the selfrefresh_enter + process (ui_clk) + begin + if (ui_clk'event and ui_clk = '1') then + if (sys_rst = '1') then + selfrefresh_enter_r1 <= '0'; + selfrefresh_enter_r2 <= '0'; + selfrefresh_enter_r3 <= '0'; + else + selfrefresh_enter_r1 <= selfrefresh_enter; + selfrefresh_enter_r2 <= selfrefresh_enter_r1; + selfrefresh_enter_r3 <= selfrefresh_enter_r2; + end if; + end if; + end process; + + + +-- The soft_cal_selfrefresh siganl is conditioned before connect to mcb_soft_calibration module. +-- It will not deassert selfrefresh_mcb_enter to MCB until input pll_lock reestablished in system. +-- This is to ensure the IOI stables before issued a selfrefresh exit command to dram. + process (ui_clk) + begin + if (ui_clk'event and ui_clk = '1') then + if (sys_rst = '1') then + soft_cal_selfrefresh_req <= '0'; + elsif (selfrefresh_enter_r3 = '1') then + soft_cal_selfrefresh_req <= '1'; + elsif (selfrefresh_enter_r3 = '0' and pll_lock = '1') then + soft_cal_selfrefresh_req <= '0'; + else + soft_cal_selfrefresh_req <= soft_cal_selfrefresh_req; + end if; + end if; + end process; + + +--Address Remapping +-- Byte Address remapping +-- +-- Bank Address[x:0] & Row Address[x:0] & Column Address[x:0] +-- column address remap for port 0 + +x16_addr : if(C_NUM_DQ_PINS = 16) generate -- port bus remapping sections for CONFIG 2 15,3,12 +x16_addr_rbc : if (C_MEM_ADDR_ORDER = "ROW_BANK_COLUMN") generate -- C_MEM_ADDR_ORDER = 0 : Bank Row Column + +-- port 0 address remapping + + x16_p0_a15 : if (C_MEM_ADDR_WIDTH = 15) generate + p0_cmd_ra <= p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + end generate; + + x16_p0_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate + p0_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p0_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p0_cmd_ba <= p0_cmd_byte_addr( C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + end generate; + + x16_p0_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p0_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p0_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto + C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p0_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p0_cmd_ca <= p0_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + end generate; + + x16_p0_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p0_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS + 1) & p0_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + end generate; + +-- port 1 address remapping + + x16_p1_a15 : if (C_MEM_ADDR_WIDTH = 15) generate --Row + p1_cmd_ra <= p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + end generate; + + x16_p1_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p1_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p1_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p1_cmd_ba <= p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + end generate; + + x16_p1_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p1_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto + C_MEM_NUM_COL_BITS + 1)); + + end generate; + + + x16_p1_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p1_cmd_ca <= p1_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + + end generate; + + x16_p1_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p1_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS + 1) & p1_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + + end generate; + + -- port 2 address remapping + x16_p2_a15 : if (C_MEM_ADDR_WIDTH = 15) generate --Row + p2_cmd_ra <= p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + end generate; + + x16_p2_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p2_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p2_cmd_byte_addr (C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p2_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p2_cmd_ba <= p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + end generate; + + x16_p2_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p2_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p2_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p2_cmd_ca <= p2_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + + end generate; + + x16_p2_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p2_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS + 1) & p2_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + + end generate; + + +-- port 3 address remapping + x16_p3_a15 : if (C_MEM_ADDR_WIDTH = 15) generate --Row + p3_cmd_ra <= p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + + end generate; + + x16_p3_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p3_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p3_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p3_cmd_ba <= p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + + end generate; + + x16_p3_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p3_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto + C_MEM_NUM_COL_BITS + 1)); + + end generate; + + + x16_p3_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p3_cmd_ca <= p3_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + + end generate; + + x16_p3_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p3_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS +1 ) & p3_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + end generate; + + + + + -- port 4 address remapping + + x16_p4_a15 : if (C_MEM_ADDR_WIDTH = 15) generate --Row + p4_cmd_ra <= p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + + end generate; + + x16_p4_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p4_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p4_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p4_cmd_ba <= p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + end generate; + + x16_p4_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p4_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p4_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p4_cmd_ca <= p4_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + + end generate; + + x16_p4_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p4_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS +1)& p4_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + end generate; + + + +-- port 5 address remapping + x16_p5_a15 : if (C_MEM_ADDR_WIDTH = 15) generate --Row + p5_cmd_ra <= p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + end generate; + + x16_p5_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p5_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p5_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p5_cmd_ba <= p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + end generate; + + x16_p5_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p5_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS downto + C_MEM_NUM_COL_BITS + 1)); + end generate; + + + x16_p5_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p5_cmd_ca <= p5_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + end generate; + + x16_p5_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p5_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS+1) & p5_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + end generate; +end generate; --x16_addr_rbc + +x16_addr_rbc_n : if (not(C_MEM_ADDR_ORDER = "ROW_BANK_COLUMN")) generate + + + -- port 0 address remapping + +x16_rbc_n_p0_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p0_cmd_ba <= p0_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + end generate; + +x16_rbc_n_p0_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p0_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p0_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + end generate; + +x16_rbc_n_p0_a15 : if (C_MEM_ADDR_WIDTH = 15 ) generate --row + p0_cmd_ra <= p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + end generate; + +x16_rbc_n_p0_a15_n : if (not(C_MEM_ADDR_WIDTH = 15 )) generate --row + p0_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1)); + end generate; + +x16_rbc_n_p0_c12 : if (C_MEM_NUM_COL_BITS = 12 ) generate --column + p0_cmd_ca <= p0_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + + end generate; + +x16_rbc_n_p0_c12_n : if (not(C_MEM_NUM_COL_BITS = 12 )) generate --column + p0_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS+1)& p0_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + end generate; + + + + + +-- port 1 address remapping + x16_rbc_n_p1_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p1_cmd_ba <= p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + end generate; + +x16_rbc_n_p1_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p1_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + end generate; + +x16_rbc_n_p1_a15 : if (C_MEM_ADDR_WIDTH = 15 ) generate --row + p1_cmd_ra <= p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + end generate; + +x16_rbc_n_p1_a15_n : if (not(C_MEM_ADDR_WIDTH = 15 )) generate --row + p1_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1)); + end generate; + +x16_rbc_n_p1_c12 : if (C_MEM_NUM_COL_BITS = 12 ) generate --column + p1_cmd_ca <= p1_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + end generate; + +x16_rbc_n_p1_c12_n : if (not(C_MEM_NUM_COL_BITS = 12 )) generate --column + p1_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS+1) & p1_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + end generate; + + + + -- port 2 address remapping +x16_rbc_n_p2_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p2_cmd_ba <= p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + end generate; + +x16_rbc_n_p2_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p2_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + + end generate; + +x16_rbc_n_p2_a15 : if (C_MEM_ADDR_WIDTH = 15 ) generate --row + p2_cmd_ra <= p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + + end generate; + +x16_rbc_n_p2_a15_n : if (not(C_MEM_ADDR_WIDTH = 15 )) generate --row + p2_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1)); + end generate; + +x16_rbc_n_p2_c12 : if (C_MEM_NUM_COL_BITS = 12 ) generate --column + p2_cmd_ca <= p2_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + + end generate; + +x16_rbc_n_p2_c12_n : if (not(C_MEM_NUM_COL_BITS = 12 )) generate --column + p2_cmd_ca <= (allzero( 12 downto C_MEM_NUM_COL_BITS +1)& p2_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + + end generate; + + + -- port 3 address remapping +x16_rbc_n_p3_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p3_cmd_ba <= p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + + end generate; + +x16_rbc_n_p3_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p3_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + + end generate; + +x16_rbc_n_p3_a15 : if (C_MEM_ADDR_WIDTH = 15 ) generate --row + p3_cmd_ra <= p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + + end generate; + +x16_rbc_n_p3_a15_n : if (not(C_MEM_ADDR_WIDTH = 15 )) generate --row + p3_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1)); + + end generate; + +x16_rbc_n_p3_c12 : if (C_MEM_NUM_COL_BITS = 12 ) generate --column + p3_cmd_ca <= p3_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + + end generate; + +x16_rbc_n_p3_c12_n : if (not(C_MEM_NUM_COL_BITS = 12 )) generate --column + p3_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS +1)& p3_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + + end generate; + + + -- port 4 address remapping +x16_rbc_n_p4_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p4_cmd_ba <= p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + + end generate; + +x16_rbc_n_p4_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p4_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + + end generate; + +x16_rbc_n_p4_a15 : if (C_MEM_ADDR_WIDTH = 15 ) generate --row + p4_cmd_ra <= p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + + end generate; + +x16_rbc_n_p4_a15_n : if (not(C_MEM_ADDR_WIDTH = 15 )) generate --row + p4_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1)); + end generate; + +x16_rbc_n_p4_c12 : if (C_MEM_NUM_COL_BITS = 12 ) generate --column + p4_cmd_ca <= p4_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + + end generate; + +x16_rbc_n_p4_c12_n : if (not(C_MEM_NUM_COL_BITS = 12 )) generate --column + p4_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS +1) & p4_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + + end generate; + + -- port 5 address remapping +x16_rbc_n_p5_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p5_cmd_ba <= p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1); + + end generate; + +x16_rbc_n_p5_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p5_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS + 1)); + + end generate; + +x16_rbc_n_p5_a15 : if (C_MEM_ADDR_WIDTH = 15 ) generate --row + p5_cmd_ra <= p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1); + end generate; + +x16_rbc_n_p5_a15_n : if (not(C_MEM_ADDR_WIDTH = 15 )) generate --row + p5_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS downto C_MEM_NUM_COL_BITS + 1)); + + end generate; + +x16_rbc_n_p5_c12 : if (C_MEM_NUM_COL_BITS = 12 ) generate --column + p5_cmd_ca <= p5_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1); + + end generate; + +x16_rbc_n_p5_c12_n : if (not(C_MEM_NUM_COL_BITS = 12 )) generate --column + p5_cmd_ca <= (allzero(12 downto C_MEM_NUM_COL_BITS +1) & p5_cmd_byte_addr(C_MEM_NUM_COL_BITS downto 1)); + + end generate; + end generate;--x16_addr_rbc_n +end generate; --x16_addr + + + + + + +x8_addr : if(C_NUM_DQ_PINS = 8) generate +x8_addr_rbc : if (C_MEM_ADDR_ORDER = "ROW_BANK_COLUMN") generate +-- port 0 address remapping + +x8_p0_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p0_cmd_ra <= p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_p0_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p0_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_p0_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p0_cmd_ba <= p0_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); --14,3,10 + + end generate; + + x8_p0_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p0_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p0_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); --14,3,10 + + end generate; + + + x8_p0_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p0_cmd_ca(11 downto 0) <= p0_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_p0_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p0_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p0_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + + + +-- port 1 address remapping + x8_p1_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p1_cmd_ra <= p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_p1_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p1_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_p1_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p1_cmd_ba <= p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); --14,3,10 + + end generate; + + x8_p1_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p1_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); --14,3,10 + + end generate; + + + x8_p1_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p1_cmd_ca(11 downto 0) <= p1_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_p1_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p1_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p1_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + + + -- port 2 address remapping + x8_p2_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p2_cmd_ra <= p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_p2_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p2_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_p2_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p2_cmd_ba <= p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); --14,3,10 + + end generate; + + x8_p2_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p2_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); --14,2,10 *** + + end generate; + + + x8_p2_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p2_cmd_ca(11 downto 0) <= p2_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_p2_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p2_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p2_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + + + +-- port 3 address remapping + x8_p3_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p3_cmd_ra <= p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_p3_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p3_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_p3_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p3_cmd_ba <= p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); --14,3,10 + + end generate; + + x8_p3_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p3_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); --14,3,10 + + end generate; + + + x8_p3_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p3_cmd_ca(11 downto 0) <= p3_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_p3_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p3_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p3_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + +-- port 4 address remapping + x8_p4_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p4_cmd_ra <= p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_p4_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p4_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_p4_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p4_cmd_ba <= p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); --14,3,10 + + end generate; + + x8_p4_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p4_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); --14,3,10 + + end generate; + + + x8_p4_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p4_cmd_ca(11 downto 0) <= p4_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_p4_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p4_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p4_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + + + -- port 5 address remapping + x8_p5_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p5_cmd_ra <= p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_p5_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p5_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_p5_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p5_cmd_ba <= p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); --14,3,10 + + end generate; + + x8_p5_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p5_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); --14,3,10 + + end generate; + + + x8_p5_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p5_cmd_ca(11 downto 0) <= p5_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_p5_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p5_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p5_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + end generate; --x8_addr_rbc + + + +x8_addr_rbc_n : if (not(C_MEM_ADDR_ORDER = "ROW_BANK_COLUMN")) generate + -- port 0 address remapping + x8_rbc_n_p0_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p0_cmd_ba <= p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p0_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p0_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + x8_rbc_n_p0_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p0_cmd_ra <= p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p0_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p0_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_rbc_n_p0_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p0_cmd_ca(11 downto 0) <= p0_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_rbc_n_p0_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p0_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p0_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + + -- port 1 address remapping + x8_rbc_n_p1_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p1_cmd_ba <= p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p1_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p1_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + x8_rbc_n_p1_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p1_cmd_ra <= p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p1_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p1_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_rbc_n_p1_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p1_cmd_ca(11 downto 0) <= p1_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_rbc_n_p1_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p1_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p1_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + +--port 2 address remapping + x8_rbc_n_p2_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p2_cmd_ba <= p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p2_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p2_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + x8_rbc_n_p2_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p2_cmd_ra <= p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p2_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p2_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_rbc_n_p2_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p2_cmd_ca(11 downto 0) <= p2_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_rbc_n_p2_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p2_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p2_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + + -- port 3 address remapping + x8_rbc_n_p3_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p3_cmd_ba <= p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p3_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p3_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + x8_rbc_n_p3_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p3_cmd_ra <= p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p3_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p3_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_rbc_n_p3_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p3_cmd_ca(11 downto 0) <= p3_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_rbc_n_p3_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p3_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p3_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + + +-- port 4 address remapping + x8_rbc_n_p4_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p4_cmd_ba <= p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p4_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p4_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH) & + p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS )); + end generate; + + x8_rbc_n_p4_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p4_cmd_ra <= p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p4_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p4_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_rbc_n_p4_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p4_cmd_ca(11 downto 0) <= p4_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_rbc_n_p4_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p4_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p4_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + + +-- port 5 address remapping + x8_rbc_n_p5_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p5_cmd_ba <= p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p5_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p5_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH)& + p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS )); + + end generate; + + x8_rbc_n_p5_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p5_cmd_ra <= p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS ); + + end generate; + + x8_rbc_n_p5_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p5_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH) & p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1 downto C_MEM_NUM_COL_BITS )); + + end generate; + + + x8_rbc_n_p5_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p5_cmd_ca(11 downto 0) <= p5_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0); + + end generate; + + x8_rbc_n_p5_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p5_cmd_ca(11 downto 0) <= (allzero(11 downto C_MEM_NUM_COL_BITS) & p5_cmd_byte_addr(C_MEM_NUM_COL_BITS - 1 downto 0)); + + end generate; + end generate; --x8_addr_rbc_n + end generate; --x8_addr + + + + + + + + + +x4_addr : if(C_NUM_DQ_PINS = 4) generate +x4_addr_rbc : if (C_MEM_ADDR_ORDER = "ROW_BANK_COLUMN") generate + +-- port 0 address remapping +x4_p0_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p0_cmd_ra <= p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + end generate; + + x4_p0_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p0_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + + x4_p0_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p0_cmd_ba <= p0_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + end generate; + + x4_p0_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p0_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p0_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + end generate; + + + x4_p0_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p0_cmd_ca <= (p0_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); --14,3,11 + + end generate; + + x4_p0_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p0_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p0_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + end generate; + + +-- port 1 address remapping +x4_p1_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p1_cmd_ra <= p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + end generate; + + x4_p1_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p1_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + + x4_p1_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p1_cmd_ba <= p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + end generate; + + x4_p1_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p1_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + end generate; + + + x4_p1_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p1_cmd_ca <= (p1_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); --14,3,11 + + end generate; + + x4_p1_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p1_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p1_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + end generate; + + +-- port 2 address remapping +x4_p2_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p2_cmd_ra <= p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + end generate; + + x4_p2_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p2_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + end generate; + + + x4_p2_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p2_cmd_ba <= p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + end generate; + + x4_p2_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p2_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + end generate; + + + x4_p2_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p2_cmd_ca <= (p2_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); --14,3,11 + + end generate; + + x4_p2_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p2_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p2_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + end generate; + + +-- port 3 address remapping +x4_p3_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p3_cmd_ra <= p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + end generate; + + x4_p3_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p3_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + + x4_p3_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p3_cmd_ba <= p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + end generate; + + x4_p3_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p3_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + end generate; + + + x4_p3_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p3_cmd_ca <= (p3_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); --14,3,11 + + end generate; + + x4_p3_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p3_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p3_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + end generate; + + + + + + + x4_p4_p5:if(C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32" + ) generate +-- port 4 address remapping + +x4_p4_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p4_cmd_ra <= p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + end generate; + +x4_p4_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p4_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + +x4_p4_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p4_cmd_ba <= p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + end generate; + +x4_p4_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p4_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + end generate; + + +x4_p4_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p4_cmd_ca <= (p4_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); --14,3,11 + + end generate; + +x4_p4_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p4_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p4_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + end generate; +-- port 5 address remapping + + +x4_p5_a15 : if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p5_cmd_ra <= p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + end generate; + +x4_p5_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p5_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + +x4_p5_ba3 : if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p5_cmd_ba <= p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + end generate; + +x4_p5_ba3_n : if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p5_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + end generate; + + +x4_p5_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p5_cmd_ca <= (p5_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); --14,3,11 + + end generate; + +x4_p5_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p5_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p5_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + end generate; + end generate; --x4_p4_p5 + end generate; --x4_addr_rbc + + + + +x4_addr_rbc_n : if (not(C_MEM_ADDR_ORDER = "ROW_BANK_COLUMN")) generate + +-- port 0 address remapping + x4_rbc_n_p0_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p0_cmd_ba <= p0_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + end generate; + + x4_rbc_n_p0_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p0_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p0_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + end generate; + + x4_rbc_n_p0_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p0_cmd_ra <= p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + end generate; + + x4_rbc_n_p0_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p0_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p0_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + end generate; + + + x4_rbc_n_p0_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p0_cmd_ca <= (p0_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + end generate; + + x4_rbc_n_p0_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p0_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p0_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + end generate; + + +-- port 1 address remapping + x4_rbc_n_p1_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p1_cmd_ba <= p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p1_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p1_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p1_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + x4_rbc_n_p1_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p1_cmd_ra <= p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p1_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p1_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p1_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + + end generate; + + + x4_rbc_n_p1_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p1_cmd_ca <= (p1_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + + end generate; + + x4_rbc_n_p1_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p1_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p1_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + + end generate; + +-- port 2 address remapping + x4_rbc_n_p2_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p2_cmd_ba <= p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p2_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p2_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p2_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + x4_rbc_n_p2_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p2_cmd_ra <= p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p2_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p2_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p2_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + + end generate; + + + x4_rbc_n_p2_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p2_cmd_ca <= (p2_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + + end generate; + + x4_rbc_n_p2_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p2_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p2_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + + end generate; + +-- port 3 address remapping + x4_rbc_n_p3_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p3_cmd_ba <= p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p3_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p3_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p3_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + x4_rbc_n_p3_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p3_cmd_ra <= p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p3_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p3_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p3_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + + end generate; + + + x4_rbc_n_p3_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p3_cmd_ca <= (p3_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + + end generate; + + x4_rbc_n_p3_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p3_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p3_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + + end generate; + + + x4_p4_p5_n: if(C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32" + ) generate +-- port 4 address remapping + + x4_rbc_n_p4_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p4_cmd_ba <= p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p4_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p4_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p4_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + x4_rbc_n_p4_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p4_cmd_ra <= p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p4_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p4_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p4_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + + end generate; + + + x4_rbc_n_p4_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p4_cmd_ca <= (p4_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + + end generate; + + x4_rbc_n_p4_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p4_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p4_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + end generate; + + +-- port 5 address remapping + + x4_rbc_n_p5_ba3 :if (C_MEM_BANKADDR_WIDTH = 3 ) generate --Bank + p5_cmd_ba <= p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p5_ba3_n :if (not(C_MEM_BANKADDR_WIDTH = 3 )) generate --Bank + p5_cmd_ba <= (allzero(2 downto C_MEM_BANKADDR_WIDTH ) & p5_cmd_byte_addr(C_MEM_BANKADDR_WIDTH + C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 1)); + + end generate; + + x4_rbc_n_p5_a15: if (C_MEM_ADDR_WIDTH = 15) generate -- Row + p5_cmd_ra <= p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1); + + + end generate; + + x4_rbc_n_p5_a15_n : if (not(C_MEM_ADDR_WIDTH = 15)) generate --Row + p5_cmd_ra <= (allzero(14 downto C_MEM_ADDR_WIDTH ) & p5_cmd_byte_addr(C_MEM_ADDR_WIDTH + C_MEM_NUM_COL_BITS - 2 downto C_MEM_NUM_COL_BITS - 1)); + + + end generate; + + + x4_rbc_n_p5_ca12 : if (C_MEM_NUM_COL_BITS = 12) generate --Column + p5_cmd_ca <= (p5_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + + end generate; + + x4_rbc_n_p5_ca12_n : if (not(C_MEM_NUM_COL_BITS = 12)) generate --Column + p5_cmd_ca <= (allzero(11 downto C_MEM_NUM_COL_BITS ) & p5_cmd_byte_addr(C_MEM_NUM_COL_BITS - 2 downto 0) & '0'); + + + end generate; + +end generate; --x4_p4_p5_n + +end generate; --x4_addr_rbc_n +end generate; --x4_addr + + + + + -- if(C_PORT_CONFIG[183:160] == "B32") begin : u_config1_0 +u_config1_0: if(C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32" + ) generate + + --synthesis translate_off + -- PORT2 + process (p2_cmd_en,p2_cmd_instr) + begin + if((C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32") and + p2_cmd_en = '1' and p2_cmd_instr(2) = '0' and p2_cmd_instr(0) = '1') then + report "ERROR - Invalid Command for write only port 2"; + end if; + end process; + + process (p2_cmd_en,p2_cmd_instr) + begin + if((C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32") and + p2_cmd_en = '1' and p2_cmd_instr(2) = '0' and p2_cmd_instr(0) = '0') then + report "ERROR - Invalid Command for read only port 2"; + end if; + end process; + + -- PORT3 + process (p3_cmd_en,p3_cmd_instr) + begin + if((C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32") and + p3_cmd_en = '1' and p3_cmd_instr(2) = '0' and p3_cmd_instr(0) = '1') then + report "ERROR - Invalid Command for write only port 3"; + end if; + end process; + + process (p3_cmd_en,p3_cmd_instr) + begin + if((C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32") and + p3_cmd_en = '1' and p3_cmd_instr(2) = '0' and p3_cmd_instr(0) = '0') then + report "ERROR - Invalid Command for read only port 3"; + end if; + end process; + + -- PORT4 + process (p4_cmd_en,p4_cmd_instr) + begin + if((C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32") and + p4_cmd_en = '1' and p4_cmd_instr(2) = '0' and p4_cmd_instr(0) = '1') then + report "ERROR - Invalid Command for write only port 4"; + end if; + end process; + + process (p4_cmd_en,p4_cmd_instr) + begin + if((C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32") and + p4_cmd_en = '1' and p4_cmd_instr(2) = '0' and p4_cmd_instr(0) = '0') then + report "ERROR - Invalid Command for read only port 4"; + end if; + end process; + + -- PORT5 + process (p5_cmd_en,p5_cmd_instr) + begin + if((C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32") and + p5_cmd_en = '1' and p5_cmd_instr(2) = '0' and p5_cmd_instr(0) = '1') then + report "ERROR - Invalid Command for write only port 5"; + end if; + end process; + + process (p5_cmd_en,p5_cmd_instr) + begin + if((C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32") and + p5_cmd_en = '1' and p5_cmd_instr(2) = '0' and p5_cmd_instr(0) = '0') then + report "ERROR - Invalid Command for read only port 5"; + end if; + end process; + + + + + --synthesis translate_on + + + -- the local declaration of input port signals doesn't work. The mig_p1_xxx through mig_p5_xxx always ends up + -- high Z even though there are signals on p1_cmd_xxx through p5_cmd_xxxx. + -- The only solutions that I have is to have MIG tool remove the entire internal codes that doesn't belongs to the Configuration.. + -- + + -- Inputs from Application CMD Port + + p0_cmd_ena: if (C_PORT_ENABLE(0) = '1') generate + + mig_p0_arb_en <= p0_arb_en ; + mig_p0_cmd_clk <= p0_cmd_clk ; + mig_p0_cmd_en <= p0_cmd_en ; + mig_p0_cmd_ra <= p0_cmd_ra ; + mig_p0_cmd_ba <= p0_cmd_ba ; + mig_p0_cmd_ca <= p0_cmd_ca ; + mig_p0_cmd_instr <= p0_cmd_instr; + mig_p0_cmd_bl <= ((p0_cmd_instr(2) or p0_cmd_bl(5)) & p0_cmd_bl(4 downto 0)) ; + p0_cmd_empty <= mig_p0_cmd_empty; + p0_cmd_full <= mig_p0_cmd_full ; + end generate; + + p0_cmd_dis: if (C_PORT_ENABLE(0) = '0') generate + mig_p0_arb_en <= '0'; + mig_p0_cmd_clk <= '0'; + mig_p0_cmd_en <= '0'; + mig_p0_cmd_ra <= (others => '0'); + mig_p0_cmd_ba <= (others => '0'); + mig_p0_cmd_ca <= (others => '0'); + mig_p0_cmd_instr <= (others => '0'); + mig_p0_cmd_bl <= (others => '0'); + p0_cmd_empty <= '0'; + p0_cmd_full <= '0'; + + end generate; + + p1_cmd_ena: if (C_PORT_ENABLE(1) = '1') generate + mig_p1_arb_en <= p1_arb_en ; + mig_p1_cmd_clk <= p1_cmd_clk ; + mig_p1_cmd_en <= p1_cmd_en ; + mig_p1_cmd_ra <= p1_cmd_ra ; + mig_p1_cmd_ba <= p1_cmd_ba ; + mig_p1_cmd_ca <= p1_cmd_ca ; + mig_p1_cmd_instr <= p1_cmd_instr; + mig_p1_cmd_bl <= ((p1_cmd_instr(2) or p1_cmd_bl(5)) & p1_cmd_bl(4 downto 0)) ; + p1_cmd_empty <= mig_p1_cmd_empty; + p1_cmd_full <= mig_p1_cmd_full ; + end generate; + + p1_cmd_dis: if (C_PORT_ENABLE(1) = '0') generate + + mig_p1_arb_en <= '0'; + mig_p1_cmd_clk <= '0'; + mig_p1_cmd_en <= '0'; + mig_p1_cmd_ra <= (others => '0'); + mig_p1_cmd_ba <= (others => '0'); + mig_p1_cmd_ca <= (others => '0'); + mig_p1_cmd_instr <= (others => '0'); + mig_p1_cmd_bl <= (others => '0'); + p1_cmd_empty <= '0'; + p1_cmd_full <= '0'; + end generate; + + + p2_cmd_ena: if (C_PORT_ENABLE(2) = '1') generate + mig_p2_arb_en <= p2_arb_en ; + mig_p2_cmd_clk <= p2_cmd_clk ; + mig_p2_cmd_en <= p2_cmd_en ; + mig_p2_cmd_ra <= p2_cmd_ra ; + mig_p2_cmd_ba <= p2_cmd_ba ; + mig_p2_cmd_ca <= p2_cmd_ca ; + mig_p2_cmd_instr <= p2_cmd_instr; + mig_p2_cmd_bl <= ((p2_cmd_instr(2) or p2_cmd_bl(5)) & p2_cmd_bl(4 downto 0)) ; + + p2_cmd_empty <= mig_p2_cmd_empty; + p2_cmd_full <= mig_p2_cmd_full ; + end generate; + + p2_cmd_dis: if (C_PORT_ENABLE(2) = '0') generate + mig_p2_arb_en <= '0'; + mig_p2_cmd_clk <= '0'; + mig_p2_cmd_en <= '0'; + mig_p2_cmd_ra <= (others => '0'); + mig_p2_cmd_ba <= (others => '0'); + mig_p2_cmd_ca <= (others => '0'); + mig_p2_cmd_instr <= (others => '0'); + mig_p2_cmd_bl <= (others => '0'); + p2_cmd_empty <= '0'; + p2_cmd_full <= '0'; + end generate; + + p3_cmd_ena: if (C_PORT_ENABLE(3) = '1') generate + + mig_p3_arb_en <= p3_arb_en ; + mig_p3_cmd_clk <= p3_cmd_clk ; + mig_p3_cmd_en <= p3_cmd_en ; + mig_p3_cmd_ra <= p3_cmd_ra ; + mig_p3_cmd_ba <= p3_cmd_ba ; + mig_p3_cmd_ca <= p3_cmd_ca ; + mig_p3_cmd_instr <= p3_cmd_instr; + mig_p3_cmd_bl <= ((p3_cmd_instr(2) or p3_cmd_bl(5)) & p3_cmd_bl(4 downto 0)) ; + p3_cmd_empty <= mig_p3_cmd_empty; + p3_cmd_full <= mig_p3_cmd_full ; + end generate; + + p3_cmd_dis: if (C_PORT_ENABLE(3) = '0') generate + mig_p3_arb_en <= '0'; + mig_p3_cmd_clk <= '0'; + mig_p3_cmd_en <= '0'; + mig_p3_cmd_ra <= (others => '0'); + mig_p3_cmd_ba <= (others => '0'); + mig_p3_cmd_ca <= (others => '0'); + mig_p3_cmd_instr <= (others => '0'); + mig_p3_cmd_bl <= (others => '0'); + p3_cmd_empty <= '0'; + p3_cmd_full <= '0'; + end generate; + + + p4_cmd_ena: if (C_PORT_ENABLE(4) = '1') generate + + mig_p4_arb_en <= p4_arb_en ; + mig_p4_cmd_clk <= p4_cmd_clk ; + mig_p4_cmd_en <= p4_cmd_en ; + mig_p4_cmd_ra <= p4_cmd_ra ; + mig_p4_cmd_ba <= p4_cmd_ba ; + mig_p4_cmd_ca <= p4_cmd_ca ; + mig_p4_cmd_instr <= p4_cmd_instr; + mig_p4_cmd_bl <= ((p4_cmd_instr(2) or p4_cmd_bl(5)) & p4_cmd_bl(4 downto 0)) ; + + p4_cmd_empty <= mig_p4_cmd_empty; + p4_cmd_full <= mig_p4_cmd_full ; +end generate; + + p4_cmd_dis: if (C_PORT_ENABLE(4) = '0') generate + + mig_p4_arb_en <= '0'; + mig_p4_cmd_clk <= '0'; + mig_p4_cmd_en <= '0'; + mig_p4_cmd_ra <= (others => '0'); + mig_p4_cmd_ba <= (others => '0'); + mig_p4_cmd_ca <= (others => '0'); + mig_p4_cmd_instr <= (others => '0'); + mig_p4_cmd_bl <= (others => '0'); + p4_cmd_empty <= '0'; + p4_cmd_full <= '0'; +end generate; + + p5_cmd_ena: if (C_PORT_ENABLE(5) = '1') generate + mig_p5_arb_en <= p5_arb_en ; + mig_p5_cmd_clk <= p5_cmd_clk ; + mig_p5_cmd_en <= p5_cmd_en ; + mig_p5_cmd_ra <= p5_cmd_ra ; + mig_p5_cmd_ba <= p5_cmd_ba ; + mig_p5_cmd_ca <= p5_cmd_ca ; + mig_p5_cmd_instr <= p5_cmd_instr; + mig_p5_cmd_bl <= ((p5_cmd_instr(2) or p5_cmd_bl(5)) & p5_cmd_bl(4 downto 0)) ; + + p5_cmd_empty <= mig_p5_cmd_empty; + p5_cmd_full <= mig_p5_cmd_full ; + +end generate; + + p5_cmd_dis: if (C_PORT_ENABLE(5) = '0') generate + + mig_p5_arb_en <= '0'; + mig_p5_cmd_clk <= '0'; + mig_p5_cmd_en <= '0'; + mig_p5_cmd_ra <= (others => '0'); + mig_p5_cmd_ba <= (others => '0'); + mig_p5_cmd_ca <= (others => '0'); + mig_p5_cmd_instr <= (others => '0'); + mig_p5_cmd_bl <= (others => '0'); + p5_cmd_empty <= '0'; + p5_cmd_full <= '0'; +end generate; + + + +p0_wr_rd_ena: if (C_PORT_ENABLE(0) = '1') generate + mig_p0_wr_clk <= p0_wr_clk; + mig_p0_rd_clk <= p0_rd_clk; + mig_p0_wr_en <= p0_wr_en; + mig_p0_rd_en <= p0_rd_en; + mig_p0_wr_mask <= p0_wr_mask(3 downto 0); + mig_p0_wr_data <= p0_wr_data(31 downto 0); + p0_rd_data <= mig_p0_rd_data; + p0_rd_full <= mig_p0_rd_full; + p0_rd_empty_i <= mig_p0_rd_empty; + p0_rd_error <= mig_p0_rd_error; + p0_wr_error <= mig_p0_wr_error; + p0_rd_overflow <= mig_p0_rd_overflow; + p0_wr_underrun <= mig_p0_wr_underrun; + p0_wr_empty <= mig_p0_wr_empty; + p0_wr_full_i <= mig_p0_wr_full; + p0_wr_count <= mig_p0_wr_count; + p0_rd_count <= mig_p0_rd_count ; +end generate; +p0_wr_rd_dis: if (C_PORT_ENABLE(0) = '0') generate + mig_p0_wr_clk <= '0'; + mig_p0_rd_clk <= '0'; + mig_p0_wr_en <= '0'; + mig_p0_rd_en <= '0'; + mig_p0_wr_mask <= (others => '0'); + mig_p0_wr_data <= (others => '0'); + p0_rd_data <= (others => '0'); + p0_rd_full <= '0'; + p0_rd_empty_i <= '0'; + p0_rd_error <= '0'; + p0_wr_error <= '0'; + p0_rd_overflow <= '0'; + p0_wr_underrun <= '0'; + p0_wr_empty <= '0'; + p0_wr_full_i <= '0'; + p0_wr_count <= (others => '0'); + p0_rd_count <= (others => '0'); +end generate; + +p1_wr_rd_ena: if (C_PORT_ENABLE(1) = '1') generate + + mig_p1_wr_clk <= p1_wr_clk; + mig_p1_rd_clk <= p1_rd_clk; + mig_p1_wr_en <= p1_wr_en; + mig_p1_wr_mask <= p1_wr_mask(3 downto 0); + mig_p1_wr_data <= p1_wr_data(31 downto 0); + mig_p1_rd_en <= p1_rd_en; + p1_rd_data <= mig_p1_rd_data; + p1_rd_empty_i <= mig_p1_rd_empty; + p1_rd_full <= mig_p1_rd_full; + p1_rd_error <= mig_p1_rd_error; + p1_wr_error <= mig_p1_wr_error; + p1_rd_overflow <= mig_p1_rd_overflow; + p1_wr_underrun <= mig_p1_wr_underrun; + p1_wr_empty <= mig_p1_wr_empty; + p1_wr_full_i <= mig_p1_wr_full; + p1_wr_count <= mig_p1_wr_count; + p1_rd_count <= mig_p1_rd_count ; + +end generate; +p1_wr_rd_dis: if (C_PORT_ENABLE(1) = '0') generate + + mig_p1_wr_clk <= '0'; + mig_p1_rd_clk <= '0'; + mig_p1_wr_en <= '0'; + mig_p1_wr_mask <= (others => '0'); + mig_p1_wr_data <= (others => '0'); + mig_p1_rd_en <= '0'; + p1_rd_data <= (others => '0'); + p1_rd_empty_i <= '0'; + p1_rd_full <= '0'; + p1_rd_error <= '0'; + p1_wr_error <= '0'; + p1_rd_overflow <= '0'; + p1_wr_underrun <= '0'; + p1_wr_empty <= '0'; + p1_wr_full_i <= '0'; + p1_wr_count <= (others => '0'); + p1_rd_count <= (others => '0'); +end generate; +end generate; + + + + +--whenever PORT 2 is in Write mode +-- xhdl272 : IF (C_PORT_CONFIG(23 downto 21) = "B32" AND C_PORT_CONFIG(15 downto 13) = "W32") GENERATE +--u_config1_2W: if(C_PORT_CONFIG(183 downto 160) = "B32" and C_PORT_CONFIG(119 downto 96) = "W32") generate + +u_config1_2W: if( C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32" + ) generate + +p2_wr_ena: if (C_PORT_ENABLE(2) = '1') generate + mig_p2_clk <= p2_wr_clk; + mig_p2_wr_data <= p2_wr_data(31 downto 0); + mig_p2_wr_mask <= p2_wr_mask(3 downto 0); + mig_p2_en <= p2_wr_en;-- this signal will not shown up if the port 5 is for read dir + p2_wr_error <= mig_p2_error; + p2_wr_full <= mig_p2_full; + p2_wr_empty <= mig_p2_empty; + p2_wr_underrun <= mig_p2_underrun; + p2_wr_count <= mig_p2_count ;-- wr port + end generate; +p2_wr_dis: if (C_PORT_ENABLE(2) = '0') generate + mig_p2_clk <= '0'; + mig_p2_wr_data <= (others => '0'); + mig_p2_wr_mask <= (others => '0'); + mig_p2_en <= '0'; + p2_wr_error <= '0'; + p2_wr_full <= '0'; + p2_wr_empty <= '0'; + p2_wr_underrun <= '0'; + p2_wr_count <= (others => '0'); +end generate; + p2_rd_data <= (others => '0'); + p2_rd_overflow <= '0'; + p2_rd_error <= '0'; + p2_rd_full <= '0'; + p2_rd_empty <= '0'; + p2_rd_count <= (others => '0'); +-- p2_rd_error <= '0'; + end generate; +--u_config1_2R: if(C_PORT_CONFIG(183 downto 160) = "B32" and C_PORT_CONFIG(119 downto 96) = "R32") generate + +u_config1_2R: if(C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" ) generate + + p2_rd_ena : if (C_PORT_ENABLE(2) = '1') generate + mig_p2_clk <= p2_rd_clk; + p2_rd_data <= mig_p2_rd_data; + mig_p2_en <= p2_rd_en; + p2_rd_overflow <= mig_p2_overflow; + p2_rd_error <= mig_p2_error; + p2_rd_full <= mig_p2_full; + p2_rd_empty <= mig_p2_empty; + p2_rd_count <= mig_p2_count ;-- wr port + end generate; + p2_rd_dis : if (C_PORT_ENABLE(2) = '0') generate + mig_p2_clk <= '0'; + p2_rd_data <= (others => '0'); + mig_p2_en <= '0'; + + p2_rd_overflow <= '0'; + p2_rd_error <= '0'; + p2_rd_full <= '0'; + p2_rd_empty <= '0'; + p2_rd_count <= (others => '0'); + end generate; + mig_p2_wr_data <= (others => '0'); + mig_p2_wr_mask <= (others => '0'); + p2_wr_error <= '0'; + p2_wr_full <= '0'; + p2_wr_empty <= '0'; + p2_wr_underrun <= '0'; + p2_wr_count <= (others => '0'); + + end generate; +--u_config1_3W: if(C_PORT_CONFIG(183 downto 160) = "B32" and C_PORT_CONFIG(87 downto 64) = "W32") generate --whenever PORT 3 is in Write mode + +u_config1_3W: if( + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32") generate --whenever PORT 3 is in Write mode + +p3_wr_ena: if (C_PORT_ENABLE(3) = '1')generate + + mig_p3_clk <= p3_wr_clk; + mig_p3_wr_data <= p3_wr_data(31 downto 0); + mig_p3_wr_mask <= p3_wr_mask(3 downto 0); + mig_p3_en <= p3_wr_en; + p3_wr_full <= mig_p3_full; + p3_wr_empty <= mig_p3_empty; + p3_wr_underrun <= mig_p3_underrun; + p3_wr_count <= mig_p3_count ;-- wr port + p3_wr_error <= mig_p3_error; + end generate; + +p3_wr_dis: if (C_PORT_ENABLE(3) = '0')generate + mig_p3_clk <= '0'; + mig_p3_wr_data <= (others => '0'); + mig_p3_wr_mask <= (others => '0'); + mig_p3_en <= '0'; + p3_wr_full <= '0'; + p3_wr_empty <= '0'; + p3_wr_underrun <= '0'; + p3_wr_count <= (others => '0'); + p3_wr_error <= '0'; + + end generate; + p3_rd_overflow <= '0'; + p3_rd_error <= '0'; + p3_rd_full <= '0'; + p3_rd_empty <= '0'; + p3_rd_count <= (others => '0'); + p3_rd_data <= (others => '0'); + end generate; + +u_config1_3R : if( + C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32") generate + +p3_rd_ena: if (C_PORT_ENABLE(3) = '1') generate + + mig_p3_clk <= p3_rd_clk; + p3_rd_data <= mig_p3_rd_data; + mig_p3_en <= p3_rd_en; -- this signal will not shown up if the port 5 is for write dir + p3_rd_overflow <= mig_p3_overflow; + p3_rd_error <= mig_p3_error; + p3_rd_full <= mig_p3_full; + p3_rd_empty <= mig_p3_empty; + p3_rd_count <= mig_p3_count ;-- wr port + end generate; +p3_rd_dis: if (C_PORT_ENABLE(3) = '0') generate + mig_p3_clk <= '0'; + mig_p3_en <= '0'; + p3_rd_overflow <= '0'; + p3_rd_full <= '0'; + p3_rd_empty <= '0'; + p3_rd_count <= (others => '0'); + p3_rd_error <= '0'; + p3_rd_data <= (others => '0'); + end generate; + p3_wr_full <= '0'; + p3_wr_empty <= '0'; + p3_wr_underrun <= '0'; + p3_wr_count <= (others => '0'); + p3_wr_error <= '0'; + mig_p3_wr_data <= (others => '0'); + mig_p3_wr_mask <= (others => '0'); + end generate; + + +u_config1_4W: if( + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32") generate + -- whenever PORT 4 is in Write mode + +p4_wr_ena : if (C_PORT_ENABLE(4) = '1') generate + mig_p4_clk <= p4_wr_clk; + mig_p4_wr_data <= p4_wr_data(31 downto 0); + mig_p4_wr_mask <= p4_wr_mask(3 downto 0); + mig_p4_en <= p4_wr_en;-- this signal will not shown up if the port 5 is for read dir + p4_wr_full <= mig_p4_full; + p4_wr_empty <= mig_p4_empty; + p4_wr_underrun <= mig_p4_underrun; + p4_wr_count <= mig_p4_count ;-- wr port + p4_wr_error <= mig_p4_error; + end generate; + +p4_wr_dis : if (C_PORT_ENABLE(4) = '0') generate + mig_p4_clk <= '0'; + mig_p4_wr_data <= (others => '0'); + mig_p4_wr_mask <= (others => '0'); + mig_p4_en <= '0'; + p4_wr_full <= '0'; + p4_wr_empty <= '0'; + p4_wr_underrun <= '0'; + p4_wr_count <= (others => '0'); + p4_wr_error <= '0'; + end generate; + + p4_rd_overflow <= '0'; + p4_rd_error <= '0'; + p4_rd_full <= '0'; + p4_rd_empty <= '0'; + p4_rd_count <= (others => '0'); + p4_rd_data <= (others => '0'); + end generate; + +u_config1_4R : if( + C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32") generate + +p4_rd_ena: if (C_PORT_ENABLE(4) = '1') generate + mig_p4_clk <= p4_rd_clk; + p4_rd_data <= mig_p4_rd_data; + mig_p4_en <= p4_rd_en; -- this signal will not shown up if the port 5 is for write dir + p4_rd_overflow <= mig_p4_overflow; + p4_rd_error <= mig_p4_error; + p4_rd_full <= mig_p4_full; + p4_rd_empty <= mig_p4_empty; + p4_rd_count <= mig_p4_count ;-- wr port + end generate; +p4_rd_dis: if (C_PORT_ENABLE(4) = '0') generate + mig_p4_clk <= '0'; + p4_rd_data <= (others => '0'); + mig_p4_en <= '0'; + p4_rd_overflow <= '0'; + p4_rd_error <= '0'; + p4_rd_full <= '0'; + p4_rd_empty <= '0'; + p4_rd_count <= (others => '0'); + end generate; + p4_wr_full <= '0'; + p4_wr_empty <= '0'; + p4_wr_underrun <= '0'; + p4_wr_count <= (others => '0'); + p4_wr_error <= '0'; + mig_p4_wr_data <= (others => '0'); + mig_p4_wr_mask <= (others => '0'); + end generate; + +u_config1_5W: if( + C_PORT_CONFIG = "B32_B32_R32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_W32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_W32") generate + -- whenever PORT 5 is in Write mode + + +p5_wr_ena: if (C_PORT_ENABLE(5) = '1') generate + mig_p5_clk <= p5_wr_clk; + mig_p5_wr_data <= p5_wr_data(31 downto 0); + mig_p5_wr_mask <= p5_wr_mask(3 downto 0); + mig_p5_en <= p5_wr_en; + p5_wr_full <= mig_p5_full; + p5_wr_empty <= mig_p5_empty; + p5_wr_underrun <= mig_p5_underrun; + p5_wr_count <= mig_p5_count ; + p5_wr_error <= mig_p5_error; + +end generate; +p5_wr_dis: if (C_PORT_ENABLE(5) = '0') generate + mig_p5_clk <= '0'; + mig_p5_wr_data <= (others => '0'); + mig_p5_wr_mask <= (others => '0'); + mig_p5_en <= '0'; + p5_wr_full <= '0'; + p5_wr_empty <= '0'; + p5_wr_underrun <= '0'; + p5_wr_count <= (others => '0'); + p5_wr_error <= '0'; +end generate; + p5_rd_data <= (others => '0'); + p5_rd_overflow <= '0'; + p5_rd_error <= '0'; + p5_rd_full <= '0'; + p5_rd_empty <= '0'; + p5_rd_count <= (others => '0'); +end generate; + + + +u_config1_5R :if( + C_PORT_CONFIG = "B32_B32_R32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_R32_W32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_R32_W32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_R32_R32" or + C_PORT_CONFIG = "B32_B32_W32_W32_W32_R32") generate + +p5_rd_ena:if (C_PORT_ENABLE(5) = '1')generate + mig_p5_clk <= p5_rd_clk; + p5_rd_data <= mig_p5_rd_data; + mig_p5_en <= p5_rd_en; + p5_rd_overflow <= mig_p5_overflow; + p5_rd_error <= mig_p5_error; + p5_rd_full <= mig_p5_full; + p5_rd_empty <= mig_p5_empty; + p5_rd_count <= mig_p5_count ; + +end generate; + +p5_rd_dis:if (C_PORT_ENABLE(5) = '0')generate + + mig_p5_clk <= '0'; + p5_rd_data <= (others => '0'); + mig_p5_en <= '0'; + p5_rd_overflow <= '0'; + p5_rd_error <= '0'; + p5_rd_full <= '0'; + p5_rd_empty <= '0'; + p5_rd_count <= (others => '0'); + +end generate; + p5_wr_full <= '0'; + p5_wr_empty <= '0'; + p5_wr_underrun <= '0'; + p5_wr_count <= (others => '0'); + p5_wr_error <= '0'; + mig_p5_wr_data <= (others => '0'); + mig_p5_wr_mask <= (others => '0'); + +end generate; + + --////////////////////////////////////////////////////////////////////////// + --/////////////////////////////////////////////////////////////////////////// + ---- + ---- B32_B32_B32_B32 + ---- + --/////////////////////////////////////////////////////////////////////////// + --////////////////////////////////////////////////////////////////////////// + +u_config_2 : if(C_PORT_CONFIG = "B32_B32_B32_B32" ) generate + + + -- Inputs from Application CMD Port + -- ************* need to hook up rd /wr error outputs + +p0_c2_ena: if (C_PORT_ENABLE(0) = '1') generate + -- command port signals + mig_p0_arb_en <= p0_arb_en ; + mig_p0_cmd_clk <= p0_cmd_clk ; + mig_p0_cmd_en <= p0_cmd_en ; + mig_p0_cmd_ra <= p0_cmd_ra ; + mig_p0_cmd_ba <= p0_cmd_ba ; + mig_p0_cmd_ca <= p0_cmd_ca ; + mig_p0_cmd_instr <= p0_cmd_instr; + mig_p0_cmd_bl <= ((p0_cmd_instr(2) or p0_cmd_bl(5)) & p0_cmd_bl(4 downto 0)) ; + -- Data port signals + mig_p0_rd_en <= p0_rd_en; + mig_p0_wr_clk <= p0_wr_clk; + mig_p0_rd_clk <= p0_rd_clk; + mig_p0_wr_en <= p0_wr_en; + mig_p0_wr_data <= p0_wr_data(31 downto 0); + mig_p0_wr_mask <= p0_wr_mask(3 downto 0); + p0_wr_count <= mig_p0_wr_count; + p0_rd_count <= mig_p0_rd_count ; +end generate; + +p0_c2_dis: if (C_PORT_ENABLE(0) = '0') generate + + mig_p0_arb_en <= '0'; + mig_p0_cmd_clk <= '0'; + mig_p0_cmd_en <= '0'; + mig_p0_cmd_ra <= (others => '0'); + mig_p0_cmd_ba <= (others => '0'); + mig_p0_cmd_ca <= (others => '0'); + mig_p0_cmd_instr <= (others => '0'); + mig_p0_cmd_bl <= (others => '0'); + + mig_p0_rd_en <= '0'; + mig_p0_wr_clk <= '0'; + mig_p0_rd_clk <= '0'; + mig_p0_wr_en <= '0'; + mig_p0_wr_data <= (others => '0'); + mig_p0_wr_mask <= (others => '0'); + p0_wr_count <= (others => '0'); + p0_rd_count <= (others => '0'); + + +end generate; + + + +p1_c2_ena: if (C_PORT_ENABLE(1) = '1') generate + -- command port signals + + mig_p1_arb_en <= p1_arb_en ; + mig_p1_cmd_clk <= p1_cmd_clk ; + mig_p1_cmd_en <= p1_cmd_en ; + mig_p1_cmd_ra <= p1_cmd_ra ; + mig_p1_cmd_ba <= p1_cmd_ba ; + mig_p1_cmd_ca <= p1_cmd_ca ; + mig_p1_cmd_instr <= p1_cmd_instr; + mig_p1_cmd_bl <= ((p1_cmd_instr(2) or p1_cmd_bl(5)) & p1_cmd_bl(4 downto 0)) ; + + -- Data port signals + + mig_p1_wr_en <= p1_wr_en; + mig_p1_wr_clk <= p1_wr_clk; + mig_p1_rd_en <= p1_rd_en; + mig_p1_wr_data <= p1_wr_data(31 downto 0); + mig_p1_wr_mask <= p1_wr_mask(3 downto 0); + mig_p1_rd_clk <= p1_rd_clk; + p1_wr_count <= mig_p1_wr_count; + p1_rd_count <= mig_p1_rd_count; + +end generate; +p1_c2_dis: if (C_PORT_ENABLE(1) = '0') generate + + mig_p1_arb_en <= '0'; + mig_p1_cmd_clk <= '0'; + mig_p1_cmd_en <= '0'; + mig_p1_cmd_ra <= (others => '0'); + mig_p1_cmd_ba <= (others => '0'); + mig_p1_cmd_ca <= (others => '0'); + mig_p1_cmd_instr <= (others => '0'); + mig_p1_cmd_bl <= (others => '0'); + -- Data port signals + mig_p1_wr_en <= '0'; + mig_p1_wr_clk <= '0'; + mig_p1_rd_en <= '0'; + mig_p1_wr_data <= (others => '0'); + mig_p1_wr_mask <= (others => '0'); + mig_p1_rd_clk <= '0'; + p1_wr_count <= (others => '0'); + p1_rd_count <= (others => '0'); + +end generate; + + + +p2_c2_ena :if (C_PORT_ENABLE(2) = '1') generate + --MCB Physical port Logical Port + mig_p2_arb_en <= p2_arb_en ; + mig_p2_cmd_clk <= p2_cmd_clk ; + mig_p2_cmd_en <= p2_cmd_en ; + mig_p2_cmd_ra <= p2_cmd_ra ; + mig_p2_cmd_ba <= p2_cmd_ba ; + mig_p2_cmd_ca <= p2_cmd_ca ; + mig_p2_cmd_instr <= p2_cmd_instr; + mig_p2_cmd_bl <= ((p2_cmd_instr(2) or p2_cmd_bl(5)) & p2_cmd_bl(4 downto 0)) ; + + mig_p2_en <= p2_rd_en; + mig_p2_clk <= p2_rd_clk; + mig_p3_en <= p2_wr_en; + mig_p3_clk <= p2_wr_clk; + mig_p3_wr_data <= p2_wr_data(31 downto 0); + mig_p3_wr_mask <= p2_wr_mask(3 downto 0); + p2_wr_count <= mig_p3_count; + p2_rd_count <= mig_p2_count; +end generate; +p2_c2_dis :if (C_PORT_ENABLE(2) = '0') generate + + mig_p2_arb_en <= '0'; + mig_p2_cmd_clk <= '0'; + mig_p2_cmd_en <= '0'; + mig_p2_cmd_ra <= (others => '0'); + mig_p2_cmd_ba <= (others => '0'); + mig_p2_cmd_ca <= (others => '0'); + mig_p2_cmd_instr <= (others => '0'); + mig_p2_cmd_bl <= (others => '0'); + + mig_p2_en <= '0'; + mig_p2_clk <= '0'; + mig_p3_en <= '0'; + mig_p3_clk <= '0'; + mig_p3_wr_data <= (others => '0'); + mig_p3_wr_mask <= (others => '0'); + p2_rd_count <= (others => '0'); + p2_wr_count <= (others => '0'); + +end generate; + + +p3_c2_ena: if (C_PORT_ENABLE(3) = '1') generate + --MCB Physical port Logical Port + mig_p4_arb_en <= p3_arb_en ; + mig_p4_cmd_clk <= p3_cmd_clk ; + mig_p4_cmd_en <= p3_cmd_en ; + mig_p4_cmd_ra <= p3_cmd_ra ; + mig_p4_cmd_ba <= p3_cmd_ba ; + mig_p4_cmd_ca <= p3_cmd_ca ; + mig_p4_cmd_instr <= p3_cmd_instr; + mig_p4_cmd_bl <= ((p3_cmd_instr(2) or p3_cmd_bl(5)) & p3_cmd_bl(4 downto 0)) ; + + mig_p4_clk <= p3_rd_clk; + mig_p4_en <= p3_rd_en; + mig_p5_clk <= p3_wr_clk; + mig_p5_en <= p3_wr_en; + mig_p5_wr_data <= p3_wr_data(31 downto 0); + mig_p5_wr_mask <= p3_wr_mask(3 downto 0); + p3_rd_count <= mig_p4_count; + p3_wr_count <= mig_p5_count; +end generate; + +p3_c2_dis: if (C_PORT_ENABLE(3) = '0') generate + mig_p4_arb_en <= '0'; + mig_p4_cmd_clk <= '0'; + mig_p4_cmd_en <= '0'; + mig_p4_cmd_ra <= (others => '0'); + mig_p4_cmd_ba <= (others => '0'); + mig_p4_cmd_ca <= (others => '0'); + mig_p4_cmd_instr <= (others => '0'); + mig_p4_cmd_bl <= (others => '0'); + + mig_p4_clk <= '0'; + mig_p4_en <= '0'; + mig_p5_clk <= '0'; + mig_p5_en <= '0'; + mig_p5_wr_data <= (others => '0'); + mig_p5_wr_mask <= (others => '0'); + p3_rd_count <= (others => '0'); + p3_wr_count <= (others => '0'); +end generate; + + p0_cmd_empty <= mig_p0_cmd_empty ; + p0_cmd_full <= mig_p0_cmd_full ; + p1_cmd_empty <= mig_p1_cmd_empty ; + p1_cmd_full <= mig_p1_cmd_full ; + p2_cmd_empty <= mig_p2_cmd_empty ; + p2_cmd_full <= mig_p2_cmd_full ; + p3_cmd_empty <= mig_p4_cmd_empty ; + p3_cmd_full <= mig_p4_cmd_full ; + + + -- outputs to Applications User Port + p0_rd_data <= mig_p0_rd_data; + p1_rd_data <= mig_p1_rd_data; + p2_rd_data <= mig_p2_rd_data; + p3_rd_data <= mig_p4_rd_data; + + p0_rd_empty_i <= mig_p0_rd_empty; + p1_rd_empty_i <= mig_p1_rd_empty; + p2_rd_empty <= mig_p2_empty; + p3_rd_empty <= mig_p4_empty; + + p0_rd_full <= mig_p0_rd_full; + p1_rd_full <= mig_p1_rd_full; + p2_rd_full <= mig_p2_full; + p3_rd_full <= mig_p4_full; + + p0_rd_error <= mig_p0_rd_error; + p1_rd_error <= mig_p1_rd_error; + p2_rd_error <= mig_p2_error; + p3_rd_error <= mig_p4_error; + + p0_rd_overflow <= mig_p0_rd_overflow; + p1_rd_overflow <= mig_p1_rd_overflow; + p2_rd_overflow <= mig_p2_overflow; + p3_rd_overflow <= mig_p4_overflow; + + p0_wr_underrun <= mig_p0_wr_underrun; + p1_wr_underrun <= mig_p1_wr_underrun; + p2_wr_underrun <= mig_p3_underrun; + p3_wr_underrun <= mig_p5_underrun; + + p0_wr_empty <= mig_p0_wr_empty; + p1_wr_empty <= mig_p1_wr_empty; + p2_wr_empty <= mig_p3_empty; + p3_wr_empty <= mig_p5_empty; + + p0_wr_full_i <= mig_p0_wr_full; + p1_wr_full_i <= mig_p1_wr_full; + p2_wr_full <= mig_p3_full; + p3_wr_full <= mig_p5_full; + + p0_wr_error <= mig_p0_wr_error; + p1_wr_error <= mig_p1_wr_error; + p2_wr_error <= mig_p3_error; + p3_wr_error <= mig_p5_error; + + -- unused ports signals + p4_cmd_empty <= '0'; + p4_cmd_full <= '0'; + mig_p2_wr_mask <= (others => '0'); + mig_p4_wr_mask <= (others => '0'); + + mig_p2_wr_data <= (others => '0'); + mig_p4_wr_data <= (others => '0'); + + + p5_cmd_empty <= '0'; + p5_cmd_full <= '0'; + + + mig_p3_cmd_clk <= '0'; + mig_p3_cmd_en <= '0'; + mig_p3_cmd_ra <= (others => '0'); + mig_p3_cmd_ba <= (others => '0'); + mig_p3_cmd_ca <= (others => '0'); + mig_p3_cmd_instr <= (others => '0'); + mig_p3_cmd_bl <= (others => '0'); + mig_p3_arb_en <= '0'; -- physical cmd port 3 is not used in this config + + + + + mig_p5_arb_en <= '0'; -- physical cmd port 3 is not used in this config + mig_p5_cmd_clk <= '0'; + mig_p5_cmd_en <= '0'; + mig_p5_cmd_ra <= (others => '0'); + mig_p5_cmd_ba <= (others => '0'); + mig_p5_cmd_ca <= (others => '0'); + mig_p5_cmd_instr <= (others => '0'); + mig_p5_cmd_bl <= (others => '0'); + +end generate; +-- +-- +-- --////////////////////////////////////////////////////////////////////////// +-- --/////////////////////////////////////////////////////////////////////////// +-- ---- +-- ---- B64_B32_B32 +-- ---- +-- --/////////////////////////////////////////////////////////////////////////// +-- --////////////////////////////////////////////////////////////////////////// +-- +-- +-- +u_config_3:if(C_PORT_CONFIG = "B64_B32_B32" ) generate + + -- Inputs from Application CMD Port + + +p0_c3_ena : if (C_PORT_ENABLE(0) = '1') generate + mig_p0_arb_en <= p0_arb_en ; + mig_p0_cmd_clk <= p0_cmd_clk ; + mig_p0_cmd_en <= p0_cmd_en ; + mig_p0_cmd_ra <= p0_cmd_ra ; + mig_p0_cmd_ba <= p0_cmd_ba ; + mig_p0_cmd_ca <= p0_cmd_ca ; + mig_p0_cmd_instr <= p0_cmd_instr; + mig_p0_cmd_bl <= ((p0_cmd_instr(2) or p0_cmd_bl(5)) & p0_cmd_bl(4 downto 0)) ; + p0_cmd_empty <= mig_p0_cmd_empty ; + p0_cmd_full <= mig_p0_cmd_full ; + + mig_p0_wr_clk <= p0_wr_clk; + mig_p0_rd_clk <= p0_rd_clk; + mig_p1_wr_clk <= p0_wr_clk; + mig_p1_rd_clk <= p0_rd_clk; + + mig_p0_wr_en <= p0_wr_en and not p0_wr_full_i; + mig_p1_wr_en <= p0_wr_en and not p0_wr_full_i; + mig_p0_wr_data <= p0_wr_data(31 downto 0); + mig_p0_wr_mask(3 downto 0) <= p0_wr_mask(3 downto 0); + mig_p1_wr_data <= p0_wr_data(63 downto 32); + mig_p1_wr_mask(3 downto 0) <= p0_wr_mask(7 downto 4); + + p0_rd_empty_i <= mig_p1_rd_empty; + p0_rd_data <= (mig_p1_rd_data & mig_p0_rd_data); + mig_p0_rd_en <= p0_rd_en and not p0_rd_empty_i; + mig_p1_rd_en <= p0_rd_en and not p0_rd_empty_i; + + + p0_wr_count <= mig_p1_wr_count; -- B64 for port 0, map most significant port to output + p0_rd_count <= mig_p1_rd_count; + p0_wr_empty <= mig_p1_wr_empty; + p0_wr_error <= mig_p1_wr_error or mig_p0_wr_error; + p0_wr_full_i <= mig_p1_wr_full; + p0_wr_underrun <= mig_p1_wr_underrun or mig_p0_wr_underrun; + p0_rd_overflow <= mig_p1_rd_overflow or mig_p0_rd_overflow; + p0_rd_error <= mig_p1_rd_error or mig_p0_rd_error; + p0_rd_full <= mig_p1_rd_full; + +end generate; +p0_c3_dis: if (C_PORT_ENABLE(0) = '0') generate + + mig_p0_arb_en <= '0'; + mig_p0_cmd_clk <= '0'; + mig_p0_cmd_en <= '0'; + mig_p0_cmd_ra <= (others => '0'); + mig_p0_cmd_ba <= (others => '0'); + mig_p0_cmd_ca <= (others => '0'); + mig_p0_cmd_instr <= (others => '0'); + mig_p0_cmd_bl <= (others => '0'); + p0_cmd_empty <= '0'; + p0_cmd_full <= '0'; + + + mig_p0_wr_clk <= '0'; + mig_p0_rd_clk <= '0'; + mig_p1_wr_clk <= '0'; + mig_p1_rd_clk <= '0'; + + mig_p0_wr_en <= '0'; + mig_p1_wr_en <= '0'; + mig_p0_wr_data <= (others => '0'); + mig_p0_wr_mask <= (others => '0'); + mig_p1_wr_data <= (others => '0'); + mig_p1_wr_mask <= (others => '0'); + + p0_rd_empty_i <= '0'; + p0_rd_data <= (others => '0'); + mig_p0_rd_en <= '0'; + mig_p1_rd_en <= '0'; + + + p0_wr_count <= (others => '0'); + p0_rd_count <= (others => '0'); + p0_wr_empty <= '0'; + p0_wr_error <= '0'; + p0_wr_full_i <= '0'; + p0_wr_underrun <= '0'; + p0_rd_overflow <= '0'; + p0_rd_error <= '0'; + p0_rd_full <= '0'; +end generate; + + + + +p1_c3_ena: if (C_PORT_ENABLE(1) = '1')generate + + mig_p2_arb_en <= p1_arb_en ; + mig_p2_cmd_clk <= p1_cmd_clk ; + mig_p2_cmd_en <= p1_cmd_en ; + mig_p2_cmd_ra <= p1_cmd_ra ; + mig_p2_cmd_ba <= p1_cmd_ba ; + mig_p2_cmd_ca <= p1_cmd_ca ; + mig_p2_cmd_instr <= p1_cmd_instr; + mig_p2_cmd_bl <= ((p1_cmd_instr(2) or p1_cmd_bl(5)) & p1_cmd_bl(4 downto 0)) ; + + p1_cmd_empty <= mig_p2_cmd_empty; + p1_cmd_full <= mig_p2_cmd_full; + + mig_p2_clk <= p1_rd_clk; + mig_p3_clk <= p1_wr_clk; + + mig_p3_en <= p1_wr_en; + mig_p3_wr_data <= p1_wr_data(31 downto 0); + mig_p3_wr_mask <= p1_wr_mask(3 downto 0); + mig_p2_en <= p1_rd_en; + + p1_rd_data <= mig_p2_rd_data; + p1_wr_count <= mig_p3_count; + p1_rd_count <= mig_p2_count; + p1_wr_empty <= mig_p3_empty; + p1_wr_error <= mig_p3_error; + p1_wr_full_i <= mig_p3_full; + p1_wr_underrun <= mig_p3_underrun; + p1_rd_overflow <= mig_p2_overflow; + p1_rd_error <= mig_p2_error; + p1_rd_full <= mig_p2_full; + p1_rd_empty_i <= mig_p2_empty; + end generate; + +p1_c3_dis: if (C_PORT_ENABLE(1) = '0')generate + + mig_p2_arb_en <= '0'; + mig_p2_cmd_clk <= '0'; + mig_p2_cmd_en <= '0'; + mig_p2_cmd_ra <= (others => '0'); + mig_p2_cmd_ba <= (others => '0'); + mig_p2_cmd_ca <= (others => '0'); + mig_p2_cmd_instr <= (others => '0'); + mig_p2_cmd_bl <= (others => '0'); + p1_cmd_empty <= '0'; + p1_cmd_full <= '0'; + mig_p3_en <= '0'; + mig_p3_wr_data <= (others => '0'); + mig_p3_wr_mask <= (others => '0'); + mig_p2_en <= '0'; + + mig_p2_clk <= '0'; + mig_p3_clk <= '0'; + + p1_rd_data <= (others => '0'); + p1_wr_count <= (others => '0'); + p1_rd_count <= (others => '0'); + p1_wr_empty <= '0'; + p1_wr_error <= '0'; + p1_wr_full_i <= '0'; + p1_wr_underrun <= '0'; + p1_rd_overflow <= '0'; + p1_rd_error <= '0'; + p1_rd_full <= '0'; + p1_rd_empty_i <= '0'; + +end generate; + +p2_c3_ena: if (C_PORT_ENABLE(2) = '1')generate + mig_p4_arb_en <= p2_arb_en ; + mig_p4_cmd_clk <= p2_cmd_clk ; + mig_p4_cmd_en <= p2_cmd_en ; + mig_p4_cmd_ra <= p2_cmd_ra ; + mig_p4_cmd_ba <= p2_cmd_ba ; + mig_p4_cmd_ca <= p2_cmd_ca ; + mig_p4_cmd_instr <= p2_cmd_instr; + mig_p4_cmd_bl <= ((p2_cmd_instr(2) or p2_cmd_bl(5)) & p2_cmd_bl(4 downto 0)) ; + + p2_cmd_empty <= mig_p4_cmd_empty ; + p2_cmd_full <= mig_p4_cmd_full ; + mig_p5_en <= p2_wr_en; + mig_p5_wr_data <= p2_wr_data(31 downto 0); + mig_p5_wr_mask <= p2_wr_mask(3 downto 0); + mig_p4_en <= p2_rd_en; + + mig_p4_clk <= p2_rd_clk; + mig_p5_clk <= p2_wr_clk; + + p2_rd_data <= mig_p4_rd_data; + p2_wr_count <= mig_p5_count; + p2_rd_count <= mig_p4_count; + p2_wr_empty <= mig_p5_empty; + p2_wr_full <= mig_p5_full; + p2_wr_error <= mig_p5_error; + p2_wr_underrun <= mig_p5_underrun; + p2_rd_overflow <= mig_p4_overflow; + p2_rd_error <= mig_p4_error; + p2_rd_full <= mig_p4_full; + p2_rd_empty <= mig_p4_empty; + +end generate; + +p2_c3_dis: if (C_PORT_ENABLE(2) = '0')generate + + mig_p4_arb_en <= '0'; + mig_p4_cmd_clk <= '0'; + mig_p4_cmd_en <= '0'; + mig_p4_cmd_ra <= (others => '0'); + mig_p4_cmd_ba <= (others => '0'); + mig_p4_cmd_ca <= (others => '0'); + mig_p4_cmd_instr <= (others => '0'); + mig_p4_cmd_bl <= (others => '0'); + p2_cmd_empty <= '0'; + p2_cmd_full <= '0'; + mig_p5_en <= '0'; + mig_p5_wr_data <= (others => '0'); + mig_p5_wr_mask <= (others => '0'); + mig_p4_en <= '0'; + + mig_p4_clk <= '0'; + mig_p5_clk <= '0'; + + p2_rd_data <= (others => '0'); + p2_wr_count <= (others => '0'); + p2_rd_count <= (others => '0'); + p2_wr_empty <= '0'; + p2_wr_full <= '0'; + p2_wr_error <= '0'; + p2_wr_underrun <= '0'; + p2_rd_overflow <= '0'; + p2_rd_error <= '0'; + p2_rd_full <= '0'; + p2_rd_empty <= '0'; + +end generate; + + -- MCB's port 1,3,5 is not used in this Config mode + mig_p1_arb_en <= '0'; + mig_p1_cmd_clk <= '0'; + mig_p1_cmd_en <= '0'; + mig_p1_cmd_ra <= (others => '0'); + mig_p1_cmd_ba <= (others => '0'); + mig_p1_cmd_ca <= (others => '0'); + + mig_p1_cmd_instr <= (others => '0'); + mig_p1_cmd_bl <= (others => '0'); + + mig_p3_arb_en <= '0'; + mig_p3_cmd_clk <= '0'; + mig_p3_cmd_en <= '0'; + mig_p3_cmd_ra <= (others => '0'); + mig_p3_cmd_ba <= (others => '0'); + mig_p3_cmd_ca <= (others => '0'); + + mig_p3_cmd_instr <= (others => '0'); + mig_p3_cmd_bl <= (others => '0'); + + mig_p5_arb_en <= '0'; + mig_p5_cmd_clk <= '0'; + mig_p5_cmd_en <= '0'; + mig_p5_cmd_ra <= (others => '0'); + mig_p5_cmd_ba <= (others => '0'); + mig_p5_cmd_ca <= (others => '0'); + + mig_p5_cmd_instr <= (others => '0'); + mig_p5_cmd_bl <= (others => '0'); + +end generate; + +u_config_4 : if(C_PORT_CONFIG = "B64_B64" ) generate + + -- Inputs from Application CMD Port + +p0_c4_ena: if (C_PORT_ENABLE(0) = '1') generate + + mig_p0_arb_en <= p0_arb_en ; + mig_p1_arb_en <= p0_arb_en ; + + mig_p0_cmd_clk <= p0_cmd_clk ; + mig_p0_cmd_en <= p0_cmd_en ; + mig_p0_cmd_ra <= p0_cmd_ra ; + mig_p0_cmd_ba <= p0_cmd_ba ; + mig_p0_cmd_ca <= p0_cmd_ca ; + mig_p0_cmd_instr <= p0_cmd_instr; + mig_p0_cmd_bl <= ((p0_cmd_instr(2) or p0_cmd_bl(5)) & p0_cmd_bl(4 downto 0)) ; + + mig_p0_wr_clk <= p0_wr_clk; + mig_p0_rd_clk <= p0_rd_clk; + mig_p1_wr_clk <= p0_wr_clk; + mig_p1_rd_clk <= p0_rd_clk; + mig_p0_wr_en <= p0_wr_en and not p0_wr_full_i; + mig_p0_wr_data <= p0_wr_data(31 downto 0); + mig_p0_wr_mask(3 downto 0) <= p0_wr_mask(3 downto 0); + mig_p1_wr_data <= p0_wr_data(63 downto 32); + mig_p1_wr_mask(3 downto 0) <= p0_wr_mask(7 downto 4); + mig_p1_wr_en <= p0_wr_en and not p0_wr_full_i; + mig_p0_rd_en <= p0_rd_en and not p0_rd_empty_i; + mig_p1_rd_en <= p0_rd_en and not p0_rd_empty_i; + p0_rd_data <= (mig_p1_rd_data & mig_p0_rd_data); + + p0_cmd_empty <= mig_p0_cmd_empty ; + p0_cmd_full <= mig_p0_cmd_full ; + p0_wr_empty <= mig_p1_wr_empty; + p0_wr_full_i <= mig_p1_wr_full; + p0_wr_error <= mig_p1_wr_error or mig_p0_wr_error; + p0_wr_count <= mig_p1_wr_count; + p0_rd_count <= mig_p1_rd_count; + p0_wr_underrun <= mig_p1_wr_underrun or mig_p0_wr_underrun; + p0_rd_overflow <= mig_p1_rd_overflow or mig_p0_rd_overflow; + p0_rd_error <= mig_p1_rd_error or mig_p0_rd_error; + p0_rd_full <= mig_p1_rd_full; + p0_rd_empty_i <= mig_p1_rd_empty; +end generate; + +p0_c4_dis: if (C_PORT_ENABLE(0) = '0') generate + mig_p0_arb_en <= '0'; + mig_p0_cmd_clk <= '0'; + mig_p0_cmd_en <= '0'; + mig_p0_cmd_ra <= (others => '0'); + mig_p0_cmd_ba <= (others => '0'); + mig_p0_cmd_ca <= (others => '0'); + mig_p0_cmd_instr <= (others => '0'); + mig_p0_cmd_bl <= (others => '0'); + + mig_p0_wr_clk <= '0'; + mig_p0_rd_clk <= '0'; + mig_p1_wr_clk <= '0'; + mig_p1_rd_clk <= '0'; + mig_p0_wr_en <= '0'; + mig_p1_wr_en <= '0'; + mig_p0_wr_data <= (others => '0'); + mig_p0_wr_mask <= (others => '0'); + mig_p1_wr_data <= (others => '0'); + mig_p1_wr_mask <= (others => '0'); + -- mig_p1_wr_en <= (others => '0'); + mig_p0_rd_en <= '0'; + mig_p1_rd_en <= '0'; + p0_rd_data <= (others => '0'); + + + p0_cmd_empty <= '0'; + p0_cmd_full <= '0'; + p0_wr_empty <= '0'; + p0_wr_full_i <= '0'; + p0_wr_error <= '0'; + p0_wr_count <= (others => '0'); + p0_rd_count <= (others => '0'); + p0_wr_underrun <= '0'; + p0_rd_overflow <= '0'; + p0_rd_error <= '0'; + p0_rd_full <= '0'; + p0_rd_empty_i <= '0'; + + +end generate; + + +p1_c4_ena: if (C_PORT_ENABLE(1) = '1') generate + + mig_p2_arb_en <= p1_arb_en ; + + mig_p2_cmd_clk <= p1_cmd_clk ; + mig_p2_cmd_en <= p1_cmd_en ; + mig_p2_cmd_ra <= p1_cmd_ra ; + mig_p2_cmd_ba <= p1_cmd_ba ; + mig_p2_cmd_ca <= p1_cmd_ca ; + mig_p2_cmd_instr <= p1_cmd_instr; + mig_p2_cmd_bl <= ((p1_cmd_instr(2) or p1_cmd_bl(5)) & p1_cmd_bl(4 downto 0)) ; + + + mig_p2_clk <= p1_rd_clk; + mig_p3_clk <= p1_wr_clk; + mig_p4_clk <= p1_rd_clk; + mig_p5_clk <= p1_wr_clk; + mig_p3_en <= p1_wr_en and not p1_wr_full_i; + mig_p5_en <= p1_wr_en and not p1_wr_full_i; + mig_p3_wr_data <= p1_wr_data(31 downto 0); + mig_p3_wr_mask <= p1_wr_mask(3 downto 0); + mig_p5_wr_data <= p1_wr_data(63 downto 32); + mig_p5_wr_mask <= p1_wr_mask(7 downto 4); + mig_p2_en <= p1_rd_en and not p1_rd_empty_i; + mig_p4_en <= p1_rd_en and not p1_rd_empty_i; + + p1_cmd_empty <= mig_p2_cmd_empty ; + p1_cmd_full <= mig_p2_cmd_full ; + + p1_wr_count <= mig_p5_count; + p1_rd_count <= mig_p4_count; + p1_wr_full_i <= mig_p5_full; + p1_wr_error <= mig_p5_error or mig_p5_error; + p1_wr_empty <= mig_p5_empty; + p1_wr_underrun <= mig_p3_underrun or mig_p5_underrun; + p1_rd_overflow <= mig_p4_overflow; + p1_rd_error <= mig_p4_error; + p1_rd_full <= mig_p4_full; + p1_rd_empty_i <= mig_p4_empty; + + p1_rd_data <= (mig_p4_rd_data & mig_p2_rd_data); + +end generate; +p1_c4_dis: if (C_PORT_ENABLE(1) = '0') generate + + mig_p2_arb_en <= '0'; + -- mig_p3_arb_en <= (others => '0'); + -- mig_p4_arb_en <= (others => '0'); + -- mig_p5_arb_en <= (others => '0'); + + mig_p2_cmd_clk <= '0'; + mig_p2_cmd_en <= '0'; + mig_p2_cmd_ra <= (others => '0'); + mig_p2_cmd_ba <= (others => '0'); + mig_p2_cmd_ca <= (others => '0'); + mig_p2_cmd_instr <= (others => '0'); + mig_p2_cmd_bl <= (others => '0'); + mig_p2_clk <= '0'; + mig_p3_clk <= '0'; + mig_p4_clk <= '0'; + mig_p5_clk <= '0'; + mig_p3_en <= '0'; + mig_p5_en <= '0'; + mig_p3_wr_data <= (others => '0'); + mig_p3_wr_mask <= (others => '0'); + mig_p5_wr_data <= (others => '0'); + mig_p5_wr_mask <= (others => '0'); + mig_p2_en <= '0'; + mig_p4_en <= '0'; + p1_cmd_empty <= '0'; + p1_cmd_full <= '0'; + + p1_wr_count <= (others => '0'); + p1_rd_count <= (others => '0'); + p1_wr_full_i <= '0'; + p1_wr_error <= '0'; + p1_wr_empty <= '0'; + p1_wr_underrun <= '0'; + p1_rd_overflow <= '0'; + p1_rd_error <= '0'; + p1_rd_full <= '0'; + p1_rd_empty_i <= '0'; + p1_rd_data <= (others => '0'); + +end generate; + + -- unused MCB's signals in this configuration + mig_p3_arb_en <= '0'; + mig_p4_arb_en <= '0'; + mig_p5_arb_en <= '0'; + + mig_p3_cmd_clk <= '0'; + mig_p3_cmd_en <= '0'; + mig_p3_cmd_ra <= (others => '0'); + mig_p3_cmd_ba <= (others => '0'); + mig_p3_cmd_ca <= (others => '0'); + mig_p3_cmd_instr <= (others => '0'); + + mig_p4_cmd_clk <= '0'; + mig_p4_cmd_en <= '0'; + mig_p4_cmd_ra <= (others => '0'); + mig_p4_cmd_ba <= (others => '0'); + mig_p4_cmd_ca <= (others => '0'); + mig_p4_cmd_instr <= (others => '0'); + mig_p4_cmd_bl <= (others => '0'); + + mig_p5_cmd_clk <= '0'; + mig_p5_cmd_en <= '0'; + mig_p5_cmd_ra <= (others => '0'); + mig_p5_cmd_ba <= (others => '0'); + mig_p5_cmd_ca <= (others => '0'); + mig_p5_cmd_instr <= (others => '0'); + mig_p5_cmd_bl <= (others => '0'); + + end generate; + + +--*******************************BEGIN OF CONFIG 5 SIGNALS ******************************** + +u_config_5: if(C_PORT_CONFIG = "B128" ) generate + + + -- Inputs from Application CMD Port + + mig_p0_arb_en <= p0_arb_en ; + mig_p0_cmd_clk <= p0_cmd_clk ; + mig_p0_cmd_en <= p0_cmd_en ; + mig_p0_cmd_ra <= p0_cmd_ra ; + mig_p0_cmd_ba <= p0_cmd_ba ; + mig_p0_cmd_ca <= p0_cmd_ca ; + mig_p0_cmd_instr <= p0_cmd_instr; + mig_p0_cmd_bl <= ((p0_cmd_instr(2) or p0_cmd_bl(5)) & p0_cmd_bl(4 downto 0)) ; + p0_cmd_empty <= mig_p0_cmd_empty ; + p0_cmd_full <= mig_p0_cmd_full ; + + + + -- Inputs from Application User Port + + mig_p0_wr_clk <= p0_wr_clk; + mig_p0_rd_clk <= p0_rd_clk; + mig_p1_wr_clk <= p0_wr_clk; + mig_p1_rd_clk <= p0_rd_clk; + + mig_p2_clk <= p0_rd_clk; + mig_p3_clk <= p0_wr_clk; + mig_p4_clk <= p0_rd_clk; + mig_p5_clk <= p0_wr_clk; + + + + mig_p0_wr_en <= p0_wr_en and not p0_wr_full_i; + mig_p1_wr_en <= p0_wr_en and not p0_wr_full_i; + mig_p3_en <= p0_wr_en and not p0_wr_full_i; + mig_p5_en <= p0_wr_en and not p0_wr_full_i; + + + + mig_p0_wr_data <= p0_wr_data(31 downto 0); + mig_p0_wr_mask(3 downto 0) <= p0_wr_mask(3 downto 0); + mig_p1_wr_data <= p0_wr_data(63 downto 32); + mig_p1_wr_mask(3 downto 0) <= p0_wr_mask(7 downto 4); + mig_p3_wr_data <= p0_wr_data(95 downto 64); + mig_p3_wr_mask(3 downto 0) <= p0_wr_mask(11 downto 8); + mig_p5_wr_data <= p0_wr_data(127 downto 96); + mig_p5_wr_mask(3 downto 0) <= p0_wr_mask(15 downto 12); + + mig_p0_rd_en <= p0_rd_en and not p0_rd_empty_i; + mig_p1_rd_en <= p0_rd_en and not p0_rd_empty_i; + mig_p2_en <= p0_rd_en and not p0_rd_empty_i; + mig_p4_en <= p0_rd_en and not p0_rd_empty_i; + + -- outputs to Applications User Port + p0_rd_data <= (mig_p4_rd_data & mig_p2_rd_data & mig_p1_rd_data & mig_p0_rd_data); + p0_rd_empty_i <= mig_p4_empty; + p0_rd_full <= mig_p4_full; + p0_rd_error <= mig_p0_rd_error or mig_p1_rd_error or mig_p2_error or mig_p4_error; + p0_rd_overflow <= mig_p0_rd_overflow or mig_p1_rd_overflow or mig_p2_overflow or mig_p4_overflow; + + p0_wr_underrun <= mig_p0_wr_underrun or mig_p1_wr_underrun or mig_p3_underrun or mig_p5_underrun; + p0_wr_empty <= mig_p5_empty; + p0_wr_full_i <= mig_p5_full; + p0_wr_error <= mig_p0_wr_error or mig_p1_wr_error or mig_p3_error or mig_p5_error; + + p0_wr_count <= mig_p5_count; + p0_rd_count <= mig_p4_count; + + + -- unused MCB's siganls in this configuration + + mig_p1_arb_en <= '0'; + mig_p1_cmd_clk <= '0'; + mig_p1_cmd_en <= '0'; + mig_p1_cmd_ra <= (others => '0'); + mig_p1_cmd_ba <= (others => '0'); + mig_p1_cmd_ca <= (others => '0'); + + mig_p1_cmd_instr <= (others => '0'); + mig_p1_cmd_bl <= (others => '0'); + + mig_p2_arb_en <= '0'; + mig_p2_cmd_clk <= '0'; + mig_p2_cmd_en <= '0'; + mig_p2_cmd_ra <= (others => '0'); + mig_p2_cmd_ba <= (others => '0'); + mig_p2_cmd_ca <= (others => '0'); + + mig_p2_cmd_instr <= (others => '0'); + mig_p2_cmd_bl <= (others => '0'); + + mig_p3_arb_en <= '0'; + mig_p3_cmd_clk <= '0'; + mig_p3_cmd_en <= '0'; + mig_p3_cmd_ra <= (others => '0'); + mig_p3_cmd_ba <= (others => '0'); + mig_p3_cmd_ca <= (others => '0'); + + mig_p3_cmd_instr <= (others => '0'); + mig_p3_cmd_bl <= (others => '0'); + + mig_p4_arb_en <= '0'; + mig_p4_cmd_clk <= '0'; + mig_p4_cmd_en <= '0'; + mig_p4_cmd_ra <= (others => '0'); + mig_p4_cmd_ba <= (others => '0'); + mig_p4_cmd_ca <= (others => '0'); + + mig_p4_cmd_instr <= (others => '0'); + mig_p4_cmd_bl <= (others => '0'); + + mig_p5_arb_en <= '0'; + mig_p5_cmd_clk <= '0'; + mig_p5_cmd_en <= '0'; + mig_p5_cmd_ra <= (others => '0'); + mig_p5_cmd_ba <= (others => '0'); + mig_p5_cmd_ca <= (others => '0'); + + mig_p5_cmd_instr <= (others => '0'); + mig_p5_cmd_bl <= (others => '0'); + +--*******************************END OF CONFIG 5 SIGNALS ******************************** + +end generate; + +uo_cal_start <= uo_cal_start_int; + + + +samc_0: MCB + GENERIC MAP + ( PORT_CONFIG => C_PORT_CONFIG, + MEM_WIDTH => C_NUM_DQ_PINS , + MEM_TYPE => C_MEM_TYPE , + MEM_BURST_LEN => C_MEM_BURST_LEN , + MEM_ADDR_ORDER => C_MEM_ADDR_ORDER, + MEM_CAS_LATENCY => C_MEM_CAS_LATENCY, + MEM_DDR3_CAS_LATENCY => C_MEM_DDR3_CAS_LATENCY , + MEM_DDR2_WRT_RECOVERY => C_MEM_DDR2_WRT_RECOVERY , + MEM_DDR3_WRT_RECOVERY => C_MEM_DDR3_WRT_RECOVERY , + MEM_MOBILE_PA_SR => C_MEM_MOBILE_PA_SR , + MEM_DDR1_2_ODS => C_MEM_DDR1_2_ODS , + MEM_DDR3_ODS => C_MEM_DDR3_ODS , + MEM_DDR2_RTT => C_MEM_DDR2_RTT , + MEM_DDR3_RTT => C_MEM_DDR3_RTT , + MEM_DDR3_ADD_LATENCY => C_MEM_DDR3_ADD_LATENCY , + MEM_DDR2_ADD_LATENCY => C_MEM_DDR2_ADD_LATENCY , + MEM_MOBILE_TC_SR => C_MEM_MOBILE_TC_SR , + MEM_MDDR_ODS => C_MEM_MDDR_ODS , + MEM_DDR2_DIFF_DQS_EN => C_MEM_DDR2_DIFF_DQS_EN , + MEM_DDR2_3_PA_SR => C_MEM_DDR2_3_PA_SR , + MEM_DDR3_CAS_WR_LATENCY => C_MEM_DDR3_CAS_WR_LATENCY, + MEM_DDR3_AUTO_SR => C_MEM_DDR3_AUTO_SR , + MEM_DDR2_3_HIGH_TEMP_SR => C_MEM_DDR2_3_HIGH_TEMP_SR, + MEM_DDR3_DYN_WRT_ODT => C_MEM_DDR3_DYN_WRT_ODT , + MEM_RA_SIZE => C_MEM_ADDR_WIDTH , + MEM_BA_SIZE => C_MEM_BANKADDR_WIDTH , + MEM_CA_SIZE => C_MEM_NUM_COL_BITS , + MEM_RAS_VAL => MEM_RAS_VAL , + MEM_RCD_VAL => MEM_RCD_VAL , + MEM_REFI_VAL => MEM_REFI_VAL , + MEM_RFC_VAL => MEM_RFC_VAL , + MEM_RP_VAL => MEM_RP_VAL , + MEM_WR_VAL => MEM_WR_VAL , + MEM_RTP_VAL => MEM_RTP_VAL , + MEM_WTR_VAL => MEM_WTR_VAL , + CAL_BYPASS => C_MC_CALIB_BYPASS, + CAL_RA => C_MC_CALIBRATION_RA, + CAL_BA => C_MC_CALIBRATION_BA , + CAL_CA => C_MC_CALIBRATION_CA, + CAL_CLK_DIV => C_MC_CALIBRATION_CLK_DIV, + CAL_DELAY => C_MC_CALIBRATION_DELAY, +-- CAL_CALIBRATION_MODE=> C_MC_CALIBRATION_MODE, + ARB_NUM_TIME_SLOTS => C_ARB_NUM_TIME_SLOTS, + ARB_TIME_SLOT_0 => C_ARB_TIME_SLOT_0, + ARB_TIME_SLOT_1 => C_ARB_TIME_SLOT_1, + ARB_TIME_SLOT_2 => C_ARB_TIME_SLOT_2, + ARB_TIME_SLOT_3 => C_ARB_TIME_SLOT_3, + ARB_TIME_SLOT_4 => C_ARB_TIME_SLOT_4, + ARB_TIME_SLOT_5 => C_ARB_TIME_SLOT_5, + ARB_TIME_SLOT_6 => C_ARB_TIME_SLOT_6, + ARB_TIME_SLOT_7 => C_ARB_TIME_SLOT_7, + ARB_TIME_SLOT_8 => C_ARB_TIME_SLOT_8, + ARB_TIME_SLOT_9 => C_ARB_TIME_SLOT_9, + ARB_TIME_SLOT_10 => C_ARB_TIME_SLOT_10, + ARB_TIME_SLOT_11 => C_ARB_TIME_SLOT_11 + ) PORT MAP + ( + + -- HIGH-SPEED PLL clock interface + + PLLCLK => pllclk1, + PLLCE => pllce1, + + PLLLOCK => '1', + + -- DQS CLOCK NETWork interface + + DQSIOIN => idelay_dqs_ioi_s, + DQSIOIP => idelay_dqs_ioi_m, + UDQSIOIN => idelay_udqs_ioi_s, + UDQSIOIP => idelay_udqs_ioi_m, + + + --DQSPIN => in_pre_dqsp, + DQI => in_dq, + -- RESETS - GLOBAl and local + SYSRST => MCB_SYSRST , + + -- command port 0 + P0ARBEN => mig_p0_arb_en, + P0CMDCLK => mig_p0_cmd_clk, + P0CMDEN => mig_p0_cmd_en, + P0CMDRA => mig_p0_cmd_ra, + P0CMDBA => mig_p0_cmd_ba, + P0CMDCA => mig_p0_cmd_ca, + + P0CMDINSTR => mig_p0_cmd_instr, + P0CMDBL => mig_p0_cmd_bl, + P0CMDEMPTY => mig_p0_cmd_empty, + P0CMDFULL => mig_p0_cmd_full, + + -- command port 1 + + P1ARBEN => mig_p1_arb_en, + P1CMDCLK => mig_p1_cmd_clk, + P1CMDEN => mig_p1_cmd_en, + P1CMDRA => mig_p1_cmd_ra, + P1CMDBA => mig_p1_cmd_ba, + P1CMDCA => mig_p1_cmd_ca, + + P1CMDINSTR => mig_p1_cmd_instr, + P1CMDBL => mig_p1_cmd_bl, + P1CMDEMPTY => mig_p1_cmd_empty, + P1CMDFULL => mig_p1_cmd_full, + + -- command port 2 + + P2ARBEN => mig_p2_arb_en, + P2CMDCLK => mig_p2_cmd_clk, + P2CMDEN => mig_p2_cmd_en, + P2CMDRA => mig_p2_cmd_ra, + P2CMDBA => mig_p2_cmd_ba, + P2CMDCA => mig_p2_cmd_ca, + + P2CMDINSTR => mig_p2_cmd_instr, + P2CMDBL => mig_p2_cmd_bl, + P2CMDEMPTY => mig_p2_cmd_empty, + P2CMDFULL => mig_p2_cmd_full, + + -- command port 3 + + P3ARBEN => mig_p3_arb_en, + P3CMDCLK => mig_p3_cmd_clk, + P3CMDEN => mig_p3_cmd_en, + P3CMDRA => mig_p3_cmd_ra, + P3CMDBA => mig_p3_cmd_ba, + P3CMDCA => mig_p3_cmd_ca, + + P3CMDINSTR => mig_p3_cmd_instr, + P3CMDBL => mig_p3_cmd_bl, + P3CMDEMPTY => mig_p3_cmd_empty, + P3CMDFULL => mig_p3_cmd_full, + + -- command port 4 -- don't care in config 2 + + P4ARBEN => mig_p4_arb_en, + P4CMDCLK => mig_p4_cmd_clk, + P4CMDEN => mig_p4_cmd_en, + P4CMDRA => mig_p4_cmd_ra, + P4CMDBA => mig_p4_cmd_ba, + P4CMDCA => mig_p4_cmd_ca, + + P4CMDINSTR => mig_p4_cmd_instr, + P4CMDBL => mig_p4_cmd_bl, + P4CMDEMPTY => mig_p4_cmd_empty, + P4CMDFULL => mig_p4_cmd_full, + + -- command port 5-- don't care in config 2 + + P5ARBEN => mig_p5_arb_en, + P5CMDCLK => mig_p5_cmd_clk, + P5CMDEN => mig_p5_cmd_en, + P5CMDRA => mig_p5_cmd_ra, + P5CMDBA => mig_p5_cmd_ba, + P5CMDCA => mig_p5_cmd_ca, + + P5CMDINSTR => mig_p5_cmd_instr, + P5CMDBL => mig_p5_cmd_bl, + P5CMDEMPTY => mig_p5_cmd_empty, + P5CMDFULL => mig_p5_cmd_full, + + + -- IOI & IOB SIGNals/tristate interface + + DQIOWEN0 => dqIO_w_en_0, + DQSIOWEN90P => dqsIO_w_en_90_p, + DQSIOWEN90N => dqsIO_w_en_90_n, + + + -- IOB MEMORY INTerface signals + ADDR => address_90, + BA => ba_90 , + RAS => ras_90 , + CAS => cas_90 , + WE => we_90 , + CKE => cke_90 , + ODT => odt_90 , + RST => rst_90 , + + -- CALIBRATION DRP interface + IOIDRPCLK => ioi_drp_clk , + IOIDRPADDR => ioi_drp_addr , + IOIDRPSDO => ioi_drp_sdo , + IOIDRPSDI => ioi_drp_sdi , + IOIDRPCS => ioi_drp_cs , + IOIDRPADD => ioi_drp_add , + IOIDRPBROADCAST => ioi_drp_broadcast , + IOIDRPTRAIN => ioi_drp_train , + IOIDRPUPDATE => ioi_drp_update , + + -- CALIBRATION DAtacapture interface + --SPECIAL COMMANDs + RECAL => mcb_recal , + UIREAD => mcb_ui_read, + UIADD => mcb_ui_add , + UICS => mcb_ui_cs , + UICLK => mcb_ui_clk , + UISDI => mcb_ui_sdi , + UIADDR => mcb_ui_addr , + UIBROADCAST => mcb_ui_broadcast, + UIDRPUPDATE => mcb_ui_drp_update, + UIDONECAL => mcb_ui_done_cal, + UICMD => mcb_ui_cmd, + UICMDIN => mcb_ui_cmd_in, + UICMDEN => mcb_ui_cmd_en, + UIDQCOUNT => mcb_ui_dqcount, + UIDQLOWERDEC => mcb_ui_dq_lower_dec, + UIDQLOWERINC => mcb_ui_dq_lower_inc, + UIDQUPPERDEC => mcb_ui_dq_upper_dec, + UIDQUPPERINC => mcb_ui_dq_upper_inc, + UIUDQSDEC => mcb_ui_udqs_dec, + UIUDQSINC => mcb_ui_udqs_inc, + UILDQSDEC => mcb_ui_ldqs_dec, + UILDQSINC => mcb_ui_ldqs_inc, + UODATA => uo_data_int, + UODATAVALID => uo_data_valid_int, + UODONECAL => hard_done_cal , + UOCMDREADYIN => uo_cmd_ready_in_int, + UOREFRSHFLAG => uo_refrsh_flag_xhdl23, + UOCALSTART => uo_cal_start_int, + UOSDO => uo_sdo_xhdl24, + + --CONTROL SIGNALS + STATUS => status, + SELFREFRESHENTER => selfrefresh_mcb_enter, + SELFREFRESHMODE => selfrefresh_mcb_mode, +------------------------------------------------ +--MUIs +------------------------------------------------ + + P0RDDATA => mig_p0_rd_data ( 31 downto 0), + P1RDDATA => mig_p1_rd_data ( 31 downto 0), + P2RDDATA => mig_p2_rd_data ( 31 downto 0), + P3RDDATA => mig_p3_rd_data ( 31 downto 0), + P4RDDATA => mig_p4_rd_data ( 31 downto 0), + P5RDDATA => mig_p5_rd_data ( 31 downto 0), + LDMN => dqnlm , + UDMN => dqnum , + DQON => dqo_n , + DQOP => dqo_p , + LDMP => dqplm , + UDMP => dqpum , + + P0RDCOUNT => mig_p0_rd_count , + P0WRCOUNT => mig_p0_wr_count , + P1RDCOUNT => mig_p1_rd_count , + P1WRCOUNT => mig_p1_wr_count , + P2COUNT => mig_p2_count , + P3COUNT => mig_p3_count , + P4COUNT => mig_p4_count , + P5COUNT => mig_p5_count , + + -- NEW ADDED FIFo status siganls + -- MIG USER PORT 0 + P0RDEMPTY => mig_p0_rd_empty, + P0RDFULL => mig_p0_rd_full, + P0RDOVERFLOW => mig_p0_rd_overflow, + P0WREMPTY => mig_p0_wr_empty, + P0WRFULL => mig_p0_wr_full, + P0WRUNDERRUN => mig_p0_wr_underrun, + -- MIG USER PORT 1 + P1RDEMPTY => mig_p1_rd_empty, + P1RDFULL => mig_p1_rd_full, + P1RDOVERFLOW => mig_p1_rd_overflow, + P1WREMPTY => mig_p1_wr_empty, + P1WRFULL => mig_p1_wr_full, + P1WRUNDERRUN => mig_p1_wr_underrun, + + -- MIG USER PORT 2 + P2EMPTY => mig_p2_empty, + P2FULL => mig_p2_full, + P2RDOVERFLOW => mig_p2_overflow, + P2WRUNDERRUN => mig_p2_underrun, + + P3EMPTY => mig_p3_empty , + P3FULL => mig_p3_full , + P3RDOVERFLOW => mig_p3_overflow, + P3WRUNDERRUN => mig_p3_underrun , + -- MIG USER PORT 3 + P4EMPTY => mig_p4_empty, + P4FULL => mig_p4_full, + P4RDOVERFLOW => mig_p4_overflow, + P4WRUNDERRUN => mig_p4_underrun, + + P5EMPTY => mig_p5_empty , + P5FULL => mig_p5_full , + P5RDOVERFLOW => mig_p5_overflow, + P5WRUNDERRUN => mig_p5_underrun, + + --------------------------------------------------------- + P0WREN => mig_p0_wr_en, + P0RDEN => mig_p0_rd_en, + P1WREN => mig_p1_wr_en, + P1RDEN => mig_p1_rd_en, + P2EN => mig_p2_en, + P3EN => mig_p3_en, + P4EN => mig_p4_en, + P5EN => mig_p5_en, + -- WRITE MASK BIts connection + P0RWRMASK => mig_p0_wr_mask(3 downto 0), + P1RWRMASK => mig_p1_wr_mask(3 downto 0), + P2WRMASK => mig_p2_wr_mask(3 downto 0), + P3WRMASK => mig_p3_wr_mask(3 downto 0), + P4WRMASK => mig_p4_wr_mask(3 downto 0), + P5WRMASK => mig_p5_wr_mask(3 downto 0), + -- DATA WRITE COnnection + P0WRDATA => mig_p0_wr_data(31 downto 0), + P1WRDATA => mig_p1_wr_data(31 downto 0), + P2WRDATA => mig_p2_wr_data(31 downto 0), + P3WRDATA => mig_p3_wr_data(31 downto 0), + P4WRDATA => mig_p4_wr_data(31 downto 0), + P5WRDATA => mig_p5_wr_data(31 downto 0), + + P0WRERROR => mig_p0_wr_error, + P1WRERROR => mig_p1_wr_error, + P0RDERROR => mig_p0_rd_error, + P1RDERROR => mig_p1_rd_error, + + P2ERROR => mig_p2_error, + P3ERROR => mig_p3_error, + P4ERROR => mig_p4_error, + P5ERROR => mig_p5_error, + + -- USER SIDE DAta ports clock + -- 128 BITS CONnections + P0WRCLK => mig_p0_wr_clk , + P1WRCLK => mig_p1_wr_clk , + P0RDCLK => mig_p0_rd_clk , + P1RDCLK => mig_p1_rd_clk , + P2CLK => mig_p2_clk , + P3CLK => mig_p3_clk , + P4CLK => mig_p4_clk , + P5CLK => mig_p5_clk + ); + +--////////////////////////////////////////////////////// +--// Input Termination Calibration +--////////////////////////////////////////////////////// + + +--process(ui_clk) +--begin +--if (ui_clk'event and ui_clk = '1') then +-- syn1_sys_rst <= sys_rst; +-- syn2_sys_rst <= syn1_sys_rst; +--end if; +--end process; + + uo_done_cal_sig <= DONE_SOFTANDHARD_CAL WHEN (C_CALIB_SOFT_IP = "TRUE") ELSE + hard_done_cal; + + + gen_term_calib : IF (C_CALIB_SOFT_IP = "TRUE") GENERATE + mcb_soft_calibration_top_inst : mcb_soft_calibration_top + generic map ( C_MEM_TZQINIT_MAXCNT => C_MEM_TZQINIT_MAXCNT, + C_MC_CALIBRATION_MODE => C_MC_CALIBRATION_MODE, + SKIP_IN_TERM_CAL => C_SKIP_IN_TERM_CAL, + SKIP_DYNAMIC_CAL => C_SKIP_DYNAMIC_CAL, + SKIP_DYN_IN_TERM => C_SKIP_DYN_IN_TERM, + C_SIMULATION => C_SIMULATION, + C_MEM_TYPE => C_MEM_TYPE + ) + + PORT MAP ( + UI_CLK => ui_clk, + --RST => syn2_sys_rst, + RST => int_sys_rst, + IOCLK => ioclk0, + DONE_SOFTANDHARD_CAL => DONE_SOFTANDHARD_CAL, + --PLL_LOCK => pll_lock, + PLL_LOCK => gated_pll_lock, + + --SELFREFRESH_REQ => selfrefresh_enter, -- from user app + SELFREFRESH_REQ => soft_cal_selfrefresh_req, -- from user app + SELFREFRESH_MCB_MODE => selfrefresh_mcb_mode, -- from MCB + SELFREFRESH_MCB_REQ => selfrefresh_mcb_enter, -- to mcb + SELFREFRESH_MODE => selfrefresh_mode_sig, -- to user app + + MCB_UIADD => mcb_ui_add, + MCB_UISDI => mcb_ui_sdi, + MCB_UOSDO => uo_sdo_xhdl24, + MCB_UODONECAL => hard_done_cal, + MCB_UOREFRSHFLAG => uo_refrsh_flag_xhdl23, + MCB_UICS => mcb_ui_cs, + MCB_UIDRPUPDATE => mcb_ui_drp_update, + MCB_UIBROADCAST => mcb_ui_broadcast, + MCB_UIADDR => mcb_ui_addr, + MCB_UICMDEN => mcb_ui_cmd_en, + MCB_UIDONECAL => mcb_ui_done_cal, + MCB_UIDQLOWERDEC => mcb_ui_dq_lower_dec, + MCB_UIDQLOWERINC => mcb_ui_dq_lower_inc, + MCB_UIDQUPPERDEC => mcb_ui_dq_upper_dec, + MCB_UIDQUPPERINC => mcb_ui_dq_upper_inc, + MCB_UILDQSDEC => mcb_ui_ldqs_dec, + MCB_UILDQSINC => mcb_ui_ldqs_inc, + MCB_UIREAD => mcb_ui_read, + MCB_UIUDQSDEC => mcb_ui_udqs_dec, + MCB_UIUDQSINC => mcb_ui_udqs_inc, + MCB_RECAL => mcb_recal, + MCB_SYSRST => MCB_SYSRST, + MCB_UICMD => mcb_ui_cmd, + MCB_UICMDIN => mcb_ui_cmd_in, + MCB_UIDQCOUNT => mcb_ui_dqcount, + MCB_UODATA => uo_data_int, + MCB_UODATAVALID => uo_data_valid_int, + MCB_UOCMDREADY => uo_cmd_ready_in_int, + MCB_UO_CAL_START => uo_cal_start_int, + RZQ_PIN => rzq, + ZIO_PIN => zio, + CKE_Train => cke_train + ); + mcb_ui_clk <= ui_clk; + END GENERATE; + + + gen_no_term_calib : if (NOT(C_CALIB_SOFT_IP = "TRUE")) generate + DONE_SOFTANDHARD_CAL <= '0'; + MCB_SYSRST <= int_sys_rst or not(wait_200us_counter(15)); + mcb_recal <= calib_recal; + mcb_ui_read <= ui_read; + mcb_ui_add <= ui_add; + mcb_ui_cs <= ui_cs; + mcb_ui_clk <= ui_clk; + mcb_ui_sdi <= ui_sdi; + mcb_ui_addr <= ui_addr; + mcb_ui_broadcast <= ui_broadcast; + mcb_ui_drp_update <= ui_drp_update; + mcb_ui_done_cal <= ui_done_cal; + mcb_ui_cmd <= ui_cmd; + mcb_ui_cmd_in <= ui_cmd_in; + mcb_ui_cmd_en <= ui_cmd_en; + mcb_ui_dqcount <= ui_dqcount; + mcb_ui_dq_lower_dec <= ui_dq_lower_dec; + mcb_ui_dq_lower_inc <= ui_dq_lower_inc; + mcb_ui_dq_upper_dec <= ui_dq_upper_dec; + mcb_ui_dq_upper_inc <= ui_dq_upper_inc; + mcb_ui_udqs_inc <= ui_udqs_inc; + mcb_ui_udqs_dec <= ui_udqs_dec; + mcb_ui_ldqs_inc <= ui_ldqs_inc; + mcb_ui_ldqs_dec <= ui_ldqs_dec; + selfrefresh_mode_sig <= '0'; + + -- synthesis translate_off + init_sequence: if (C_SIMULATION = "FALSE") generate + -- synthesis translate_on + process (ui_clk, int_sys_rst) + begin + if (int_sys_rst = '1') then + wait_200us_counter <= (others => '0'); + elsif (ui_clk'event and ui_clk = '1') then -- UI_CLK maximum is up to 100 MHz + if (wait_200us_counter(15) = '1') then + wait_200us_counter <= wait_200us_counter; + else + wait_200us_counter <= wait_200us_counter + '1'; + end if; + end if; + end process; + -- synthesis translate_off + end generate; + + init_sequence_skip: if (C_SIMULATION = "TRUE") generate + wait_200us_counter <= X"FFFF"; + process + begin + report "The 200 us wait period required before CKE goes active has been skipped in Simulation"; + wait; + end process; + end generate; + -- synthesis translate_on + + gen_cketrain_a: if (C_MEM_TYPE = "DDR2") generate + process (ui_clk) + begin + -- When wait_200us_[13] and wait_200us_[14] are both asserted, + -- 200 us wait should have been passed. + if (ui_clk'event and ui_clk = '1') then + if ((wait_200us_counter(14) and wait_200us_counter(13)) = '1') then + wait_200us_done_r1 <= '1'; + else + wait_200us_done_r1 <= '0'; + end if; + wait_200us_done_r2 <= wait_200us_done_r1; + end if; + end process; + + process (ui_clk, int_sys_rst) + begin + if (int_sys_rst = '1') then + cke_train_reg <= '0'; + elsif (ui_clk'event and ui_clk = '1') then + if ((wait_200us_done_r1 and not(wait_200us_done_r2)) = '1') then + cke_train_reg <= '1'; + elsif (uo_done_cal_sig = '1') then + cke_train_reg <= '0'; + end if; + end if; + end process; + + cke_train <= cke_train_reg; + end generate; + + gen_cketrain_b: if (NOT(C_MEM_TYPE = "DDR2")) generate + + cke_train <= '0'; + + end generate; + + end generate; + + + +--////////////////////////////////////////////////////// +--//ODDRDES2 instantiations +--////////////////////////////////////////////////////// + +-------- +--ADDR +-------- + + gen_addr_oserdes2 : FOR addr_ioi IN 0 TO C_MEM_ADDR_WIDTH - 1 GENERATE + + + ioi_addr_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + ) + PORT MAP ( + OQ => ioi_addr(addr_ioi), + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => t_addr(addr_ioi), + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => address_90(addr_ioi), + D2 => address_90(addr_ioi), + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => '0', + T2 => '0', + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + END GENERATE; + +-------- +--BA +-------- + + gen_ba_oserdes2 : FOR ba_ioi IN 0 TO C_MEM_BANKADDR_WIDTH - 1 GENERATE + + + ioi_ba_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + ) + PORT MAP ( + OQ => ioi_ba(ba_ioi), + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => t_ba(ba_ioi), + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => ba_90(ba_ioi), + D2 => ba_90(ba_ioi), + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => '0', + T2 => '0', + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + END GENERATE; + +-------- +--CAS +-------- + ioi_cas_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + ) + PORT MAP ( + OQ => ioi_cas, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => t_cas, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => cas_90, + D2 => cas_90, + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => '0', + T2 => '0', + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + +-------- +--CKE +-------- + ioi_cke_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2, + TRAIN_PATTERN => 15 + ) + PORT MAP ( + OQ => ioi_cke, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => t_cke, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => cke_90, + D2 => cke_90, + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + --OCE => '1', + OCE => pll_lock, + RST => '0', --int_sys_rst + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => '0', + T2 => '0', + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => cke_train + ); +-------- +--ODT +-------- + xhdl330 : IF (C_MEM_TYPE = "DDR3" OR C_MEM_TYPE = "DDR2") GENERATE + + ioi_odt_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 +-- TRAIN_PATTERN => 0 + ) + PORT MAP ( + OQ => ioi_odt, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => t_odt, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => odt_90, + D2 => odt_90, + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => '0', + T2 => '0', + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + END GENERATE; + +-------- +--RAS +-------- + ioi_ras_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + ) + PORT MAP ( + OQ => ioi_ras, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => t_ras, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => ras_90, + D2 => ras_90, + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => '0', + T2 => '0', + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); +-------- +--RST +-------- + xhdl331 : IF (C_MEM_TYPE = "DDR3") GENERATE + ioi_rst_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + ) + PORT MAP ( + OQ => ioi_rst, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => t_rst, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => rst_90, + D2 => rst_90, + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + --OCE => '1', + OCE => pll_lock, + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => '0', + T2 => '0', + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + END GENERATE; +-------- +--WE +-------- + ioi_we_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + ) + PORT MAP ( + OQ => ioi_we, + TQ => t_we, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => we_90, + D2 => we_90, + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => '0', + T2 => '0', + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + +-------- +--CK +-------- + ioi_ck_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + ) + PORT MAP ( + OQ => ioi_ck, + SHIFTOUT1 => open,--ck_shiftout0_1, + SHIFTOUT2 => open,--ck_shiftout0_2, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => t_ck, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => '0', + D2 => '1', + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + --OCE => '1', + OCE => pll_lock, + RST => '0', --int_sys_rst + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => '0', + T2 => '0', + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + +---------- +----CKN +---------- +-- ioi_ckn_0 : OSERDES2 +-- GENERIC MAP ( +-- BYPASS_GCLK_FF => TRUE, +-- DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, +-- DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, +-- OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, +-- SERDES_MODE => C_OSERDES2_SERDES_MODE_SLAVE, +-- DATA_WIDTH => 2 +-- ) +-- PORT MAP ( +-- OQ => ioi_ckn, +-- SHIFTOUT1 => open, +-- SHIFTOUT2 => open, +-- SHIFTOUT3 => open,--ck_shiftout1_3, +-- SHIFTOUT4 => open,--ck_shiftout1_4, +-- TQ => t_ckn, +-- CLK0 => ioclk0, +-- CLK1 => '0', +-- CLKDIV => '0', +-- D1 => '1', +-- D2 => '0', +-- D3 => '0', +-- D4 => '0', +-- IOCE => pll_ce_0, +-- OCE => '1', +-- RST => '0', +-- SHIFTIN1 => '0', +-- SHIFTIN2 => '0', +-- SHIFTIN3 => '0', +-- SHIFTIN4 => '0', +-- T1 => '0', +-- T2 => '0', +-- T3 => '0', +-- T4 => '0', +-- TCE => '1', +-- TRAIN => '0' +-- ); +-- +-------- +--UDM +-------- + + ioi_udm_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + ) + PORT MAP ( + OQ => udm_oq, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => udm_t, + CLK0 => ioclk90, + CLK1 => '0', + CLKDIV => '0', + D1 => dqpum, + D2 => dqnum, + D3 => '0', + D4 => '0', + IOCE => pll_ce_90, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => dqIO_w_en_0, + T2 => dqIO_w_en_0, + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + +-------- +--LDM +-------- + ioi_ldm_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + ) + PORT MAP ( + OQ => ldm_oq, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => ldm_t, + CLK0 => ioclk90, + CLK1 => '0', + CLKDIV => '0', + D1 => dqplm, + D2 => dqnlm, + D3 => '0', + D4 => '0', + IOCE => pll_ce_90, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => dqIO_w_en_0, + T2 => dqIO_w_en_0, + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); +-------- +--DQ +-------- + gen_dq : FOR dq IN 0 TO C_NUM_DQ_PINS-1 GENERATE + oserdes2_dq_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2, + TRAIN_PATTERN => 5 + ) + PORT MAP ( + OQ => dq_oq(dq), + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => dq_tq(dq), + CLK0 => ioclk90, + CLK1 => '0', + CLKDIV => '0', + D1 => dqo_p(dq), + D2 => dqo_n(dq), + D3 => '0', + D4 => '0', + IOCE => pll_ce_90, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => dqIO_w_en_0, + T2 => dqIO_w_en_0, + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => ioi_drp_train + ); + END GENERATE; + +-------- +--DQSP +-------- + + + oserdes2_dqsp_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 + -- TRAIN_PATTERN => 0 + ) + PORT MAP ( + OQ => dqsp_oq, + SHIFTOUT1 => open,--dqs_shiftout0_1, + SHIFTOUT2 => open,--dqs_shiftout0_2, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => dqsp_tq, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => '0', + D2 => '1', + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0',--dqs_shiftout1_3, + SHIFTIN4 => '0',--dqs_shiftout1_4, + T1 => dqsIO_w_en_90_n, + T2 => dqsIO_w_en_90_p, + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + +-------- +--DQSN +-------- + + oserdes2_dqsn_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_SLAVE, + DATA_WIDTH => 2 + -- TRAIN_PATTERN => 0 + ) + PORT MAP ( + OQ => dqsn_oq, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open,--dqs_shiftout1_3, + SHIFTOUT4 => open,--dqs_shiftout1_4, + TQ => dqsn_tq, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => '1', + D2 => '0', + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0',--dqs_shiftout0_1, + SHIFTIN2 => '0',--dqs_shiftout0_2, + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => dqsIO_w_en_90_n, + T2 => dqsIO_w_en_90_p, + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + +-------- +--UDQSP +-------- + + oserdeS2_UDQSP_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_MASTER, + DATA_WIDTH => 2 +-- TRAIN_PATTERN => 0 + ) + PORT MAP ( + OQ => udqsp_oq, + SHIFTOUT1 => open,--udqs_shiftout0_1, + SHIFTOUT2 => open,--udqs_shiftout0_2, + SHIFTOUT3 => open, + SHIFTOUT4 => open, + TQ => udqsp_tq, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => '0', + D2 => '1', + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0', + SHIFTIN2 => '0', + SHIFTIN3 => '0',--udqs_shiftout1_3, + SHIFTIN4 => '0',--udqs_shiftout1_4, + T1 => dqsIO_w_en_90_n, + t2 => dqsIO_w_en_90_p, + T3 => '0', + T4 => '0', + tce => '1', + train => '0' + ); + +-------- +--UDQSN +-------- + + oserdes2_udqsn_0 : OSERDES2 + GENERIC MAP ( + BYPASS_GCLK_FF => TRUE, + DATA_RATE_OQ => C_OSERDES2_DATA_RATE_OQ, + DATA_RATE_OT => C_OSERDES2_DATA_RATE_OT, + OUTPUT_MODE => C_OSERDES2_OUTPUT_MODE_SE, + SERDES_MODE => C_OSERDES2_SERDES_MODE_SLAVE, + DATA_WIDTH => 2 +-- TRAIN_PATTERN => 0 + ) + PORT MAP ( + OQ => udqsn_oq, + SHIFTOUT1 => open, + SHIFTOUT2 => open, + SHIFTOUT3 => open,--udqs_shiftout1_3, + SHIFTOUT4 => open,--udqs_shiftout1_4, + TQ => udqsn_tq, + CLK0 => ioclk0, + CLK1 => '0', + CLKDIV => '0', + D1 => '1', + D2 => '0', + D3 => '0', + D4 => '0', + IOCE => pll_ce_0, + OCE => '1', + RST => int_sys_rst, + SHIFTIN1 => '0',--udqs_shiftout0_1, + SHIFTIN2 => '0',--udqs_shiftout0_2, + SHIFTIN3 => '0', + SHIFTIN4 => '0', + T1 => dqsIO_w_en_90_n, + T2 => dqsIO_w_en_90_p, + T3 => '0', + T4 => '0', + TCE => '1', + TRAIN => '0' + ); + +------------------------------------------------------ +--*********************************** OSERDES2 instantiations end ******************************************* +------------------------------------------------------ + +------------------------------------------------ +--&&&&&&&&&&&&&&&&&&&&&&&&&&& IODRP2 instantiations &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& +------------------------------------------------ +---#####################################--X16 MEMORY WIDTH-############################################# + + dq_15_0_data : if (C_NUM_DQ_PINS = 16) GENERATE + +--//////////////////////////////////////////////// +--DQ14 +--//////////////////////////////////////////////// + + iodrp2_DQ_14 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ14_TAP_DELAY_VAL, + MCB_ADDRESS => 7, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_14, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(14), + DQSOUTN => open, + DQSOUTP => in_dq(14), + SDO => open, + TOUT => t_dq(14), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_15, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(14), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(14), + SDI => ioi_drp_sdo, + T => dq_tq(14) + ); + +--//////////////////////////////////////////////// +--DQ15 +--//////////////////////////////////////////////// + + + iodrp2_dq_15 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ15_TAP_DELAY_VAL, + MCB_ADDRESS => 7, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_15, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(15), + DQSOUTN => open, + DQSOUTP => in_dq(15), + SDO => open, + TOUT => t_dq(15), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => '0', + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(15), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(15), + SDI => ioi_drp_sdo, + T => dq_tq(15) + ); + +--//////////////////////////////////////////////// +--DQ12 +--//////////////////////////////////////////////// + + iodrp2_DQ_12 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ12_TAP_DELAY_VAL, + MCB_ADDRESS => 6, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_12, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(12), + DQSOUTN => open, + DQSOUTP => in_dq(12), + SDO => open, + TOUT => t_dq(12), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_13, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(12), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(12), + SDI => ioi_drp_sdo, + T => dq_tq(12) + ); + +--//////////////////////////////////////////////// +--DQ13 +--//////////////////////////////////////////////// + + iodrp2_dq_13 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ13_TAP_DELAY_VAL, + MCB_ADDRESS => 6, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_13, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(13), + DQSOUTN => open, + DQSOUTP => in_dq(13), + SDO => open, + TOUT => t_dq(13), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_14, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(13), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(13), + SDI => ioi_drp_sdo, + T => dq_tq(13) + ); + +--///////// +--UDQSP +--///////// + + iodrp2_UDQSP_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQS_IODRP2_DATA_RATE, + IDELAY_VALUE => UDQSP_TAP_DELAY_VAL, + MCB_ADDRESS => 14, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQS_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_udqsp, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_udqs, + DQSOUTN => open, + DQSOUTP => idelay_udqs_ioi_m, + SDO => open, + TOUT => t_udqs, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_udqsn, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_udqsp, + IOCLK0 => ioclk0, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => udqsp_oq, + SDI => ioi_drp_sdo, + T => udqsp_tq + ); + +--///////// +--UDQSN +--///////// + + iodrp2_udqsn_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQS_IODRP2_DATA_RATE, + IDELAY_VALUE => UDQSN_TAP_DELAY_VAL, + MCB_ADDRESS => 14, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQS_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_udqsn, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_udqsn, + DQSOUTN => open, + DQSOUTP => idelay_udqs_ioi_s, + SDO => open, + TOUT => t_udqsn, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_12, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_udqsp, + IOCLK0 => ioclk0, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => udqsn_oq, + SDI => ioi_drp_sdo, + T => udqsn_tq + ); + +--///////////////////////////////////////////////// +--//DQ10 +--//////////////////////////////////////////////// + iodrp2_DQ_10 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ10_TAP_DELAY_VAL, + MCB_ADDRESS => 5, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_10, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(10), + DQSOUTN => open, + DQSOUTP => in_dq(10), + SDO => open, + TOUT => t_dq(10), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_11, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(10), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(10), + SDI => ioi_drp_sdo, + T => dq_tq(10) + ); + +--///////////////////////////////////////////////// +--//DQ11 +--//////////////////////////////////////////////// + + iodrp2_dq_11 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ11_TAP_DELAY_VAL, + MCB_ADDRESS => 5, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_11, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(11), + DQSOUTN => open, + DQSOUTP => in_dq(11), + SDO => open, + TOUT => t_dq(11), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_udqsp, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(11), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(11), + SDI => ioi_drp_sdo, + T => dq_tq(11) + ); + +--///////////////////////////////////////////////// +--//DQ8 +--//////////////////////////////////////////////// + + iodrp2_DQ_8 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ8_TAP_DELAY_VAL, + MCB_ADDRESS => 4, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_8, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(8), + DQSOUTN => open, + DQSOUTP => in_dq(8), + SDO => open, + TOUT => t_dq(8), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_9, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(8), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(8), + SDI => ioi_drp_sdo, + T => dq_tq(8) + ); + +--///////////////////////////////////////////////// +--//DQ9 +--//////////////////////////////////////////////// + + iodrp2_dq_9 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ9_TAP_DELAY_VAL, + MCB_ADDRESS => 4, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_9, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(9), + DQSOUTN => open, + DQSOUTP => in_dq(9), + SDO => open, + TOUT => t_dq(9), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_10, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(9), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(9), + SDI => ioi_drp_sdo, + T => dq_tq(9) + ); + +--///////////////////////////////////////////////// +--//DQ0 +--//////////////////////////////////////////////// + + iodrp2_DQ_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ0_TAP_DELAY_VAL, + MCB_ADDRESS => 0, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_0, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(0), + DQSOUTN => open, + DQSOUTP => in_dq(0), + SDO => open, + TOUT => t_dq(0), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_1, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(0), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(0), + SDI => ioi_drp_sdo, + T => dq_tq(0) + ); + +--///////////////////////////////////////////////// +--//DQ1 +--//////////////////////////////////////////////// + + iodrp2_dq_1 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ1_TAP_DELAY_VAL, + MCB_ADDRESS => 0, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_1, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(1), + DQSOUTN => open, + DQSOUTP => in_dq(1), + SDO => open, + TOUT => t_dq(1), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_8, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(1), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(1), + SDI => ioi_drp_sdo, + T => dq_tq(1) + ); + +--///////////////////////////////////////////////// +--//DQ2 +--//////////////////////////////////////////////// + + iodrp2_DQ_2 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ2_TAP_DELAY_VAL, + MCB_ADDRESS => 1, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_2, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(2), + DQSOUTN => open, + DQSOUTP => in_dq(2), + SDO => open, + TOUT => t_dq(2), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_3, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(2), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(2), + SDI => ioi_drp_sdo, + T => dq_tq(2) + ); + +--///////////////////////////////////////////////// +--//DQ3 +--//////////////////////////////////////////////// + + iodrp2_dq_3 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ3_TAP_DELAY_VAL, + MCB_ADDRESS => 1, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_3, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(3), + DQSOUTN => open, + DQSOUTP => in_dq(3), + SDO => open, + TOUT => t_dq(3), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_0, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(3), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(3), + SDI => ioi_drp_sdo, + T => dq_tq(3) + ); + +--///////// +--//DQSP +--///////// + + iodrp2_DQSP_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQS_IODRP2_DATA_RATE, + IDELAY_VALUE => LDQSP_TAP_DELAY_VAL, + MCB_ADDRESS => 15, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQS_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_dqsp, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dqs, + DQSOUTN => open, + DQSOUTP => idelay_dqs_ioi_m, + SDO => open, + TOUT => t_dqs, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_dqsn, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dqsp, + IOCLK0 => ioclk0, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dqsp_oq, + SDI => ioi_drp_sdo, + T => dqsp_tq + ); + +--///////// +--//DQSN +--///////// + + iodrp2_dqsn_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQS_IODRP2_DATA_RATE, + IDELAY_VALUE => LDQSN_TAP_DELAY_VAL, + MCB_ADDRESS => 15, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQS_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_dqsn, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dqsn, + DQSOUTN => open, + DQSOUTP => idelay_dqs_ioi_s, + SDO => open, + TOUT => t_dqsn, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_2, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dqsp, + IOCLK0 => ioclk0, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dqsn_oq, + SDI => ioi_drp_sdo, + T => dqsn_tq + ); + +--///////////////////////////////////////////////// +--//DQ6 +--//////////////////////////////////////////////// + + iodrp2_DQ_6 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ6_TAP_DELAY_VAL, + MCB_ADDRESS => 3, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_6, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(6), + DQSOUTN => open, + DQSOUTP => in_dq(6), + SDO => open, + TOUT => t_dq(6), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_7, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(6), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(6), + SDI => ioi_drp_sdo, + T => dq_tq(6) + ); + +--///////////////////////////////////////////////// +--//DQ7 +--//////////////////////////////////////////////// + + iodrp2_dq_7 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ7_TAP_DELAY_VAL, + MCB_ADDRESS => 3, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_7, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(7), + DQSOUTN => open, + DQSOUTP => in_dq(7), + SDO => open, + TOUT => t_dq(7), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_dqsp, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(7), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(7), + SDI => ioi_drp_sdo, + T => dq_tq(7) + ); + +--///////////////////////////////////////////////// +--//DQ4 +--//////////////////////////////////////////////// + + iodrp2_DQ_4 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ4_TAP_DELAY_VAL, + MCB_ADDRESS => 2, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_4, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(4), + DQSOUTN => open, + DQSOUTP => in_dq(4), + SDO => open, + TOUT => t_dq(4), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_5, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(4), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(4), + SDI => ioi_drp_sdo, + T => dq_tq(4) + ); + +--///////////////////////////////////////////////// +--//DQ5 +--//////////////////////////////////////////////// + + iodrp2_dq_5 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ5_TAP_DELAY_VAL, + MCB_ADDRESS => 2, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_5, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(5), + DQSOUTN => open, + DQSOUTP => in_dq(5), + SDO => open, + TOUT => t_dq(5), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_6, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(5), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(5), + SDI => ioi_drp_sdo, + T => dq_tq(5) + ); + + + + +--///////////////////////////////////////////////// +--//UDM +--//////////////////////////////////////////////// + + iodrp2_dq_udm : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => 0, + MCB_ADDRESS => 8, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => ioi_drp_sdi, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_udm, + DQSOUTN => open, + DQSOUTP => open, + SDO => open, + TOUT => t_udm, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_ldm, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => '0', + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => udm_oq, + SDI => ioi_drp_sdo, + T => udm_t + ); + +--///////////////////////////////////////////////// +--//LDM +--//////////////////////////////////////////////// + + iodrp2_dq_ldm : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => 0, + MCB_ADDRESS => 8, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_ldm, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_ldm, + DQSOUTN => open, + DQSOUTP => open, + SDO => open, + TOUT => t_ldm, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_4, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => '0', + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => ldm_oq, + SDI => ioi_drp_sdo, + T => ldm_t + ); + +end generate; + +---#####################################--X8 MEMORY WIDTH-############################################# + + dq_7_0_data : if (C_NUM_DQ_PINS = 8) GENERATE +--///////////////////////////////////////////////// +--//DQ0 +--//////////////////////////////////////////////// + iodrp2_DQ_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ0_TAP_DELAY_VAL, + MCB_ADDRESS => 0, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_0, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(0), + DQSOUTN => open, + DQSOUTP => in_dq(0), + SDO => open, + TOUT => t_dq(0), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_1, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(0), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(0), + SDI => ioi_drp_sdo, + T => dq_tq(0) + ); + +--///////////////////////////////////////////////// +--//DQ1 +--//////////////////////////////////////////////// + + iodrp2_dq_1 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ1_TAP_DELAY_VAL, + MCB_ADDRESS => 0, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_1, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(1), + DQSOUTN => open, + DQSOUTP => in_dq(1), + SDO => open, + TOUT => t_dq(1), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => '0', + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(1), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(1), + SDI => ioi_drp_sdo, + T => dq_tq(1) + ); + +--///////////////////////////////////////////////// +--//DQ2 +--//////////////////////////////////////////////// + + iodrp2_DQ_2 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ2_TAP_DELAY_VAL, + MCB_ADDRESS => 1, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_2, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(2), + DQSOUTN => open, + DQSOUTP => in_dq(2), + SDO => open, + TOUT => t_dq(2), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_3, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(2), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(2), + SDI => ioi_drp_sdo, + T => dq_tq(2) + ); + +--///////////////////////////////////////////////// +--//DQ3 +--//////////////////////////////////////////////// + + iodrp2_dq_3 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ3_TAP_DELAY_VAL, + MCB_ADDRESS => 1, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_3, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(3), + DQSOUTN => open, + DQSOUTP => in_dq(3), + SDO => open, + TOUT => t_dq(3), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_0, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(3), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(3), + SDI => ioi_drp_sdo, + T => dq_tq(3) + ); + +--///////// +--//DQSP +--///////// + + iodrp2_DQSP_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQS_IODRP2_DATA_RATE, + IDELAY_VALUE => LDQSP_TAP_DELAY_VAL, + MCB_ADDRESS => 15, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQS_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_dqsp, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dqs, + DQSOUTN => open, + DQSOUTP => idelay_dqs_ioi_m, + SDO => open, + TOUT => t_dqs, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_dqsn, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dqsp, + IOCLK0 => ioclk0, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dqsp_oq, + SDI => ioi_drp_sdo, + T => dqsp_tq + ); + +--///////// +--//DQSN +--///////// + iodrp2_dqsn_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQS_IODRP2_DATA_RATE, + IDELAY_VALUE => LDQSN_TAP_DELAY_VAL, + MCB_ADDRESS => 15, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQS_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_dqsn, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dqsn, + DQSOUTN => open, + DQSOUTP => idelay_dqs_ioi_s, + SDO => open, + TOUT => t_dqsn, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_2, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dqsp, + IOCLK0 => ioclk0, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dqsn_oq, + SDI => ioi_drp_sdo, + T => dqsn_tq + ); + +--///////////////////////////////////////////////// +--//DQ6 +--//////////////////////////////////////////////// + + iodrp2_DQ_6 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ6_TAP_DELAY_VAL, + MCB_ADDRESS => 3, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_6, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(6), + DQSOUTN => open, + DQSOUTP => in_dq(6), + SDO => open, + TOUT => t_dq(6), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_7, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(6), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(6), + SDI => ioi_drp_sdo, + T => dq_tq(6) + ); + +--///////////////////////////////////////////////// +--//DQ7 +--//////////////////////////////////////////////// + + iodrp2_dq_7 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ7_TAP_DELAY_VAL, + MCB_ADDRESS => 3, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_7, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(7), + DQSOUTN => open, + DQSOUTP => in_dq(7), + SDO => open, + TOUT => t_dq(7), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_dqsp, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(7), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(7), + SDI => ioi_drp_sdo, + T => dq_tq(7) + ); + +--///////////////////////////////////////////////// +--//DQ4 +--//////////////////////////////////////////////// + + iodrp2_DQ_4 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ4_TAP_DELAY_VAL, + MCB_ADDRESS => 2, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_4, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(4), + DQSOUTN => open, + DQSOUTP => in_dq(4), + SDO => open, + TOUT => t_dq(4), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_5, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(4), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(4), + SDI => ioi_drp_sdo, + T => dq_tq(4) + ); +--///////////////////////////////////////////////// +--//DQ5 +--//////////////////////////////////////////////// + + + iodrp2_dq_5 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ5_TAP_DELAY_VAL, + MCB_ADDRESS => 2, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_5, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(5), + DQSOUTN => open, + DQSOUTP => in_dq(5), + SDO => open, + TOUT => t_dq(5), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_6, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(5), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(5), + SDI => ioi_drp_sdo, + T => dq_tq(5) + ); + + + +--NEED TO GENERATE UDM so that user won't instantiate in this location + +--///////////////////////////////////////////////// +--//UDM +--//////////////////////////////////////////////// + + iodrp2_dq_udm : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => 0, + MCB_ADDRESS => 8, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => ioi_drp_sdi, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_udm, + DQSOUTN => open, + DQSOUTP => open, + SDO => open, + TOUT => t_udm, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_ldm, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => '0', + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => udm_oq, + SDI => ioi_drp_sdo, + T => udm_t + ); + +--///////////////////////////////////////////////// +--//LDM +--//////////////////////////////////////////////// + + iodrp2_dq_ldm : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => 0, + MCB_ADDRESS => 8, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_ldm, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_ldm, + DQSOUTN => open, + DQSOUTP => open, + SDO => open, + TOUT => t_ldm, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_4, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => '0', + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => ldm_oq, + SDI => ioi_drp_sdo, + T => ldm_t + ); + +end generate; + +---#####################################--X4 MEMORY WIDTH-############################################# + + dq_3_0_data : if (C_NUM_DQ_PINS = 4) GENERATE +--///////////////////////////////////////////////// +--//DQ0 +--//////////////////////////////////////////////// + + iodrp2_DQ_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ0_TAP_DELAY_VAL, + MCB_ADDRESS => 0, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_0, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(0), + DQSOUTN => open, + DQSOUTP => in_dq(0), + SDO => open, + TOUT => t_dq(0), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_1, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(0), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(0), + SDI => ioi_drp_sdo, + T => dq_tq(0) + ); + + --///////////////////////////////////////////////// +--//DQ1 +--//////////////////////////////////////////////// + + iodrp2_dq_1 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ1_TAP_DELAY_VAL, + MCB_ADDRESS => 0, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_1, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(1), + DQSOUTN => open, + DQSOUTP => in_dq(1), + SDO => open, + TOUT => t_dq(1), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => '0', + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(1), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(1), + SDI => ioi_drp_sdo, + T => dq_tq(1) + ); + + --///////////////////////////////////////////////// +--//DQ2 +--//////////////////////////////////////////////// + + iodrp2_DQ_2 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ2_TAP_DELAY_VAL, + MCB_ADDRESS => 1, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_2, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(2), + DQSOUTN => open, + DQSOUTP => in_dq(2), + SDO => open, + TOUT => t_dq(2), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_3, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(2), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(2), + SDI => ioi_drp_sdo, + T => dq_tq(2) + ); + +--///////////////////////////////////////////////// +--//DQ3 +--//////////////////////////////////////////////// + + iodrp2_dq_3 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => DQ3_TAP_DELAY_VAL, + MCB_ADDRESS => 1, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_3, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dq(3), + DQSOUTN => open, + DQSOUTP => in_dq(3), + SDO => open, + TOUT => t_dq(3), + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_0, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dq(3), + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dq_oq(3), + SDI => ioi_drp_sdo, + T => dq_tq(3) + ); + +--/////////////////////////////////////////////// +--DQSP +--/////////////////////////////////////////////// + iodrp2_DQSP_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQS_IODRP2_DATA_RATE, + IDELAY_VALUE => LDQSP_TAP_DELAY_VAL, + MCB_ADDRESS => 15, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQS_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_dqsp, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dqs, + DQSOUTN => open, + DQSOUTP => idelay_dqs_ioi_m, + SDO => open, + TOUT => t_dqs, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_dqsn, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dqsp, + IOCLK0 => ioclk0, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dqsp_oq, + SDI => ioi_drp_sdo, + T => dqsp_tq + ); + +--/////////////////////////////////////////////// +--DQSN +--/////////////////////////////////////////////// + + iodrp2_dqsn_0 : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQS_IODRP2_DATA_RATE, + IDELAY_VALUE => LDQSN_TAP_DELAY_VAL, + MCB_ADDRESS => 15, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQS_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_dqsn, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_dqsn, + DQSOUTN => open, + DQSOUTP => idelay_dqs_ioi_s, + SDO => open, + TOUT => t_dqsn, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_2, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => in_pre_dqsp, + IOCLK0 => ioclk0, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => dqsn_oq, + SDI => ioi_drp_sdo, + T => dqsn_tq + ); +--/////////////////////////////////////////////// +--UDM +--////////////////////////////////////////////// + --NEED TO GENERATE UDM so that user won't instantiate in this location + + + iodrp2_dq_udm : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => 0, + MCB_ADDRESS => 8, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_MASTER, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => ioi_drp_sdi, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_udm, + DQSOUTN => open, + DQSOUTP => open, + SDO => open, + TOUT => t_udm, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_ldm, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => '0', + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => udm_oq, + SDI => ioi_drp_sdo, + T => udm_t + ); + +--/////////////////////////////////////////////// +--LDM +--////////////////////////////////////////////// + + + iodrp2_dq_ldm : IODRP2_MCB + GENERIC MAP ( + DATA_RATE => C_DQ_IODRP2_DATA_RATE, + IDELAY_VALUE => 0, + MCB_ADDRESS => 8, + ODELAY_VALUE => 0, + SERDES_MODE => C_DQ_IODRP2_SERDES_MODE_SLAVE, + SIM_TAPDELAY_VALUE => 10 + ) + PORT MAP ( + AUXSDO => aux_sdi_out_ldm, + DATAOUT => open, + DATAOUT2 => open, + DOUT => ioi_ldm, + DQSOUTN => open, + DQSOUTP => open, + SDO => open, + TOUT => t_ldm, + ADD => ioi_drp_add, + AUXADDR => ioi_drp_addr, + AUXSDOIN => aux_sdi_out_4, + BKST => ioi_drp_broadcast, + CLK => ioi_drp_clk, + CS => ioi_drp_cs, + IDATAIN => '0', + IOCLK0 => ioclk90, + IOCLK1 => '0', + MEMUPDATE => ioi_drp_update, + ODATAIN => ldm_oq, + SDI => ioi_drp_sdo, + T => ldm_t + ); + +end generate; + +------------------------------------------------ +--&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& IODRP2 instantiations end &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& +------------------------------------------------ + + -------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + --IOBs instantiations + -- this part need more inputs from design team + -- for now just use as listed in fpga.v + -----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +-- DRAM Address + gen_addr_obuft : FOR addr_i IN 0 TO C_MEM_ADDR_WIDTH - 1 GENERATE + iob_addr_inst : OBUFT + PORT MAP ( + I => ioi_addr(addr_i), + T => t_addr(addr_i), + O => mcbx_dram_addr(addr_i) + ); + END GENERATE; + + gen_ba_obuft : FOR ba_i IN 0 TO C_MEM_BANKADDR_WIDTH - 1 GENERATE + iob_ba_inst : OBUFT + PORT MAP ( + I => ioi_ba(ba_i), + T => t_ba(ba_i), + O => mcbx_dram_ba(ba_i) + ); + END GENERATE; + +-- DRAM control +--RAS + iob_ras : OBUFT + PORT MAP ( + O => mcbx_dram_ras_n, + I => ioi_ras, + T => t_ras + ); + +--CAS + iob_cas : OBUFT + PORT MAP ( + O => mcbx_dram_cas_n, + I => ioi_cas, + T => t_cas + ); + +--WE + iob_we : OBUFT + PORT MAP ( + O => mcbx_dram_we_n, + I => ioi_we, + T => t_we + ); + +--CKE + iob_cke : OBUFT + PORT MAP ( + O => mcbx_dram_cke, + I => ioi_cke, + T => t_cke + ); + +--DDR3 RST + gen_ddr3_rst : IF (C_MEM_TYPE = "DDR3") GENERATE + iob_rst : OBUFT + PORT MAP ( + O => mcbx_dram_ddr3_rst, + I => ioi_rst, + T => t_rst + ); + END GENERATE; + +--ODT + gen_dram_odt : IF ((C_MEM_TYPE = "DDR3" AND (not(C_MEM_DDR3_RTT = "OFF") OR not(C_MEM_DDR3_DYN_WRT_ODT = "OFF"))) + OR (C_MEM_TYPE = "DDR2" AND not(C_MEM_DDR2_RTT = "OFF")) ) GENERATE + iob_odt : OBUFT + PORT MAP ( + O => mcbx_dram_odt, + I => ioi_odt, + t => t_odt + ); + END GENERATE; + +--MEMORY CLOCK + iob_clk : OBUFTDS + PORT MAP ( + I => ioi_ck, + T => t_ck, + O => mcbx_dram_clk, + OB => mcbx_dram_clk_n + ); + +--DQ + gen_dq_iobuft : FOR dq_i IN 0 TO C_NUM_DQ_PINS-1 GENERATE + gen_iob_dq_inst : IOBUF + PORT MAP ( + IO => mcbx_dram_dq(dq_i), + I => ioi_dq(dq_i), + T => t_dq(dq_i), + O => in_pre_dq(dq_i) + ); + END GENERATE; + +-- x4 and x8 +--DQS +gen_dqs_iobuf : if((C_MEM_TYPE = "DDR" or C_MEM_TYPE = "MDDR" or (C_MEM_TYPE = "DDR2" and +(C_MEM_DDR2_DIFF_DQS_EN = "NO")))) generate + iob_dqs : IOBUF + PORT MAP ( + IO => mcbx_dram_dqs, + I => ioi_dqs, + T => t_dqs, + O => in_pre_dqsp + ); +end generate; + +--DQSP/DQSN +gen_dqs_iobufds : if((C_MEM_TYPE = "DDR3" or (C_MEM_TYPE = "DDR2" and +(C_MEM_DDR2_DIFF_DQS_EN = "YES")))) generate + iob_dqs : IOBUFDS + PORT MAP ( + IO => mcbx_dram_dqs, + IOB => mcbx_dram_dqs_n, + I => ioi_dqs, + T => t_dqs, + O => in_pre_dqsp + ); +end generate; + +-- x16 +--UDQS +gen_udqs_iobuf : if((C_MEM_TYPE = "DDR" or C_MEM_TYPE = "MDDR" or (C_MEM_TYPE = "DDR2" and +(C_MEM_DDR2_DIFF_DQS_EN = "NO"))) and C_NUM_DQ_PINS = 16) generate + iob_udqs : IOBUF + PORT MAP ( + IO => mcbx_dram_udqs, + I => ioi_udqs, + T => t_udqs, + O => in_pre_udqsp + ); +end generate; + +----UDQSP/UDQSN +gen_udqs_iobufds : if((C_MEM_TYPE = "DDR3" or (C_MEM_TYPE = "DDR2" and +(C_MEM_DDR2_DIFF_DQS_EN = "YES"))) and C_NUM_DQ_PINS = 16) generate + iob_udqs : IOBUFDS + PORT MAP ( + IO => mcbx_dram_udqs, + IOB => mcbx_dram_udqs_n, + I => ioi_udqs, + T => t_udqs, + O => in_pre_udqsp + ); +end generate; + +-- DQS PULLDWON +gen_dqs_pullupdn: if(C_MEM_TYPE = "DDR" or C_MEM_TYPE ="MDDR" or (C_MEM_TYPE = "DDR2" and (C_MEM_DDR2_DIFF_DQS_EN = "NO"))) generate +dqs_pulldown : PULLDOWN port map (O => mcbx_dram_dqs); +end generate; + +gen_dqs_pullupdn_ds : if((C_MEM_TYPE = "DDR3" or (C_MEM_TYPE = "DDR2" and +(C_MEM_DDR2_DIFF_DQS_EN = "YES")))) generate +dqs_pulldown :PULLDOWN port map (O => mcbx_dram_dqs); +dqs_n_pullup : PULLUP port map (O => mcbx_dram_dqs_n); +end generate; + +-- DQSN PULLUP +gen_udqs_pullupdn : if((C_MEM_TYPE = "DDR" or C_MEM_TYPE = "MDDR" or (C_MEM_TYPE = "DDR2" and +(C_MEM_DDR2_DIFF_DQS_EN = "NO"))) and C_NUM_DQ_PINS = 16) generate +udqs_pulldown : PULLDOWN port map (O => mcbx_dram_udqs); +end generate; + +gen_udqs_pullupdn_ds : if ((C_NUM_DQ_PINS = 16) and not(C_MEM_TYPE = "DDR" or C_MEM_TYPE = "MDDR" or (C_MEM_TYPE = "DDR2" and + (C_MEM_DDR2_DIFF_DQS_EN = "NO"))) ) generate +udqs_pulldown :PULLDOWN port map (O => mcbx_dram_udqs); +udqs_n_pullup : PULLUP port map (O => mcbx_dram_udqs_n); +end generate; + +--UDM +gen_udm : if(C_NUM_DQ_PINS = 16) generate + iob_udm : OBUFT + PORT MAP ( + I => ioi_udm, + T => t_udm, + O => mcbx_dram_udm + ); +end generate; +--LDM + iob_ldm : OBUFT + PORT MAP ( + I => ioi_ldm, + T => t_ldm, + O => mcbx_dram_ldm + ); + +selfrefresh_mode <= selfrefresh_mode_sig; + + end aarch; + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_soft_calibration.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_soft_calibration.vhd new file mode 100755 index 0000000..0e68a29 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_soft_calibration.vhd @@ -0,0 +1,1774 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: mcb_soft_calibration.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:17:26 $ +-- \ \ / \ Date Created: Mon Feb 9 2009 +-- \___\/\___\ +-- +--Device: Spartan6 +--Design Name: DDR/DDR2/DDR3/LPDDR +--Purpose: Xilinx reference design for MCB Soft +-- Calibration +--Reference: +-- +-- Revision: Date: Comment +-- 1.0: 2/06/09: Initial version for MIG wrapper. +-- 1.1: 2/09/09: moved Max_Value_Previous assignments to be completely inside CASE statement for next-state logic (needed to get it working +-- correctly) +-- 1.2: 2/12/09: Many other changes. +-- 1.3: 2/26/09: Removed section with Max_Value_pre and DQS_COUNT_PREVIOUS_pre, and instead added PREVIOUS_STATE reg and moved assignment to within +-- STATE +-- 1.4: 3/02/09: Removed comments out of sensitivity list of always block to mux SDI, SDO, CS, and ADD.Also added reg declaration for PREVIOUS_STATE +-- 1.5: 3/16/09: Added pll_lock port, and using it to gate reset. Changing RST (except input port) to RST_reg and gating it with pll_lock. +-- 1.6: 6/05/09: Added START_DYN_CAL_PRE with pulse on SYSRST; removed MCB_UIDQCOUNT. +-- 1.7: 6/24/09: Gave RZQ and ZIO each their own unique ADD and SDI nets +-- 2.6: 12/15/09: Changed STATE from 7-bit to 6-bit. Dropped (* FSM_ENCODING="BINARY" *) for STATE. Moved MCB_UICMDEN = 0 from OFF_RZQ_PTERM to +-- RST_DELAY. +-- Changed the "reset" always block so that RST_reg is always set to 1 when the PLL loses lock, and is now held in reset for at least +-- 16 clocks. Added PNSKEW option. +-- 2.7: 12/23/09: Added new states "SKEW" and "MULTIPLY_DIVIDE" to help with timing. +-- 2.8: 01/14/10: Added functionality to allow for SUSPEND. Changed MCB_SYSRST port from wire to reg. +-- 2.9: 02/01/10: More changes to SUSPEND and Reset logic to handle SUSPEND properly. Also - eliminated 2's comp DQS_COUNT_VIRTUAL, and replaced +-- with 8bit TARGET_DQS_DELAY which +-- will track most recnet Max_Value. Eliminated DQS_COUNT_PREVIOUS. Combined DQS_COUNT_INITIAL and DQS_DELAY into DQS_DELAY_INITIAL. +-- Changed DQS_COUNT* to DQS_DELAY*. +-- Changed MCB_SYSRST port back to wire (from reg). +-- 3.0: 02/10/10: Added count_inc and count_dec to add few (4) UI_CLK cycles latency to the INC and DEC signals(to deal with latency on UOREFRSHFLAG) +-- 3.1: 02/23/10: Registered the DONE_SOFTANDHARD_CAL for timing. +-- 3.2: 02/28/10: Corrected the WAIT_SELFREFRESH_EXIT_DQS_CAL logic; +-- 3.3: 03/02/10: Changed PNSKEW to default on (1'b1) +-- 3.4: 03/04/10: Recoded the RST_Reg logic. +-- 3.5: 03/05/10: Changed Result register to be 16-bits. Changed DQS_NUMERATOR/DENOMINATOR values to 3/8 (from 6/16) +-- 3.6 03/10/10: Improvements to Reset logic. +-- 3.7: 04/26/10: Added DDR2 Initialization fix to meet 400 ns wait as outlined in step d) of JEDEC DDR2 spec . +-- 3.8: 05/05/10: Added fixes for the CR# 559092 (updated Mult_Divide function) and 555416 (added IOB attribute to DONE_SOFTANDHARD_CAL). +-- 3.9: 05/24/10: Added 200us Wait logic to control CKE_Train. The 200us Wait counter assumes UI_CLK freq not higher than 100 MHz. +-- 3.10 10/22/10: Fixed PERFORM_START_DYN_CAL_AFTER_SELFREFRESH logic. +-- 3.11 2/14/11: Apply a different skkew for the P and N inputs for the differential LDQS and UDQS signals to provide more noise immunity. +-- 4.1 03/08/12: Fixed SELFREFRESH_MCB_REQ logic. It should not need depend on the SM STATE so that +-- MCB can come out of selfresh mode. SM requires refresh cycle to update the DQS value. +-- 4.2 05/10/12: All P/N terms of input and bidir memory pins are initialized with value of ZERO. TZQINIT_MAXCNT +-- are set to 8 for LPDDR,DDR and DDR2 interface . +-- Keep the UICMDEN in assertion state when SM is in RST_DELAY state so that MCB will not start doing +-- Premable detection until the second deassertion of MCB_SYSRST. + + +-- End Revision +--********************************************************************************** + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + USE ieee.numeric_std.all; + +entity mcb_soft_calibration is + generic ( + C_MEM_TZQINIT_MAXCNT : std_logic_vector(9 downto 0) := "1000000000"; -- DDR3 Minimum delay between resets + SKIP_IN_TERM_CAL : integer := 0; -- provides option to skip the input termination calibration + SKIP_DYNAMIC_CAL : integer := 0; -- provides option to skip the dynamic delay calibration + SKIP_DYN_IN_TERM : integer := 1; -- provides option to skip the input termination calibration + C_MC_CALIBRATION_MODE : string := "CALIBRATION"; -- if set to CALIBRATION will reset DQS IDELAY to DQS_NUMERATOR/DQS_DENOMINATOR local_param value + -- if set to NOCALIBRATION then defaults to hard cal blocks setting of C_MC_CALBRATION_DELAY + -- (Quarter, etc) + C_SIMULATION : string := "FALSE"; -- Tells us whether the design is being simulated or implemented + C_MEM_TYPE : string := "DDR" + + + ); + port ( + UI_CLK : in std_logic; -- main clock input for logic and IODRP CLK pins. At top level, this should also connect to IODRP2_MCB + -- CLK pins + RST : in std_logic; -- main system reset for both the Soft Calibration block - also will act as a passthrough to MCB's SYSRST + DONE_SOFTANDHARD_CAL : out std_logic; -- active high flag signals soft calibration of input delays is complete and MCB_UODONECAL is high (MCB + -- hard calib complete) + PLL_LOCK : in std_logic; -- Lock signal from PLL + SELFREFRESH_REQ : in std_logic; + SELFREFRESH_MCB_MODE : in std_logic; + SELFREFRESH_MCB_REQ : out std_logic; + SELFREFRESH_MODE : out std_logic; + IODRP_ADD : out std_logic; -- IODRP ADD port + IODRP_SDI : out std_logic; -- IODRP SDI port + RZQ_IN : in std_logic; -- RZQ pin from board - expected to have a 2*R resistor to ground + RZQ_IODRP_SDO : in std_logic; -- RZQ IODRP's SDO port + RZQ_IODRP_CS : out std_logic := '0'; -- RZQ IODRP's CS port + ZIO_IN : in std_logic; -- Z-stated IO pin - garanteed not to be driven externally + ZIO_IODRP_SDO : in std_logic; -- ZIO IODRP's SDO port + ZIO_IODRP_CS : out std_logic := '0'; -- ZIO IODRP's CS port + MCB_UIADD : out std_logic; -- to MCB's UIADD port + MCB_UISDI : out std_logic; -- to MCB's UISDI port + MCB_UOSDO : in std_logic; -- from MCB's UOSDO port (User output SDO) + MCB_UODONECAL : in std_logic; -- indicates when MCB hard calibration process is complete + MCB_UOREFRSHFLAG : in std_logic; -- high during refresh cycle and time when MCB is innactive + MCB_UICS : out std_logic; -- to MCB's UICS port (User Input CS) + MCB_UIDRPUPDATE : out std_logic := '1'; -- MCB's UIDRPUPDATE port (gets passed to IODRP2_MCB's MEMUPDATE port: this controls shadow latch used + -- during IODRP2_MCB writes). Currently just trasnparent + MCB_UIBROADCAST : out std_logic; -- only to MCB's UIBROADCAST port (User Input BROADCAST - gets passed to IODRP2_MCB's BKST port) + MCB_UIADDR : out std_logic_vector(4 downto 0) := "00000"; -- to MCB's UIADDR port (gets passed to IODRP2_MCB's AUXADDR port + MCB_UICMDEN : out std_logic := '1'; -- set to 1 to take control of UI interface - removes control from internal calib block + MCB_UIDONECAL : out std_logic := '0'; -- set to 0 to "tell" controller that it's still in a calibrate state + MCB_UIDQLOWERDEC : out std_logic ; + MCB_UIDQLOWERINC : out std_logic ; + MCB_UIDQUPPERDEC : out std_logic ; + MCB_UIDQUPPERINC : out std_logic ; + MCB_UILDQSDEC : out std_logic := '0'; + MCB_UILDQSINC : out std_logic := '0'; + MCB_UIREAD : out std_logic; -- enables read w/o writing by turning on a SDO->SDI loopback inside the IODRP2_MCBs (doesn't exist in + -- regular IODRP2). IODRPCTRLR_R_WB becomes don't-care. + MCB_UIUDQSDEC : out std_logic := '0'; + MCB_UIUDQSINC : out std_logic := '0'; + MCB_RECAL : out std_logic ; -- future hook to drive MCB's RECAL pin - initiates a hard re-calibration sequence when high + MCB_UICMD : out std_logic; + MCB_UICMDIN : out std_logic; + MCB_UIDQCOUNT : out std_logic_vector(3 downto 0); + MCB_UODATA : in std_logic_vector(7 downto 0); + MCB_UODATAVALID : in std_logic; + MCB_UOCMDREADY : in std_logic; + MCB_UO_CAL_START : in std_logic; + MCB_SYSRST : out std_logic; -- drives the MCB's SYSRST pin - the main reset for MCB + Max_Value : out std_logic_vector(7 downto 0); + CKE_Train : out std_logic + ); +end entity mcb_soft_calibration; + +architecture trans of mcb_soft_calibration is + + constant IOI_DQ0 : std_logic_vector(4 downto 0) := ("0000" & '1'); + constant IOI_DQ1 : std_logic_vector(4 downto 0) := ("0000" & '0'); + constant IOI_DQ2 : std_logic_vector(4 downto 0) := ("0001" & '1'); + constant IOI_DQ3 : std_logic_vector(4 downto 0) := ("0001" & '0'); + constant IOI_DQ4 : std_logic_vector(4 downto 0) := ("0010" & '1'); + constant IOI_DQ5 : std_logic_vector(4 downto 0) := ("0010" & '0'); + constant IOI_DQ6 : std_logic_vector(4 downto 0) := ("0011" & '1'); + constant IOI_DQ7 : std_logic_vector(4 downto 0) := ("0011" & '0'); + constant IOI_DQ8 : std_logic_vector(4 downto 0) := ("0100" & '1'); + constant IOI_DQ9 : std_logic_vector(4 downto 0) := ("0100" & '0'); + constant IOI_DQ10 : std_logic_vector(4 downto 0) := ("0101" & '1'); + constant IOI_DQ11 : std_logic_vector(4 downto 0) := ("0101" & '0'); + constant IOI_DQ12 : std_logic_vector(4 downto 0) := ("0110" & '1'); + constant IOI_DQ13 : std_logic_vector(4 downto 0) := ("0110" & '0'); + constant IOI_DQ14 : std_logic_vector(4 downto 0) := ("0111" & '1'); + constant IOI_DQ15 : std_logic_vector(4 downto 0) := ("0111" & '0'); + constant IOI_UDM : std_logic_vector(4 downto 0) := ("1000" & '1'); + constant IOI_LDM : std_logic_vector(4 downto 0) := ("1000" & '0'); + constant IOI_CK_P : std_logic_vector(4 downto 0) := ("1001" & '1'); + constant IOI_CK_N : std_logic_vector(4 downto 0) := ("1001" & '0'); + constant IOI_RESET : std_logic_vector(4 downto 0) := ("1010" & '1'); + constant IOI_A11 : std_logic_vector(4 downto 0) := ("1010" & '0'); + constant IOI_WE : std_logic_vector(4 downto 0) := ("1011" & '1'); + constant IOI_BA2 : std_logic_vector(4 downto 0) := ("1011" & '0'); + constant IOI_BA0 : std_logic_vector(4 downto 0) := ("1100" & '1'); + constant IOI_BA1 : std_logic_vector(4 downto 0) := ("1100" & '0'); + constant IOI_RASN : std_logic_vector(4 downto 0) := ("1101" & '1'); + constant IOI_CASN : std_logic_vector(4 downto 0) := ("1101" & '0'); + constant IOI_UDQS_CLK : std_logic_vector(4 downto 0) := ("1110" & '1'); + constant IOI_UDQS_PIN : std_logic_vector(4 downto 0) := ("1110" & '0'); + constant IOI_LDQS_CLK : std_logic_vector(4 downto 0) := ("1111" & '1'); + constant IOI_LDQS_PIN : std_logic_vector(4 downto 0) := ("1111" & '0'); + + constant START : std_logic_vector(5 downto 0) := "000000"; + constant LOAD_RZQ_NTERM : std_logic_vector(5 downto 0) := "000001"; + constant WAIT1 : std_logic_vector(5 downto 0) := "000010"; + constant LOAD_RZQ_PTERM : std_logic_vector(5 downto 0) := "000011"; + constant WAIT2 : std_logic_vector(5 downto 0) := "000100"; + constant INC_PTERM : std_logic_vector(5 downto 0) := "000101"; + constant MULTIPLY_DIVIDE : std_logic_vector(5 downto 0) := "000110"; + constant LOAD_ZIO_PTERM : std_logic_vector(5 downto 0) := "000111"; + constant WAIT3 : std_logic_vector(5 downto 0) := "001000"; + constant LOAD_ZIO_NTERM : std_logic_vector(5 downto 0) := "001001"; + constant WAIT4 : std_logic_vector(5 downto 0) := "001010"; + constant INC_NTERM : std_logic_vector(5 downto 0) := "001011"; + constant SKEW : std_logic_vector(5 downto 0) := "001100"; + constant WAIT_FOR_START_BROADCAST : std_logic_vector(5 downto 0) := "001101"; + constant BROADCAST_PTERM : std_logic_vector(5 downto 0) := "001110"; + constant WAIT5 : std_logic_vector(5 downto 0) := "001111"; + constant BROADCAST_NTERM : std_logic_vector(5 downto 0) := "010000"; + constant WAIT6 : std_logic_vector(5 downto 0) := "010001"; + + constant LDQS_CLK_WRITE_P_TERM : std_logic_vector(5 downto 0) := "010010"; + constant LDQS_CLK_P_TERM_WAIT : std_logic_vector(5 downto 0) := "010011"; + constant LDQS_CLK_WRITE_N_TERM : std_logic_vector(5 downto 0) := "010100"; + constant LDQS_CLK_N_TERM_WAIT : std_logic_vector(5 downto 0) := "010101"; + constant LDQS_PIN_WRITE_P_TERM : std_logic_vector(5 downto 0) := "010110"; + constant LDQS_PIN_P_TERM_WAIT : std_logic_vector(5 downto 0) := "010111"; + constant LDQS_PIN_WRITE_N_TERM : std_logic_vector(5 downto 0) := "011000"; + constant LDQS_PIN_N_TERM_WAIT : std_logic_vector(5 downto 0) := "011001"; + constant UDQS_CLK_WRITE_P_TERM : std_logic_vector(5 downto 0) := "011010"; + constant UDQS_CLK_P_TERM_WAIT : std_logic_vector(5 downto 0) := "011011"; + constant UDQS_CLK_WRITE_N_TERM : std_logic_vector(5 downto 0) := "011100"; + constant UDQS_CLK_N_TERM_WAIT : std_logic_vector(5 downto 0) := "011101"; + constant UDQS_PIN_WRITE_P_TERM : std_logic_vector(5 downto 0) := "011110"; + constant UDQS_PIN_P_TERM_WAIT : std_logic_vector(5 downto 0) := "011111"; + constant UDQS_PIN_WRITE_N_TERM : std_logic_vector(5 downto 0) := "100000"; + constant UDQS_PIN_N_TERM_WAIT : std_logic_vector(5 downto 0) := "100001"; + + constant OFF_RZQ_PTERM : std_logic_vector(5 downto 0) := "100010"; + constant WAIT7 : std_logic_vector(5 downto 0) := "100011"; + constant OFF_ZIO_NTERM : std_logic_vector(5 downto 0) := "100100"; + constant WAIT8 : std_logic_vector(5 downto 0) := "100101"; + constant RST_DELAY : std_logic_vector(5 downto 0) := "100110"; + constant START_DYN_CAL_PRE : std_logic_vector(5 downto 0) := "100111"; + constant WAIT_FOR_UODONE : std_logic_vector(5 downto 0) := "101000"; + constant LDQS_WRITE_POS_INDELAY : std_logic_vector(5 downto 0) := "101001"; + constant LDQS_WAIT1 : std_logic_vector(5 downto 0) := "101010"; + constant LDQS_WRITE_NEG_INDELAY : std_logic_vector(5 downto 0) := "101011"; + constant LDQS_WAIT2 : std_logic_vector(5 downto 0) := "101100"; + constant UDQS_WRITE_POS_INDELAY : std_logic_vector(5 downto 0) := "101101"; + constant UDQS_WAIT1 : std_logic_vector(5 downto 0) := "101110"; + constant UDQS_WRITE_NEG_INDELAY : std_logic_vector(5 downto 0) := "101111"; + constant UDQS_WAIT2 : std_logic_vector(5 downto 0) := "110000"; + constant START_DYN_CAL : std_logic_vector(5 downto 0) := "110001"; + constant WRITE_CALIBRATE : std_logic_vector(5 downto 0) := "110010"; + constant WAIT9 : std_logic_vector(5 downto 0) := "110011"; + constant READ_MAX_VALUE : std_logic_vector(5 downto 0) := "110100"; + constant WAIT10 : std_logic_vector(5 downto 0) := "110101"; + constant ANALYZE_MAX_VALUE : std_logic_vector(5 downto 0) := "110110"; + constant FIRST_DYN_CAL : std_logic_vector(5 downto 0) := "110111"; + constant INCREMENT : std_logic_vector(5 downto 0) := "111000"; + constant DECREMENT : std_logic_vector(5 downto 0) := "111001"; + constant DONE : std_logic_vector(5 downto 0) := "111010"; + --constant INCREMENT_TA : std_logic_vector(5 downto 0) := "111011"; + + constant RZQ : std_logic_vector(1 downto 0) := "00"; + constant ZIO : std_logic_vector(1 downto 0) := "01"; + constant MCB_PORT : std_logic_vector(1 downto 0) := "11"; + constant WRITE_MODE : std_logic := '0'; + constant READ_MODE : std_logic := '1'; + + -- IOI Registers + constant NoOp : std_logic_vector(7 downto 0) := "00000000"; + constant DelayControl : std_logic_vector(7 downto 0) := "00000001"; + constant PosEdgeInDly : std_logic_vector(7 downto 0) := "00000010"; + constant NegEdgeInDly : std_logic_vector(7 downto 0) := "00000011"; + constant PosEdgeOutDly : std_logic_vector(7 downto 0) := "00000100"; + constant NegEdgeOutDly : std_logic_vector(7 downto 0) := "00000101"; + constant MiscCtl1 : std_logic_vector(7 downto 0) := "00000110"; + constant MiscCtl2 : std_logic_vector(7 downto 0) := "00000111"; + constant MaxValue : std_logic_vector(7 downto 0) := "00001000"; + + -- IOB Registers + constant PDrive : std_logic_vector(7 downto 0) := "10000000"; + constant PTerm : std_logic_vector(7 downto 0) := "10000001"; + constant NDrive : std_logic_vector(7 downto 0) := "10000010"; + constant NTerm : std_logic_vector(7 downto 0) := "10000011"; + constant SlewRateCtl : std_logic_vector(7 downto 0) := "10000100"; + constant LVDSControl : std_logic_vector(7 downto 0) := "10000101"; + constant MiscControl : std_logic_vector(7 downto 0) := "10000110"; + constant InputControl : std_logic_vector(7 downto 0) := "10000111"; + constant TestReadback : std_logic_vector(7 downto 0) := "10001000"; + +-- No multi/divide is required when a 55 ohm resister is used on RZQ +-- localparam MULT = 1; +-- localparam DIV = 1; +-- use 7/4 scaling factor when the 100 ohm RZQ is used + constant MULT : integer := 7; + constant DIV : integer := 4; + + constant PNSKEW : std_logic := '1'; -- Default is 1'b1. Change to 1'b0 if PSKEW and NSKEW are not required + constant PNSKEWDQS : std_logic := '1'; + + constant MULT_S : integer := 9; + constant DIV_S : integer := 8; + constant MULT_W : integer := 7; + constant DIV_W : integer := 8; + + constant DQS_NUMERATOR : integer := 3; + constant DQS_DENOMINATOR : integer := 8; + constant INCDEC_THRESHOLD : std_logic_vector(7 downto 0) := X"03"; + -- parameter for the threshold which triggers an inc/dec to occur. 2 for half, 4 for quarter, + -- 3 for three eighths + + constant RST_CNT : std_logic_vector(9 downto 0) := "0000010000"; + + constant IN_TERM_PASS : std_logic := '0'; + constant DYN_CAL_PASS : std_logic := '1'; + + function TZQINIT_MAXCNT_W return std_logic_vector is + variable temp : std_logic_vector(9 downto 0) := (others=>'0'); + begin + if (C_MEM_TYPE = "DDR3") then + temp := C_MEM_TZQINIT_MAXCNT + RST_CNT; + else + temp := 8 + RST_CNT; + end if; + return temp(9 downto 0); + end function; + + constant TZQINIT_MAXCNT : std_logic_vector(9 downto 0) := TZQINIT_MAXCNT_W; + + component iodrp_mcb_controller is + port ( + memcell_address : in std_logic_vector(7 downto 0); + write_data : in std_logic_vector(7 downto 0); + read_data : out std_logic_vector(7 downto 0); + rd_not_write : in std_logic; + cmd_valid : in std_logic; + rdy_busy_n : out std_logic; + use_broadcast : in std_logic; + drp_ioi_addr : in std_logic_vector(4 downto 0); + sync_rst : in std_logic; + DRP_CLK : in std_logic; + DRP_CS : out std_logic; + DRP_SDI : out std_logic; + DRP_ADD : out std_logic; + DRP_BKST : out std_logic; + DRP_SDO : in std_logic; + MCB_UIREAD : out std_logic + ); + end component; + + component iodrp_controller is + port ( + memcell_address : in std_logic_vector(7 downto 0); + write_data : in std_logic_vector(7 downto 0); + read_data : out std_logic_vector(7 downto 0); + rd_not_write : in std_logic; + cmd_valid : in std_logic; + rdy_busy_n : out std_logic; + use_broadcast : in std_logic; + sync_rst : in std_logic; + DRP_CLK : in std_logic; + DRP_CS : out std_logic; + DRP_SDI : out std_logic; + DRP_ADD : out std_logic; + DRP_BKST : out std_logic; + DRP_SDO : in std_logic + ); + end component; + + signal P_Term : std_logic_vector(5 downto 0) := "000000"; + signal N_Term : std_logic_vector(6 downto 0) := "0000000"; + signal P_Term_s : std_logic_vector(5 downto 0) := "000000"; + signal N_Term_s : std_logic_vector(6 downto 0) := "0000000"; + signal P_Term_w : std_logic_vector(5 downto 0) := "000000"; + signal N_Term_w : std_logic_vector(6 downto 0) := "0000000"; + signal P_Term_Prev : std_logic_vector(5 downto 0) := "000000"; + signal N_Term_Prev : std_logic_vector(6 downto 0) := "0000000"; + + signal STATE : std_logic_vector(5 downto 0); + signal IODRPCTRLR_MEMCELL_ADDR : std_logic_vector(7 downto 0); + signal IODRPCTRLR_WRITE_DATA : std_logic_vector(7 downto 0); + signal Active_IODRP : std_logic_vector(1 downto 0); + signal IODRPCTRLR_R_WB : std_logic := '0'; + signal IODRPCTRLR_CMD_VALID : std_logic := '0'; + signal IODRPCTRLR_USE_BKST : std_logic := '0'; + signal MCB_CMD_VALID : std_logic := '0'; + signal MCB_USE_BKST : std_logic := '0'; + signal Pre_SYSRST : std_logic := '1'; -- internally generated reset which will OR with RST input to drive MCB's + -- SYSRST pin (MCB_SYSRST) + signal IODRP_SDO : std_logic; + signal Max_Value_Previous : std_logic_vector(7 downto 0) := "00000000"; + signal count : std_logic_vector(5 downto 0) := "000000"; -- counter for adding 18 extra clock cycles after setting Calibrate bit + signal counter_en : std_logic := '0'; -- counter enable for "count" + signal First_Dyn_Cal_Done : std_logic := '0'; -- flag - high after the very first dynamic calibration is done + signal START_BROADCAST : std_logic ; -- Trigger to start Broadcast to IODRP2_MCBs to set Input Impedance - + -- state machine will wait for this to be high + signal DQS_DELAY_INITIAL : std_logic_vector(7 downto 0) := "00000000"; + signal DQS_DELAY : std_logic_vector(7 downto 0); -- contains the latest values written to LDQS and UDQS Input Delays + signal TARGET_DQS_DELAY : std_logic_vector(7 downto 0); -- used to track the target for DQS input delays - only gets updated if + -- the Max Value changes by more than the threshold + signal counter_inc : std_logic_vector(7 downto 0); -- used to delay Inc signal by several ui_clk cycles (to deal with + -- latency on UOREFRSHFLAG) + signal counter_dec : std_logic_vector(7 downto 0); -- used to delay Dec signal by several ui_clk cycles (to deal with + -- latency on UOREFRSHFLAG) + signal IODRPCTRLR_READ_DATA : std_logic_vector(7 downto 0); + signal IODRPCTRLR_RDY_BUSY_N : std_logic; + signal IODRP_CS : std_logic; + signal MCB_READ_DATA : std_logic_vector(7 downto 0); + signal RST_reg : std_logic; + signal Block_Reset : std_logic; + signal MCB_UODATAVALID_U : std_logic; + + signal Inc_Dec_REFRSH_Flag : std_logic_vector(2 downto 0); -- 3-bit flag to show:Inc is needed, Dec needed, refresh cycle taking place + signal Max_Value_Delta_Up : std_logic_vector(7 downto 0); -- tracks amount latest Max Value has gone up from previous Max Value read + signal Half_MV_DU : std_logic_vector(7 downto 0); -- half of Max_Value_Delta_Up + signal Max_Value_Delta_Dn : std_logic_vector(7 downto 0); -- tracks amount latest Max Value has gone down from previous Max Value read + signal Half_MV_DD : std_logic_vector(7 downto 0); -- half of Max_Value_Delta_Dn + + signal RstCounter : std_logic_vector(9 downto 0) := (others => '0'); + signal rst_tmp : std_logic; + signal LastPass_DynCal : std_logic; + signal First_In_Term_Done : std_logic; + signal Inc_Flag : std_logic; -- flag to increment Dynamic Delay + signal Dec_Flag : std_logic; -- flag to decrement Dynamic Delay + + signal CALMODE_EQ_CALIBRATION : std_logic; -- will calculate and set the DQS input delays if C_MC_CALIBRATION_MODE + -- parameter = "CALIBRATION" + signal DQS_DELAY_LOWER_LIMIT : std_logic_vector(7 downto 0); -- Lower limit for DQS input delays + signal DQS_DELAY_UPPER_LIMIT : std_logic_vector(7 downto 0); -- Upper limit for DQS input delays + signal SKIP_DYN_IN_TERMINATION : std_logic; -- wire to allow skipping dynamic input termination if either the + -- one-time or dynamic parameters are 1 + signal SKIP_DYNAMIC_DQS_CAL : std_logic; -- wire allowing skipping dynamic DQS delay calibration if either + -- SKIP_DYNIMIC_CAL=1, or if C_MC_CALIBRATION_MODE=NOCALIBRATION + signal Quarter_Max_Value : std_logic_vector(7 downto 0); + signal Half_Max_Value : std_logic_vector(7 downto 0); + signal PLL_LOCK_R1 : std_logic; + signal PLL_LOCK_R2 : std_logic; + signal MCB_RDY_BUSY_N : std_logic; + + signal SELFREFRESH_REQ_R1 : std_logic; + signal SELFREFRESH_REQ_R2 : std_logic; + signal SELFREFRESH_REQ_R3 : std_logic; + signal SELFREFRESH_MCB_MODE_R1 : std_logic; + signal SELFREFRESH_MCB_MODE_R2 : std_logic; + signal SELFREFRESH_MCB_MODE_R3 : std_logic; + signal WAIT_SELFREFRESH_EXIT_DQS_CAL : std_logic; + signal PERFORM_START_DYN_CAL_AFTER_SELFREFRESH : std_logic; + signal START_DYN_CAL_STATE_R1 : std_logic; + signal PERFORM_START_DYN_CAL_AFTER_SELFREFRESH_R1 : std_logic; + + -- Declare intermediate signals for referenced outputs + signal IODRP_ADD_xilinx0 : std_logic; + signal IODRP_SDI_xilinx1 : std_logic; + signal MCB_UIADD_xilinx2 : std_logic; + signal MCB_UISDI_xilinx11 : std_logic; + signal MCB_UICS_xilinx6 : std_logic; + signal MCB_UIBROADCAST_xilinx4 : std_logic; + signal MCB_UIADDR_int : std_logic_vector(4 downto 0); + signal MCB_UIDONECAL_xilinx7 : std_logic; + signal MCB_UIREAD_xilinx10 : std_logic; + signal SELFREFRESH_MODE_xilinx11 : std_logic; + signal Max_Value_int : std_logic_vector(7 downto 0); + signal Rst_condition1 : std_logic; + --signal Rst_condition2 : std_logic; + signal non_violating_rst : std_logic; + signal WAIT_200us_COUNTER : std_logic_vector(15 downto 0); + signal WaitTimer : std_logic_vector(7 downto 0); + signal WarmEnough : std_logic; + signal WaitCountEnable : std_logic; + signal State_Start_DynCal_R1 : std_logic; + signal State_Start_DynCal : std_logic; + + signal pre_sysrst_minpulse_width_ok : std_logic; + signal pre_sysrst_cnt : std_logic_vector(3 downto 0); + + -- This function multiplies by a constant MULT and then divides by the DIV constant + function Mult_Divide (Input : std_logic_vector(7 downto 0); MULT : integer ; DIV : integer ) return std_logic_vector is + variable Result : integer := 0; + variable temp : std_logic_vector(14 downto 0) := "000000000000000"; + begin + for count in 0 to (MULT-1) loop + temp := temp + ("0000000" & Input); + end loop; + Result := (to_integer(unsigned(temp))) / (DIV); + temp := std_logic_vector(to_unsigned(Result,15)); + return temp(7 downto 0); + end function Mult_Divide; + + + + attribute syn_preserve : boolean; + attribute syn_preserve of P_Term : signal is TRUE; + attribute syn_preserve of N_Term : signal is TRUE; + attribute syn_preserve of P_Term_s : signal is TRUE; + attribute syn_preserve of N_Term_s : signal is TRUE; + attribute syn_preserve of P_Term_w : signal is TRUE; + attribute syn_preserve of N_Term_w : signal is TRUE; + + + + + attribute syn_preserve of P_Term_Prev : signal is TRUE; + attribute syn_preserve of N_Term_Prev : signal is TRUE; + attribute syn_preserve of IODRPCTRLR_MEMCELL_ADDR : signal is TRUE; + attribute syn_preserve of IODRPCTRLR_WRITE_DATA : signal is TRUE; + attribute syn_preserve of Max_Value_Previous : signal is TRUE; + attribute syn_preserve of DQS_DELAY_INITIAL : signal is TRUE; + + attribute iob : string; + attribute iob of DONE_SOFTANDHARD_CAL : signal is "FALSE"; + +begin + + +-- move the default assignment here to make FORMALITY happy. + + START_BROADCAST <= '1'; + MCB_RECAL <= '0'; + MCB_UIDQLOWERDEC <= '0'; + MCB_UIADDR <= MCB_UIADDR_int; + MCB_UIDQLOWERINC <= '0'; + MCB_UIDQUPPERDEC <= '0'; + MCB_UIDQUPPERINC <= '0'; + + + Max_Value <= Max_Value_int; + -- Drive referenced outputs + IODRP_ADD <= IODRP_ADD_xilinx0; + IODRP_SDI <= IODRP_SDI_xilinx1; + MCB_UIADD <= MCB_UIADD_xilinx2; + MCB_UISDI <= MCB_UISDI_xilinx11; + MCB_UICS <= MCB_UICS_xilinx6; + MCB_UIBROADCAST <= MCB_UIBROADCAST_xilinx4; + MCB_UIDONECAL <= MCB_UIDONECAL_xilinx7; + MCB_UIREAD <= MCB_UIREAD_xilinx10; + SELFREFRESH_MODE <= SELFREFRESH_MODE_xilinx11; + + Inc_Dec_REFRSH_Flag <= (Inc_Flag & Dec_Flag & MCB_UOREFRSHFLAG); + Max_Value_Delta_Up <= Max_Value_int - Max_Value_Previous; + Half_MV_DU <= ('0' & Max_Value_Delta_Up(7 downto 1)); + Max_Value_Delta_Dn <= Max_Value_Previous - Max_Value_int; + Half_MV_DD <= ('0' & Max_Value_Delta_Dn(7 downto 1)); + CALMODE_EQ_CALIBRATION <= '1' when (C_MC_CALIBRATION_MODE = "CALIBRATION") else '0'; -- will calculate and set the DQS input delays if = 1'b1 + Half_Max_Value <= ('0' & Max_Value_int(7 downto 1)); + Quarter_Max_Value <= ("00" & Max_Value_int(7 downto 2)); + DQS_DELAY_LOWER_LIMIT <= Quarter_Max_Value; -- limit for DQS_DELAY for decrements; could optionally be assigned to any 8-bit hex value here + DQS_DELAY_UPPER_LIMIT <= Half_Max_Value; -- limit for DQS_DELAY for increments; could optionally be assigned to any 8-bit hex value here + SKIP_DYN_IN_TERMINATION <= '1' when ((SKIP_DYN_IN_TERM = 1) or (SKIP_IN_TERM_CAL = 1)) else '0'; + -- skip dynamic input termination if either the one-time or dynamic parameters are 1 + SKIP_DYNAMIC_DQS_CAL <= '1' when ((CALMODE_EQ_CALIBRATION = '0') or (SKIP_DYNAMIC_CAL = 1)) else '0'; + -- skip dynamic DQS delay calibration if either SKIP_DYNAMIC_CAL=1, or if C_MC_CALIBRATION_MODE=NOCALIBRATION + + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if ((DQS_DELAY_INITIAL /= X"00") or (STATE = DONE)) then + DONE_SOFTANDHARD_CAL <= MCB_UODONECAL; -- high when either DQS input delays initialized, or STATE=DONE and UODONECAL high + else + DONE_SOFTANDHARD_CAL <= '0'; + end if; + end if; + end process; + + iodrp_controller_inst : iodrp_controller + port map ( + memcell_address => IODRPCTRLR_MEMCELL_ADDR, + write_data => IODRPCTRLR_WRITE_DATA, + read_data => IODRPCTRLR_READ_DATA, + rd_not_write => IODRPCTRLR_R_WB, + cmd_valid => IODRPCTRLR_CMD_VALID, + rdy_busy_n => IODRPCTRLR_RDY_BUSY_N, + use_broadcast => '0', + sync_rst => RST_reg, + DRP_CLK => UI_CLK, + DRP_CS => IODRP_CS, + DRP_SDI => IODRP_SDI_xilinx1, + DRP_ADD => IODRP_ADD_xilinx0, + DRP_SDO => IODRP_SDO, + DRP_BKST => open + ); + + iodrp_mcb_controller_inst : iodrp_mcb_controller + port map ( + memcell_address => IODRPCTRLR_MEMCELL_ADDR, + write_data => IODRPCTRLR_WRITE_DATA, + read_data => MCB_READ_DATA, + rd_not_write => IODRPCTRLR_R_WB, + cmd_valid => MCB_CMD_VALID, + rdy_busy_n => MCB_RDY_BUSY_N, + use_broadcast => MCB_USE_BKST, + drp_ioi_addr => MCB_UIADDR_int, + sync_rst => RST_reg, + DRP_CLK => UI_CLK, + DRP_CS => MCB_UICS_xilinx6, + DRP_SDI => MCB_UISDI_xilinx11, + DRP_ADD => MCB_UIADD_xilinx2, + DRP_BKST => MCB_UIBROADCAST_xilinx4, + DRP_SDO => MCB_UOSDO, + MCB_UIREAD => MCB_UIREAD_xilinx10 + ); + + process (UI_CLK, RST) begin + if (RST = '1') then + if (C_SIMULATION = "TRUE") then + WAIT_200us_COUNTER <= X"7FF0"; + else + WAIT_200us_COUNTER <= (others => '0'); + end if; + elsif (UI_CLK'event and UI_CLK = '1') then + if (WAIT_200us_COUNTER(15) = '1') then + WAIT_200us_COUNTER <= WAIT_200us_COUNTER; + else + WAIT_200us_COUNTER <= WAIT_200us_COUNTER + '1'; + end if; + end if; + end process; + + -- init_sequence_skip: if (C_SIMULATION = "TRUE") generate + -- WAIT_200us_COUNTER <= X"FFFF"; + -- process + -- begin + -- report "The 200 us wait period required before CKE goes active has been skipped in Simulation"; + -- wait; + -- end process; + -- end generate; + + + gen_CKE_Train_a: if (C_MEM_TYPE = "DDR2") generate + process (UI_CLK, RST) begin + if (RST = '1') then + CKE_Train <= '0'; + elsif (UI_CLK'event and UI_CLK = '1') then + if (STATE = WAIT_FOR_UODONE and MCB_UODONECAL = '1') then + CKE_Train <= '0'; + elsif (WAIT_200us_COUNTER(15) = '1' and MCB_UODONECAL = '0') then + CKE_Train <= '1'; + else + CKE_Train <= '0'; + end if; + end if; + end process; + end generate ; + + gen_CKE_Train_b: if (not(C_MEM_TYPE = "DDR2")) generate + process (UI_CLK) begin + if (UI_CLK'event and UI_CLK = '1') then + CKE_Train <= '0'; + end if; + end process; + end generate ; + +--******************************************** +-- PLL_LOCK and RST signals +--******************************************** + --MCB_SYSRST <= Pre_SYSRST or RST_reg; -- Pre_SYSRST is generated from the STATE state machine, and is OR'd with RST_reg input to drive MCB's + -- SYSRST pin (MCB_SYSRST) + + rst_tmp <= not(SELFREFRESH_MODE_xilinx11) and not(PLL_LOCK_R2); -- rst_tmp becomes 1 if you lose Lock and the device is not in SUSPEND + + process (UI_CLK, RST) begin + if (RST = '1') then + --Block_Reset <= '0'; + --RstCounter <= (others => '0'); + --elsif (UI_CLK'event and UI_CLK = '1') then + -- if (rst_tmp = '1') then -- this is to deal with not allowing the user-reset "RST" to violate TZQINIT_MAXCNT (min time between resets to DDR3) + Block_Reset <= '0'; + RstCounter <= (others => '0'); + elsif (UI_CLK'event and UI_CLK = '1') then + Block_Reset <= '0'; -- default to allow STATE to move out of RST_DELAY state + if (Pre_SYSRST = '1') then + RstCounter <= RST_CNT; -- whenever STATE wants to reset the MCB, set RstCounter to h10 + else + if (RstCounter < TZQINIT_MAXCNT) then -- if RstCounter is less than d512 than this will execute + Block_Reset <= '1'; -- STATE won't exit RST_DELAY state + RstCounter <= RstCounter + "1"; -- and Rst_Counter increments + end if; + end if; + end if; + --end if; + end process; + + -- Rst_contidtion1 is to make sure RESET will not happen again within TZQINIT_MAXCNT + non_violating_rst <= RST and Rst_condition1; + MCB_SYSRST <= Pre_SYSRST; + + process (UI_CLK) begin + if (UI_CLK'event and UI_CLK = '1') then + if (RstCounter >= TZQINIT_MAXCNT) then + Rst_condition1 <= '1'; + else + Rst_condition1 <= '0'; + end if; + end if; + end process; + +-- -- non_violating_rst asserts whenever (system-level reset) RST is asserted but must be after TZQINIT_MAXCNT is reached (min-time between resets for DDR3) +-- -- After power stablizes, we will hold MCB in reset state for at least 200us before beginning initialization process. +-- -- If the PLL loses lock during normal operation, no ui_clk will be present because mcb_drp_clk is from a BUFGCE which +-- is gated by pll's lock signal. When the PLL locks again, the RST_reg stays asserted for at least 200 us which +-- will cause MCB to reset and reinitialize the memory afterwards. +-- -- During SUSPEND operation, the PLL will lose lock but non_violating_rst remains low (de-asserted) and WAIT_200us_COUNTER stays at +-- its terminal count. The PLL_LOCK input does not come direct from PLL, rather it is driven by gated_pll_lock from mcb_raw_wrapper module +-- The gated_pll_lock in the mcb_raw_wrapper does not de-assert during SUSPEND operation, hence PLL_LOCK will not de-assert, and the soft calibration +-- state machine will not reset during SUSPEND. +-- -- RST_reg is the control signal that resets the mcb_soft_calibration's State Machine. The MCB_SYSRST is now equal to +-- Pre_SYSRST. When State Machine is performing "INPUT Termination Calibration", it holds the MCB in reset by assertign MCB_SYSRST. +-- It will deassert the MCB_SYSRST so that it can grab the bus to broadcast the P and N term value to all of the DQ pins. Once the calibrated INPUT +-- termination is set, the State Machine will issue another short MCB_SYSRST so that MCB will use the tuned input termination during DQS preamble calibration. + + + --process (UI_CLK) begin + -- if (UI_CLK'event and UI_CLK = '1') then + -- + -- if (RstCounter < RST_CNT) then + -- Rst_condition2 <= '1'; + -- else + -- Rst_condition2 <= '0'; + -- end if; + -- end if; + --end process; + + process (UI_CLK, non_violating_rst) begin + if (non_violating_rst = '1') then + RST_reg <= '1'; -- STATE and MCB_SYSRST will both be reset if you lose lock when the device is not in SUSPEND + elsif (UI_CLK'event and UI_CLK = '1') then + if (WAIT_200us_COUNTER(15) = '0') then + RST_reg <= '1'; + else + --RST_reg <= Rst_condition2 or rst_tmp; -- insures RST_reg is at least h10 pulses long + RST_reg <= rst_tmp; -- insures RST_reg is at least h10 pulses long + end if; + end if; + end process; + +--************************************************************* +-- Stretching the pre_sysrst to satisfy the minimum pulse width +--************************************************************* + +process (UI_CLK) begin +if (UI_CLK'event and UI_CLK = '1') then + if (STATE = START_DYN_CAL_PRE) then + pre_sysrst_cnt <= pre_sysrst_cnt + '1'; + else + pre_sysrst_cnt <= (others=>'0'); + end if; +end if; +end process; + +pre_sysrst_minpulse_width_ok <= pre_sysrst_cnt(3); + +--******************************************** +-- SUSPEND Logic +--******************************************** + process (UI_CLK,RST) + begin + if (RST = '1') then + + SELFREFRESH_MCB_MODE_R1 <= '0'; + SELFREFRESH_MCB_MODE_R2 <= '0'; + SELFREFRESH_MCB_MODE_R3 <= '0'; + + SELFREFRESH_REQ_R1 <= '0'; + SELFREFRESH_REQ_R2 <= '0'; + SELFREFRESH_REQ_R3 <= '0'; + + PLL_LOCK_R1 <= '0'; + PLL_LOCK_R2 <= '0'; + + elsif (UI_CLK'event and UI_CLK = '1') then + -- SELFREFRESH_MCB_MODE is clocked by sysclk_2x_180 + SELFREFRESH_MCB_MODE_R1 <= SELFREFRESH_MCB_MODE; + SELFREFRESH_MCB_MODE_R2 <= SELFREFRESH_MCB_MODE_R1; + SELFREFRESH_MCB_MODE_R3 <= SELFREFRESH_MCB_MODE_R2; + + -- SELFREFRESH_REQ is clocked by user's application clock + SELFREFRESH_REQ_R1 <= SELFREFRESH_REQ; + SELFREFRESH_REQ_R2 <= SELFREFRESH_REQ_R1; + SELFREFRESH_REQ_R3 <= SELFREFRESH_REQ_R2; + + PLL_LOCK_R1 <= PLL_LOCK; + PLL_LOCK_R2 <= PLL_LOCK_R1; + + end if; + end process; + +-- SELFREFRESH should only be deasserted after PLL_LOCK is asserted. +-- This is to make sure MCB get a locked sys_2x_clk before exiting +-- SELFREFRESH mode. + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST = '1') then + SELFREFRESH_MCB_REQ <= '0'; + --elsif ((PLL_LOCK_R2 = '1') and (SELFREFRESH_REQ_R3 = '0') and (STATE = START_DYN_CAL)) then + elsif ((PLL_LOCK_R2 = '1') and (SELFREFRESH_REQ_R3 = '0')) then + SELFREFRESH_MCB_REQ <= '0'; + elsif ((STATE = START_DYN_CAL) and (SELFREFRESH_REQ_R3 = '1')) then + SELFREFRESH_MCB_REQ <= '1'; + end if; + end if; + end process; + + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST = '1') then + WAIT_SELFREFRESH_EXIT_DQS_CAL <= '0'; + elsif ((SELFREFRESH_MCB_MODE_R2 = '1') and (SELFREFRESH_MCB_MODE_R3 = '0')) then + WAIT_SELFREFRESH_EXIT_DQS_CAL <= '1'; + elsif ((WAIT_SELFREFRESH_EXIT_DQS_CAL = '1') and (SELFREFRESH_REQ_R3 = '0') and (PERFORM_START_DYN_CAL_AFTER_SELFREFRESH = '1')) then + -- START_DYN_CAL is next state + WAIT_SELFREFRESH_EXIT_DQS_CAL <= '0'; + end if; + end if; + end process; + +-- Need to detect when SM entering START_DYN_CAL + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST = '1') then + PERFORM_START_DYN_CAL_AFTER_SELFREFRESH <= '0'; + START_DYN_CAL_STATE_R1 <= '0'; + else + -- register PERFORM_START_DYN_CAL_AFTER_SELFREFRESH to detect end of cycle + PERFORM_START_DYN_CAL_AFTER_SELFREFRESH_R1 <= PERFORM_START_DYN_CAL_AFTER_SELFREFRESH; + if (STATE = START_DYN_CAL) then + START_DYN_CAL_STATE_R1 <= '1'; + else + START_DYN_CAL_STATE_R1 <= '0'; + end if; + if ((WAIT_SELFREFRESH_EXIT_DQS_CAL = '1') and (STATE /= START_DYN_CAL) and (START_DYN_CAL_STATE_R1 = '1')) then + PERFORM_START_DYN_CAL_AFTER_SELFREFRESH <= '1'; + elsif ((STATE = START_DYN_CAL) and (SELFREFRESH_MCB_MODE_R3 = '0')) then + PERFORM_START_DYN_CAL_AFTER_SELFREFRESH <= '0'; + end if; + end if; + end if; + end process; + +-- SELFREFRESH_MCB_MODE deasserted status is hold off +-- until Soft_Calib has at least done one loop of DQS update. +-- New logic WarmeEnough is added to make sure PLL_Lock is lockec and all IOs stable before +-- deassert the status of MCB's SELFREFRESH_MODE. This is to ensure all IOs are stable before +-- user logic sending new commands to MCB. + + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST = '1') then + SELFREFRESH_MODE_xilinx11 <= '0'; + elsif (SELFREFRESH_MCB_MODE_R2 = '1') then + SELFREFRESH_MODE_xilinx11 <= '1'; + elsif (WarmEnough = '1') then + SELFREFRESH_MODE_xilinx11 <= '0'; + end if; + end if; + end process; + + + + + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST = '1') then + WaitCountEnable <= '0'; + elsif (SELFREFRESH_REQ_R2 = '0' and SELFREFRESH_REQ_R1 = '1') then + WaitCountEnable <= '0'; + elsif ((PERFORM_START_DYN_CAL_AFTER_SELFREFRESH = '0') and (PERFORM_START_DYN_CAL_AFTER_SELFREFRESH_R1 = '1')) then + WaitCountEnable <= '1'; + else + WaitCountEnable <= WaitCountEnable; + end if; + end if; + end process; + + + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST = '1') then + State_Start_DynCal <= '0'; + elsif (STATE = START_DYN_CAL) then + State_Start_DynCal <= '1'; + else + State_Start_DynCal <= '0'; + end if; + end if; + end process; + + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST = '1') then + State_Start_DynCal_R1 <= '0'; + else + State_Start_DynCal_R1 <= State_Start_DynCal; + end if; + end if; + end process; + + + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST = '1') then + WaitTimer <= (others => '0'); + WarmEnough <= '1'; + elsif ((SELFREFRESH_REQ_R2 = '0') and (SELFREFRESH_REQ_R1 = '1')) then + WaitTimer <= (others => '0'); + WarmEnough <= '0'; + elsif (WaitTimer = X"04") then + WaitTimer <= WaitTimer ; + WarmEnough <= '1'; + elsif (WaitCountEnable = '1') then + WaitTimer <= WaitTimer + '1'; + else + WaitTimer <= WaitTimer ; + end if; + end if; + end process; + +--******************************************** +--Comparitor for Dynamic Calibration circuit +--******************************************** + Dec_Flag <= '1' when (TARGET_DQS_DELAY < DQS_DELAY) else '0'; + Inc_Flag <= '1' when (TARGET_DQS_DELAY > DQS_DELAY) else '0'; + +--********************************************************************************************* +--Counter for extra clock cycles injected after setting Calibrate bit in IODRP2 for Dynamic Cal +--********************************************************************************************* + process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST_reg = '1') then + count <= "000000"; + elsif (counter_en = '1') then + count <= count + "000001"; + else + count <= "000000"; + end if; + end if; + end process; + +--********************************************************************************************* +-- Capture narrow MCB_UODATAVALID pulse - only one sysclk90 cycle wide +--********************************************************************************************* + process (UI_CLK, MCB_UODATAVALID) + begin + if(MCB_UODATAVALID = '1') then + MCB_UODATAVALID_U <= '1'; + elsif(UI_CLK'event and UI_CLK = '1') then + MCB_UODATAVALID_U <= MCB_UODATAVALID; + end if; + end process; + +--************************************************************************************************************** +--Always block to mux SDI, SDO, CS, and ADD depending on which IODRP is active: RZQ, ZIO or MCB's UI port (to IODRP2_MCBs) +--************************************************************************************************************** + process (Active_IODRP, IODRP_CS, RZQ_IODRP_SDO, ZIO_IODRP_SDO) + begin + case Active_IODRP is + when RZQ => + RZQ_IODRP_CS <= IODRP_CS; + ZIO_IODRP_CS <= '0'; + IODRP_SDO <= RZQ_IODRP_SDO; + when ZIO => + RZQ_IODRP_CS <= '0'; + ZIO_IODRP_CS <= IODRP_CS; + IODRP_SDO <= ZIO_IODRP_SDO; + when MCB_PORT => + RZQ_IODRP_CS <= '0'; + ZIO_IODRP_CS <= '0'; + IODRP_SDO <= '0'; + when others => + RZQ_IODRP_CS <= '0'; + ZIO_IODRP_CS <= '0'; + IODRP_SDO <= '0'; + end case; + end process; + +--****************************************************************** +--State Machine's Always block / Case statement for Next State Logic +-- +--The WAIT1,2,etc states were required after every state where the +--DRP controller was used to do a write to the IODRPs - this is because +--there's a clock cycle latency on IODRPCTRLR_RDY_BUSY_N whenever the DRP controller +--sees IODRPCTRLR_CMD_VALID go high. OFF_RZQ_PTERM and OFF_ZIO_NTERM were added +--soley for the purpose of reducing power, particularly on RZQ as +--that pin is expected to have a permanent external resistor to gnd. +--****************************************************************** + NEXT_STATE_LOGIC: process (UI_CLK) + begin + if (UI_CLK'event and UI_CLK = '1') then + if (RST_reg = '1') then -- Synchronous reset + MCB_CMD_VALID <= '0'; + MCB_UIADDR_int <= "00000"; -- take control of UI/UO port + MCB_UICMDEN <= '1'; -- tells MCB that it is in Soft Cal. + MCB_UIDONECAL_xilinx7 <= '0'; + MCB_USE_BKST <= '0'; + MCB_UIDRPUPDATE <= '1'; + Pre_SYSRST <= '1'; -- keeps MCB in reset + IODRPCTRLR_CMD_VALID <= '0'; + IODRPCTRLR_MEMCELL_ADDR <= NoOp; + IODRPCTRLR_WRITE_DATA <= "00000000"; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_USE_BKST <= '0'; + P_Term <= "000000"; + N_Term <= "0000000"; + P_Term_s <= "000000"; + N_Term_w <= "0000000"; + P_Term_w <= "000000"; + N_Term_s <= "0000000"; + + P_Term_Prev <= "000000"; + N_Term_Prev <= "0000000"; + Active_IODRP <= RZQ; + MCB_UILDQSINC <= '0'; --no inc or dec + MCB_UIUDQSINC <= '0'; --no inc or dec + MCB_UILDQSDEC <= '0'; --no inc or dec + MCB_UIUDQSDEC <= '0'; + counter_en <= '0'; --flag that the First Dynamic Calibration completed + First_Dyn_Cal_Done <= '0'; + Max_Value_int <= "00000000"; + Max_Value_Previous <= "00000000"; + STATE <= START; + DQS_DELAY <= "00000000"; + DQS_DELAY_INITIAL <= "00000000"; + TARGET_DQS_DELAY <= "00000000"; + LastPass_DynCal <= IN_TERM_PASS; + First_In_Term_Done <= '0'; + MCB_UICMD <= '0'; + MCB_UICMDIN <= '0'; + MCB_UIDQCOUNT <= "0000"; + counter_inc <= "00000000"; + counter_dec <= "00000000"; + else + counter_en <= '0'; + IODRPCTRLR_CMD_VALID <= '0'; + IODRPCTRLR_MEMCELL_ADDR <= NoOp; + IODRPCTRLR_R_WB <= READ_MODE; + IODRPCTRLR_USE_BKST <= '0'; + MCB_CMD_VALID <= '0'; --no inc or dec + MCB_UILDQSINC <= '0'; --no inc or dec + MCB_UIUDQSINC <= '0'; --no inc or dec + MCB_UILDQSDEC <= '0'; --no inc or dec + MCB_UIUDQSDEC <= '0'; + MCB_USE_BKST <= '0'; + MCB_UICMDIN <= '0'; + DQS_DELAY <= DQS_DELAY; + TARGET_DQS_DELAY <= TARGET_DQS_DELAY; + + case STATE is + when START => --h00 + MCB_UICMDEN <= '1'; -- take control of UI/UO port + MCB_UIDONECAL_xilinx7 <= '0'; -- tells MCB that it is in Soft Cal. + P_Term <= "000000"; + N_Term <= "0000000"; + Pre_SYSRST <= '1'; -- keeps MCB in reset + LastPass_DynCal <= IN_TERM_PASS; + if (SKIP_IN_TERM_CAL = 1) then + --STATE <= WRITE_CALIBRATE; + STATE <= WAIT_FOR_START_BROADCAST; + P_Term <= "000000"; + N_Term <= "0000000"; + elsif (IODRPCTRLR_RDY_BUSY_N = '1') then + STATE <= LOAD_RZQ_NTERM; + else + STATE <= START; + end if; + --*************************** + -- IOB INPUT TERMINATION CAL + --*************************** + when LOAD_RZQ_NTERM => --h01 + Active_IODRP <= RZQ; + IODRPCTRLR_CMD_VALID <= '1'; + IODRPCTRLR_MEMCELL_ADDR <= NTerm; + IODRPCTRLR_WRITE_DATA <= ('0' & N_Term); + IODRPCTRLR_R_WB <= WRITE_MODE; + if (IODRPCTRLR_RDY_BUSY_N = '1') then + STATE <= LOAD_RZQ_NTERM; + else + STATE <= WAIT1; + end if; + + when WAIT1 => --h02 + if (IODRPCTRLR_RDY_BUSY_N = '0') then + STATE <= WAIT1; + else + STATE <= LOAD_RZQ_PTERM; + end if; + + when LOAD_RZQ_PTERM => --h03 + IODRPCTRLR_CMD_VALID <= '1'; + IODRPCTRLR_MEMCELL_ADDR <= PTerm; + IODRPCTRLR_WRITE_DATA <= ("00" & P_Term); + IODRPCTRLR_R_WB <= WRITE_MODE; + if (IODRPCTRLR_RDY_BUSY_N = '1') then + STATE <= LOAD_RZQ_PTERM; + else + STATE <= WAIT2; + end if; + + when WAIT2 => --h04 + if (IODRPCTRLR_RDY_BUSY_N = '0') then + STATE <= WAIT2; + elsif ((RZQ_IN = '1') or (P_Term = "111111")) then + STATE <= MULTIPLY_DIVIDE; -- LOAD_ZIO_PTERM + else + STATE <= INC_PTERM; + end if; + + when INC_PTERM => --h05 + P_Term <= P_Term + "000001"; + STATE <= LOAD_RZQ_PTERM; + + when MULTIPLY_DIVIDE => -- h06 + -- 13/4/2011 compensate the added sync FF + P_Term <= Mult_Divide(("00" & (P_Term - '1')),MULT,DIV)(5 downto 0); + STATE <= LOAD_ZIO_PTERM; + + when LOAD_ZIO_PTERM => --h07 + Active_IODRP <= ZIO; + IODRPCTRLR_CMD_VALID <= '1'; + IODRPCTRLR_MEMCELL_ADDR <= PTerm; + IODRPCTRLR_WRITE_DATA <= ("00" & P_Term); + IODRPCTRLR_R_WB <= WRITE_MODE; + if (IODRPCTRLR_RDY_BUSY_N = '1') then + STATE <= LOAD_ZIO_PTERM; + else + STATE <= WAIT3; + end if; + + when WAIT3 => --h08 + if ((not(IODRPCTRLR_RDY_BUSY_N)) = '1') then + STATE <= WAIT3; + else + STATE <= LOAD_ZIO_NTERM; + end if; + + when LOAD_ZIO_NTERM => --h09 + Active_IODRP <= ZIO; + IODRPCTRLR_CMD_VALID <= '1'; + IODRPCTRLR_MEMCELL_ADDR <= NTerm; + IODRPCTRLR_WRITE_DATA <= ('0' & N_Term); + IODRPCTRLR_R_WB <= WRITE_MODE; + if (IODRPCTRLR_RDY_BUSY_N = '1') then + STATE <= LOAD_ZIO_NTERM; + else + STATE <= WAIT4; + end if; + + when WAIT4 => --h0A + if ((not(IODRPCTRLR_RDY_BUSY_N)) = '1') then + STATE <= WAIT4; + elsif (((not(ZIO_IN))) = '1' or (N_Term = "1111111")) then + if (PNSKEW = '1') then + STATE <= SKEW; + else + STATE <= WAIT_FOR_START_BROADCAST; + end if; + else + STATE <= INC_NTERM; + end if; + + when INC_NTERM => --h0B + N_Term <= N_Term + "0000001"; + STATE <= LOAD_ZIO_NTERM; + + when SKEW => -- h0C + + P_Term_s <= Mult_Divide(("00" & P_Term), MULT_S, DIV_S)(5 downto 0); + N_Term_w <= Mult_Divide(('0' & (N_Term-'1')), MULT_W, DIV_W)(6 downto 0); + P_Term_w <= Mult_Divide(("00" & P_Term), MULT_W, DIV_W)(5 downto 0); + N_Term_s <= Mult_Divide(('0' & (N_Term-'1')), MULT_S, DIV_S)(6 downto 0); + P_Term <= Mult_Divide(("00" & P_Term), MULT_S, DIV_S)(5 downto 0); + N_Term <= Mult_Divide(('0' & (N_Term-'1')), MULT_W, DIV_W)(6 downto 0); + STATE <= WAIT_FOR_START_BROADCAST; + + when WAIT_FOR_START_BROADCAST => --h0D + Pre_SYSRST <= '0'; -- release SYSRST, but keep UICMDEN=1 and UIDONECAL=0. This is needed to do Broadcast through UI interface, while + -- keeping the MCB in calibration mode + Active_IODRP <= MCB_PORT; + if ((START_BROADCAST and IODRPCTRLR_RDY_BUSY_N) = '1') then + if ((P_Term /= P_Term_Prev) or (SKIP_IN_TERM_CAL = 1)) then + STATE <= BROADCAST_PTERM; + P_Term_Prev <= P_Term; + elsif (N_Term /= N_Term_Prev) then + N_Term_Prev <= N_Term; + STATE <= BROADCAST_NTERM; + else + STATE <= OFF_RZQ_PTERM; + end if; + else + STATE <= WAIT_FOR_START_BROADCAST; + end if; + + when BROADCAST_PTERM => --h0E + IODRPCTRLR_MEMCELL_ADDR <= PTerm; + IODRPCTRLR_WRITE_DATA <= ("00" & P_Term); + IODRPCTRLR_R_WB <= WRITE_MODE; + MCB_CMD_VALID <= '1'; + MCB_UIDRPUPDATE <= not First_In_Term_Done; -- Set the update flag if this is the first time through + MCB_USE_BKST <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= BROADCAST_PTERM; + else + STATE <= WAIT5; + end if; + + when WAIT5 => --h0F + if ((not(MCB_RDY_BUSY_N)) = '1') then + STATE <= WAIT5; + elsif (First_In_Term_Done = '1') then -- If first time through is already set, then this must be dynamic in term + if (MCB_UOREFRSHFLAG = '1')then + MCB_UIDRPUPDATE <= '1'; + if (N_Term /= N_Term_Prev) then + N_Term_Prev <= N_Term; + STATE <= BROADCAST_NTERM; + else + STATE <= OFF_RZQ_PTERM; + end if; + else + STATE <= WAIT5; -- wait for a Refresh cycle + end if; + else + N_Term_Prev <= N_Term; + STATE <= BROADCAST_NTERM; + end if; + + when BROADCAST_NTERM => -- h10 + IODRPCTRLR_MEMCELL_ADDR <= NTerm; + IODRPCTRLR_WRITE_DATA <= ("0" & N_Term); + IODRPCTRLR_R_WB <= WRITE_MODE; + MCB_CMD_VALID <= '1'; + MCB_USE_BKST <= '1'; + MCB_UIDRPUPDATE <= not(First_In_Term_Done); -- Set the update flag if this is the first time through + if (MCB_RDY_BUSY_N = '1') then + STATE <= BROADCAST_NTERM; + else + STATE <= WAIT6; + end if; + + when WAIT6 => -- h11 + if (MCB_RDY_BUSY_N = '0') then + STATE <= WAIT6; + elsif (First_In_Term_Done = '1') then -- If first time through is already set, then this must be dynamic in term + if (MCB_UOREFRSHFLAG = '1')then + MCB_UIDRPUPDATE <= '1'; + STATE <= OFF_RZQ_PTERM; + else + STATE <= WAIT6; -- wait for a Refresh cycle + end if; + else + -- if (PNSKEWDQS = '1') then + STATE <= LDQS_CLK_WRITE_P_TERM; + -- else + -- STATE <= OFF_RZQ_PTERM; + -- end if; + end if; + +-- ********************* + when LDQS_CLK_WRITE_P_TERM => -- h12 + IODRPCTRLR_MEMCELL_ADDR <= PTerm; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= "00" & P_Term_w; + MCB_UIADDR_int <= IOI_LDQS_CLK; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= LDQS_CLK_WRITE_P_TERM; + else + STATE <= LDQS_CLK_P_TERM_WAIT; + end if; + + + when LDQS_CLK_P_TERM_WAIT => --7'h13 + if (MCB_RDY_BUSY_N = '0') then + STATE <= LDQS_CLK_P_TERM_WAIT; + else + STATE <= LDQS_CLK_WRITE_N_TERM; + end if; + + when LDQS_CLK_WRITE_N_TERM => --7'h14 + IODRPCTRLR_MEMCELL_ADDR <= NTerm; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= '0' & N_Term_s; + MCB_UIADDR_int <= IOI_LDQS_CLK; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= LDQS_CLK_WRITE_N_TERM; + else + STATE <= LDQS_CLK_N_TERM_WAIT; + end if; + + --** + when LDQS_CLK_N_TERM_WAIT => --7'h15 + if (MCB_RDY_BUSY_N = '0') then + STATE <= LDQS_CLK_N_TERM_WAIT; + else + STATE <= LDQS_PIN_WRITE_P_TERM; + end if; + + + when LDQS_PIN_WRITE_P_TERM => --7'h16 + IODRPCTRLR_MEMCELL_ADDR <= PTerm; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= "00" & P_Term_s; + MCB_UIADDR_int <= IOI_LDQS_PIN; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= LDQS_PIN_WRITE_P_TERM; + else + STATE <= LDQS_PIN_P_TERM_WAIT; + end if; + + + when LDQS_PIN_P_TERM_WAIT => --7'h17 + if (MCB_RDY_BUSY_N = '0') then + STATE <= LDQS_PIN_P_TERM_WAIT; + else + STATE <= LDQS_PIN_WRITE_N_TERM; + end if; + + + when LDQS_PIN_WRITE_N_TERM => --7'h18 + IODRPCTRLR_MEMCELL_ADDR <= NTerm; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= '0' & N_Term_w; + MCB_UIADDR_int <= IOI_LDQS_PIN; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= LDQS_PIN_WRITE_N_TERM; + else + STATE <= LDQS_PIN_N_TERM_WAIT; + end if; + + + when LDQS_PIN_N_TERM_WAIT => --7'h19 + if (MCB_RDY_BUSY_N = '0') then + STATE <= LDQS_PIN_N_TERM_WAIT; + else + STATE <= UDQS_CLK_WRITE_P_TERM; + end if; + + + + when UDQS_CLK_WRITE_P_TERM => --7'h1A + IODRPCTRLR_MEMCELL_ADDR <= PTerm; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= "00" & P_Term_w; + MCB_UIADDR_int <= IOI_UDQS_CLK; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= UDQS_CLK_WRITE_P_TERM; + else + STATE <= UDQS_CLK_P_TERM_WAIT; + end if; + + + when UDQS_CLK_P_TERM_WAIT => --7'h1B + if (MCB_RDY_BUSY_N = '0') then + STATE <= UDQS_CLK_P_TERM_WAIT; + else + STATE <= UDQS_CLK_WRITE_N_TERM; + end if; + + + when UDQS_CLK_WRITE_N_TERM => --7'h1C + IODRPCTRLR_MEMCELL_ADDR <= NTerm; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= '0' & N_Term_s; + MCB_UIADDR_int <= IOI_UDQS_CLK; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= UDQS_CLK_WRITE_N_TERM; + else + STATE <= UDQS_CLK_N_TERM_WAIT; + end if; + + when UDQS_CLK_N_TERM_WAIT => --7'h1D + if (MCB_RDY_BUSY_N = '0') then + STATE <= UDQS_CLK_N_TERM_WAIT; + else + STATE <= UDQS_PIN_WRITE_P_TERM; + end if; + + + + when UDQS_PIN_WRITE_P_TERM => --7'h1E + IODRPCTRLR_MEMCELL_ADDR <= PTerm; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= "00" & P_Term_s; + MCB_UIADDR_int <= IOI_UDQS_PIN; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= UDQS_PIN_WRITE_P_TERM; + else + STATE <= UDQS_PIN_P_TERM_WAIT; + end if; + + + when UDQS_PIN_P_TERM_WAIT => --7'h1F + if (MCB_RDY_BUSY_N = '0') then + STATE <= UDQS_PIN_P_TERM_WAIT; + else + STATE <= UDQS_PIN_WRITE_N_TERM; + end if; + + when UDQS_PIN_WRITE_N_TERM => --7'h20 + IODRPCTRLR_MEMCELL_ADDR <= NTerm; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= '0' & N_Term_w; + MCB_UIADDR_int <= IOI_UDQS_PIN; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= UDQS_PIN_WRITE_N_TERM; + else + STATE <= UDQS_PIN_N_TERM_WAIT; + end if; + + + when UDQS_PIN_N_TERM_WAIT => --7'h21 + if (MCB_RDY_BUSY_N = '0') then + STATE <= UDQS_PIN_N_TERM_WAIT; + else + STATE <= OFF_RZQ_PTERM; + end if; + +-- ********************* + + + when OFF_RZQ_PTERM => -- h22 + Active_IODRP <= RZQ; + IODRPCTRLR_CMD_VALID <= '1'; + IODRPCTRLR_MEMCELL_ADDR <= PTerm; + IODRPCTRLR_WRITE_DATA <= "00000000"; + IODRPCTRLR_R_WB <= WRITE_MODE; + P_Term <= "000000"; + N_Term <= "0000000"; + MCB_UIDRPUPDATE <= not(First_In_Term_Done); -- Set the update flag if this is the first time through + if (IODRPCTRLR_RDY_BUSY_N = '1') then + STATE <= OFF_RZQ_PTERM; + else + STATE <= WAIT7; + end if; + + when WAIT7 => -- h23 + if ((not(IODRPCTRLR_RDY_BUSY_N)) = '1') then + STATE <= WAIT7; + else + STATE <= OFF_ZIO_NTERM; + end if; + + when OFF_ZIO_NTERM => -- h24 + Active_IODRP <= ZIO; + IODRPCTRLR_CMD_VALID <= '1'; + IODRPCTRLR_MEMCELL_ADDR <= NTerm; + IODRPCTRLR_WRITE_DATA <= "00000000"; + IODRPCTRLR_R_WB <= WRITE_MODE; + if (IODRPCTRLR_RDY_BUSY_N = '1') then + STATE <= OFF_ZIO_NTERM; + else + STATE <= WAIT8; + end if; + + when WAIT8 => -- h25 + if (IODRPCTRLR_RDY_BUSY_N = '0') then + STATE <= WAIT8; + else + if (First_In_Term_Done = '1') then + STATE <= START_DYN_CAL; -- No need to reset the MCB if we are in InTerm tuning + else + STATE <= WRITE_CALIBRATE; -- go read the first Max_Value_int from RZQ + end if; + end if; + + when RST_DELAY => -- h26 + --MCB_UICMDEN <= '0'; -- release control of UI/UO port + if (Block_Reset = '1') then -- this ensures that more than 512 clock cycles occur since the last reset after MCB_WRITE_CALIBRATE ??? + STATE <= RST_DELAY; + else + STATE <= START_DYN_CAL_PRE; + end if; + +--*************************** +--DYNAMIC CALIBRATION PORTION +--*************************** + when START_DYN_CAL_PRE => -- h27 + LastPass_DynCal <= IN_TERM_PASS; + MCB_UICMDEN <= '0'; -- release UICMDEN + MCB_UIDONECAL_xilinx7 <= '1'; -- release UIDONECAL - MCB will now initialize. + Pre_SYSRST <= '1'; -- SYSRST pulse + if (CALMODE_EQ_CALIBRATION = '0') then -- if C_MC_CALIBRATION_MODE is set to NOCALIBRATION + STATE <= START_DYN_CAL; -- we'll skip setting the DQS delays manually + elsif (pre_sysrst_minpulse_width_ok = '1') then + STATE <= WAIT_FOR_UODONE; + end if; + + when WAIT_FOR_UODONE => -- h28 + Pre_SYSRST <= '0'; -- SYSRST pulse + if ((IODRPCTRLR_RDY_BUSY_N and MCB_UODONECAL) = '1')then --IODRP Controller needs to be ready, & MCB needs to be done with hard calibration + MCB_UICMDEN <= '1'; -- grab UICMDEN + DQS_DELAY_INITIAL <= Mult_Divide(Max_Value_int, DQS_NUMERATOR, DQS_DENOMINATOR); + STATE <= LDQS_WRITE_POS_INDELAY; + else + STATE <= WAIT_FOR_UODONE; + end if; + + when LDQS_WRITE_POS_INDELAY => -- h29 + IODRPCTRLR_MEMCELL_ADDR <= PosEdgeInDly; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= DQS_DELAY_INITIAL; + MCB_UIADDR_int <= IOI_LDQS_CLK; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1') then + STATE <= LDQS_WRITE_POS_INDELAY; + else + STATE <= LDQS_WAIT1; + end if; + + when LDQS_WAIT1 => -- h2A + if (MCB_RDY_BUSY_N = '0')then + STATE <= LDQS_WAIT1; + else + STATE <= LDQS_WRITE_NEG_INDELAY; + end if; + + when LDQS_WRITE_NEG_INDELAY => -- h2B + IODRPCTRLR_MEMCELL_ADDR <= NegEdgeInDly; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= DQS_DELAY_INITIAL; + MCB_UIADDR_int <= IOI_LDQS_CLK; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1')then + STATE <= LDQS_WRITE_NEG_INDELAY; + else + STATE <= LDQS_WAIT2; + end if; + + when LDQS_WAIT2 => -- 7'h2C + if(MCB_RDY_BUSY_N = '0')then + STATE <= LDQS_WAIT2; + else + STATE <= UDQS_WRITE_POS_INDELAY; + end if; + + when UDQS_WRITE_POS_INDELAY => -- 7'h2D + IODRPCTRLR_MEMCELL_ADDR <= PosEdgeInDly; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= DQS_DELAY_INITIAL; + MCB_UIADDR_int <= IOI_UDQS_CLK; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1')then + STATE <= UDQS_WRITE_POS_INDELAY; + else + STATE <= UDQS_WAIT1; + end if; + + when UDQS_WAIT1 => -- 7'h2E + if (MCB_RDY_BUSY_N = '0')then + STATE <= UDQS_WAIT1; + else + STATE <= UDQS_WRITE_NEG_INDELAY; + end if; + + when UDQS_WRITE_NEG_INDELAY => -- 7'h2F + IODRPCTRLR_MEMCELL_ADDR <= NegEdgeInDly; + IODRPCTRLR_R_WB <= WRITE_MODE; + IODRPCTRLR_WRITE_DATA <= DQS_DELAY_INITIAL; + MCB_UIADDR_int <= IOI_UDQS_CLK; + MCB_CMD_VALID <= '1'; + if (MCB_RDY_BUSY_N = '1')then + STATE <= UDQS_WRITE_NEG_INDELAY; + else + STATE <= UDQS_WAIT2; + end if; + + when UDQS_WAIT2 => -- 7'h30 + if (MCB_RDY_BUSY_N = '0')then + STATE <= UDQS_WAIT2; + else + DQS_DELAY <= DQS_DELAY_INITIAL; + TARGET_DQS_DELAY <= DQS_DELAY_INITIAL; + STATE <= START_DYN_CAL; + end if; + + when START_DYN_CAL => -- h31 + Pre_SYSRST <= '0'; -- SYSRST not driven + counter_inc <= (others => '0'); + counter_dec <= (others => '0'); + if (SKIP_DYNAMIC_DQS_CAL = '1' and SKIP_DYN_IN_TERMINATION = '1')then + STATE <= DONE; --if we're skipping both dynamic algorythms, go directly to DONE + elsif ((IODRPCTRLR_RDY_BUSY_N = '1') and (MCB_UODONECAL = '1') and (SELFREFRESH_REQ_R1 = '0')) then + --IODRP Controller needs to be ready, & MCB needs to be done with hard calibration + -- Alternate between Dynamic Input Termination and Dynamic Tuning routines + if ((SKIP_DYN_IN_TERMINATION = '0') and (LastPass_DynCal = DYN_CAL_PASS)) then + LastPass_DynCal <= IN_TERM_PASS; + STATE <= LOAD_RZQ_NTERM; + else + LastPass_DynCal <= DYN_CAL_PASS; + STATE <= WRITE_CALIBRATE; + end if; + else + STATE <= START_DYN_CAL; + end if; + + when WRITE_CALIBRATE => -- h32 + Pre_SYSRST <= '0'; + IODRPCTRLR_CMD_VALID <= '1'; + IODRPCTRLR_MEMCELL_ADDR <= DelayControl; + IODRPCTRLR_WRITE_DATA <= "00100000"; + IODRPCTRLR_R_WB <= WRITE_MODE; + Active_IODRP <= RZQ; + if (IODRPCTRLR_RDY_BUSY_N = '1') then + STATE <= WRITE_CALIBRATE; + else + STATE <= WAIT9; + end if; + + when WAIT9 => -- h33 + counter_en <= '1'; + if (count < "100110") then -- this adds approximately 22 extra clock cycles after WRITE_CALIBRATE + STATE <= WAIT9; + else + STATE <= READ_MAX_VALUE; + end if; + + when READ_MAX_VALUE => -- h34 + IODRPCTRLR_CMD_VALID <= '1'; + IODRPCTRLR_MEMCELL_ADDR <= MaxValue; + IODRPCTRLR_R_WB <= READ_MODE; + Max_Value_Previous <= Max_Value_int; + if (IODRPCTRLR_RDY_BUSY_N = '1') then + STATE <= READ_MAX_VALUE; + else + STATE <= WAIT10; + end if; + + when WAIT10 => -- h35 + if (IODRPCTRLR_RDY_BUSY_N = '0') then + STATE <= WAIT10; + else + Max_Value_int <= IODRPCTRLR_READ_DATA; --record the Max_Value_int from the IODRP controller + if (First_In_Term_Done = '0') then + STATE <= RST_DELAY; + First_In_Term_Done <= '1'; + else + STATE <= ANALYZE_MAX_VALUE; + end if; + end if; + + when ANALYZE_MAX_VALUE => -- h36 only do a Inc or Dec during a REFRESH cycle. + if (First_Dyn_Cal_Done = '0')then + STATE <= FIRST_DYN_CAL; + elsif ((Max_Value_int < Max_Value_Previous) and (Max_Value_Delta_Dn >= INCDEC_THRESHOLD)) then + STATE <= DECREMENT; -- May need to Decrement + TARGET_DQS_DELAY <= Mult_Divide(Max_Value_int, DQS_NUMERATOR, DQS_DENOMINATOR); + -- DQS_COUNT_VIRTUAL updated (could be negative value) + elsif ((Max_Value_int > Max_Value_Previous) and (Max_Value_Delta_Up >= INCDEC_THRESHOLD)) then + STATE <= INCREMENT; -- May need to Increment + TARGET_DQS_DELAY <= Mult_Divide(Max_Value_int, DQS_NUMERATOR, DQS_DENOMINATOR); + else + Max_Value_int <= Max_Value_Previous; + STATE <= START_DYN_CAL; + end if; + + when FIRST_DYN_CAL => -- h37 + First_Dyn_Cal_Done <= '1'; -- set flag that the First Dynamic Calibration has been completed + STATE <= START_DYN_CAL; + + when INCREMENT => -- h38 + STATE <= START_DYN_CAL; -- Default case: Inc is not high or no longer in REFRSH + MCB_UILDQSINC <= '0'; -- Default case: no inc or dec + MCB_UIUDQSINC <= '0'; -- Default case: no inc or dec + MCB_UILDQSDEC <= '0'; -- Default case: no inc or dec + MCB_UIUDQSDEC <= '0'; -- Default case: no inc or dec + case Inc_Dec_REFRSH_Flag is -- {Increment_Flag,Decrement_Flag,MCB_UOREFRSHFLAG}, + when "101" => + counter_inc <= counter_inc + '1'; + STATE <= INCREMENT; -- Increment is still high, still in REFRSH cycle + if ((DQS_DELAY < DQS_DELAY_UPPER_LIMIT) and (counter_inc >= X"04")) then + -- if not at the upper limit yet, and you've waited 4 clks, increment + MCB_UILDQSINC <= '1'; + MCB_UIUDQSINC <= '1'; + DQS_DELAY <= DQS_DELAY + '1'; + end if; + when "100" => + if (DQS_DELAY < DQS_DELAY_UPPER_LIMIT) then + STATE <= INCREMENT; -- Increment is still high, REFRESH ended - wait for next REFRESH + end if; + when others => + STATE <= START_DYN_CAL; + end case; + + when DECREMENT => -- h39 + STATE <= START_DYN_CAL; -- Default case: Dec is not high or no longer in REFRSH + MCB_UILDQSINC <= '0'; -- Default case: no inc or dec + MCB_UIUDQSINC <= '0'; -- Default case: no inc or dec + MCB_UILDQSDEC <= '0'; -- Default case: no inc or dec + MCB_UIUDQSDEC <= '0'; -- Default case: no inc or dec + if (DQS_DELAY /= "00000000") then + case Inc_Dec_REFRSH_Flag is -- {Increment_Flag,Decrement_Flag,MCB_UOREFRSHFLAG}, + when "011" => + counter_dec <= counter_dec + '1'; + STATE <= DECREMENT; -- Decrement is still high, still in REFRSH cycle + if ((DQS_DELAY > DQS_DELAY_LOWER_LIMIT) and (counter_dec >= X"04")) then + -- if not at the lower limit, and you've waited 4 clks, decrement + MCB_UILDQSDEC <= '1'; -- decrement + MCB_UIUDQSDEC <= '1'; -- decrement + DQS_DELAY <= DQS_DELAY - '1'; -- SBS + end if; + when "010" => + if (DQS_DELAY > DQS_DELAY_LOWER_LIMIT) then --if not at the lower limit, decrement + STATE <= DECREMENT; --Decrement is still high, REFRESH ended - wait for next REFRESH + end if; + when others => + STATE <= START_DYN_CAL; + end case; + end if; + + when DONE => -- h3A + Pre_SYSRST <= '0'; -- SYSRST cleared + MCB_UICMDEN <= '0'; -- release UICMDEN + STATE <= DONE; + + when others => + MCB_UICMDEN <= '0'; -- release UICMDEN + MCB_UIDONECAL_xilinx7 <= '1'; -- release UIDONECAL - MCB will now initialize. + Pre_SYSRST <= '0'; -- SYSRST not driven + IODRPCTRLR_CMD_VALID <= '0'; + IODRPCTRLR_MEMCELL_ADDR <= "00000000"; + IODRPCTRLR_WRITE_DATA <= "00000000"; + IODRPCTRLR_R_WB <= '0'; + IODRPCTRLR_USE_BKST <= '0'; + P_Term <= "000000"; + N_Term <= "0000000"; + Active_IODRP <= ZIO; + Max_Value_Previous <= "00000000"; + MCB_UILDQSINC <= '0'; -- no inc or dec + MCB_UIUDQSINC <= '0'; -- no inc or dec + MCB_UILDQSDEC <= '0'; -- no inc or dec + MCB_UIUDQSDEC <= '0'; -- no inc or dec + counter_en <= '0'; + First_Dyn_Cal_Done <= '0'; -- flag that the First Dynamic Calibration completed + Max_Value_int <= Max_Value_int; + STATE <= START; + end case; + end if; + end if; + end process; + +end architecture trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_soft_calibration_top.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_soft_calibration_top.vhd new file mode 100755 index 0000000..10aebb4 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/mcb_soft_calibration_top.vhd @@ -0,0 +1,428 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: mcb_soft_calibration_top.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:17:26 $ +-- \ \ / \ Date Created: Mon Feb 9 2009 +-- \___\/\___\ +-- +--Device: Spartan6 +--Design Name: DDR/DDR2/DDR3/LPDDR +--Purpose: Xilinx reference design top-level simulation +-- wrapper file for input termination calibration +--Reference: +-- +-- Revision: Date: Comment +-- 1.0: 2/06/09: Initial version for MIG wrapper. +-- 1.1: 3/16/09: Added pll_lock port, for using it to gate reset +-- 1.2: 6/06/09: Removed MCB_UIDQCOUNT. +-- 1.3: 6/18/09: corrected/changed MCB_SYSRST to be an output port +-- 1.4: 6/24/09: gave RZQ and ZIO each their own unique ADD and SDI nets +-- 1.5: 10/08/09: removed INCDEC_TRESHOLD parameter - making it a localparam inside mcb_soft_calibration +-- 1.5: 10/08/09: removed INCDEC_TRESHOLD parameter - making it a localparam inside mcb_soft_calibration +-- 1.6: 02/04/09: Added condition generate statmenet for ZIO pin. +-- 1.7: 04/12/10: Added CKE_Train signal to fix DDR2 init wait . +-- End Revision +--********************************************************************************** + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; +library unisim; +use unisim.vcomponents.all; + +entity mcb_soft_calibration_top is + generic ( + C_MEM_TZQINIT_MAXCNT : std_logic_vector(9 downto 0) := "1000000000"; -- DDR3 Minimum delay between resets + C_MC_CALIBRATION_MODE : string := "CALIBRATION"; -- if set to CALIBRATION will reset DQS IDELAY to DQS_NUMERATOR/DQS_DENOMINATOR local_param values, + -- and does dynamic recal, + -- if set to NOCALIBRATION then defaults to hard cal blocks setting of C_MC_CALBRATION_DELAY *and* + -- no dynamic recal will be done + SKIP_IN_TERM_CAL : integer := 0; -- provides option to skip the input termination calibration + SKIP_DYNAMIC_CAL : integer := 0; -- provides option to skip the dynamic delay calibration + SKIP_DYN_IN_TERM : integer := 0; -- provides option to skip the dynamic delay calibration + C_SIMULATION : string := "FALSE"; -- Tells us whether the design is being simulated or implemented + C_MEM_TYPE : string := "DDR" -- provides the memory device used for the design + + ); + port ( + UI_CLK : in std_logic; -- Input - global clock to be used for input_term_tuner and IODRP clock + RST : in std_logic; -- Input - reset for input_term_tuner - synchronous for input_term_tuner state machine, asynch for + -- IODRP (sub)controller + IOCLK : in std_logic; -- Input - IOCLK input to the IODRP's + DONE_SOFTANDHARD_CAL : out std_logic; -- active high flag signals soft calibration of input delays is complete and MCB_UODONECAL is high + -- (MCB hard calib complete) + PLL_LOCK : in std_logic; -- Lock signal from PLL + SELFREFRESH_REQ : in std_logic; + SELFREFRESH_MCB_MODE : in std_logic; + SELFREFRESH_MCB_REQ : out std_logic; + SELFREFRESH_MODE : out std_logic; + MCB_UIADD : out std_logic; -- to MCB's UIADD port + MCB_UISDI : out std_logic; -- to MCB's UISDI port + MCB_UOSDO : in std_logic; + MCB_UODONECAL : in std_logic; + MCB_UOREFRSHFLAG : in std_logic; + MCB_UICS : out std_logic; + MCB_UIDRPUPDATE : out std_logic; + MCB_UIBROADCAST : out std_logic; + MCB_UIADDR : out std_logic_vector(4 downto 0); + MCB_UICMDEN : out std_logic; + MCB_UIDONECAL : out std_logic; + MCB_UIDQLOWERDEC : out std_logic; + MCB_UIDQLOWERINC : out std_logic; + MCB_UIDQUPPERDEC : out std_logic; + MCB_UIDQUPPERINC : out std_logic; + MCB_UILDQSDEC : out std_logic; + MCB_UILDQSINC : out std_logic; + MCB_UIREAD : out std_logic; + MCB_UIUDQSDEC : out std_logic; + MCB_UIUDQSINC : out std_logic; + MCB_RECAL : out std_logic; + MCB_SYSRST : out std_logic; + + MCB_UICMD : out std_logic; + MCB_UICMDIN : out std_logic; + MCB_UIDQCOUNT : out std_logic_vector(3 downto 0); + MCB_UODATA : in std_logic_vector(7 downto 0); + MCB_UODATAVALID : in std_logic; + MCB_UOCMDREADY : in std_logic; + MCB_UO_CAL_START : in std_logic; + RZQ_PIN : inout std_logic; + ZIO_PIN : inout std_logic; + CKE_Train : out std_logic + + ); +end entity mcb_soft_calibration_top; + +architecture trans of mcb_soft_calibration_top is + +component mcb_soft_calibration is + generic ( + C_MEM_TZQINIT_MAXCNT : std_logic_vector(9 downto 0) := "1000000000"; -- DDR3 Minimum delay between resets + SKIP_IN_TERM_CAL : integer := 0; -- provides option to skip the input termination calibration + SKIP_DYNAMIC_CAL : integer := 0; -- provides option to skip the dynamic delay calibration + SKIP_DYN_IN_TERM : integer := 1; -- provides option to skip the input termination calibration + C_MC_CALIBRATION_MODE : string := "CALIBRATION"; -- if set to CALIBRATION will reset DQS IDELAY to DQS_NUMERATOR/DQS_DENOMINATOR local_param value + -- if set to NOCALIBRATION then defaults to hard cal blocks setting of C_MC_CALBRATION_DELAY + -- (Quarter, etc) + + C_SIMULATION : string := "FALSE"; -- Tells us whether the design is being simulated or implemented + C_MEM_TYPE : string := "DDR" + ); + port ( + UI_CLK : in std_logic; -- main clock input for logic and IODRP CLK pins. At top level, this should also connect to IODRP2_MCB + -- CLK pins + RST : in std_logic; -- main system reset for both the Soft Calibration block - also will act as a passthrough to MCB's SYSRST + DONE_SOFTANDHARD_CAL : out std_logic; -- active high flag signals soft calibration of input delays is complete and MCB_UODONECAL is high (MCB + -- hard calib complete) + PLL_LOCK : in std_logic; -- Lock signal from PLL + SELFREFRESH_REQ : in std_logic; + SELFREFRESH_MCB_MODE : in std_logic; + SELFREFRESH_MCB_REQ : out std_logic; + SELFREFRESH_MODE : out std_logic; + IODRP_ADD : out std_logic; -- IODRP ADD port + IODRP_SDI : out std_logic; -- IODRP SDI port + RZQ_IN : in std_logic; -- RZQ pin from board - expected to have a 2*R resistor to ground + RZQ_IODRP_SDO : in std_logic; -- RZQ IODRP's SDO port + RZQ_IODRP_CS : out std_logic := '0'; -- RZQ IODRP's CS port + ZIO_IN : in std_logic; -- Z-stated IO pin - garanteed not to be driven externally + ZIO_IODRP_SDO : in std_logic; -- ZIO IODRP's SDO port + ZIO_IODRP_CS : out std_logic := '0'; -- ZIO IODRP's CS port + MCB_UIADD : out std_logic; -- to MCB's UIADD port + MCB_UISDI : out std_logic; -- to MCB's UISDI port + MCB_UOSDO : in std_logic; -- from MCB's UOSDO port (User output SDO) + MCB_UODONECAL : in std_logic; -- indicates when MCB hard calibration process is complete + MCB_UOREFRSHFLAG : in std_logic; -- high during refresh cycle and time when MCB is innactive + MCB_UICS : out std_logic; -- to MCB's UICS port (User Input CS) + MCB_UIDRPUPDATE : out std_logic := '1'; -- MCB's UIDRPUPDATE port (gets passed to IODRP2_MCB's MEMUPDATE port: this controls shadow latch used + -- during IODRP2_MCB writes). Currently just trasnparent + MCB_UIBROADCAST : out std_logic; -- only to MCB's UIBROADCAST port (User Input BROADCAST - gets passed to IODRP2_MCB's BKST port) + MCB_UIADDR : out std_logic_vector(4 downto 0) := "00000"; -- to MCB's UIADDR port (gets passed to IODRP2_MCB's AUXADDR port + MCB_UICMDEN : out std_logic := '1'; -- set to 1 to take control of UI interface - removes control from internal calib block + MCB_UIDONECAL : out std_logic := '0'; -- set to 0 to "tell" controller that it's still in a calibrate state + MCB_UIDQLOWERDEC : out std_logic := '0'; + MCB_UIDQLOWERINC : out std_logic := '0'; + MCB_UIDQUPPERDEC : out std_logic := '0'; + MCB_UIDQUPPERINC : out std_logic := '0'; + MCB_UILDQSDEC : out std_logic := '0'; + MCB_UILDQSINC : out std_logic := '0'; + MCB_UIREAD : out std_logic; -- enables read w/o writing by turning on a SDO->SDI loopback inside the IODRP2_MCBs (doesn't exist in + -- regular IODRP2). IODRPCTRLR_R_WB becomes don't-care. + MCB_UIUDQSDEC : out std_logic := '0'; + MCB_UIUDQSINC : out std_logic := '0'; + MCB_RECAL : out std_logic := '0'; -- future hook to drive MCB's RECAL pin - initiates a hard re-calibration sequence when high + MCB_UICMD : out std_logic; + MCB_UICMDIN : out std_logic; + MCB_UIDQCOUNT : out std_logic_vector(3 downto 0); + MCB_UODATA : in std_logic_vector(7 downto 0); + MCB_UODATAVALID : in std_logic; + MCB_UOCMDREADY : in std_logic; + MCB_UO_CAL_START : in std_logic; + MCB_SYSRST : out std_logic; -- drives the MCB's SYSRST pin - the main reset for MCB + Max_Value : out std_logic_vector(7 downto 0); + CKE_Train : out std_logic + + ); +end component; + + signal IODRP_ADD : std_logic; + signal IODRP_SDI : std_logic; + signal RZQ_IODRP_SDO : std_logic; + signal RZQ_IODRP_CS : std_logic; + signal ZIO_IODRP_SDO : std_logic; + signal ZIO_IODRP_CS : std_logic; + signal IODRP_SDO : std_logic; + signal IODRP_CS : std_logic; + signal IODRP_BKST : std_logic; + signal RZQ_ZIO_ODATAIN : std_logic; + signal RZQ_ZIO_TRISTATE : std_logic; + signal RZQ_TOUT : std_logic; + signal ZIO_TOUT : std_logic; + signal Max_Value : std_logic_vector(7 downto 0); + + signal RZQ_IN : std_logic; -- RZQ pin from board - expected to have a 2*R resistor to ground + signal RZQ_IN_R1 : std_logic; -- RZQ pin from board - expected to have a 2*R resistor to ground + signal RZQ_IN_R2 : std_logic; -- RZQ pin from board - expected to have a 2*R resistor to ground + signal ZIO_IN : std_logic; -- Z-stated IO pin - garanteed not to be driven externally + signal ZIO_IN_R1 : std_logic; -- Z-stated IO pin - garanteed not to be driven externally + signal ZIO_IN_R2 : std_logic; -- Z-stated IO pin - garanteed not to be driven externally + signal RZQ_OUT : std_logic; + signal ZIO_OUT : std_logic; + + -- Declare intermediate signals for referenced outputs + signal DONE_SOFTANDHARD_CAL_xilinx0 : std_logic; + signal MCB_UIADD_xilinx3 : std_logic; + signal MCB_UISDI_xilinx17 : std_logic; + signal MCB_UICS_xilinx7 : std_logic; + signal MCB_UIDRPUPDATE_xilinx13 : std_logic; + signal MCB_UIBROADCAST_xilinx5 : std_logic; + signal MCB_UIADDR_xilinx4 : std_logic_vector(4 downto 0); + signal MCB_UICMDEN_xilinx6 : std_logic; + signal MCB_UIDONECAL_xilinx8 : std_logic; + signal MCB_UIDQLOWERDEC_xilinx9 : std_logic; + signal MCB_UIDQLOWERINC_xilinx10 : std_logic; + signal MCB_UIDQUPPERDEC_xilinx11 : std_logic; + signal MCB_UIDQUPPERINC_xilinx12 : std_logic; + signal MCB_UILDQSDEC_xilinx14 : std_logic; + signal MCB_UILDQSINC_xilinx15 : std_logic; + signal MCB_UIREAD_xilinx16 : std_logic; + signal MCB_UIUDQSDEC_xilinx18 : std_logic; + signal MCB_UIUDQSINC_xilinx19 : std_logic; + signal MCB_RECAL_xilinx1 : std_logic; + signal MCB_SYSRST_xilinx2 : std_logic; +begin + -- Drive referenced outputs + DONE_SOFTANDHARD_CAL <= DONE_SOFTANDHARD_CAL_xilinx0; + MCB_UIADD <= MCB_UIADD_xilinx3; + MCB_UISDI <= MCB_UISDI_xilinx17; + MCB_UICS <= MCB_UICS_xilinx7; + MCB_UIDRPUPDATE <= MCB_UIDRPUPDATE_xilinx13; + MCB_UIBROADCAST <= MCB_UIBROADCAST_xilinx5; + MCB_UIADDR <= MCB_UIADDR_xilinx4; + MCB_UICMDEN <= MCB_UICMDEN_xilinx6; + MCB_UIDONECAL <= MCB_UIDONECAL_xilinx8; + MCB_UIDQLOWERDEC <= MCB_UIDQLOWERDEC_xilinx9; + MCB_UIDQLOWERINC <= MCB_UIDQLOWERINC_xilinx10; + MCB_UIDQUPPERDEC <= MCB_UIDQUPPERDEC_xilinx11; + MCB_UIDQUPPERINC <= MCB_UIDQUPPERINC_xilinx12; + MCB_UILDQSDEC <= MCB_UILDQSDEC_xilinx14; + MCB_UILDQSINC <= MCB_UILDQSINC_xilinx15; + MCB_UIREAD <= MCB_UIREAD_xilinx16; + MCB_UIUDQSDEC <= MCB_UIUDQSDEC_xilinx18; + MCB_UIUDQSINC <= MCB_UIUDQSINC_xilinx19; + MCB_RECAL <= MCB_RECAL_xilinx1; + MCB_SYSRST <= MCB_SYSRST_xilinx2; + + RZQ_ZIO_ODATAIN <= not(RST); + RZQ_ZIO_TRISTATE <= not(RST); + IODRP_BKST <= '0'; -- future hook for possible BKST to ZIO and RZQ + + + mcb_soft_calibration_inst : mcb_soft_calibration + generic map ( + C_MEM_TZQINIT_MAXCNT => C_MEM_TZQINIT_MAXCNT, + C_MC_CALIBRATION_MODE => C_MC_CALIBRATION_MODE, + SKIP_IN_TERM_CAL => SKIP_IN_TERM_CAL, + SKIP_DYNAMIC_CAL => SKIP_DYNAMIC_CAL, + SKIP_DYN_IN_TERM => SKIP_DYN_IN_TERM, + C_SIMULATION => C_SIMULATION, + C_MEM_TYPE => C_MEM_TYPE + + ) + port map ( + UI_CLK => UI_CLK, + RST => RST, + PLL_LOCK => PLL_LOCK, + SELFREFRESH_REQ => SELFREFRESH_REQ, + SELFREFRESH_MCB_MODE => SELFREFRESH_MCB_MODE, + SELFREFRESH_MCB_REQ => SELFREFRESH_MCB_REQ, + SELFREFRESH_MODE => SELFREFRESH_MODE, + DONE_SOFTANDHARD_CAL => DONE_SOFTANDHARD_CAL_xilinx0, + IODRP_ADD => IODRP_ADD, + IODRP_SDI => IODRP_SDI, + RZQ_IN => RZQ_IN_R2, + RZQ_IODRP_SDO => RZQ_IODRP_SDO, + RZQ_IODRP_CS => RZQ_IODRP_CS, + ZIO_IN => ZIO_IN_R2, + ZIO_IODRP_SDO => ZIO_IODRP_SDO, + ZIO_IODRP_CS => ZIO_IODRP_CS, + MCB_UIADD => MCB_UIADD_xilinx3, + MCB_UISDI => MCB_UISDI_xilinx17, + MCB_UOSDO => MCB_UOSDO, + MCB_UODONECAL => MCB_UODONECAL, + MCB_UOREFRSHFLAG => MCB_UOREFRSHFLAG, + MCB_UICS => MCB_UICS_xilinx7, + MCB_UIDRPUPDATE => MCB_UIDRPUPDATE_xilinx13, + MCB_UIBROADCAST => MCB_UIBROADCAST_xilinx5, + MCB_UIADDR => MCB_UIADDR_xilinx4, + MCB_UICMDEN => MCB_UICMDEN_xilinx6, + MCB_UIDONECAL => MCB_UIDONECAL_xilinx8, + MCB_UIDQLOWERDEC => MCB_UIDQLOWERDEC_xilinx9, + MCB_UIDQLOWERINC => MCB_UIDQLOWERINC_xilinx10, + MCB_UIDQUPPERDEC => MCB_UIDQUPPERDEC_xilinx11, + MCB_UIDQUPPERINC => MCB_UIDQUPPERINC_xilinx12, + MCB_UILDQSDEC => MCB_UILDQSDEC_xilinx14, + MCB_UILDQSINC => MCB_UILDQSINC_xilinx15, + MCB_UIREAD => MCB_UIREAD_xilinx16, + MCB_UIUDQSDEC => MCB_UIUDQSDEC_xilinx18, + MCB_UIUDQSINC => MCB_UIUDQSINC_xilinx19, + MCB_RECAL => MCB_RECAL_xilinx1, + MCB_UICMD => MCB_UICMD, + MCB_UICMDIN => MCB_UICMDIN, + MCB_UIDQCOUNT => MCB_UIDQCOUNT, + MCB_UODATA => MCB_UODATA, + MCB_UODATAVALID => MCB_UODATAVALID, + MCB_UOCMDREADY => MCB_UOCMDREADY, + MCB_UO_CAL_START => MCB_UO_CAL_START, + mcb_sysrst => MCB_SYSRST_xilinx2, + Max_Value => Max_Value, + CKE_Train => CKE_Train + ); + + process(UI_CLK,RST) + begin + if (RST = '1') then + ZIO_IN_R1 <= '0'; + ZIO_IN_R2 <= '0'; + RZQ_IN_R1 <= '0'; + RZQ_IN_R2 <= '0'; + elsif (UI_CLK'event and UI_CLK = '1') then + ZIO_IN_R1 <= ZIO_IN; + ZIO_IN_R2 <= ZIO_IN_R1; + RZQ_IN_R1 <= RZQ_IN; + RZQ_IN_R2 <= RZQ_IN_R1; + end if; + end process; + + IOBUF_RZQ : IOBUF + port map ( + o => RZQ_IN, + io => RZQ_PIN, + i => RZQ_OUT, + t => RZQ_TOUT + ); + + IODRP2_RZQ : IODRP2 + port map ( + dataout => open, + dataout2 => open, + dout => RZQ_OUT, + sdo => RZQ_IODRP_SDO, + tout => RZQ_TOUT, + add => IODRP_ADD, + bkst => IODRP_BKST, + clk => UI_CLK, + cs => RZQ_IODRP_CS, + idatain => RZQ_IN, + ioclk0 => IOCLK, + ioclk1 => '1', + odatain => RZQ_ZIO_ODATAIN, + sdi => IODRP_SDI, + t => RZQ_ZIO_TRISTATE + ); + + + gen_zio: if ( ((C_MEM_TYPE = "DDR") or (C_MEM_TYPE = "DDR2") or (C_MEM_TYPE = "DDR3")) and + (SKIP_IN_TERM_CAL = 0)) generate + + IOBUF_ZIO : IOBUF + port map ( + o => ZIO_IN, + io => ZIO_PIN, + i => ZIO_OUT, + t => ZIO_TOUT + ); + + IODRP2_ZIO : IODRP2 + port map ( + dataout => open, + dataout2 => open, + dout => ZIO_OUT, + sdo => ZIO_IODRP_SDO, + tout => ZIO_TOUT, + add => IODRP_ADD, + bkst => IODRP_BKST, + clk => UI_CLK, + cs => ZIO_IODRP_CS, + idatain => ZIO_IN, + ioclk0 => IOCLK, + ioclk1 => '1', + odatain => RZQ_ZIO_ODATAIN, + sdi => IODRP_SDI, + t => RZQ_ZIO_TRISTATE + ); + end generate; + +end architecture trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_infrastructure.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_infrastructure.vhd new file mode 100644 index 0000000..6f5a97f --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_infrastructure.vhd @@ -0,0 +1,334 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor : Xilinx +-- \ \ \/ Version : 3.92 +-- \ \ Application : MIG +-- / / Filename : memc3_infrastructure.vhd +-- /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:56 $ +-- \ \ / \ Date Created : Jul 03 2009 +-- \___\/\___\ +-- +--Device : Spartan-6 +--Design Name : DDR/DDR2/DDR3/LPDDR +--Purpose : Clock generation/distribution and reset synchronization +--Reference : +--Revision History : +--***************************************************************************** +library ieee; +use ieee.std_logic_1164.all; +library unisim; +use unisim.vcomponents.all; + +entity memc3_infrastructure is +generic + ( + C_INCLK_PERIOD : integer := 2500; + C_RST_ACT_LOW : integer := 1; + C_INPUT_CLK_TYPE : string := "DIFFERENTIAL"; + C_CLKOUT0_DIVIDE : integer := 1; + C_CLKOUT1_DIVIDE : integer := 1; + C_CLKOUT2_DIVIDE : integer := 16; + C_CLKOUT3_DIVIDE : integer := 8; + C_CLKFBOUT_MULT : integer := 2; + C_DIVCLK_DIVIDE : integer := 1 + + ); +port +( + sys_clk_p : in std_logic; + sys_clk_n : in std_logic; + sys_clk : in std_logic; + sys_rst_i : in std_logic; + clk0 : out std_logic; + rst0 : out std_logic; + async_rst : out std_logic; + sysclk_2x : out std_logic; + sysclk_2x_180 : out std_logic; + mcb_drp_clk : out std_logic; + pll_ce_0 : out std_logic; + pll_ce_90 : out std_logic; + pll_lock : out std_logic + +); +end entity; +architecture syn of memc3_infrastructure is + + -- # of clock cycles to delay deassertion of reset. Needs to be a fairly + -- high number not so much for metastability protection, but to give time + -- for reset (i.e. stable clock cycles) to propagate through all state + -- machines and to all control signals (i.e. not all control signals have + -- resets, instead they rely on base state logic being reset, and the effect + -- of that reset propagating through the logic). Need this because we may not + -- be getting stable clock cycles while reset asserted (i.e. since reset + -- depends on PLL/DCM lock status) + + constant RST_SYNC_NUM : integer := 25; + constant CLK_PERIOD_NS : real := (real(C_INCLK_PERIOD)) / 1000.0; + constant CLK_PERIOD_INT : integer := C_INCLK_PERIOD/1000; + + + signal clk_2x_0 : std_logic; + signal clk_2x_180 : std_logic; + signal clk0_bufg : std_logic; + signal clk0_bufg_in : std_logic; + signal mcb_drp_clk_bufg_in : std_logic; + signal clkfbout_clkfbin : std_logic; + signal rst_tmp : std_logic; + signal sys_clk_ibufg : std_logic; + signal sys_rst : std_logic; + signal rst0_sync_r : std_logic_vector(RST_SYNC_NUM-1 downto 0); + signal powerup_pll_locked : std_logic; + signal syn_clk0_powerup_pll_locked : std_logic; + signal locked : std_logic; + signal bufpll_mcb_locked : std_logic; + signal mcb_drp_clk_sig : std_logic; + + attribute max_fanout : string; + attribute syn_maxfan : integer; + attribute KEEP : string; + attribute max_fanout of rst0_sync_r : signal is "10"; + attribute syn_maxfan of rst0_sync_r : signal is 10; + attribute KEEP of sys_clk_ibufg : signal is "TRUE"; + +begin + + sys_rst <= not(sys_rst_i) when (C_RST_ACT_LOW /= 0) else sys_rst_i; + clk0 <= clk0_bufg; + pll_lock <= bufpll_mcb_locked; + mcb_drp_clk <= mcb_drp_clk_sig; + + diff_input_clk : if(C_INPUT_CLK_TYPE = "DIFFERENTIAL") generate + --*********************************************************************** + -- Differential input clock input buffers + --*********************************************************************** + u_ibufg_sys_clk : IBUFGDS + generic map ( + DIFF_TERM => TRUE + ) + port map ( + I => sys_clk_p, + IB => sys_clk_n, + O => sys_clk_ibufg + ); + end generate; + + + se_input_clk : if(C_INPUT_CLK_TYPE = "SINGLE_ENDED") generate + --*********************************************************************** + -- SINGLE_ENDED input clock input buffers + --*********************************************************************** + u_ibufg_sys_clk : IBUFG + port map ( + I => sys_clk, + O => sys_clk_ibufg + ); + end generate; + + --*************************************************************************** + -- Global clock generation and distribution + --*************************************************************************** + + u_pll_adv : PLL_ADV + generic map + ( + BANDWIDTH => "OPTIMIZED", + CLKIN1_PERIOD => CLK_PERIOD_NS, + CLKIN2_PERIOD => CLK_PERIOD_NS, + CLKOUT0_DIVIDE => C_CLKOUT0_DIVIDE, + CLKOUT1_DIVIDE => C_CLKOUT1_DIVIDE, + CLKOUT2_DIVIDE => C_CLKOUT2_DIVIDE, + CLKOUT3_DIVIDE => C_CLKOUT3_DIVIDE, + CLKOUT4_DIVIDE => 1, + CLKOUT5_DIVIDE => 1, + CLKOUT0_PHASE => 0.000, + CLKOUT1_PHASE => 180.000, + CLKOUT2_PHASE => 0.000, + CLKOUT3_PHASE => 0.000, + CLKOUT4_PHASE => 0.000, + CLKOUT5_PHASE => 0.000, + CLKOUT0_DUTY_CYCLE => 0.500, + CLKOUT1_DUTY_CYCLE => 0.500, + CLKOUT2_DUTY_CYCLE => 0.500, + CLKOUT3_DUTY_CYCLE => 0.500, + CLKOUT4_DUTY_CYCLE => 0.500, + CLKOUT5_DUTY_CYCLE => 0.500, + SIM_DEVICE => "SPARTAN6", + COMPENSATION => "INTERNAL", + DIVCLK_DIVIDE => C_DIVCLK_DIVIDE, + CLKFBOUT_MULT => C_CLKFBOUT_MULT, + CLKFBOUT_PHASE => 0.0, + REF_JITTER => 0.005000 + ) + port map + ( + CLKFBIN => clkfbout_clkfbin, + CLKINSEL => '1', + CLKIN1 => sys_clk_ibufg, + CLKIN2 => '0', + DADDR => (others => '0'), + DCLK => '0', + DEN => '0', + DI => (others => '0'), + DWE => '0', + REL => '0', + RST => sys_rst, + CLKFBDCM => open, + CLKFBOUT => clkfbout_clkfbin, + CLKOUTDCM0 => open, + CLKOUTDCM1 => open, + CLKOUTDCM2 => open, + CLKOUTDCM3 => open, + CLKOUTDCM4 => open, + CLKOUTDCM5 => open, + CLKOUT0 => clk_2x_0, + CLKOUT1 => clk_2x_180, + CLKOUT2 => clk0_bufg_in, + CLKOUT3 => mcb_drp_clk_bufg_in, + CLKOUT4 => open, + CLKOUT5 => open, + DO => open, + DRDY => open, + LOCKED => locked + ); + + U_BUFG_CLK0 : BUFG + port map + ( + O => clk0_bufg, + I => clk0_bufg_in + ); + + --U_BUFG_CLK1 : BUFG + -- port map ( + -- O => mcb_drp_clk_sig, + -- I => mcb_drp_clk_bufg_in + -- ); + + U_BUFG_CLK1 : BUFGCE + port map ( + O => mcb_drp_clk_sig, + I => mcb_drp_clk_bufg_in, + CE => locked + ); + + process (mcb_drp_clk_sig, sys_rst) + begin + if(sys_rst = '1') then + powerup_pll_locked <= '0'; + elsif (mcb_drp_clk_sig'event and mcb_drp_clk_sig = '1') then + if (bufpll_mcb_locked = '1') then + powerup_pll_locked <= '1'; + end if; + end if; + end process; + + + process (clk0_bufg, sys_rst) + begin + if(sys_rst = '1') then + syn_clk0_powerup_pll_locked <= '0'; + elsif (clk0_bufg'event and clk0_bufg = '1') then + if (bufpll_mcb_locked = '1') then + syn_clk0_powerup_pll_locked <= '1'; + end if; + end if; + end process; + + + --*************************************************************************** + -- Reset synchronization + -- NOTES: + -- 1. shut down the whole operation if the PLL hasn't yet locked (and + -- by inference, this means that external sys_rst has been asserted - + -- PLL deasserts LOCKED as soon as sys_rst asserted) + -- 2. asynchronously assert reset. This was we can assert reset even if + -- there is no clock (needed for things like 3-stating output buffers). + -- reset deassertion is synchronous. + -- 3. asynchronous reset only look at pll_lock from PLL during power up. After + -- power up and pll_lock is asserted, the powerup_pll_locked will be asserted + -- forever until sys_rst is asserted again. PLL will lose lock when FPGA + -- enters suspend mode. We don't want reset to MCB get + -- asserted in the application that needs suspend feature. + --*************************************************************************** + + + async_rst <= sys_rst or not(powerup_pll_locked); + -- async_rst <= rst_tmp; + rst_tmp <= sys_rst or not(syn_clk0_powerup_pll_locked); + -- rst_tmp <= sys_rst or not(powerup_pll_locked); + +process (clk0_bufg, rst_tmp) + begin + if (rst_tmp = '1') then + rst0_sync_r <= (others => '1'); + elsif (rising_edge(clk0_bufg)) then + rst0_sync_r <= rst0_sync_r(RST_SYNC_NUM-2 downto 0) & '0'; -- logical left shift by one (pads with 0) + end if; + end process; + + rst0 <= rst0_sync_r(RST_SYNC_NUM-1); + + +BUFPLL_MCB_INST : BUFPLL_MCB +port map +( IOCLK0 => sysclk_2x, + IOCLK1 => sysclk_2x_180, + LOCKED => locked, + GCLK => mcb_drp_clk_sig, + SERDESSTROBE0 => pll_ce_0, + SERDESSTROBE1 => pll_ce_90, + PLLIN0 => clk_2x_0, + PLLIN1 => clk_2x_180, + LOCK => bufpll_mcb_locked + ); + +end architecture syn; + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_tb_top.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_tb_top.vhd new file mode 100644 index 0000000..6cb946b --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_tb_top.vhd @@ -0,0 +1,1070 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor : Xilinx +-- \ \ \/ Version : 3.92 +-- \ \ Application : MIG +-- / / Filename : memc3_tb_top.vhd +-- /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:56 $ +-- \ \ / \ Date Created : Jul 03 2009 +-- \___\/\___\ +-- +--Device : Spartan-6 +--Design Name : DDR/DDR2/DDR3/LPDDR +--Purpose : This is top level module for test bench. which instantiates +-- init_mem_pattern_ctr and mcb_traffic_gen modules for each user +-- port. +--Reference : +--Revision History : +--***************************************************************************** +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity memc3_tb_top is +generic + ( + C_P0_MASK_SIZE : integer := 4; + C_P0_DATA_PORT_SIZE : integer := 32; + C_P1_MASK_SIZE : integer := 4; + C_P1_DATA_PORT_SIZE : integer := 32; + C_MEM_BURST_LEN : integer := 8; + C_SIMULATION : string := "FALSE"; + C_MEM_NUM_COL_BITS : integer := 11; + C_NUM_DQ_PINS : integer := 8; + C_SMALL_DEVICE : string := "FALSE"; + C_p0_BEGIN_ADDRESS : std_logic_vector(31 downto 0) := X"00000100"; + C_p0_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + C_p0_END_ADDRESS : std_logic_vector(31 downto 0) := X"000002ff"; + C_p0_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"fffffc00"; + C_p0_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00000100"; + C_p1_BEGIN_ADDRESS : std_logic_vector(31 downto 0) := X"00000300"; + C_p1_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + C_p1_END_ADDRESS : std_logic_vector(31 downto 0) := X"000004ff"; + C_p1_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"fffff800"; + C_p1_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00000300"; + C_p2_BEGIN_ADDRESS : std_logic_vector(31 downto 0) := X"00000500"; + C_p2_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + C_p2_END_ADDRESS : std_logic_vector(31 downto 0) := X"000006ff"; + C_p2_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"fffff800"; + C_p2_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00000500"; + C_p3_BEGIN_ADDRESS : std_logic_vector(31 downto 0) := X"00000700"; + C_p3_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + C_p3_END_ADDRESS : std_logic_vector(31 downto 0) := X"000008ff"; + C_p3_PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"fffff000"; + C_p3_PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00000700" + ); +port +( + clk0 : in std_logic; + rst0 : in std_logic; + calib_done : in std_logic; + p0_mcb_cmd_en_o : out std_logic; + p0_mcb_cmd_instr_o : out std_logic_vector(2 downto 0); + p0_mcb_cmd_bl_o : out std_logic_vector(5 downto 0); + p0_mcb_cmd_addr_o : out std_logic_vector(29 downto 0); + p0_mcb_cmd_full_i : in std_logic; + + p0_mcb_wr_en_o : out std_logic; + p0_mcb_wr_mask_o : out std_logic_vector(C_P0_MASK_SIZE - 1 downto 0); + p0_mcb_wr_data_o : out std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0); + p0_mcb_wr_full_i : in std_logic; + p0_mcb_wr_fifo_counts : in std_logic_vector(6 downto 0); + + p0_mcb_rd_en_o : out std_logic; + p0_mcb_rd_data_i : in std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0); + p0_mcb_rd_empty_i : in std_logic; + p0_mcb_rd_fifo_counts : in std_logic_vector(6 downto 0); + + p1_mcb_cmd_en_o : out std_logic; + p1_mcb_cmd_instr_o : out std_logic_vector(2 downto 0); + p1_mcb_cmd_bl_o : out std_logic_vector(5 downto 0); + p1_mcb_cmd_addr_o : out std_logic_vector(29 downto 0); + p1_mcb_cmd_full_i : in std_logic; + + p1_mcb_wr_en_o : out std_logic; + p1_mcb_wr_mask_o : out std_logic_vector(C_P1_MASK_SIZE - 1 downto 0); + p1_mcb_wr_data_o : out std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0); + p1_mcb_wr_full_i : in std_logic; + p1_mcb_wr_fifo_counts : in std_logic_vector(6 downto 0); + + p1_mcb_rd_en_o : out std_logic; + p1_mcb_rd_data_i : in std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0); + p1_mcb_rd_empty_i : in std_logic; + p1_mcb_rd_fifo_counts : in std_logic_vector(6 downto 0); + + p2_mcb_cmd_en_o : out std_logic; + p2_mcb_cmd_instr_o : out std_logic_vector(2 downto 0); + p2_mcb_cmd_bl_o : out std_logic_vector(5 downto 0); + p2_mcb_cmd_addr_o : out std_logic_vector(29 downto 0); + p2_mcb_cmd_full_i : in std_logic; + + p2_mcb_wr_en_o : out std_logic; + p2_mcb_wr_mask_o : out std_logic_vector(3 downto 0); + p2_mcb_wr_data_o : out std_logic_vector(31 downto 0); + p2_mcb_wr_full_i : in std_logic; + p2_mcb_wr_fifo_counts : in std_logic_vector(6 downto 0); + + p2_mcb_rd_en_o : out std_logic; + p2_mcb_rd_data_i : in std_logic_vector(31 downto 0); + p2_mcb_rd_empty_i : in std_logic; + p2_mcb_rd_fifo_counts : in std_logic_vector(6 downto 0); + + p3_mcb_cmd_en_o : out std_logic; + p3_mcb_cmd_instr_o : out std_logic_vector(2 downto 0); + p3_mcb_cmd_bl_o : out std_logic_vector(5 downto 0); + p3_mcb_cmd_addr_o : out std_logic_vector(29 downto 0); + p3_mcb_cmd_full_i : in std_logic; + + p3_mcb_wr_en_o : out std_logic; + p3_mcb_wr_mask_o : out std_logic_vector(3 downto 0); + p3_mcb_wr_data_o : out std_logic_vector(31 downto 0); + p3_mcb_wr_full_i : in std_logic; + p3_mcb_wr_fifo_counts : in std_logic_vector(6 downto 0); + + p3_mcb_rd_en_o : out std_logic; + p3_mcb_rd_data_i : in std_logic_vector(31 downto 0); + p3_mcb_rd_empty_i : in std_logic; + p3_mcb_rd_fifo_counts : in std_logic_vector(6 downto 0); + + + + vio_modify_enable : in std_logic; + vio_data_mode_value : in std_logic_vector(2 downto 0); + vio_addr_mode_value : in std_logic_vector(2 downto 0); + cmp_error : out std_logic; + cmp_data : out std_logic_vector(31 downto 0); + cmp_data_valid : out std_logic; + error : out std_logic; + error_status : out std_logic_vector(127 downto 0) +); +end memc3_tb_top; + +architecture arc of memc3_tb_top is + +function ERROR_DQWIDTH (val_i : integer) return integer is +begin + if (val_i = 4) then + return 1; + else + return val_i/8; + end if; +end function ERROR_DQWIDTH; + +constant DQ_ERROR_WIDTH : integer := ERROR_DQWIDTH(C_NUM_DQ_PINS); + +component init_mem_pattern_ctr IS + generic ( + FAMILY : string; + BEGIN_ADDRESS : std_logic_vector(31 downto 0); + END_ADDRESS : std_logic_vector(31 downto 0); + DWIDTH : integer; + CMD_SEED_VALUE : std_logic_vector(31 downto 0); + DATA_SEED_VALUE : std_logic_vector(31 downto 0); + DATA_MODE : std_logic_vector(3 downto 0); + PORT_MODE : string + ); + PORT ( + clk_i : in std_logic; + rst_i : in std_logic; + mcb_cmd_bl_i : in std_logic_vector(5 downto 0); + mcb_cmd_en_i : in std_logic; + mcb_cmd_instr_i : in std_logic_vector(2 downto 0); + mcb_init_done_i : in std_logic; + mcb_wr_en_i : in std_logic; + vio_modify_enable : in std_logic; + vio_data_mode_value : in std_logic_vector(2 downto 0); + vio_addr_mode_value : in std_logic_vector(2 downto 0); + vio_bl_mode_value : in STD_LOGIC_VECTOR(1 downto 0); + vio_fixed_bl_value : in STD_LOGIC_VECTOR(5 downto 0); + cmp_error : in std_logic; + run_traffic_o : out std_logic; + start_addr_o : out std_logic_vector(31 downto 0); + end_addr_o : out std_logic_vector(31 downto 0); + cmd_seed_o : out std_logic_vector(31 downto 0); + data_seed_o : out std_logic_vector(31 downto 0); + load_seed_o : out std_logic; + addr_mode_o : out std_logic_vector(2 downto 0); + instr_mode_o : out std_logic_vector(3 downto 0); + bl_mode_o : out std_logic_vector(1 downto 0); + data_mode_o : out std_logic_vector(3 downto 0); + mode_load_o : out std_logic; + fixed_bl_o : out std_logic_vector(5 downto 0); + fixed_instr_o : out std_logic_vector(2 downto 0); + fixed_addr_o : out std_logic_vector(31 downto 0) + ); +end component; + +component mcb_traffic_gen is + generic ( + + FAMILY : string; + SIMULATION : string; + MEM_BURST_LEN : integer; + PORT_MODE : string; + DATA_PATTERN : string; + CMD_PATTERN : string; + ADDR_WIDTH : integer; + CMP_DATA_PIPE_STAGES : integer; + MEM_COL_WIDTH : integer; + NUM_DQ_PINS : integer; + DQ_ERROR_WIDTH : integer; + DWIDTH : integer; + PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0); + PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0); + PRBS_EADDR : std_logic_vector(31 downto 0); + PRBS_SADDR : std_logic_vector(31 downto 0) + ); + port ( + + clk_i : in std_logic; + rst_i : in std_logic; + run_traffic_i : in std_logic; + manual_clear_error : in std_logic; + -- *** runtime parameter *** + start_addr_i : in std_logic_vector(31 downto 0); + end_addr_i : in std_logic_vector(31 downto 0); + cmd_seed_i : in std_logic_vector(31 downto 0); + data_seed_i : in std_logic_vector(31 downto 0); + load_seed_i : in std_logic; + + addr_mode_i : in std_logic_vector(2 downto 0); + instr_mode_i : in std_logic_vector(3 downto 0); + bl_mode_i : in std_logic_vector(1 downto 0); + data_mode_i : in std_logic_vector(3 downto 0); + mode_load_i : in std_logic; + + -- fixed pattern inputs interface + fixed_bl_i : in std_logic_vector(5 downto 0); + fixed_instr_i : in std_logic_vector(2 downto 0); + fixed_addr_i : in std_logic_vector(31 downto 0); + fixed_data_i : IN STD_LOGIC_VECTOR(DWIDTH-1 DOWNTO 0); + + bram_cmd_i : in std_logic_vector(38 downto 0); + bram_valid_i : in std_logic; + bram_rdy_o : out std_logic; + + --/////////////////////////////////////////////////////////////////////////// + -- MCB INTERFACE + -- interface to mcb command port + mcb_cmd_en_o : out std_logic; + mcb_cmd_instr_o : out std_logic_vector(2 downto 0); + mcb_cmd_addr_o : out std_logic_vector(ADDR_WIDTH - 1 downto 0); + mcb_cmd_bl_o : out std_logic_vector(5 downto 0); + mcb_cmd_full_i : in std_logic; + -- interface to mcb wr data port + mcb_wr_en_o : out std_logic; + mcb_wr_data_o : out std_logic_vector(DWIDTH - 1 downto 0); + mcb_wr_mask_o : out std_logic_vector((DWIDTH / 8) - 1 downto 0); + mcb_wr_data_end_o : OUT std_logic; + + mcb_wr_full_i : in std_logic; + mcb_wr_fifo_counts : in std_logic_vector(6 downto 0); + + -- interface to mcb rd data port + mcb_rd_en_o : out std_logic; + mcb_rd_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + mcb_rd_empty_i : in std_logic; + mcb_rd_fifo_counts : in std_logic_vector(6 downto 0); + --/////////////////////////////////////////////////////////////////////////// + -- status feedback + counts_rst : in std_logic; + wr_data_counts : out std_logic_vector(47 downto 0); + rd_data_counts : out std_logic_vector(47 downto 0); + cmp_data : out std_logic_vector(DWIDTH - 1 downto 0); + cmp_data_valid : out std_logic; + cmp_error : out std_logic; + error : out std_logic; + error_status : out std_logic_vector(64 + (2 * DWIDTH - 1) downto 0); + mem_rd_data : out std_logic_vector(DWIDTH - 1 downto 0); + dq_error_bytelane_cmp : out std_logic_vector(DQ_ERROR_WIDTH - 1 downto 0); + cumlative_dq_lane_error : out std_logic_vector(DQ_ERROR_WIDTH - 1 downto 0) + + ); +end component; + + -- Function to determine the number of data patterns to be generated + function DATA_PATTERN_CALC return string is + begin + if (C_SMALL_DEVICE = "FALSE") then + return "DGEN_ALL"; + else + return "DGEN_ADDR"; + end if; + end function; + + constant FAMILY : string := "SPARTAN6"; + constant DATA_PATTERN : string := DATA_PATTERN_CALC; + constant CMD_PATTERN : string := "CGEN_ALL"; + constant ADDR_WIDTH : integer := 30; + constant CMP_DATA_PIPE_STAGES : integer := 0; + constant PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00007000"; + constant PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"FFFF8000"; + constant PRBS_SADDR : std_logic_vector(31 downto 0) := X"00005000"; + constant PRBS_EADDR : std_logic_vector(31 downto 0) := X"00007fff"; + constant BEGIN_ADDRESS : std_logic_vector(31 downto 0) := X"00000000"; + constant END_ADDRESS : std_logic_vector(31 downto 0) := X"00000fff"; + constant DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + + + + + + + constant p0_DWIDTH : integer := 32; + + constant p1_DWIDTH : integer := 32; + + constant p2_DWIDTH : integer := 32; + + constant p3_DWIDTH : integer := 32; + + + constant p0_PORT_MODE : string := "BI_MODE"; + + constant p1_PORT_MODE : string := "BI_MODE"; + + constant p2_PORT_MODE : string := "BI_MODE"; + + constant p3_PORT_MODE : string := "BI_MODE"; + + + + + + + + + + + + + + + +--p0 Signal declarations +signal p0_tg_run_traffic : std_logic; +signal p0_tg_start_addr : std_logic_vector(31 downto 0); +signal p0_tg_end_addr : std_logic_vector(31 downto 0); +signal p0_tg_cmd_seed : std_logic_vector(31 downto 0); +signal p0_tg_data_seed : std_logic_vector(31 downto 0); +signal p0_tg_load_seed : std_logic; +signal p0_tg_addr_mode : std_logic_vector(2 downto 0); +signal p0_tg_instr_mode : std_logic_vector(3 downto 0); +signal p0_tg_bl_mode : std_logic_vector(1 downto 0); +signal p0_tg_data_mode : std_logic_vector(3 downto 0); +signal p0_tg_mode_load : std_logic; +signal p0_tg_fixed_bl : std_logic_vector(5 downto 0); +signal p0_tg_fixed_instr : std_logic_vector(2 downto 0); +signal p0_tg_fixed_addr : std_logic_vector(31 downto 0); +signal p0_error_status : std_logic_vector(64 + (2*p0_DWIDTH - 1) downto 0); +signal p0_error : std_logic; +signal p0_cmp_error : std_logic; +signal p0_cmp_data : std_logic_vector(p0_DWIDTH-1 downto 0); +signal p0_cmp_data_valid : std_logic; + +signal p0_mcb_cmd_en_o_int : std_logic; +signal p0_mcb_cmd_instr_o_int : std_logic_vector(2 downto 0); +signal p0_mcb_cmd_bl_o_int : std_logic_vector(5 downto 0); +signal p0_mcb_cmd_addr_o_int : std_logic_vector(29 downto 0); +signal p0_mcb_wr_en_o_int : std_logic; + + +--p1 Signal declarations +signal p1_tg_run_traffic : std_logic; +signal p1_tg_start_addr : std_logic_vector(31 downto 0); +signal p1_tg_end_addr : std_logic_vector(31 downto 0); +signal p1_tg_cmd_seed : std_logic_vector(31 downto 0); +signal p1_tg_data_seed : std_logic_vector(31 downto 0); +signal p1_tg_load_seed : std_logic; +signal p1_tg_addr_mode : std_logic_vector(2 downto 0); +signal p1_tg_instr_mode : std_logic_vector(3 downto 0); +signal p1_tg_bl_mode : std_logic_vector(1 downto 0); +signal p1_tg_data_mode : std_logic_vector(3 downto 0); +signal p1_tg_mode_load : std_logic; +signal p1_tg_fixed_bl : std_logic_vector(5 downto 0); +signal p1_tg_fixed_instr : std_logic_vector(2 downto 0); +signal p1_tg_fixed_addr : std_logic_vector(31 downto 0); +signal p1_error_status : std_logic_vector(64 + (2*p1_DWIDTH - 1) downto 0); +signal p1_error : std_logic; +signal p1_cmp_error : std_logic; +signal p1_cmp_data : std_logic_vector(p1_DWIDTH-1 downto 0); +signal p1_cmp_data_valid : std_logic; + +signal p1_mcb_cmd_en_o_int : std_logic; +signal p1_mcb_cmd_instr_o_int : std_logic_vector(2 downto 0); +signal p1_mcb_cmd_bl_o_int : std_logic_vector(5 downto 0); +signal p1_mcb_cmd_addr_o_int : std_logic_vector(29 downto 0); +signal p1_mcb_wr_en_o_int : std_logic; + + +--p2 Signal declarations +signal p2_tg_run_traffic : std_logic; +signal p2_tg_start_addr : std_logic_vector(31 downto 0); +signal p2_tg_end_addr : std_logic_vector(31 downto 0); +signal p2_tg_cmd_seed : std_logic_vector(31 downto 0); +signal p2_tg_data_seed : std_logic_vector(31 downto 0); +signal p2_tg_load_seed : std_logic; +signal p2_tg_addr_mode : std_logic_vector(2 downto 0); +signal p2_tg_instr_mode : std_logic_vector(3 downto 0); +signal p2_tg_bl_mode : std_logic_vector(1 downto 0); +signal p2_tg_data_mode : std_logic_vector(3 downto 0); +signal p2_tg_mode_load : std_logic; +signal p2_tg_fixed_bl : std_logic_vector(5 downto 0); +signal p2_tg_fixed_instr : std_logic_vector(2 downto 0); +signal p2_tg_fixed_addr : std_logic_vector(31 downto 0); +signal p2_error_status : std_logic_vector(64 + (2*p2_DWIDTH - 1) downto 0); +signal p2_error : std_logic; +signal p2_cmp_error : std_logic; +signal p2_cmp_data : std_logic_vector(p2_DWIDTH-1 downto 0); +signal p2_cmp_data_valid : std_logic; + +signal p2_mcb_cmd_en_o_int : std_logic; +signal p2_mcb_cmd_instr_o_int : std_logic_vector(2 downto 0); +signal p2_mcb_cmd_bl_o_int : std_logic_vector(5 downto 0); +signal p2_mcb_cmd_addr_o_int : std_logic_vector(29 downto 0); +signal p2_mcb_wr_en_o_int : std_logic; + + +--p3 Signal declarations +signal p3_tg_run_traffic : std_logic; +signal p3_tg_start_addr : std_logic_vector(31 downto 0); +signal p3_tg_end_addr : std_logic_vector(31 downto 0); +signal p3_tg_cmd_seed : std_logic_vector(31 downto 0); +signal p3_tg_data_seed : std_logic_vector(31 downto 0); +signal p3_tg_load_seed : std_logic; +signal p3_tg_addr_mode : std_logic_vector(2 downto 0); +signal p3_tg_instr_mode : std_logic_vector(3 downto 0); +signal p3_tg_bl_mode : std_logic_vector(1 downto 0); +signal p3_tg_data_mode : std_logic_vector(3 downto 0); +signal p3_tg_mode_load : std_logic; +signal p3_tg_fixed_bl : std_logic_vector(5 downto 0); +signal p3_tg_fixed_instr : std_logic_vector(2 downto 0); +signal p3_tg_fixed_addr : std_logic_vector(31 downto 0); +signal p3_error_status : std_logic_vector(64 + (2*p3_DWIDTH - 1) downto 0); +signal p3_error : std_logic; +signal p3_cmp_error : std_logic; +signal p3_cmp_data : std_logic_vector(p3_DWIDTH-1 downto 0); +signal p3_cmp_data_valid : std_logic; + +signal p3_mcb_cmd_en_o_int : std_logic; +signal p3_mcb_cmd_instr_o_int : std_logic_vector(2 downto 0); +signal p3_mcb_cmd_bl_o_int : std_logic_vector(5 downto 0); +signal p3_mcb_cmd_addr_o_int : std_logic_vector(29 downto 0); +signal p3_mcb_wr_en_o_int : std_logic; + + + + + + + + + +--signal cmp_data : std_logic_vector(31 downto 0); +begin + + cmp_error <= p0_cmp_error or p1_cmp_error or p2_cmp_error or p3_cmp_error; + error <= p0_error or p1_error or p2_error or p3_error; + error_status <= p0_error_status; + cmp_data <= p0_cmp_data(31 downto 0); + cmp_data_valid <= p0_cmp_data_valid; + + +p0_mcb_cmd_en_o <= p0_mcb_cmd_en_o_int; +p0_mcb_cmd_instr_o <= p0_mcb_cmd_instr_o_int; +p0_mcb_cmd_bl_o <= p0_mcb_cmd_bl_o_int; +p0_mcb_cmd_addr_o <= p0_mcb_cmd_addr_o_int; +p0_mcb_wr_en_o <= p0_mcb_wr_en_o_int; + + init_mem_pattern_ctr_p0 :init_mem_pattern_ctr + generic map + ( + DWIDTH => p0_DWIDTH, + FAMILY => FAMILY, + BEGIN_ADDRESS => C_p0_BEGIN_ADDRESS, + END_ADDRESS => C_p0_END_ADDRESS, + CMD_SEED_VALUE => X"56456783", + DATA_SEED_VALUE => X"12345678", + DATA_MODE => C_p0_DATA_MODE, + PORT_MODE => p0_PORT_MODE + + ) + port map + ( + clk_i => clk0, + rst_i => rst0, + + mcb_cmd_en_i => p0_mcb_cmd_en_o_int, + mcb_cmd_instr_i => p0_mcb_cmd_instr_o_int, + mcb_cmd_bl_i => p0_mcb_cmd_bl_o_int, + mcb_wr_en_i => p0_mcb_wr_en_o_int, + + vio_modify_enable => vio_modify_enable, + vio_data_mode_value => vio_data_mode_value, + vio_addr_mode_value => vio_addr_mode_value, + vio_bl_mode_value => "10",--vio_bl_mode_value, + vio_fixed_bl_value => "000000",--vio_fixed_bl_value, + + mcb_init_done_i => calib_done, + cmp_error => p0_error, + run_traffic_o => p0_tg_run_traffic, + start_addr_o => p0_tg_start_addr, + end_addr_o => p0_tg_end_addr , + cmd_seed_o => p0_tg_cmd_seed , + data_seed_o => p0_tg_data_seed , + load_seed_o => p0_tg_load_seed , + addr_mode_o => p0_tg_addr_mode , + instr_mode_o => p0_tg_instr_mode , + bl_mode_o => p0_tg_bl_mode , + data_mode_o => p0_tg_data_mode , + mode_load_o => p0_tg_mode_load , + fixed_bl_o => p0_tg_fixed_bl , + fixed_instr_o => p0_tg_fixed_instr, + fixed_addr_o => p0_tg_fixed_addr + ); + + m_traffic_gen_p0 : mcb_traffic_gen + generic map( + MEM_BURST_LEN => C_MEM_BURST_LEN, + MEM_COL_WIDTH => C_MEM_NUM_COL_BITS, + NUM_DQ_PINS => C_NUM_DQ_PINS, + DQ_ERROR_WIDTH => DQ_ERROR_WIDTH, + + PORT_MODE => p0_PORT_MODE, + DWIDTH => p0_DWIDTH, + CMP_DATA_PIPE_STAGES => CMP_DATA_PIPE_STAGES, + FAMILY => FAMILY, + SIMULATION => "FALSE", + DATA_PATTERN => DATA_PATTERN, + CMD_PATTERN => "CGEN_ALL", + ADDR_WIDTH => 30, + PRBS_SADDR_MASK_POS => C_p0_PRBS_SADDR_MASK_POS, + PRBS_EADDR_MASK_POS => C_p0_PRBS_EADDR_MASK_POS, + PRBS_SADDR => C_p0_BEGIN_ADDRESS, + PRBS_EADDR => C_p0_END_ADDRESS + ) + port map + ( + clk_i => clk0, + rst_i => rst0, + run_traffic_i => p0_tg_run_traffic, + manual_clear_error => rst0, + -- runtime parameter + start_addr_i => p0_tg_start_addr , + end_addr_i => p0_tg_end_addr , + cmd_seed_i => p0_tg_cmd_seed , + data_seed_i => p0_tg_data_seed , + load_seed_i => p0_tg_load_seed, + addr_mode_i => p0_tg_addr_mode, + + instr_mode_i => p0_tg_instr_mode , + bl_mode_i => p0_tg_bl_mode , + data_mode_i => p0_tg_data_mode , + mode_load_i => p0_tg_mode_load , + + -- fixed pattern inputs interface + fixed_bl_i => p0_tg_fixed_bl, + fixed_instr_i => p0_tg_fixed_instr, + fixed_addr_i => p0_tg_fixed_addr, + fixed_data_i => (others => '0'), + -- BRAM interface. + bram_cmd_i => (others => '0'), + bram_valid_i => '0', + bram_rdy_o => open, + + -- MCB INTERFACE + mcb_cmd_en_o => p0_mcb_cmd_en_o_int, + mcb_cmd_instr_o => p0_mcb_cmd_instr_o_int, + mcb_cmd_bl_o => p0_mcb_cmd_bl_o_int, + mcb_cmd_addr_o => p0_mcb_cmd_addr_o_int, + mcb_cmd_full_i => p0_mcb_cmd_full_i, + + mcb_wr_en_o => p0_mcb_wr_en_o_int, + mcb_wr_mask_o => p0_mcb_wr_mask_o, + mcb_wr_data_o => p0_mcb_wr_data_o, + mcb_wr_data_end_o => open, + mcb_wr_full_i => p0_mcb_wr_full_i, + mcb_wr_fifo_counts => p0_mcb_wr_fifo_counts, + + mcb_rd_en_o => p0_mcb_rd_en_o, + mcb_rd_data_i => p0_mcb_rd_data_i, + mcb_rd_empty_i => p0_mcb_rd_empty_i, + mcb_rd_fifo_counts => p0_mcb_rd_fifo_counts, + + -- status feedback + counts_rst => rst0, + wr_data_counts => open, + rd_data_counts => open, + cmp_data => p0_cmp_data, + cmp_data_valid => p0_cmp_data_valid, + cmp_error => p0_cmp_error, + error => p0_error, + error_status => p0_error_status, + mem_rd_data => open, + dq_error_bytelane_cmp => open, + cumlative_dq_lane_error => open + ); + + + +p1_mcb_cmd_en_o <= p1_mcb_cmd_en_o_int; +p1_mcb_cmd_instr_o <= p1_mcb_cmd_instr_o_int; +p1_mcb_cmd_bl_o <= p1_mcb_cmd_bl_o_int; +p1_mcb_cmd_addr_o <= p1_mcb_cmd_addr_o_int; +p1_mcb_wr_en_o <= p1_mcb_wr_en_o_int; + + init_mem_pattern_ctr_p1 :init_mem_pattern_ctr + generic map + ( + DWIDTH => p1_DWIDTH, + FAMILY => FAMILY, + BEGIN_ADDRESS => C_p1_BEGIN_ADDRESS, + END_ADDRESS => C_p1_END_ADDRESS, + CMD_SEED_VALUE => X"56456783", + DATA_SEED_VALUE => X"12345678", + DATA_MODE => C_p1_DATA_MODE, + PORT_MODE => p1_PORT_MODE + + ) + port map + ( + clk_i => clk0, + rst_i => rst0, + + mcb_cmd_en_i => p1_mcb_cmd_en_o_int, + mcb_cmd_instr_i => p1_mcb_cmd_instr_o_int, + mcb_cmd_bl_i => p1_mcb_cmd_bl_o_int, + mcb_wr_en_i => p1_mcb_wr_en_o_int, + + vio_modify_enable => vio_modify_enable, + vio_data_mode_value => vio_data_mode_value, + vio_addr_mode_value => vio_addr_mode_value, + vio_bl_mode_value => "10",--vio_bl_mode_value, + vio_fixed_bl_value => "000000",--vio_fixed_bl_value, + + mcb_init_done_i => calib_done, + cmp_error => p1_error, + run_traffic_o => p1_tg_run_traffic, + start_addr_o => p1_tg_start_addr, + end_addr_o => p1_tg_end_addr , + cmd_seed_o => p1_tg_cmd_seed , + data_seed_o => p1_tg_data_seed , + load_seed_o => p1_tg_load_seed , + addr_mode_o => p1_tg_addr_mode , + instr_mode_o => p1_tg_instr_mode , + bl_mode_o => p1_tg_bl_mode , + data_mode_o => p1_tg_data_mode , + mode_load_o => p1_tg_mode_load , + fixed_bl_o => p1_tg_fixed_bl , + fixed_instr_o => p1_tg_fixed_instr, + fixed_addr_o => p1_tg_fixed_addr + ); + + m_traffic_gen_p1 : mcb_traffic_gen + generic map( + MEM_BURST_LEN => C_MEM_BURST_LEN, + MEM_COL_WIDTH => C_MEM_NUM_COL_BITS, + NUM_DQ_PINS => C_NUM_DQ_PINS, + DQ_ERROR_WIDTH => DQ_ERROR_WIDTH, + + PORT_MODE => p1_PORT_MODE, + DWIDTH => p1_DWIDTH, + CMP_DATA_PIPE_STAGES => CMP_DATA_PIPE_STAGES, + FAMILY => FAMILY, + SIMULATION => "FALSE", + DATA_PATTERN => DATA_PATTERN, + CMD_PATTERN => "CGEN_ALL", + ADDR_WIDTH => 30, + PRBS_SADDR_MASK_POS => C_p1_PRBS_SADDR_MASK_POS, + PRBS_EADDR_MASK_POS => C_p1_PRBS_EADDR_MASK_POS, + PRBS_SADDR => C_p1_BEGIN_ADDRESS, + PRBS_EADDR => C_p1_END_ADDRESS + ) + port map + ( + clk_i => clk0, + rst_i => rst0, + run_traffic_i => p1_tg_run_traffic, + manual_clear_error => rst0, + -- runtime parameter + start_addr_i => p1_tg_start_addr , + end_addr_i => p1_tg_end_addr , + cmd_seed_i => p1_tg_cmd_seed , + data_seed_i => p1_tg_data_seed , + load_seed_i => p1_tg_load_seed, + addr_mode_i => p1_tg_addr_mode, + + instr_mode_i => p1_tg_instr_mode , + bl_mode_i => p1_tg_bl_mode , + data_mode_i => p1_tg_data_mode , + mode_load_i => p1_tg_mode_load , + + -- fixed pattern inputs interface + fixed_bl_i => p1_tg_fixed_bl, + fixed_instr_i => p1_tg_fixed_instr, + fixed_addr_i => p1_tg_fixed_addr, + fixed_data_i => (others => '0'), + -- BRAM interface. + bram_cmd_i => (others => '0'), + bram_valid_i => '0', + bram_rdy_o => open, + + -- MCB INTERFACE + mcb_cmd_en_o => p1_mcb_cmd_en_o_int, + mcb_cmd_instr_o => p1_mcb_cmd_instr_o_int, + mcb_cmd_bl_o => p1_mcb_cmd_bl_o_int, + mcb_cmd_addr_o => p1_mcb_cmd_addr_o_int, + mcb_cmd_full_i => p1_mcb_cmd_full_i, + + mcb_wr_en_o => p1_mcb_wr_en_o_int, + mcb_wr_mask_o => p1_mcb_wr_mask_o, + mcb_wr_data_o => p1_mcb_wr_data_o, + mcb_wr_data_end_o => open, + mcb_wr_full_i => p1_mcb_wr_full_i, + mcb_wr_fifo_counts => p1_mcb_wr_fifo_counts, + + mcb_rd_en_o => p1_mcb_rd_en_o, + mcb_rd_data_i => p1_mcb_rd_data_i, + mcb_rd_empty_i => p1_mcb_rd_empty_i, + mcb_rd_fifo_counts => p1_mcb_rd_fifo_counts, + + -- status feedback + counts_rst => rst0, + wr_data_counts => open, + rd_data_counts => open, + cmp_data => p1_cmp_data, + cmp_data_valid => p1_cmp_data_valid, + cmp_error => p1_cmp_error, + error => p1_error, + error_status => p1_error_status, + mem_rd_data => open, + dq_error_bytelane_cmp => open, + cumlative_dq_lane_error => open + ); + + + +p2_mcb_cmd_en_o <= p2_mcb_cmd_en_o_int; +p2_mcb_cmd_instr_o <= p2_mcb_cmd_instr_o_int; +p2_mcb_cmd_bl_o <= p2_mcb_cmd_bl_o_int; +p2_mcb_cmd_addr_o <= p2_mcb_cmd_addr_o_int; +p2_mcb_wr_en_o <= p2_mcb_wr_en_o_int; + + init_mem_pattern_ctr_p2 :init_mem_pattern_ctr + generic map + ( + DWIDTH => p2_DWIDTH, + FAMILY => FAMILY, + BEGIN_ADDRESS => C_p2_BEGIN_ADDRESS, + END_ADDRESS => C_p2_END_ADDRESS, + CMD_SEED_VALUE => X"56456783", + DATA_SEED_VALUE => X"12345678", + DATA_MODE => C_p2_DATA_MODE, + PORT_MODE => p2_PORT_MODE + + ) + port map + ( + clk_i => clk0, + rst_i => rst0, + + mcb_cmd_en_i => p2_mcb_cmd_en_o_int, + mcb_cmd_instr_i => p2_mcb_cmd_instr_o_int, + mcb_cmd_bl_i => p2_mcb_cmd_bl_o_int, + mcb_wr_en_i => p2_mcb_wr_en_o_int, + + vio_modify_enable => vio_modify_enable, + vio_data_mode_value => vio_data_mode_value, + vio_addr_mode_value => vio_addr_mode_value, + vio_bl_mode_value => "10",--vio_bl_mode_value, + vio_fixed_bl_value => "000000",--vio_fixed_bl_value, + + mcb_init_done_i => calib_done, + cmp_error => p2_error, + run_traffic_o => p2_tg_run_traffic, + start_addr_o => p2_tg_start_addr, + end_addr_o => p2_tg_end_addr , + cmd_seed_o => p2_tg_cmd_seed , + data_seed_o => p2_tg_data_seed , + load_seed_o => p2_tg_load_seed , + addr_mode_o => p2_tg_addr_mode , + instr_mode_o => p2_tg_instr_mode , + bl_mode_o => p2_tg_bl_mode , + data_mode_o => p2_tg_data_mode , + mode_load_o => p2_tg_mode_load , + fixed_bl_o => p2_tg_fixed_bl , + fixed_instr_o => p2_tg_fixed_instr, + fixed_addr_o => p2_tg_fixed_addr + ); + + m_traffic_gen_p2 : mcb_traffic_gen + generic map( + MEM_BURST_LEN => C_MEM_BURST_LEN, + MEM_COL_WIDTH => C_MEM_NUM_COL_BITS, + NUM_DQ_PINS => C_NUM_DQ_PINS, + DQ_ERROR_WIDTH => DQ_ERROR_WIDTH, + + PORT_MODE => p2_PORT_MODE, + DWIDTH => p2_DWIDTH, + CMP_DATA_PIPE_STAGES => CMP_DATA_PIPE_STAGES, + FAMILY => FAMILY, + SIMULATION => "FALSE", + DATA_PATTERN => DATA_PATTERN, + CMD_PATTERN => "CGEN_ALL", + ADDR_WIDTH => 30, + PRBS_SADDR_MASK_POS => C_p2_PRBS_SADDR_MASK_POS, + PRBS_EADDR_MASK_POS => C_p2_PRBS_EADDR_MASK_POS, + PRBS_SADDR => C_p2_BEGIN_ADDRESS, + PRBS_EADDR => C_p2_END_ADDRESS + ) + port map + ( + clk_i => clk0, + rst_i => rst0, + run_traffic_i => p2_tg_run_traffic, + manual_clear_error => rst0, + -- runtime parameter + start_addr_i => p2_tg_start_addr , + end_addr_i => p2_tg_end_addr , + cmd_seed_i => p2_tg_cmd_seed , + data_seed_i => p2_tg_data_seed , + load_seed_i => p2_tg_load_seed, + addr_mode_i => p2_tg_addr_mode, + + instr_mode_i => p2_tg_instr_mode , + bl_mode_i => p2_tg_bl_mode , + data_mode_i => p2_tg_data_mode , + mode_load_i => p2_tg_mode_load , + + -- fixed pattern inputs interface + fixed_bl_i => p2_tg_fixed_bl, + fixed_instr_i => p2_tg_fixed_instr, + fixed_addr_i => p2_tg_fixed_addr, + fixed_data_i => (others => '0'), + -- BRAM interface. + bram_cmd_i => (others => '0'), + bram_valid_i => '0', + bram_rdy_o => open, + + -- MCB INTERFACE + mcb_cmd_en_o => p2_mcb_cmd_en_o_int, + mcb_cmd_instr_o => p2_mcb_cmd_instr_o_int, + mcb_cmd_bl_o => p2_mcb_cmd_bl_o_int, + mcb_cmd_addr_o => p2_mcb_cmd_addr_o_int, + mcb_cmd_full_i => p2_mcb_cmd_full_i, + + mcb_wr_en_o => p2_mcb_wr_en_o_int, + mcb_wr_mask_o => p2_mcb_wr_mask_o, + mcb_wr_data_o => p2_mcb_wr_data_o, + mcb_wr_data_end_o => open, + mcb_wr_full_i => p2_mcb_wr_full_i, + mcb_wr_fifo_counts => p2_mcb_wr_fifo_counts, + + mcb_rd_en_o => p2_mcb_rd_en_o, + mcb_rd_data_i => p2_mcb_rd_data_i, + mcb_rd_empty_i => p2_mcb_rd_empty_i, + mcb_rd_fifo_counts => p2_mcb_rd_fifo_counts, + + -- status feedback + counts_rst => rst0, + wr_data_counts => open, + rd_data_counts => open, + cmp_data => p2_cmp_data, + cmp_data_valid => p2_cmp_data_valid, + cmp_error => p2_cmp_error, + error => p2_error, + error_status => p2_error_status, + mem_rd_data => open, + dq_error_bytelane_cmp => open, + cumlative_dq_lane_error => open + ); + + + +p3_mcb_cmd_en_o <= p3_mcb_cmd_en_o_int; +p3_mcb_cmd_instr_o <= p3_mcb_cmd_instr_o_int; +p3_mcb_cmd_bl_o <= p3_mcb_cmd_bl_o_int; +p3_mcb_cmd_addr_o <= p3_mcb_cmd_addr_o_int; +p3_mcb_wr_en_o <= p3_mcb_wr_en_o_int; + + init_mem_pattern_ctr_p3 :init_mem_pattern_ctr + generic map + ( + DWIDTH => p3_DWIDTH, + FAMILY => FAMILY, + BEGIN_ADDRESS => C_p3_BEGIN_ADDRESS, + END_ADDRESS => C_p3_END_ADDRESS, + CMD_SEED_VALUE => X"56456783", + DATA_SEED_VALUE => X"12345678", + DATA_MODE => C_p3_DATA_MODE, + PORT_MODE => p3_PORT_MODE + + ) + port map + ( + clk_i => clk0, + rst_i => rst0, + + mcb_cmd_en_i => p3_mcb_cmd_en_o_int, + mcb_cmd_instr_i => p3_mcb_cmd_instr_o_int, + mcb_cmd_bl_i => p3_mcb_cmd_bl_o_int, + mcb_wr_en_i => p3_mcb_wr_en_o_int, + + vio_modify_enable => vio_modify_enable, + vio_data_mode_value => vio_data_mode_value, + vio_addr_mode_value => vio_addr_mode_value, + vio_bl_mode_value => "10",--vio_bl_mode_value, + vio_fixed_bl_value => "000000",--vio_fixed_bl_value, + + mcb_init_done_i => calib_done, + cmp_error => p3_error, + run_traffic_o => p3_tg_run_traffic, + start_addr_o => p3_tg_start_addr, + end_addr_o => p3_tg_end_addr , + cmd_seed_o => p3_tg_cmd_seed , + data_seed_o => p3_tg_data_seed , + load_seed_o => p3_tg_load_seed , + addr_mode_o => p3_tg_addr_mode , + instr_mode_o => p3_tg_instr_mode , + bl_mode_o => p3_tg_bl_mode , + data_mode_o => p3_tg_data_mode , + mode_load_o => p3_tg_mode_load , + fixed_bl_o => p3_tg_fixed_bl , + fixed_instr_o => p3_tg_fixed_instr, + fixed_addr_o => p3_tg_fixed_addr + ); + + m_traffic_gen_p3 : mcb_traffic_gen + generic map( + MEM_BURST_LEN => C_MEM_BURST_LEN, + MEM_COL_WIDTH => C_MEM_NUM_COL_BITS, + NUM_DQ_PINS => C_NUM_DQ_PINS, + DQ_ERROR_WIDTH => DQ_ERROR_WIDTH, + + PORT_MODE => p3_PORT_MODE, + DWIDTH => p3_DWIDTH, + CMP_DATA_PIPE_STAGES => CMP_DATA_PIPE_STAGES, + FAMILY => FAMILY, + SIMULATION => "FALSE", + DATA_PATTERN => DATA_PATTERN, + CMD_PATTERN => "CGEN_ALL", + ADDR_WIDTH => 30, + PRBS_SADDR_MASK_POS => C_p3_PRBS_SADDR_MASK_POS, + PRBS_EADDR_MASK_POS => C_p3_PRBS_EADDR_MASK_POS, + PRBS_SADDR => C_p3_BEGIN_ADDRESS, + PRBS_EADDR => C_p3_END_ADDRESS + ) + port map + ( + clk_i => clk0, + rst_i => rst0, + run_traffic_i => p3_tg_run_traffic, + manual_clear_error => rst0, + -- runtime parameter + start_addr_i => p3_tg_start_addr , + end_addr_i => p3_tg_end_addr , + cmd_seed_i => p3_tg_cmd_seed , + data_seed_i => p3_tg_data_seed , + load_seed_i => p3_tg_load_seed, + addr_mode_i => p3_tg_addr_mode, + + instr_mode_i => p3_tg_instr_mode , + bl_mode_i => p3_tg_bl_mode , + data_mode_i => p3_tg_data_mode , + mode_load_i => p3_tg_mode_load , + + -- fixed pattern inputs interface + fixed_bl_i => p3_tg_fixed_bl, + fixed_instr_i => p3_tg_fixed_instr, + fixed_addr_i => p3_tg_fixed_addr, + fixed_data_i => (others => '0'), + -- BRAM interface. + bram_cmd_i => (others => '0'), + bram_valid_i => '0', + bram_rdy_o => open, + + -- MCB INTERFACE + mcb_cmd_en_o => p3_mcb_cmd_en_o_int, + mcb_cmd_instr_o => p3_mcb_cmd_instr_o_int, + mcb_cmd_bl_o => p3_mcb_cmd_bl_o_int, + mcb_cmd_addr_o => p3_mcb_cmd_addr_o_int, + mcb_cmd_full_i => p3_mcb_cmd_full_i, + + mcb_wr_en_o => p3_mcb_wr_en_o_int, + mcb_wr_mask_o => p3_mcb_wr_mask_o, + mcb_wr_data_o => p3_mcb_wr_data_o, + mcb_wr_data_end_o => open, + mcb_wr_full_i => p3_mcb_wr_full_i, + mcb_wr_fifo_counts => p3_mcb_wr_fifo_counts, + + mcb_rd_en_o => p3_mcb_rd_en_o, + mcb_rd_data_i => p3_mcb_rd_data_i, + mcb_rd_empty_i => p3_mcb_rd_empty_i, + mcb_rd_fifo_counts => p3_mcb_rd_fifo_counts, + + -- status feedback + counts_rst => rst0, + wr_data_counts => open, + rd_data_counts => open, + cmp_data => p3_cmp_data, + cmp_data_valid => p3_cmp_data_valid, + cmp_error => p3_cmp_error, + error => p3_error, + error_status => p3_error_status, + mem_rd_data => open, + dq_error_bytelane_cmp => open, + cumlative_dq_lane_error => open + ); + + +end architecture; + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_wrapper.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_wrapper.vhd new file mode 100644 index 0000000..f0d77ea --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/memc3_wrapper.vhd @@ -0,0 +1,1013 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor : Xilinx +-- \ \ \/ Version : 3.92 +-- \ \ Application : MIG +-- / / Filename : memc3_wrapper.vhd +-- /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:57 $ +-- \ \ / \ Date Created : Jul 03 2009 +-- \___\/\___\ +-- +--Device : Spartan-6 +--Design Name : DDR/DDR2/DDR3/LPDDR +--Purpose : This module instantiates mcb_raw_wrapper module. +--Reference : +--Revision History : +--***************************************************************************** +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity memc3_wrapper is +generic ( + + C_MEMCLK_PERIOD : integer := 2500; + C_P0_MASK_SIZE : integer := 4; + C_P0_DATA_PORT_SIZE : integer := 32; + C_P1_MASK_SIZE : integer := 4; + C_P1_DATA_PORT_SIZE : integer := 32; + + C_ARB_NUM_TIME_SLOTS : integer := 12; + C_ARB_TIME_SLOT_0 : bit_vector := "000"; + C_ARB_TIME_SLOT_1 : bit_vector := "000"; + C_ARB_TIME_SLOT_2 : bit_vector := "000"; + C_ARB_TIME_SLOT_3 : bit_vector := "000"; + C_ARB_TIME_SLOT_4 : bit_vector := "000"; + C_ARB_TIME_SLOT_5 : bit_vector := "000"; + C_ARB_TIME_SLOT_6 : bit_vector := "000"; + C_ARB_TIME_SLOT_7 : bit_vector := "000"; + C_ARB_TIME_SLOT_8 : bit_vector := "000"; + C_ARB_TIME_SLOT_9 : bit_vector := "000"; + C_ARB_TIME_SLOT_10 : bit_vector := "000"; + C_ARB_TIME_SLOT_11 : bit_vector := "000"; + + C_MEM_TRAS : integer := 45000; + C_MEM_TRCD : integer := 12500; + C_MEM_TREFI : integer := 7800000; + C_MEM_TRFC : integer := 127500; + C_MEM_TRP : integer := 12500; + C_MEM_TWR : integer := 15000; + C_MEM_TRTP : integer := 7500; + C_MEM_TWTR : integer := 7500; + + C_MEM_ADDR_ORDER : string :="ROW_BANK_COLUMN"; + C_MEM_TYPE : string :="DDR2"; + C_MEM_DENSITY : string :="1Gb"; + C_NUM_DQ_PINS : integer := 4; + C_MEM_BURST_LEN : integer := 8; + C_MEM_CAS_LATENCY : integer := 5; + C_MEM_ADDR_WIDTH : integer := 14; + C_MEM_BANKADDR_WIDTH : integer := 3; + C_MEM_NUM_COL_BITS : integer := 11; + + C_MEM_DDR1_2_ODS : string := "FULL"; + C_MEM_DDR2_RTT : string := "50OHMS"; + C_MEM_DDR2_DIFF_DQS_EN : string := "YES"; + C_MEM_DDR2_3_PA_SR : string := "FULL"; + C_MEM_DDR2_3_HIGH_TEMP_SR : string := "NORMAL"; + + C_MEM_DDR3_CAS_LATENCY : integer:= 7; + C_MEM_DDR3_CAS_WR_LATENCY : integer:= 5; + C_MEM_DDR3_ODS : string := "DIV6"; + C_MEM_DDR3_RTT : string := "DIV2"; + C_MEM_DDR3_AUTO_SR : string := "ENABLED"; + C_MEM_DDR3_DYN_WRT_ODT : string := "OFF"; + C_MEM_MOBILE_PA_SR : string := "FULL"; + C_MEM_MDDR_ODS : string := "FULL"; + C_MC_CALIB_BYPASS : string := "NO"; + C_LDQSP_TAP_DELAY_VAL : integer := 0; + C_UDQSP_TAP_DELAY_VAL : integer := 0; + C_LDQSN_TAP_DELAY_VAL : integer := 0; + C_UDQSN_TAP_DELAY_VAL : integer := 0; + C_DQ0_TAP_DELAY_VAL : integer := 0; + C_DQ1_TAP_DELAY_VAL : integer := 0; + C_DQ2_TAP_DELAY_VAL : integer := 0; + C_DQ3_TAP_DELAY_VAL : integer := 0; + C_DQ4_TAP_DELAY_VAL : integer := 0; + C_DQ5_TAP_DELAY_VAL : integer := 0; + C_DQ6_TAP_DELAY_VAL : integer := 0; + C_DQ7_TAP_DELAY_VAL : integer := 0; + C_DQ8_TAP_DELAY_VAL : integer := 0; + C_DQ9_TAP_DELAY_VAL : integer := 0; + C_DQ10_TAP_DELAY_VAL : integer := 0; + C_DQ11_TAP_DELAY_VAL : integer := 0; + C_DQ12_TAP_DELAY_VAL : integer := 0; + C_DQ13_TAP_DELAY_VAL : integer := 0; + C_DQ14_TAP_DELAY_VAL : integer := 0; + C_DQ15_TAP_DELAY_VAL : integer := 0; + + + C_SKIP_IN_TERM_CAL : integer := 0; + C_SKIP_DYNAMIC_CAL : integer := 0; + + C_SIMULATION : string := "FALSE"; + C_MC_CALIBRATION_MODE : string := "CALIBRATION"; + C_MC_CALIBRATION_DELAY : string := "QUARTER"; + C_CALIB_SOFT_IP : string := "TRUE" + + + ); + port + ( + + -- high-speed PLL clock interface + sysclk_2x : in std_logic; + sysclk_2x_180 : in std_logic; + pll_ce_0 : in std_logic; + pll_ce_90 : in std_logic; + pll_lock : in std_logic; + async_rst : in std_logic; + + --User Port0 Interface Signals + + p0_cmd_clk : in std_logic; + p0_cmd_en : in std_logic; + p0_cmd_instr : in std_logic_vector(2 downto 0) ; + p0_cmd_bl : in std_logic_vector(5 downto 0) ; + p0_cmd_byte_addr : in std_logic_vector(29 downto 0) ; + p0_cmd_empty : out std_logic; + p0_cmd_full : out std_logic; + + -- Data Wr Port signals + p0_wr_clk : in std_logic; + p0_wr_en : in std_logic; + p0_wr_mask : in std_logic_vector(C_P0_MASK_SIZE - 1 downto 0) ; + p0_wr_data : in std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0) ; + p0_wr_full : out std_logic; + p0_wr_empty : out std_logic; + p0_wr_count : out std_logic_vector(6 downto 0) ; + p0_wr_underrun : out std_logic; + p0_wr_error : out std_logic; + + --Data Rd Port signals + p0_rd_clk : in std_logic; + p0_rd_en : in std_logic; + p0_rd_data : out std_logic_vector(C_P0_DATA_PORT_SIZE - 1 downto 0) ; + p0_rd_full : out std_logic; + p0_rd_empty : out std_logic; + p0_rd_count : out std_logic_vector(6 downto 0) ; + p0_rd_overflow : out std_logic; + p0_rd_error : out std_logic; + + --User Port1 Interface Signals + + p1_cmd_clk : in std_logic; + p1_cmd_en : in std_logic; + p1_cmd_instr : in std_logic_vector(2 downto 0) ; + p1_cmd_bl : in std_logic_vector(5 downto 0) ; + p1_cmd_byte_addr : in std_logic_vector(29 downto 0) ; + p1_cmd_empty : out std_logic; + p1_cmd_full : out std_logic; + + -- Data Wr Port signals + p1_wr_clk : in std_logic; + p1_wr_en : in std_logic; + p1_wr_mask : in std_logic_vector(C_P1_MASK_SIZE - 1 downto 0) ; + p1_wr_data : in std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0) ; + p1_wr_full : out std_logic; + p1_wr_empty : out std_logic; + p1_wr_count : out std_logic_vector(6 downto 0) ; + p1_wr_underrun : out std_logic; + p1_wr_error : out std_logic; + + --Data Rd Port signals + p1_rd_clk : in std_logic; + p1_rd_en : in std_logic; + p1_rd_data : out std_logic_vector(C_P1_DATA_PORT_SIZE - 1 downto 0) ; + p1_rd_full : out std_logic; + p1_rd_empty : out std_logic; + p1_rd_count : out std_logic_vector(6 downto 0) ; + p1_rd_overflow : out std_logic; + p1_rd_error : out std_logic; + + --User Port2 Interface Signals + + p2_cmd_clk : in std_logic; + p2_cmd_en : in std_logic; + p2_cmd_instr : in std_logic_vector(2 downto 0) ; + p2_cmd_bl : in std_logic_vector(5 downto 0) ; + p2_cmd_byte_addr : in std_logic_vector(29 downto 0) ; + p2_cmd_empty : out std_logic; + p2_cmd_full : out std_logic; + + -- Data Wr Port signals + p2_wr_clk : in std_logic; + p2_wr_en : in std_logic; + p2_wr_mask : in std_logic_vector(3 downto 0) ; + p2_wr_data : in std_logic_vector(31 downto 0) ; + p2_wr_full : out std_logic; + p2_wr_empty : out std_logic; + p2_wr_count : out std_logic_vector(6 downto 0) ; + p2_wr_underrun : out std_logic; + p2_wr_error : out std_logic; + + --Data Rd Port signals + p2_rd_clk : in std_logic; + p2_rd_en : in std_logic; + p2_rd_data : out std_logic_vector(31 downto 0) ; + p2_rd_full : out std_logic; + p2_rd_empty : out std_logic; + p2_rd_count : out std_logic_vector(6 downto 0) ; + p2_rd_overflow : out std_logic; + p2_rd_error : out std_logic; + + --User Port3 Interface Signals + + p3_cmd_clk : in std_logic; + p3_cmd_en : in std_logic; + p3_cmd_instr : in std_logic_vector(2 downto 0) ; + p3_cmd_bl : in std_logic_vector(5 downto 0) ; + p3_cmd_byte_addr : in std_logic_vector(29 downto 0) ; + p3_cmd_empty : out std_logic; + p3_cmd_full : out std_logic; + + -- Data Wr Port signals + p3_wr_clk : in std_logic; + p3_wr_en : in std_logic; + p3_wr_mask : in std_logic_vector(3 downto 0) ; + p3_wr_data : in std_logic_vector(31 downto 0) ; + p3_wr_full : out std_logic; + p3_wr_empty : out std_logic; + p3_wr_count : out std_logic_vector(6 downto 0) ; + p3_wr_underrun : out std_logic; + p3_wr_error : out std_logic; + + --Data Rd Port signals + p3_rd_clk : in std_logic; + p3_rd_en : in std_logic; + p3_rd_data : out std_logic_vector(31 downto 0) ; + p3_rd_full : out std_logic; + p3_rd_empty : out std_logic; + p3_rd_count : out std_logic_vector(6 downto 0) ; + p3_rd_overflow : out std_logic; + p3_rd_error : out std_logic; + + + + -- memory interface signals + mcb3_dram_ck : out std_logic; + mcb3_dram_ck_n : out std_logic; + mcb3_dram_a : out std_logic_vector(C_MEM_ADDR_WIDTH-1 downto 0); + mcb3_dram_ba : out std_logic_vector(C_MEM_BANKADDR_WIDTH-1 downto 0); + mcb3_dram_ras_n : out std_logic; + mcb3_dram_cas_n : out std_logic; + mcb3_dram_we_n : out std_logic; + mcb3_dram_odt : out std_logic; +-- mcb3_dram_odt : out std_logic; + mcb3_dram_cke : out std_logic; + mcb3_dram_dq : inout std_logic_vector(C_NUM_DQ_PINS-1 downto 0); + mcb3_dram_dqs : inout std_logic; + mcb3_dram_dqs_n : inout std_logic; + + +mcb3_dram_udqs : inout std_logic; +mcb3_dram_udm : out std_logic; + + + mcb3_dram_udqs_n : inout std_logic; + + + +mcb3_dram_dm : out std_logic; + + mcb3_rzq : inout std_logic; + mcb3_zio : inout std_logic; + + -- Calibration signals + mcb_drp_clk : in std_logic; + calib_done : out std_logic; + selfrefresh_enter : in std_logic; + selfrefresh_mode : out std_logic + + ); +end entity; +architecture acch of memc3_wrapper is +component mcb_raw_wrapper IS + GENERIC ( + + C_MEMCLK_PERIOD : integer; + C_PORT_ENABLE : std_logic_vector(5 downto 0); + C_MEM_ADDR_ORDER : string; + C_ARB_NUM_TIME_SLOTS : integer; + C_ARB_TIME_SLOT_0 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_1 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_2 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_3 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_4 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_5 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_6 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_7 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_8 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_9 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_10 : bit_vector(17 downto 0); + C_ARB_TIME_SLOT_11 : bit_vector(17 downto 0); + C_PORT_CONFIG : string; + + + C_MEM_TRAS : integer; + C_MEM_TRCD : integer; + C_MEM_TREFI : integer; + C_MEM_TRFC : integer; + C_MEM_TRP : integer; + C_MEM_TWR : integer; + C_MEM_TRTP : integer; + C_MEM_TWTR : integer; + + C_NUM_DQ_PINS : integer; + C_MEM_TYPE : string; + C_MEM_DENSITY : string; + C_MEM_BURST_LEN : integer; + + C_MEM_CAS_LATENCY : integer; + C_MEM_ADDR_WIDTH : integer; + C_MEM_BANKADDR_WIDTH : integer; + C_MEM_NUM_COL_BITS : integer; + + C_MEM_DDR3_CAS_LATENCY : integer; + C_MEM_MOBILE_PA_SR : string; + C_MEM_DDR1_2_ODS : string; + C_MEM_DDR3_ODS : string; + C_MEM_DDR2_RTT : string; + C_MEM_DDR3_RTT : string; + C_MEM_MDDR_ODS : string; + + C_MEM_DDR2_DIFF_DQS_EN : string; + C_MEM_DDR2_3_PA_SR : string; + C_MEM_DDR3_CAS_WR_LATENCY : integer; + + C_MEM_DDR3_AUTO_SR : string; + C_MEM_DDR2_3_HIGH_TEMP_SR : string; + C_MEM_DDR3_DYN_WRT_ODT : string; + + C_MC_CALIB_BYPASS : string; + C_MC_CALIBRATION_RA : bit_vector(15 DOWNTO 0); + C_MC_CALIBRATION_BA : bit_vector(2 DOWNTO 0); + C_CALIB_SOFT_IP : string; + C_MC_CALIBRATION_CA : bit_vector(11 DOWNTO 0); + C_MC_CALIBRATION_CLK_DIV : integer; + C_MC_CALIBRATION_MODE : string; + C_MC_CALIBRATION_DELAY : string; + + LDQSP_TAP_DELAY_VAL : integer; + UDQSP_TAP_DELAY_VAL : integer; + LDQSN_TAP_DELAY_VAL : integer; + UDQSN_TAP_DELAY_VAL : integer; + DQ0_TAP_DELAY_VAL : integer; + DQ1_TAP_DELAY_VAL : integer; + DQ2_TAP_DELAY_VAL : integer; + DQ3_TAP_DELAY_VAL : integer; + DQ4_TAP_DELAY_VAL : integer; + DQ5_TAP_DELAY_VAL : integer; + DQ6_TAP_DELAY_VAL : integer; + DQ7_TAP_DELAY_VAL : integer; + DQ8_TAP_DELAY_VAL : integer; + DQ9_TAP_DELAY_VAL : integer; + DQ10_TAP_DELAY_VAL : integer; + DQ11_TAP_DELAY_VAL : integer; + DQ12_TAP_DELAY_VAL : integer; + DQ13_TAP_DELAY_VAL : integer; + DQ14_TAP_DELAY_VAL : integer; + DQ15_TAP_DELAY_VAL : integer; + + C_P0_MASK_SIZE : integer; + C_P0_DATA_PORT_SIZE : integer; + C_P1_MASK_SIZE : integer; + C_P1_DATA_PORT_SIZE : integer; + + C_SIMULATION : string ; + C_SKIP_IN_TERM_CAL : integer; + C_SKIP_DYNAMIC_CAL : integer; + C_SKIP_DYN_IN_TERM : integer; + + C_MEM_TZQINIT_MAXCNT : std_logic_vector(9 downto 0) + ); + PORT ( + -- HIGH-SPEED PLL clock interface + + sysclk_2x : in std_logic; + sysclk_2x_180 : in std_logic; + pll_ce_0 : in std_logic; + pll_ce_90 : in std_logic; + pll_lock : in std_logic; + sys_rst : in std_logic; + + p0_arb_en : in std_logic; + p0_cmd_clk : in std_logic; + p0_cmd_en : in std_logic; + p0_cmd_instr : in std_logic_vector(2 DOWNTO 0); + p0_cmd_bl : in std_logic_vector(5 DOWNTO 0); + p0_cmd_byte_addr : in std_logic_vector(29 DOWNTO 0); + p0_cmd_empty : out std_logic; + p0_cmd_full : out std_logic; + p0_wr_clk : in std_logic; + p0_wr_en : in std_logic; + p0_wr_mask : in std_logic_vector(C_P0_MASK_SIZE - 1 DOWNTO 0); + p0_wr_data : in std_logic_vector(C_P0_DATA_PORT_SIZE - 1 DOWNTO 0); + p0_wr_full : out std_logic; + p0_wr_empty : out std_logic; + p0_wr_count : out std_logic_vector(6 DOWNTO 0); + p0_wr_underrun : out std_logic; + p0_wr_error : out std_logic; + p0_rd_clk : in std_logic; + p0_rd_en : in std_logic; + p0_rd_data : out std_logic_vector(C_P0_DATA_PORT_SIZE - 1 DOWNTO 0); + p0_rd_full : out std_logic; + p0_rd_empty : out std_logic; + p0_rd_count : out std_logic_vector(6 DOWNTO 0); + p0_rd_overflow : out std_logic; + p0_rd_error : out std_logic; + p1_arb_en : in std_logic; + p1_cmd_clk : in std_logic; + p1_cmd_en : in std_logic; + p1_cmd_instr : in std_logic_vector(2 DOWNTO 0); + p1_cmd_bl : in std_logic_vector(5 DOWNTO 0); + p1_cmd_byte_addr : in std_logic_vector(29 DOWNTO 0); + p1_cmd_empty : out std_logic; + p1_cmd_full : out std_logic; + p1_wr_clk : in std_logic; + p1_wr_en : in std_logic; + p1_wr_mask : in std_logic_vector(C_P1_MASK_SIZE - 1 DOWNTO 0); + p1_wr_data : in std_logic_vector(C_P1_DATA_PORT_SIZE - 1 DOWNTO 0); + p1_wr_full : out std_logic; + p1_wr_empty : out std_logic; + p1_wr_count : out std_logic_vector(6 DOWNTO 0); + p1_wr_underrun : out std_logic; + p1_wr_error : out std_logic; + p1_rd_clk : in std_logic; + p1_rd_en : in std_logic; + p1_rd_data : out std_logic_vector(C_P1_DATA_PORT_SIZE - 1 DOWNTO 0); + p1_rd_full : out std_logic; + p1_rd_empty : out std_logic; + p1_rd_count : out std_logic_vector(6 DOWNTO 0); + p1_rd_overflow : out std_logic; + p1_rd_error : out std_logic; + p2_arb_en : in std_logic; + p2_cmd_clk : in std_logic; + p2_cmd_en : in std_logic; + p2_cmd_instr : in std_logic_vector(2 DOWNTO 0); + p2_cmd_bl : in std_logic_vector(5 DOWNTO 0); + p2_cmd_byte_addr : in std_logic_vector(29 DOWNTO 0); + p2_cmd_empty : out std_logic; + p2_cmd_full : out std_logic; + p2_wr_clk : in std_logic; + p2_wr_en : in std_logic; + p2_wr_mask : in std_logic_vector(3 DOWNTO 0); + p2_wr_data : in std_logic_vector(31 DOWNTO 0); + p2_wr_full : out std_logic; + p2_wr_empty : out std_logic; + p2_wr_count : out std_logic_vector(6 DOWNTO 0); + p2_wr_underrun : out std_logic; + p2_wr_error : out std_logic; + p2_rd_clk : in std_logic; + p2_rd_en : in std_logic; + p2_rd_data : out std_logic_vector(31 DOWNTO 0); + p2_rd_full : out std_logic; + p2_rd_empty : out std_logic; + p2_rd_count : out std_logic_vector(6 DOWNTO 0); + p2_rd_overflow : out std_logic; + p2_rd_error : out std_logic; + p3_arb_en : in std_logic; + p3_cmd_clk : in std_logic; + p3_cmd_en : in std_logic; + p3_cmd_instr : in std_logic_vector(2 DOWNTO 0); + p3_cmd_bl : in std_logic_vector(5 DOWNTO 0); + p3_cmd_byte_addr : in std_logic_vector(29 DOWNTO 0); + p3_cmd_empty : out std_logic; + p3_cmd_full : out std_logic; + p3_wr_clk : in std_logic; + p3_wr_en : in std_logic; + p3_wr_mask : in std_logic_vector(3 DOWNTO 0); + p3_wr_data : in std_logic_vector(31 DOWNTO 0); + p3_wr_full : out std_logic; + p3_wr_empty : out std_logic; + p3_wr_count : out std_logic_vector(6 DOWNTO 0); + p3_wr_underrun : out std_logic; + p3_wr_error : out std_logic; + p3_rd_clk : in std_logic; + p3_rd_en : in std_logic; + p3_rd_data : out std_logic_vector(31 DOWNTO 0); + p3_rd_full : out std_logic; + p3_rd_empty : out std_logic; + p3_rd_count : out std_logic_vector(6 DOWNTO 0); + p3_rd_overflow : out std_logic; + p3_rd_error : out std_logic; + p4_arb_en : in std_logic; + p4_cmd_clk : in std_logic; + p4_cmd_en : in std_logic; + p4_cmd_instr : in std_logic_vector(2 DOWNTO 0); + p4_cmd_bl : in std_logic_vector(5 DOWNTO 0); + p4_cmd_byte_addr : in std_logic_vector(29 DOWNTO 0); + p4_cmd_empty : out std_logic; + p4_cmd_full : out std_logic; + p4_wr_clk : in std_logic; + p4_wr_en : in std_logic; + p4_wr_mask : in std_logic_vector(3 DOWNTO 0); + p4_wr_data : in std_logic_vector(31 DOWNTO 0); + p4_wr_full : out std_logic; + p4_wr_empty : out std_logic; + p4_wr_count : out std_logic_vector(6 DOWNTO 0); + p4_wr_underrun : out std_logic; + p4_wr_error : out std_logic; + p4_rd_clk : in std_logic; + p4_rd_en : in std_logic; + p4_rd_data : out std_logic_vector(31 DOWNTO 0); + p4_rd_full : out std_logic; + p4_rd_empty : out std_logic; + p4_rd_count : out std_logic_vector(6 DOWNTO 0); + p4_rd_overflow : out std_logic; + p4_rd_error : out std_logic; + p5_arb_en : in std_logic; + p5_cmd_clk : in std_logic; + p5_cmd_en : in std_logic; + p5_cmd_instr : in std_logic_vector(2 DOWNTO 0); + p5_cmd_bl : in std_logic_vector(5 DOWNTO 0); + p5_cmd_byte_addr : in std_logic_vector(29 DOWNTO 0); + p5_cmd_empty : out std_logic; + p5_cmd_full : out std_logic; + p5_wr_clk : in std_logic; + p5_wr_en : in std_logic; + p5_wr_mask : in std_logic_vector(3 DOWNTO 0); + p5_wr_data : in std_logic_vector(31 DOWNTO 0); + p5_wr_full : out std_logic; + p5_wr_empty : out std_logic; + p5_wr_count : out std_logic_vector(6 DOWNTO 0); + p5_wr_underrun : out std_logic; + p5_wr_error : out std_logic; + p5_rd_clk : in std_logic; + p5_rd_en : in std_logic; + p5_rd_data : out std_logic_vector(31 DOWNTO 0); + p5_rd_full : out std_logic; + p5_rd_empty : out std_logic; + p5_rd_count : out std_logic_vector(6 DOWNTO 0); + p5_rd_overflow : out std_logic; + p5_rd_error : out std_logic; + + mcbx_dram_addr : out std_logic_vector(C_MEM_ADDR_WIDTH - 1 DOWNTO 0); + mcbx_dram_ba : out std_logic_vector(C_MEM_BANKADDR_WIDTH - 1 DOWNTO 0); + mcbx_dram_ras_n : out std_logic; + mcbx_dram_cas_n : out std_logic; + mcbx_dram_we_n : out std_logic; + mcbx_dram_cke : out std_logic; + mcbx_dram_clk : out std_logic; + mcbx_dram_clk_n : out std_logic; + mcbx_dram_dq : inout std_logic_vector(C_NUM_DQ_PINS-1 DOWNTO 0); + mcbx_dram_dqs : inout std_logic; + mcbx_dram_dqs_n : inout std_logic; + mcbx_dram_udqs : inout std_logic; + mcbx_dram_udqs_n : inout std_logic; + mcbx_dram_udm : out std_logic; + mcbx_dram_ldm : out std_logic; + mcbx_dram_odt : out std_logic; + mcbx_dram_ddr3_rst : out std_logic; + calib_recal : in std_logic; + rzq : inout std_logic; + zio : inout std_logic; + ui_read : in std_logic; + ui_add : in std_logic; + ui_cs : in std_logic; + ui_clk : in std_logic; + ui_sdi : in std_logic; + ui_addr : in std_logic_vector(4 DOWNTO 0); + ui_broadcast : in std_logic; + ui_drp_update : in std_logic; + ui_done_cal : in std_logic; + ui_cmd : in std_logic; + ui_cmd_in : in std_logic; + ui_cmd_en : in std_logic; + ui_dqcount : in std_logic_vector(3 DOWNTO 0); + ui_dq_lower_dec : in std_logic; + ui_dq_lower_inc : in std_logic; + ui_dq_upper_dec : in std_logic; + ui_dq_upper_inc : in std_logic; + ui_udqs_inc : in std_logic; + ui_udqs_dec : in std_logic; + ui_ldqs_inc : in std_logic; + ui_ldqs_dec : in std_logic; + uo_data : out std_logic_vector(7 DOWNTO 0); + uo_data_valid : out std_logic; + uo_done_cal : out std_logic; + uo_cmd_ready_in : out std_logic; + uo_refrsh_flag : out std_logic; + uo_cal_start : out std_logic; + uo_sdo : out std_logic; + status : out std_logic_vector(31 DOWNTO 0); + selfrefresh_enter : in std_logic; + selfrefresh_mode : out std_logic + ); +end component; + +signal uo_data : std_logic_vector(7 downto 0); + + constant C_PORT_ENABLE : std_logic_vector(5 downto 0) := "001111"; + +constant C_PORT_CONFIG : string := "B32_B32_B32_B32"; + + +constant ARB_TIME_SLOT_0 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_0(11 downto 9) & C_ARB_TIME_SLOT_0(8 downto 6) & C_ARB_TIME_SLOT_0(5 downto 3) & C_ARB_TIME_SLOT_0(2 downto 0)); +constant ARB_TIME_SLOT_1 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_1(11 downto 9) & C_ARB_TIME_SLOT_1(8 downto 6) & C_ARB_TIME_SLOT_1(5 downto 3) & C_ARB_TIME_SLOT_1(2 downto 0)); +constant ARB_TIME_SLOT_2 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_2(11 downto 9) & C_ARB_TIME_SLOT_2(8 downto 6) & C_ARB_TIME_SLOT_2(5 downto 3) & C_ARB_TIME_SLOT_2(2 downto 0)); +constant ARB_TIME_SLOT_3 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_3(11 downto 9) & C_ARB_TIME_SLOT_3(8 downto 6) & C_ARB_TIME_SLOT_3(5 downto 3) & C_ARB_TIME_SLOT_3(2 downto 0)); +constant ARB_TIME_SLOT_4 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_4(11 downto 9) & C_ARB_TIME_SLOT_4(8 downto 6) & C_ARB_TIME_SLOT_4(5 downto 3) & C_ARB_TIME_SLOT_4(2 downto 0)); +constant ARB_TIME_SLOT_5 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_5(11 downto 9) & C_ARB_TIME_SLOT_5(8 downto 6) & C_ARB_TIME_SLOT_5(5 downto 3) & C_ARB_TIME_SLOT_5(2 downto 0)); +constant ARB_TIME_SLOT_6 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_6(11 downto 9) & C_ARB_TIME_SLOT_6(8 downto 6) & C_ARB_TIME_SLOT_6(5 downto 3) & C_ARB_TIME_SLOT_6(2 downto 0)); +constant ARB_TIME_SLOT_7 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_7(11 downto 9) & C_ARB_TIME_SLOT_7(8 downto 6) & C_ARB_TIME_SLOT_7(5 downto 3) & C_ARB_TIME_SLOT_7(2 downto 0)); +constant ARB_TIME_SLOT_8 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_8(11 downto 9) & C_ARB_TIME_SLOT_8(8 downto 6) & C_ARB_TIME_SLOT_8(5 downto 3) & C_ARB_TIME_SLOT_8(2 downto 0)); +constant ARB_TIME_SLOT_9 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_9(11 downto 9) & C_ARB_TIME_SLOT_9(8 downto 6) & C_ARB_TIME_SLOT_9(5 downto 3) & C_ARB_TIME_SLOT_9(2 downto 0)); +constant ARB_TIME_SLOT_10 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_10(11 downto 9) & C_ARB_TIME_SLOT_10(8 downto 6) & C_ARB_TIME_SLOT_10(5 downto 3) & C_ARB_TIME_SLOT_10(2 downto 0)); +constant ARB_TIME_SLOT_11 : bit_vector(17 downto 0) := ("000" & "000" & C_ARB_TIME_SLOT_11(11 downto 9) & C_ARB_TIME_SLOT_11(8 downto 6) & C_ARB_TIME_SLOT_11(5 downto 3) & C_ARB_TIME_SLOT_11(2 downto 0)); + + +constant C_MC_CALIBRATION_CLK_DIV : integer := 1; +constant C_MEM_TZQINIT_MAXCNT : std_logic_vector(9 downto 0) := "1000000000" + "0000010000"; -- 16 cycles are added to avoid trfc violations +constant C_SKIP_DYN_IN_TERM : integer := 1; + +constant C_MC_CALIBRATION_RA : bit_vector(15 downto 0) := X"0000"; +constant C_MC_CALIBRATION_BA : bit_vector(2 downto 0) := o"0"; +constant C_MC_CALIBRATION_CA : bit_vector(11 downto 0) := X"000"; + +signal status : std_logic_vector(31 downto 0); +signal uo_data_valid : std_logic; +signal uo_cmd_ready_in : std_logic; +signal uo_refrsh_flag : std_logic; +signal uo_cal_start : std_logic; +signal uo_sdo : std_logic; + + + + + + + +attribute X_CORE_INFO : string; +attribute X_CORE_INFO of acch : architecture IS + "mig_v3_92_ddr2_s6, Coregen 14.2"; + +attribute CORE_GENERATION_INFO : string; +attribute CORE_GENERATION_INFO of acch : architecture IS "mcb3_ddr2_s6,mig_v3_92,{LANGUAGE=VHDL, SYNTHESIS_TOOL=ISE, NO_OF_CONTROLLERS=1, AXI_ENABLE=0, MEM_INTERFACE_TYPE=DDR2_SDRAM, CLK_PERIOD=3000, MEMORY_PART=mt47h64m16xx-25e, MEMORY_DEVICE_WIDTH=16, OUTPUT_DRV=FULL, RTT_NOM=50OHMS, DQS#_ENABLE=YES, HIGH_TEMP_SR=NORMAL, PORT_CONFIG=Four 32-bit bi-directional ports, MEM_ADDR_ORDER=BANK_ROW_COLUMN, PORT_ENABLE=Port0_Port1_Port2_Port3, CLASS_ADDR=II, CLASS_DATA=II, INPUT_PIN_TERMINATION=CALIB_TERM, DATA_TERMINATION=25 Ohms, CLKFBOUT_MULT_F=2, CLKOUT_DIVIDE=1, DEBUG_PORT=0, INPUT_CLK_TYPE=Single-Ended}"; + +begin + + +memc3_mcb_raw_wrapper_inst : mcb_raw_wrapper +generic map + ( + C_MEMCLK_PERIOD => C_MEMCLK_PERIOD, + C_P0_MASK_SIZE => C_P0_MASK_SIZE, + C_P0_DATA_PORT_SIZE => C_P0_DATA_PORT_SIZE, + C_P1_MASK_SIZE => C_P1_MASK_SIZE, + C_P1_DATA_PORT_SIZE => C_P1_DATA_PORT_SIZE, + + C_ARB_NUM_TIME_SLOTS => C_ARB_NUM_TIME_SLOTS, + C_ARB_TIME_SLOT_0 => ARB_TIME_SLOT_0, + C_ARB_TIME_SLOT_1 => ARB_TIME_SLOT_1, + C_ARB_TIME_SLOT_2 => ARB_TIME_SLOT_2, + C_ARB_TIME_SLOT_3 => ARB_TIME_SLOT_3, + C_ARB_TIME_SLOT_4 => ARB_TIME_SLOT_4, + C_ARB_TIME_SLOT_5 => ARB_TIME_SLOT_5, + C_ARB_TIME_SLOT_6 => ARB_TIME_SLOT_6, + C_ARB_TIME_SLOT_7 => ARB_TIME_SLOT_7, + C_ARB_TIME_SLOT_8 => ARB_TIME_SLOT_8, + C_ARB_TIME_SLOT_9 => ARB_TIME_SLOT_9, + C_ARB_TIME_SLOT_10 => ARB_TIME_SLOT_10, + C_ARB_TIME_SLOT_11 => ARB_TIME_SLOT_11, + + C_PORT_CONFIG => C_PORT_CONFIG, + C_PORT_ENABLE => C_PORT_ENABLE, + + C_MEM_TRAS => C_MEM_TRAS, + C_MEM_TRCD => C_MEM_TRCD, + C_MEM_TREFI => C_MEM_TREFI, + C_MEM_TRFC => C_MEM_TRFC, + C_MEM_TRP => C_MEM_TRP, + C_MEM_TWR => C_MEM_TWR, + C_MEM_TRTP => C_MEM_TRTP, + C_MEM_TWTR => C_MEM_TWTR, + + C_MEM_ADDR_ORDER => C_MEM_ADDR_ORDER, + C_NUM_DQ_PINS => C_NUM_DQ_PINS, + C_MEM_TYPE => C_MEM_TYPE, + C_MEM_DENSITY => C_MEM_DENSITY, + C_MEM_BURST_LEN => C_MEM_BURST_LEN, + C_MEM_CAS_LATENCY => C_MEM_CAS_LATENCY, + C_MEM_ADDR_WIDTH => C_MEM_ADDR_WIDTH, + C_MEM_BANKADDR_WIDTH => C_MEM_BANKADDR_WIDTH, + C_MEM_NUM_COL_BITS => C_MEM_NUM_COL_BITS, + + C_MEM_DDR1_2_ODS => C_MEM_DDR1_2_ODS, + C_MEM_DDR2_RTT => C_MEM_DDR2_RTT, + C_MEM_DDR2_DIFF_DQS_EN => C_MEM_DDR2_DIFF_DQS_EN, + C_MEM_DDR2_3_PA_SR => C_MEM_DDR2_3_PA_SR, + C_MEM_DDR2_3_HIGH_TEMP_SR => C_MEM_DDR2_3_HIGH_TEMP_SR, + + C_MEM_DDR3_CAS_LATENCY => C_MEM_DDR3_CAS_LATENCY, + C_MEM_DDR3_ODS => C_MEM_DDR3_ODS, + C_MEM_DDR3_RTT => C_MEM_DDR3_RTT, + C_MEM_DDR3_CAS_WR_LATENCY => C_MEM_DDR3_CAS_WR_LATENCY, + C_MEM_DDR3_AUTO_SR => C_MEM_DDR3_AUTO_SR, + C_MEM_DDR3_DYN_WRT_ODT => C_MEM_DDR3_DYN_WRT_ODT, + C_MEM_MOBILE_PA_SR => C_MEM_MOBILE_PA_SR, + C_MEM_MDDR_ODS => C_MEM_MDDR_ODS, + C_MC_CALIBRATION_CLK_DIV => C_MC_CALIBRATION_CLK_DIV, + C_MC_CALIBRATION_MODE => C_MC_CALIBRATION_MODE, + C_MC_CALIBRATION_DELAY => C_MC_CALIBRATION_DELAY, + + C_MC_CALIB_BYPASS => C_MC_CALIB_BYPASS, + C_MC_CALIBRATION_RA => C_MC_CALIBRATION_RA, + C_MC_CALIBRATION_BA => C_MC_CALIBRATION_BA, + C_MC_CALIBRATION_CA => C_MC_CALIBRATION_CA, + C_CALIB_SOFT_IP => C_CALIB_SOFT_IP, + + C_SIMULATION => C_SIMULATION, + C_SKIP_IN_TERM_CAL => C_SKIP_IN_TERM_CAL, + C_SKIP_DYNAMIC_CAL => C_SKIP_DYNAMIC_CAL, + C_SKIP_DYN_IN_TERM => C_SKIP_DYN_IN_TERM, + C_MEM_TZQINIT_MAXCNT => C_MEM_TZQINIT_MAXCNT, + + LDQSP_TAP_DELAY_VAL => C_LDQSP_TAP_DELAY_VAL, + UDQSP_TAP_DELAY_VAL => C_UDQSP_TAP_DELAY_VAL, + LDQSN_TAP_DELAY_VAL => C_LDQSN_TAP_DELAY_VAL, + UDQSN_TAP_DELAY_VAL => C_UDQSN_TAP_DELAY_VAL, + DQ0_TAP_DELAY_VAL => C_DQ0_TAP_DELAY_VAL, + DQ1_TAP_DELAY_VAL => C_DQ1_TAP_DELAY_VAL, + DQ2_TAP_DELAY_VAL => C_DQ2_TAP_DELAY_VAL, + DQ3_TAP_DELAY_VAL => C_DQ3_TAP_DELAY_VAL, + DQ4_TAP_DELAY_VAL => C_DQ4_TAP_DELAY_VAL, + DQ5_TAP_DELAY_VAL => C_DQ5_TAP_DELAY_VAL, + DQ6_TAP_DELAY_VAL => C_DQ6_TAP_DELAY_VAL, + DQ7_TAP_DELAY_VAL => C_DQ7_TAP_DELAY_VAL, + DQ8_TAP_DELAY_VAL => C_DQ8_TAP_DELAY_VAL, + DQ9_TAP_DELAY_VAL => C_DQ9_TAP_DELAY_VAL, + DQ10_TAP_DELAY_VAL => C_DQ10_TAP_DELAY_VAL, + DQ11_TAP_DELAY_VAL => C_DQ11_TAP_DELAY_VAL, + DQ12_TAP_DELAY_VAL => C_DQ12_TAP_DELAY_VAL, + DQ13_TAP_DELAY_VAL => C_DQ13_TAP_DELAY_VAL, + DQ14_TAP_DELAY_VAL => C_DQ14_TAP_DELAY_VAL, + DQ15_TAP_DELAY_VAL => C_DQ15_TAP_DELAY_VAL + ) + +port map +( + sys_rst => async_rst, + sysclk_2x => sysclk_2x, + sysclk_2x_180 => sysclk_2x_180, + pll_ce_0 => pll_ce_0, + pll_ce_90 => pll_ce_90, + pll_lock => pll_lock, + mcbx_dram_addr => mcb3_dram_a, + mcbx_dram_ba => mcb3_dram_ba, + mcbx_dram_ras_n => mcb3_dram_ras_n, + mcbx_dram_cas_n => mcb3_dram_cas_n, + mcbx_dram_we_n => mcb3_dram_we_n, + mcbx_dram_cke => mcb3_dram_cke, + mcbx_dram_clk => mcb3_dram_ck, + mcbx_dram_clk_n => mcb3_dram_ck_n, + mcbx_dram_dq => mcb3_dram_dq, + mcbx_dram_odt => mcb3_dram_odt, + mcbx_dram_ldm => mcb3_dram_dm, + mcbx_dram_udm => mcb3_dram_udm, + mcbx_dram_dqs => mcb3_dram_dqs, + mcbx_dram_dqs_n => mcb3_dram_dqs_n, + mcbx_dram_udqs => mcb3_dram_udqs, + mcbx_dram_udqs_n => mcb3_dram_udqs_n, + mcbx_dram_ddr3_rst => open, + calib_recal => '0', + rzq => mcb3_rzq, + zio => mcb3_zio, + ui_read => '0', + ui_add => '0', + ui_cs => '0', + ui_clk => mcb_drp_clk, + ui_sdi => '0', + ui_addr => (others => '0'), + ui_broadcast => '0', + ui_drp_update => '0', + ui_done_cal => '1', + ui_cmd => '0', + ui_cmd_in => '0', + ui_cmd_en => '0', + ui_dqcount => (others => '0'), + ui_dq_lower_dec => '0', + ui_dq_lower_inc => '0', + ui_dq_upper_dec => '0', + ui_dq_upper_inc => '0', + ui_udqs_inc => '0', + ui_udqs_dec => '0', + ui_ldqs_inc => '0', + ui_ldqs_dec => '0', + uo_data => uo_data, + uo_data_valid => uo_data_valid, + uo_done_cal => calib_done, + uo_cmd_ready_in => uo_cmd_ready_in, + uo_refrsh_flag => uo_refrsh_flag, + uo_cal_start => uo_cal_start, + uo_sdo => uo_sdo, + status => status, + selfrefresh_enter => '0', + selfrefresh_mode => selfrefresh_mode, + + + p0_arb_en => '1', + p0_cmd_clk => p0_cmd_clk, + p0_cmd_en => p0_cmd_en, + p0_cmd_instr => p0_cmd_instr, + p0_cmd_bl => p0_cmd_bl, + p0_cmd_byte_addr => p0_cmd_byte_addr, + p0_cmd_empty => p0_cmd_empty, + p0_cmd_full => p0_cmd_full, + p0_wr_clk => p0_wr_clk, + p0_wr_en => p0_wr_en, + p0_wr_mask => p0_wr_mask, + p0_wr_data => p0_wr_data, + p0_wr_full => p0_wr_full, + p0_wr_empty => p0_wr_empty, + p0_wr_count => p0_wr_count, + p0_wr_underrun => p0_wr_underrun, + p0_wr_error => p0_wr_error, + p0_rd_clk => p0_rd_clk, + p0_rd_en => p0_rd_en, + p0_rd_data => p0_rd_data, + p0_rd_full => p0_rd_full, + p0_rd_empty => p0_rd_empty, + p0_rd_count => p0_rd_count, + p0_rd_overflow => p0_rd_overflow, + p0_rd_error => p0_rd_error, + p1_arb_en => '1', + p1_cmd_clk => p1_cmd_clk, + p1_cmd_en => p1_cmd_en, + p1_cmd_instr => p1_cmd_instr, + p1_cmd_bl => p1_cmd_bl, + p1_cmd_byte_addr => p1_cmd_byte_addr, + p1_cmd_empty => p1_cmd_empty, + p1_cmd_full => p1_cmd_full, + p1_wr_clk => p1_wr_clk, + p1_wr_en => p1_wr_en, + p1_wr_mask => p1_wr_mask, + p1_wr_data => p1_wr_data, + p1_wr_full => p1_wr_full, + p1_wr_empty => p1_wr_empty, + p1_wr_count => p1_wr_count, + p1_wr_underrun => p1_wr_underrun, + p1_wr_error => p1_wr_error, + p1_rd_clk => p1_rd_clk, + p1_rd_en => p1_rd_en, + p1_rd_data => p1_rd_data, + p1_rd_full => p1_rd_full, + p1_rd_empty => p1_rd_empty, + p1_rd_count => p1_rd_count, + p1_rd_overflow => p1_rd_overflow, + p1_rd_error => p1_rd_error, + p2_arb_en => '1', + p2_cmd_clk => p2_cmd_clk, + p2_cmd_en => p2_cmd_en, + p2_cmd_instr => p2_cmd_instr, + p2_cmd_bl => p2_cmd_bl, + p2_cmd_byte_addr => p2_cmd_byte_addr, + p2_cmd_empty => p2_cmd_empty, + p2_cmd_full => p2_cmd_full, + p2_wr_clk => p2_wr_clk, + p2_wr_en => p2_wr_en, + p2_wr_mask => p2_wr_mask, + p2_wr_data => p2_wr_data, + p2_wr_full => p2_wr_full, + p2_wr_empty => p2_wr_empty, + p2_wr_count => p2_wr_count, + p2_wr_underrun => p2_wr_underrun, + p2_wr_error => p2_wr_error, + p2_rd_clk => p2_rd_clk, + p2_rd_en => p2_rd_en, + p2_rd_data => p2_rd_data, + p2_rd_full => p2_rd_full, + p2_rd_empty => p2_rd_empty, + p2_rd_count => p2_rd_count, + p2_rd_overflow => p2_rd_overflow, + p2_rd_error => p2_rd_error, + p3_arb_en => '1', + p3_cmd_clk => p3_cmd_clk, + p3_cmd_en => p3_cmd_en, + p3_cmd_instr => p3_cmd_instr, + p3_cmd_bl => p3_cmd_bl, + p3_cmd_byte_addr => p3_cmd_byte_addr, + p3_cmd_empty => p3_cmd_empty, + p3_cmd_full => p3_cmd_full, + p3_wr_clk => p3_wr_clk, + p3_wr_en => p3_wr_en, + p3_wr_mask => p3_wr_mask, + p3_wr_data => p3_wr_data, + p3_wr_full => p3_wr_full, + p3_wr_empty => p3_wr_empty, + p3_wr_count => p3_wr_count, + p3_wr_underrun => p3_wr_underrun, + p3_wr_error => p3_wr_error, + p3_rd_clk => p3_rd_clk, + p3_rd_en => p3_rd_en, + p3_rd_data => p3_rd_data, + p3_rd_full => p3_rd_full, + p3_rd_empty => p3_rd_empty, + p3_rd_count => p3_rd_count, + p3_rd_overflow => p3_rd_overflow, + p3_rd_error => p3_rd_error, + p4_arb_en => '0', + p4_cmd_clk => '0', + p4_cmd_en => '0', + p4_cmd_instr => (others => '0'), + p4_cmd_bl => (others => '0'), + p4_cmd_byte_addr => (others => '0'), + p4_cmd_empty => open, + p4_cmd_full => open, + p4_rd_clk => '0', + p4_rd_en => '0', + p4_rd_data => open, + p4_rd_full => open, + p4_rd_empty => open, + p4_rd_count => open, + p4_rd_overflow => open, + p4_rd_error => open, + p4_wr_clk => '0', + p4_wr_en => '0', + p4_wr_mask => (others => '0'), + p4_wr_data => (others => '0'), + p4_wr_full => open, + p4_wr_empty => open, + p4_wr_count => open, + p4_wr_underrun => open, + p4_wr_error => open, + p5_arb_en => '0', + p5_cmd_clk => '0', + p5_cmd_en => '0', + p5_cmd_instr => (others => '0'), + p5_cmd_bl => (others => '0'), + p5_cmd_byte_addr => (others => '0'), + p5_cmd_empty => open, + p5_cmd_full => open, + p5_rd_clk => '0', + p5_rd_en => '0', + p5_rd_data => open, + p5_rd_full => open, + p5_rd_empty => open, + p5_rd_count => open, + p5_rd_overflow => open, + p5_rd_error => open, + p5_wr_clk => '0', + p5_wr_en => '0', + p5_wr_mask => (others => '0'), + p5_wr_data => (others => '0'), + p5_wr_full => open, + p5_wr_empty => open, + p5_wr_count => open, + p5_wr_underrun => open, + p5_wr_error => open +); + + + +end architecture; + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/afifo.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/afifo.vhd new file mode 100755 index 0000000..5924354 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/afifo.vhd @@ -0,0 +1,280 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: afifo.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:16:34 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: A generic synchronous fifo. +-- Reference: +-- Revision History: 2009/01/09 corrected signal "buf_avail" and "almost_full" equation. + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + + + +ENTITY afifo IS + GENERIC ( + TCQ : TIME := 100 ps; + DSIZE : INTEGER := 32; + FIFO_DEPTH : INTEGER := 16; + ASIZE : INTEGER := 4; + SYNC : INTEGER := 1 + ); + PORT ( + wr_clk : IN STD_LOGIC; + rst : IN STD_LOGIC; + wr_en : IN STD_LOGIC; + wr_data : IN STD_LOGIC_VECTOR(DSIZE - 1 DOWNTO 0); + rd_en : IN STD_LOGIC; + rd_clk : IN STD_LOGIC; + rd_data : OUT STD_LOGIC_VECTOR(DSIZE - 1 DOWNTO 0); + full : OUT STD_LOGIC; + empty : OUT STD_LOGIC; + almost_full : OUT STD_LOGIC + ); +END afifo; + +ARCHITECTURE trans OF afifo IS + TYPE mem_array IS ARRAY (0 TO FIFO_DEPTH ) OF STD_LOGIC_VECTOR(DSIZE - 1 DOWNTO 0); + + + + SIGNAL mem : mem_array; + + SIGNAL rd_gray_nxt : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL rd_gray : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL rd_capture_ptr : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL pre_rd_capture_gray_ptr : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL rd_capture_gray_ptr : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL wr_gray : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL wr_gray_nxt : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + + SIGNAL wr_capture_ptr : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL pre_wr_capture_gray_ptr : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL wr_capture_gray_ptr : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL buf_avail : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL buf_filled : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL wr_addr : STD_LOGIC_VECTOR(ASIZE - 1 DOWNTO 0); + SIGNAL rd_addr : STD_LOGIC_VECTOR(ASIZE - 1 DOWNTO 0); + + SIGNAL wr_ptr : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL rd_ptr : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL i : INTEGER; + SIGNAL j : INTEGER; + SIGNAL k : INTEGER; + + SIGNAL rd_strobe : STD_LOGIC; + + SIGNAL n : INTEGER; + SIGNAL rd_ptr_tmp : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + + SIGNAL wbin : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL wgraynext : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL wbinnext : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL ZERO : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + SIGNAL ONE : STD_LOGIC_VECTOR(ASIZE DOWNTO 0); + + -- Declare intermediate signals for referenced outputs + SIGNAL full_xhdl1 : STD_LOGIC; + SIGNAL almost_full_int : STD_LOGIC; + SIGNAL empty_xhdl0 : STD_LOGIC; +BEGIN + -- Drive referenced outputs + ZERO <= std_logic_vector(to_unsigned(0,(ASIZE+1))); + ONE <= std_logic_vector(to_unsigned(1,(ASIZE+1))); + + full <= full_xhdl1; + empty <= empty_xhdl0; + xhdl3 : IF (SYNC = 1) GENERATE + PROCESS (rd_ptr) + BEGIN + rd_capture_ptr <= rd_ptr; + END PROCESS; + END GENERATE; + + + + + xhdl4 : IF (SYNC = 1) GENERATE + PROCESS (wr_ptr) + BEGIN + wr_capture_ptr <= wr_ptr; + END PROCESS; + END GENERATE; + + wr_addr <= wr_ptr(ASIZE-1 DOWNTO 0); + rd_data <= mem(conv_integer(rd_addr)); + + + + PROCESS (wr_clk) + BEGIN + IF (wr_clk'EVENT AND wr_clk = '1') THEN + IF ((wr_en AND NOT(full_xhdl1)) = '1') THEN + mem(to_integer(unsigned(wr_addr))) <= wr_data; + END IF; + END IF; + END PROCESS; + + rd_addr <= rd_ptr(ASIZE - 1 DOWNTO 0); + rd_strobe <= rd_en AND NOT(empty_xhdl0); + PROCESS (rd_ptr) + BEGIN + rd_gray_nxt(ASIZE) <= rd_ptr(ASIZE); + FOR n IN 0 TO ASIZE - 1 LOOP + rd_gray_nxt(n) <= rd_ptr(n) XOR rd_ptr(n + 1); + END LOOP; + END PROCESS; + + PROCESS (rd_clk) + BEGIN + IF (rd_clk'EVENT AND rd_clk = '1') THEN + IF (rst = '1') THEN + rd_ptr <= (others=> '0'); + rd_gray <= (others=> '0'); + ELSE + IF (rd_strobe = '1') THEN + rd_ptr <= rd_ptr + 1; + END IF; + rd_ptr_tmp <= rd_ptr; + rd_gray <= rd_gray_nxt; + END IF; + END IF; + END PROCESS; + + buf_filled <= wr_capture_ptr - rd_ptr; + PROCESS (rd_clk) + BEGIN + IF (rd_clk'EVENT AND rd_clk = '1') THEN + IF (rst = '1') THEN + empty_xhdl0 <= '1'; + ELSIF ((buf_filled = ZERO) OR (buf_filled = ONE AND rd_strobe = '1')) THEN + empty_xhdl0 <= '1'; + ELSE + empty_xhdl0 <= '0'; + END IF; + END IF; + END PROCESS; + + + PROCESS (rd_clk) + BEGIN + IF (rd_clk'EVENT AND rd_clk = '1') THEN + IF (rst = '1') THEN + wr_ptr <= (others => '0'); + wr_gray <= (others => '0'); + ELSE + IF (wr_en = '1') THEN + + wr_ptr <= wr_ptr + 1; + END IF; + wr_gray <= wr_gray_nxt; + END IF; + END IF; + END PROCESS; + + + PROCESS (wr_ptr) + BEGIN + wr_gray_nxt(ASIZE) <= wr_ptr(ASIZE); + FOR n IN 0 TO ASIZE - 1 LOOP + wr_gray_nxt(n) <= wr_ptr(n) XOR wr_ptr(n + 1); + END LOOP; + END PROCESS; + + buf_avail <= rd_capture_ptr + FIFO_DEPTH - wr_ptr; + + + PROCESS (wr_clk) + BEGIN + IF (wr_clk'EVENT AND wr_clk = '1') THEN + IF (rst = '1') THEN + full_xhdl1 <= '0'; + ELSIF ((buf_avail = ZERO) OR (buf_avail = ONE AND wr_en = '1')) THEN + full_xhdl1 <= '1'; + ELSE + full_xhdl1 <= '0'; + END IF; + END IF; + END PROCESS; + + almost_full <= almost_full_int; + PROCESS (wr_clk) + BEGIN + IF (wr_clk'EVENT AND wr_clk = '1') THEN + IF (rst = '1') THEN + almost_full_int <= '0'; + + ELSIF (buf_avail <= 3 AND wr_en = '1') THEN --FIFO_DEPTH + + almost_full_int <= '1'; + ELSE + almost_full_int <= '0'; + END IF; + END IF; + END PROCESS; + + + +END trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/cmd_gen.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/cmd_gen.vhd new file mode 100755 index 0000000..17ee620 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/cmd_gen.vhd @@ -0,0 +1,1077 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: cmd_gen.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/05/27 15:50:27 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This module genreates different type of commands, address, +-- burst_length to mcb_flow_control module. +-- Reference: +-- Revision History: + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + USE ieee.numeric_std.all; + + +ENTITY cmd_gen IS + GENERIC ( + FAMILY : STRING := "SPARTAN6"; + MEM_BURST_LEN : INTEGER := 8; + TCQ : TIME := 100 ps; + PORT_MODE : STRING := "BI_MODE"; + NUM_DQ_PINS : INTEGER := 8; + DATA_PATTERN : STRING := "DGEN_ALL"; + CMD_PATTERN : STRING := "CGEN_ALL"; + ADDR_WIDTH : INTEGER := 30; + DWIDTH : INTEGER := 32; + PIPE_STAGES : INTEGER := 0; + MEM_COL_WIDTH : INTEGER := 10; + PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"FFFFD000"; + PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_EADDR : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_SADDR : std_logic_vector(31 downto 0) := X"00002000" + ); + PORT ( + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC_VECTOR(9 DOWNTO 0); + run_traffic_i : IN STD_LOGIC; + rd_buff_avail_i : IN STD_LOGIC_VECTOR(6 DOWNTO 0); + force_wrcmd_gen_i : IN STD_LOGIC; + start_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + end_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + cmd_seed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + data_seed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + load_seed_i : IN STD_LOGIC; + addr_mode_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + instr_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + bl_mode_i : IN STD_LOGIC_VECTOR(1 DOWNTO 0); + mode_load_i : IN STD_LOGIC; + fixed_bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + fixed_instr_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + fixed_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + bram_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + bram_instr_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + bram_bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + bram_valid_i : IN STD_LOGIC; + bram_rdy_o : OUT STD_LOGIC; + reading_rd_data_i : IN STD_LOGIC; + rdy_i : IN STD_LOGIC; + addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + instr_o : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); + bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); +-- m_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + cmd_o_vld : OUT STD_LOGIC + ); +END cmd_gen; + +ARCHITECTURE trans OF cmd_gen IS + constant PRBS_ADDR_WIDTH : INTEGER := 32; + constant INSTR_PRBS_WIDTH : INTEGER := 16; + constant BL_PRBS_WIDTH : INTEGER := 16; + + constant BRAM_DATAL_MODE : std_logic_vector(3 downto 0) := "0000"; + constant FIXED_DATA_MODE : std_logic_vector(3 downto 0) := "0001"; + constant ADDR_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + constant HAMMER_DATA_MODE : std_logic_vector(3 downto 0) := "0011"; + constant NEIGHBOR_DATA_MODE : std_logic_vector(3 downto 0) := "0100"; + constant WALKING1_DATA_MODE : std_logic_vector(3 downto 0) := "0101"; + constant WALKING0_DATA_MODE : std_logic_vector(3 downto 0) := "0110"; + constant PRBS_DATA_MODE : std_logic_vector(3 downto 0) := "0111"; +COMPONENT pipeline_inserter IS + GENERIC ( + DATA_WIDTH : INTEGER := 32; + PIPE_STAGES : INTEGER := 1 + ); + PORT ( + data_i : IN STD_LOGIC_VECTOR(DATA_WIDTH-1 DOWNTO 0); + clk_i : IN STD_LOGIC; + en_i : IN STD_LOGIC; + + data_o : OUT STD_LOGIC_VECTOR(DATA_WIDTH-1 DOWNTO 0) + ); +END COMPONENT; + +COMPONENT cmd_prbs_gen IS + GENERIC ( + TCQ : time := 100 ps; + FAMILY : STRING := "SPARTAN6"; + ADDR_WIDTH : INTEGER := 29; + DWIDTH : INTEGER := 32; + PRBS_CMD : STRING := "ADDRESS"; + PRBS_WIDTH : INTEGER := 64; + SEED_WIDTH : INTEGER := 32; + PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"FFFFD000"; + PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_EADDR : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_SADDR : std_logic_vector(31 downto 0) := X"00002000" + ); + PORT ( + + clk_i : IN STD_LOGIC; + prbs_seed_init : IN STD_LOGIC; + clk_en : IN STD_LOGIC; + prbs_seed_i : IN STD_LOGIC_VECTOR(SEED_WIDTH - 1 DOWNTO 0); + + prbs_o : OUT STD_LOGIC_VECTOR(SEED_WIDTH - 1 DOWNTO 0) + ); +END COMPONENT; + +function BOOLEAN_TO_STD_LOGIC(A : in BOOLEAN) return std_logic is +begin + if A = true then + return '1'; + else + return '0'; + end if; +end function BOOLEAN_TO_STD_LOGIC; + + SIGNAL INC_COUNTS : STD_LOGIC_VECTOR(10 DOWNTO 0); + SIGNAL addr_mode_reg : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL bl_mode_reg : STD_LOGIC_VECTOR(1 DOWNTO 0); + SIGNAL addr_counts : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL prbs_bl : STD_LOGIC_VECTOR(14 DOWNTO 0); + SIGNAL instr_out : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL prbs_instr_a : STD_LOGIC_VECTOR(14 DOWNTO 0); + SIGNAL prbs_instr_b : STD_LOGIC_VECTOR(14 DOWNTO 0); + SIGNAL prbs_brlen : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL prbs_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL seq_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL fixed_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL addr_out : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL bl_out : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL bl_out_reg : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL mode_load_d1 : STD_LOGIC; + SIGNAL mode_load_d2 : STD_LOGIC; + SIGNAL mode_load_pulse : STD_LOGIC; + SIGNAL pipe_data_o : STD_LOGIC_VECTOR(41 DOWNTO 0); + SIGNAL cmd_clk_en : STD_LOGIC; + SIGNAL pipe_out_vld : STD_LOGIC; + SIGNAL end_addr_range : STD_LOGIC_VECTOR(15 DOWNTO 0); + SIGNAL force_bl1 : STD_LOGIC; + SIGNAL A0_G_E0 : STD_LOGIC; + SIGNAL A1_G_E1 : STD_LOGIC; + SIGNAL A2_G_E2 : STD_LOGIC; + SIGNAL A3_G_E3 : STD_LOGIC; + SIGNAL AC3_G_E3 : STD_LOGIC; + SIGNAL AC2_G_E2 : STD_LOGIC; + SIGNAL AC1_G_E1 : STD_LOGIC; + SIGNAL bl_out_clk_en : STD_LOGIC; + SIGNAL pipe_data_in : STD_LOGIC_VECTOR(41 DOWNTO 0); + SIGNAL instr_vld : STD_LOGIC; + SIGNAL bl_out_vld : STD_LOGIC; + SIGNAL cmd_vld : STD_LOGIC; + SIGNAL run_traffic_r : STD_LOGIC; + SIGNAL run_traffic_pulse : STD_LOGIC; + + SIGNAL pipe_data_in_vld : STD_LOGIC; + SIGNAL gen_addr_larger : STD_LOGIC; + SIGNAL buf_avail_r : STD_LOGIC_VECTOR(6 DOWNTO 0); + SIGNAL rd_data_received_counts : STD_LOGIC_VECTOR(6 DOWNTO 0); + SIGNAL rd_data_counts_asked : STD_LOGIC_VECTOR(6 DOWNTO 0); + SIGNAL rd_data_received_counts_total : STD_LOGIC_VECTOR(15 DOWNTO 0); + SIGNAL instr_vld_dly1 : STD_LOGIC; + SIGNAL first_load_pulse : STD_LOGIC; + SIGNAL mem_init_done : STD_LOGIC; + SIGNAL i : INTEGER; + SIGNAL force_wrcmd_gen : STD_LOGIC; + SIGNAL force_smallvalue : STD_LOGIC; + + SIGNAL end_addr_r : STD_LOGIC_VECTOR(31 DOWNTO 0); + + SIGNAL force_rd_counts : STD_LOGIC_VECTOR(9 DOWNTO 0); + SIGNAL force_rd : STD_LOGIC; + SIGNAL addr_counts_next_r : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL refresh_cmd_en : STD_LOGIC; + SIGNAL refresh_timer : STD_LOGIC_VECTOR(9 DOWNTO 0); + SIGNAL refresh_prbs : STD_LOGIC; + SIGNAL cmd_clk_en_r : STD_LOGIC; + + signal instr_mode_reg : std_logic_vector(3 downto 0); + + + -- X-HDL generated signals + + SIGNAL xhdl4 : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL xhdl12 : STD_LOGIC_VECTOR(1 DOWNTO 0); + SIGNAL xhdl14 : STD_LOGIC_VECTOR(5 DOWNTO 0); + + -- Declare intermediate signals for referenced outputs + SIGNAL bl_o_xhdl0 : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL mode_load_pulse_r1 : STD_LOGIC; + +BEGIN + -- Drive referenced outputs + bl_o <= bl_o_xhdl0; + addr_o <= pipe_data_o(31 DOWNTO 0); + instr_o <= pipe_data_o(34 DOWNTO 32); + bl_o_xhdl0 <= pipe_data_o(40 DOWNTO 35); + cmd_o_vld <= pipe_data_o(41) AND run_traffic_r; + pipe_out_vld <= pipe_data_o(41) AND run_traffic_r; + pipe_data_o <= pipe_data_in; + + + cv1 : IF (CMD_PATTERN = "CGEN_BRAM") GENERATE + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + cmd_vld <= cmd_clk_en; + END IF; + END PROCESS; + END GENERATE; + + cv3 : IF (CMD_PATTERN = "CGEN_PRBS" OR CMD_PATTERN = "CGEN_ALL" OR CMD_PATTERN = "CGEN_SEQUENTIAL" OR CMD_PATTERN = "CGEN_FIXED") GENERATE + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + cmd_vld <= cmd_clk_en OR (mode_load_pulse AND first_load_pulse); + END IF; + END PROCESS; + END GENERATE; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + run_traffic_r <= run_traffic_i ; + IF ( run_traffic_i= '1' AND run_traffic_r = '0' ) THEN + run_traffic_pulse <= '1' ; + ELSE + run_traffic_pulse <= '0' ; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + instr_vld <= cmd_clk_en OR (mode_load_pulse AND first_load_pulse) ; + bl_out_clk_en <= cmd_clk_en OR (mode_load_pulse AND first_load_pulse) ; + bl_out_vld <= bl_out_clk_en ; + pipe_data_in_vld <= instr_vld ; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i(0) = '1') THEN + first_load_pulse <= '1' ; + ELSIF (mode_load_pulse = '1') THEN + first_load_pulse <= '0' ; + ELSE + first_load_pulse <= first_load_pulse ; + END IF; + END IF; + END PROCESS; + + + cmd_clk_en <= (rdy_i AND pipe_out_vld AND run_traffic_i) OR (mode_load_pulse AND BOOLEAN_TO_STD_LOGIC(CMD_PATTERN = "CGEN_BRAM")); + + pipe_in_s6 : IF (FAMILY = "SPARTAN6") GENERATE + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(0)) = '1') THEN + pipe_data_in(31 DOWNTO 0) <= start_addr_i ; + ELSIF (instr_vld = '1') THEN + IF (gen_addr_larger = '1' AND (addr_mode_reg = "100" OR addr_mode_reg = "010")) THEN + + IF (DWIDTH = 32) THEN + pipe_data_in(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 8) & "00000000") ; + ELSIF (DWIDTH = 64) THEN + pipe_data_in(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 9) & "000000000") ; + ELSE + pipe_data_in(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 10) & "0000000000") ; + END IF; + + ELSE + IF (DWIDTH = 32) THEN + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 2) & "00") ; + ELSIF (DWIDTH = 64) THEN + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000") ; + ELSIF (DWIDTH = 128) THEN + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 4) & "0000") ; + END IF; + END IF; + END IF; + END IF; + END PROCESS; + + END GENERATE; + pipe_in_v6 : IF (FAMILY = "VIRTEX6") GENERATE + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(1)) = '1') THEN + pipe_data_in(31 DOWNTO 0) <= start_addr_i ; + ELSIF (instr_vld = '1') THEN + IF (gen_addr_larger = '1' AND (addr_mode_reg = "100" OR addr_mode_reg = "010")) THEN + pipe_data_in(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 8) & "00000000") ; + + ELSIF ((NUM_DQ_PINS >= 128) AND (NUM_DQ_PINS <= 144)) THEN + IF (MEM_BURST_LEN = 8) THEN + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 7) & "0000000") ; + ELSE + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 6) & "000000") ; + END IF; + + ELSIF ((NUM_DQ_PINS >= 64) AND (NUM_DQ_PINS < 128)) THEN + + IF (MEM_BURST_LEN = 8) THEN + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 6) & "000000") ; + ELSE + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 5) & "00000") ; + END IF; + + ELSIF ((NUM_DQ_PINS = 32) OR (NUM_DQ_PINS = 40) OR (NUM_DQ_PINS = 48) OR (NUM_DQ_PINS = 56)) THEN + IF (MEM_BURST_LEN = 8) THEN + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 5) & "00000") ; + ELSE + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 4) & "0000") ; + END IF; + + ELSIF ((NUM_DQ_PINS = 16) OR (NUM_DQ_PINS = 24)) THEN + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000"); + IF (MEM_BURST_LEN = 8) THEN + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 4) & "0000") ; + ELSE + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000") ; + END IF; + ELSIF (NUM_DQ_PINS = 8) THEN + IF (MEM_BURST_LEN = 8) THEN + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000") ; + ELSE + pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 2) & "00") ; + END IF; + + + END IF; + END IF; + END IF; + END PROCESS; + + END GENERATE; +-- pipe_m_addr_o : IF (FAMILY = "VIRTEX6") GENERATE +-- PROCESS (clk_i) +-- BEGIN +-- IF (clk_i'EVENT AND clk_i = '1') THEN +-- IF ((rst_i(1)) = '1') THEN +-- m_addr_o(31 DOWNTO 0) <= start_addr_i ; +-- ELSIF (instr_vld = '1') THEN +-- IF (gen_addr_larger = '1' AND (addr_mode_reg = "100" OR addr_mode_reg = "010")) THEN +-- m_addr_o(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 8) & "00000000") ; +-- +-- ELSIF ((NUM_DQ_PINS >= 128) AND (NUM_DQ_PINS < 256)) THEN +-- m_addr_o <= (addr_out(31 DOWNTO 6) & "000000") ; +-- +-- ELSIF ((NUM_DQ_PINS >= 64) AND (NUM_DQ_PINS < 128)) THEN +-- m_addr_o <= (addr_out(31 DOWNTO 5) & "00000") ; +-- ELSIF ((NUM_DQ_PINS = 32) OR (NUM_DQ_PINS = 40) OR (NUM_DQ_PINS = 48) OR (NUM_DQ_PINS = 56)) THEN +-- m_addr_o(31 DOWNTO 0) <= (addr_out(31 DOWNTO 4) & "0000") ; +-- ELSIF ((NUM_DQ_PINS = 16) OR (NUM_DQ_PINS = 17)) THEN +-- m_addr_o(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000") ; +-- ELSIF ((NUM_DQ_PINS = 8) OR (NUM_DQ_PINS = 9)) THEN +-- m_addr_o(31 DOWNTO 0) <= (addr_out(31 DOWNTO 2) & "00") ; +-- END IF; +-- END IF; +-- END IF; +-- END PROCESS; +-- +-- END GENERATE; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i(0) = '1') THEN + force_wrcmd_gen <= '0' ; + ELSIF (buf_avail_r = "0111111") THEN + force_wrcmd_gen <= '0' ; + ELSIF (instr_vld_dly1 = '1' AND pipe_data_in(32) = '1' AND pipe_data_in(41 DOWNTO 35) > "0010000") THEN + force_wrcmd_gen <= '1' ; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + instr_mode_reg <= instr_mode_i ; + + END IF; + END PROCESS; + -- ********************************************** + + PROCESS (clk_i) BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(2)) = '1') THEN + pipe_data_in(40 DOWNTO 32) <= "000000000"; + force_smallvalue <= '0'; + ELSIF (instr_vld = '1') THEN + + IF (instr_mode_reg = 0) THEN + pipe_data_in(34 DOWNTO 32) <= instr_out ; + + ELSIF (instr_out(2) = '1') THEN + + pipe_data_in(34 DOWNTO 32) <= "100" ; + + + ELSIF (FAMILY = "SPARTAN6" AND PORT_MODE = "RD_MODE") THEN + + pipe_data_in(34 DOWNTO 32) <= instr_out(2 downto 1) & '1' ; + + ELSIF ((force_wrcmd_gen = '1' OR buf_avail_r <= "0001111") AND FAMILY = "SPARTAN6" AND PORT_MODE /= "RD_MODE") THEN + pipe_data_in(34 DOWNTO 32) <= instr_out(2) & "00"; + ELSE + pipe_data_in(34 DOWNTO 32) <= instr_out; + + END IF; + ----********* condition the generated bl value except if TG is programmed for BRAM interface' + ---- if the generated address is close to end address range, the bl_out will be altered to 1. + -- + IF (bl_mode_i = 0) THEN + pipe_data_in(40 DOWNTO 35) <= bl_out ; + ELSIF ( FAMILY = "VIRTEX6") THEN + pipe_data_in(40 DOWNTO 35) <= bl_out ; + ELSIF (force_bl1 = '1' AND (bl_mode_reg = "10") AND FAMILY = "SPARTAN6") THEN + + pipe_data_in(40 DOWNTO 35) <= "000001" ; + + + -- ********************************************** + + ELSIF (buf_avail_r(5 DOWNTO 0) >= "111100" AND buf_avail_r(6) = '0' AND pipe_data_in(32) = '1' AND FAMILY = "SPARTAN6") THEN + IF (bl_mode_reg = "10") THEN + force_smallvalue <= NOT(force_smallvalue) ; + END IF; + IF (buf_avail_r(6) = '1' AND bl_mode_reg = "10") THEN + pipe_data_in(40 DOWNTO 35) <= ("00" & bl_out(3 DOWNTO 1) & '1') ; + ELSE + pipe_data_in(40 DOWNTO 35) <= bl_out ; + END IF; + ELSIF (buf_avail_r < "1000000" AND rd_buff_avail_i >= "0000000" AND instr_out(0) = '1' AND (bl_mode_reg = "10")) THEN + IF (FAMILY = "SPARTAN6") THEN + pipe_data_in(40 DOWNTO 35) <= ("00" & bl_out(3 DOWNTO 0)) + '1' ; + ELSE + pipe_data_in(40 DOWNTO 35) <= bl_out ; + END IF; + END IF; --IF (bl_mode_i = 0) THEN + END IF; --IF ((rst_i(2)) = '1') THEN + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(2)) = '1') THEN + pipe_data_in(41) <= '0' ; + ELSIF (cmd_vld = '1') THEN + pipe_data_in(41) <= instr_vld ; + ELSIF ((rdy_i AND pipe_out_vld) = '1') THEN + pipe_data_in(41) <= '0' ; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + instr_vld_dly1 <= instr_vld; + END IF; + END PROCESS; + + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i(0) = '1') THEN + rd_data_counts_asked <= (others => '0') ; + ELSIF (instr_vld_dly1 = '1' AND pipe_data_in(32) = '1') THEN + IF (pipe_data_in(40 DOWNTO 35) = "000000") THEN + rd_data_counts_asked <= rd_data_counts_asked + 64 ; + + ELSE + rd_data_counts_asked <= rd_data_counts_asked + ('0' & (pipe_data_in(40 DOWNTO 35))); + + END IF; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i(0) = '1') THEN + rd_data_received_counts <= (others => '0'); + rd_data_received_counts_total <= (others => '0'); + ELSIF (reading_rd_data_i = '1') THEN + rd_data_received_counts <= rd_data_received_counts + '1'; + rd_data_received_counts_total <= rd_data_received_counts_total + "0000000000000001"; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + buf_avail_r <= (rd_data_received_counts + 64) - rd_data_counts_asked; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(3)) = '1') THEN + IF (CMD_PATTERN = "CGEN_BRAM") THEN + addr_mode_reg <= "000"; + ELSE + addr_mode_reg <= "011"; + END IF; + ELSIF (mode_load_pulse = '1') THEN + addr_mode_reg <= addr_mode_i; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (mode_load_pulse = '1') THEN + bl_mode_reg <= bl_mode_i; + END IF; + mode_load_d1 <= mode_load_i; + mode_load_d2 <= mode_load_d1; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + mode_load_pulse <= mode_load_d1 AND NOT(mode_load_d2); + END IF; + END PROCESS; + + xhdl4 <= addr_mode_reg; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(3)) = '1') THEN + addr_out <= start_addr_i; + ELSE + CASE xhdl4 IS + WHEN "000" => + addr_out <= bram_addr_i; + WHEN "001" => + addr_out <= fixed_addr; + WHEN "010" => + addr_out <= prbs_addr; + WHEN "011" => + addr_out <= ("00" & seq_addr(29 DOWNTO 0)); + WHEN "100" => +-- addr_out <= (prbs_addr(31 DOWNTO 6) & "000000"); + addr_out <= ("000" & seq_addr(6 DOWNTO 2) & seq_addr(23 DOWNTO 0));--(prbs_addr(31 DOWNTO 6) & "000000"); + WHEN "101" => + addr_out <= (prbs_addr(31 DOWNTO 20) & seq_addr(19 DOWNTO 0)); + -- addr_out <= (prbs_addr(31 DOWNTO MEM_COL_WIDTH) & seq_addr(MEM_COL_WIDTH - 1 DOWNTO 0)); + WHEN OTHERS => + addr_out <= (others => '0');--"00000000000000000000000000000000"; + END CASE; + END IF; + END IF; + END PROCESS; + + xhdl5 : IF (CMD_PATTERN = "CGEN_PRBS" OR CMD_PATTERN = "CGEN_ALL") GENERATE + + + addr_prbs_gen : cmd_prbs_gen + GENERIC MAP ( + family => FAMILY, + addr_width => 32, + dwidth => DWIDTH, + prbs_width => 32, + seed_width => 32, + prbs_eaddr_mask_pos => PRBS_EADDR_MASK_POS, + prbs_saddr_mask_pos => PRBS_SADDR_MASK_POS, + prbs_eaddr => PRBS_EADDR, + prbs_saddr => PRBS_SADDR + ) + PORT MAP ( + clk_i => clk_i, + clk_en => cmd_clk_en, + prbs_seed_init => mode_load_pulse, + prbs_seed_i => cmd_seed_i(31 DOWNTO 0), + prbs_o => prbs_addr + ); + END GENERATE; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (addr_out(31 DOWNTO 8) >= end_addr_i(31 DOWNTO 8)) THEN + gen_addr_larger <= '1'; + ELSE + gen_addr_larger <= '0'; + END IF; + END IF; + END PROCESS; + + xhdl6 : IF (FAMILY = "SPARTAN6") GENERATE + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (mem_init_done = '1') THEN + INC_COUNTS <= std_logic_vector(to_unsigned((DWIDTH/8 * to_integer(unsigned(bl_out_reg))),11)); + ELSE + IF (fixed_bl_i = "000000") THEN + INC_COUNTS <= std_logic_vector(to_unsigned((DWIDTH/8)*(64), 11)); + ELSE + INC_COUNTS <= std_logic_vector(to_unsigned((DWIDTH/8 * to_integer(unsigned(fixed_bl_i))),11)); + END IF; + END IF; + END IF; + END PROCESS; + + END GENERATE; + xhdl7 : IF (FAMILY = "VIRTEX6") GENERATE + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (NUM_DQ_PINS >= 128 AND NUM_DQ_PINS <= 144) THEN + INC_COUNTS <= std_logic_vector(to_unsigned(64 * (MEM_BURST_LEN/4), 11)); + + ELSIF (NUM_DQ_PINS >= 64 AND NUM_DQ_PINS < 128) THEN + INC_COUNTS <= std_logic_vector(to_unsigned(32 * (MEM_BURST_LEN/4), 11)); + ELSIF (NUM_DQ_PINS >= 32 AND NUM_DQ_PINS < 64) THEN + INC_COUNTS <= std_logic_vector(to_unsigned(16 * (MEM_BURST_LEN/4), 11)); + ELSIF (NUM_DQ_PINS = 16 OR NUM_DQ_PINS = 24) THEN + INC_COUNTS <= std_logic_vector(to_unsigned(8 * (MEM_BURST_LEN/4), 11)); + ELSIF (NUM_DQ_PINS = 8 OR NUM_DQ_PINS = 9) THEN + INC_COUNTS <= std_logic_vector(to_unsigned(4 * (MEM_BURST_LEN/4), 11)); + END IF; + END IF; + END PROCESS; + + END GENERATE; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + end_addr_r <= end_addr_i - std_logic_vector(to_unsigned(DWIDTH/8*to_integer(unsigned(fixed_bl_i)),32)) + "00000000000000000000000000000001"; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (addr_out(31 DOWNTO 24) >= end_addr_r(31 DOWNTO 24)) THEN + AC3_G_E3 <= '1'; + ELSE + AC3_G_E3 <= '0'; + END IF; + IF (addr_out(23 DOWNTO 16) >= end_addr_r(23 DOWNTO 16)) THEN + AC2_G_E2 <= '1'; + ELSE + AC2_G_E2 <= '0'; + END IF; + IF (addr_out(15 DOWNTO 8) >= end_addr_r(15 DOWNTO 8)) THEN + AC1_G_E1 <= '1'; + ELSE + AC1_G_E1 <= '0'; + END IF; + END IF; + END PROCESS; + +-- xhdl8 : IF (CMD_PATTERN = "CGEN_SEQUENTIAL" OR CMD_PATTERN = "CGEN_ALL") GENERATE + seq_addr <= addr_counts; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + mode_load_pulse_r1 <= mode_load_pulse; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + end_addr_range <= end_addr_i(15 DOWNTO 0) - std_logic_vector(to_unsigned((DWIDTH/8 * to_integer(unsigned(bl_out_reg))),16)) + "0000000000000001"; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + addr_counts_next_r <= addr_counts + (INC_COUNTS); + + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + cmd_clk_en_r <= cmd_clk_en; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(4)) = '1') THEN + addr_counts <= start_addr_i; + mem_init_done <= '0'; + ELSIF ((cmd_clk_en_r OR mode_load_pulse_r1) = '1') THEN +-- IF ((DWIDTH = 32 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND (addr_counts(7 DOWNTO 0) >= end_addr_r(7 DOWNTO 0))) OR (DWIDTH = 64 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND (addr_counts(7 DOWNTO 0) >= end_addr_r(7 DOWNTO 0))) OR ((DWIDTH = 128 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND FAMILY = "SPARTAN6") OR (DWIDTH = 128 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND (addr_counts(7 DOWNTO 0) >= end_addr_r(7 DOWNTO 0)) AND FAMILY = "VIRTEX6") OR (DWIDTH >= 256 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND (addr_counts(7 DOWNTO 0) >= end_addr_r(7 DOWNTO 0)) AND FAMILY = "VIRTEX6"))) THEN + IF (addr_counts_next_r >= end_addr_i) THEN + addr_counts <= start_addr_i; + mem_init_done <= '1'; + ELSIF (addr_counts < end_addr_r) THEN + addr_counts <= addr_counts + INC_COUNTS; + END IF; + END IF; + END IF; + END PROCESS; + + --END GENERATE; + + xhdl9 : IF (CMD_PATTERN = "CGEN_FIXED" OR CMD_PATTERN = "CGEN_ALL") GENERATE + fixed_addr <= (fixed_addr_i(31 DOWNTO 2) & "00") WHEN (DWIDTH = 32) ELSE + (fixed_addr_i(31 DOWNTO 3) & "000") WHEN (DWIDTH = 64) ELSE + (fixed_addr_i(31 DOWNTO 4) & "0000") WHEN (DWIDTH = 128) ELSE + (fixed_addr_i(31 DOWNTO 5) & "00000") WHEN (DWIDTH = 256) ELSE + (fixed_addr_i(31 DOWNTO 6) & "000000"); + END GENERATE; + xhdl10 : IF (CMD_PATTERN = "CGEN_BRAM" OR CMD_PATTERN = "CGEN_ALL") GENERATE + bram_rdy_o <= (run_traffic_i AND cmd_clk_en AND bram_valid_i) OR (mode_load_pulse); + END GENERATE; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(4)) = '1') THEN + force_rd_counts <= (others => '0');--"0000000000"; + ELSIF (instr_vld = '1') THEN + force_rd_counts <= force_rd_counts + "0000000001"; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(4)) = '1') THEN + force_rd <= '0'; + ELSIF ((force_rd_counts(3)) = '1') THEN + force_rd <= '1'; + ELSE + force_rd <= '0'; + END IF; + END IF; + END PROCESS; + + + +-- adding refresh timer to limit the amount of issuing refresh command. + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(4)) = '1') THEN + refresh_timer <= (others => '0'); + ELSE + refresh_timer <= refresh_timer + 1; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(4)) = '1') THEN + refresh_cmd_en <= '0'; + ELSIF (refresh_timer = "1111111111") THEN + refresh_cmd_en <= '1'; + ELSIF ((cmd_clk_en and refresh_cmd_en) = '1') THEN + refresh_cmd_en <= '0'; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (FAMILY = "SPARTAN6") THEN + refresh_prbs <= prbs_instr_b(3) and refresh_cmd_en; + ELSE + refresh_prbs <= '0'; + END IF; + END IF; + END PROCESS; + + --synthesis translate_off + PROCESS (instr_mode_i) + BEGIN + IF ((instr_mode_i > "0010") and (FAMILY = "VIRTEX6")) THEN + report "Error ! Not valid instruction mode"; + END IF; + END PROCESS; + --synthesis translate_on + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + CASE instr_mode_i IS + WHEN "0000" => + instr_out <= bram_instr_i; + WHEN "0001" => + instr_out <= fixed_instr_i; + WHEN "0010" => + instr_out <= ("00" & (prbs_instr_a(0) OR force_rd)); + WHEN "0011" => + instr_out <= ("00" & prbs_instr_a(0)); + WHEN "0100" => + instr_out <= ('0' & prbs_instr_b(0) & prbs_instr_a(0)); + + WHEN "0101" => + instr_out <= (refresh_prbs & prbs_instr_b(0) & prbs_instr_a(0)); + WHEN OTHERS => + instr_out <= ("00" & prbs_instr_a(0)); + END CASE; + END IF; + END PROCESS; + + + xhdl11 : IF (CMD_PATTERN = "CGEN_PRBS" OR CMD_PATTERN = "CGEN_ALL") GENERATE + + + + + instr_prbs_gen_a : cmd_prbs_gen + GENERIC MAP ( + prbs_cmd => "INSTR", + family => FAMILY, + addr_width => 32, + seed_width => 15, + prbs_width => 20 + ) + PORT MAP ( + clk_i => clk_i, + clk_en => cmd_clk_en, + prbs_seed_init => load_seed_i, + prbs_seed_i => cmd_seed_i(14 DOWNTO 0), + prbs_o => prbs_instr_a + ); + + + + instr_prbs_gen_b : cmd_prbs_gen + GENERIC MAP ( + prbs_cmd => "INSTR", + family => FAMILY, + seed_width => 15, + prbs_width => 20 + ) + PORT MAP ( + clk_i => clk_i, + clk_en => cmd_clk_en, + prbs_seed_init => load_seed_i, + prbs_seed_i => cmd_seed_i(16 DOWNTO 2), + prbs_o => prbs_instr_b + ); + + END GENERATE; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (addr_out(31 DOWNTO 24) >= end_addr_i(31 DOWNTO 24)) THEN + A3_G_E3 <= '1' ; + ELSE + + A3_G_E3 <= '0' ; + END IF; + IF (addr_out(23 DOWNTO 16) >= end_addr_i(23 DOWNTO 16)) THEN + A2_G_E2 <= '1' ; + ELSE + + A2_G_E2 <= '0' ; + END IF; + IF (addr_out(15 DOWNTO 8) >= end_addr_i(15 DOWNTO 8)) THEN + A1_G_E1 <= '1' ; + ELSE + + A1_G_E1 <= '0' ; + END IF; + IF (addr_out(7 DOWNTO 0) > (end_addr_i(7 DOWNTO 0) - std_logic_vector(to_unsigned((DWIDTH/8)*to_integer(unsigned(bl_out) ),32)) + '1') ) THEN -- OK + + + + + + A0_G_E0 <= '1' ; + ELSE + + A0_G_E0 <= '0' ; + END IF; + END IF; + END PROCESS; + +--testout <= std_logic_vector(to_unsigned((DWIDTH/8)*to_integer(unsigned(bl_out) ),testout'length)) + '1'; + + PROCESS (addr_out,buf_avail_r, bl_out, end_addr_i, rst_i) + BEGIN + IF ((rst_i(5)) = '1') THEN + force_bl1 <= '0'; + + + ELSIF (addr_out + std_logic_vector(to_unsigned((DWIDTH/8)*to_integer(unsigned(bl_out) ),32)) >= end_addr_i) OR + (buf_avail_r <= 50 and PORT_MODE = "RD_MODE") THEN + force_bl1 <= '1' ; + ELSE + force_bl1 <= '0' ; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(6)) = '1') THEN + bl_out_reg <= fixed_bl_i; + ELSIF (bl_out_vld = '1') THEN + + bl_out_reg <= bl_out; + END IF; + END IF; + END PROCESS; + + xhdl12 <= bl_mode_reg; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (mode_load_pulse = '1') THEN + bl_out <= fixed_bl_i; + ELSIF (cmd_clk_en = '1') THEN + CASE xhdl12 IS + WHEN "00" => + bl_out <= bram_bl_i; + WHEN "01" => + bl_out <= fixed_bl_i; + WHEN "10" => + bl_out <= prbs_brlen; + WHEN OTHERS => + bl_out <= "000001"; + END CASE; + END IF; + END IF; + END PROCESS; + + --synthesis translate_off + PROCESS (bl_out) + BEGIN + IF (bl_out > "000010" AND FAMILY = "VIRTEX6") THEN + report "Error ! Not valid burst length"; --severity ERROR; + END IF; + END PROCESS; + --synthesis translate_on + + xhdl13 : IF (CMD_PATTERN = "CGEN_PRBS" OR CMD_PATTERN = "CGEN_ALL") GENERATE + + + + + bl_prbs_gen : cmd_prbs_gen + GENERIC MAP ( + TCQ => TCQ, + family => FAMILY, + prbs_cmd => "BLEN", + addr_width => 32, + seed_width => 15, + prbs_width => 20 + ) + PORT MAP ( + clk_i => clk_i, + clk_en => cmd_clk_en, + + prbs_seed_init => load_seed_i, + prbs_seed_i => cmd_seed_i(16 DOWNTO 2), + prbs_o => prbs_bl + ); + + END GENERATE; +-- xhdl14 <= "000001" WHEN (prbs_bl(5 DOWNTO 0) = "000000") ELSE prbs_bl(5 DOWNTO 0); + PROCESS (prbs_bl) BEGIN + IF (FAMILY = "SPARTAN6") THEN + if (prbs_bl(5 DOWNTO 0) = "000000") then +-- prbs_brlen <= xhdl14; + prbs_brlen <= "000001"; + else + prbs_brlen <= prbs_bl(5 DOWNTO 0); + end if; + ELSE + prbs_brlen <= "000010"; + END IF; + END PROCESS; + + + +END trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/cmd_prbs_gen.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/cmd_prbs_gen.vhd new file mode 100755 index 0000000..ddba6fc --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/cmd_prbs_gen.vhd @@ -0,0 +1,247 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: cmd_prbs_gen.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:16:37 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This moduel use LFSR to generate random address, isntructions +-- or burst_length. +-- Reference: +-- Revision History: + +--***************************************************************************** + + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + USE ieee.numeric_std.all; + + +ENTITY cmd_prbs_gen IS + GENERIC ( + TCQ : time := 100 ps; + FAMILY : STRING := "SPARTAN6"; + ADDR_WIDTH : INTEGER := 29; + DWIDTH : INTEGER := 32; + PRBS_CMD : STRING := "ADDRESS"; + PRBS_WIDTH : INTEGER := 64; + SEED_WIDTH : INTEGER := 32; + + PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"FFFFD000"; + PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_EADDR : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_SADDR : std_logic_vector(31 downto 0) := X"00002000" + ); + PORT ( + + clk_i : IN STD_LOGIC; + prbs_seed_init : IN STD_LOGIC; + clk_en : IN STD_LOGIC; + prbs_seed_i : IN STD_LOGIC_VECTOR(SEED_WIDTH - 1 DOWNTO 0); + + prbs_o : OUT STD_LOGIC_VECTOR(SEED_WIDTH - 1 DOWNTO 0) + ); +END cmd_prbs_gen; + +ARCHITECTURE trans OF cmd_prbs_gen IS + SIGNAL ZEROS : STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + SIGNAL prbs : STD_LOGIC_VECTOR(SEED_WIDTH - 1 DOWNTO 0); + SIGNAL lfsr_q : STD_LOGIC_VECTOR(PRBS_WIDTH DOWNTO 1); + + function logb2 (val : integer) return integer is + variable vec_con : integer; + variable rtn : integer := 1; + begin + vec_con := val; + for index in 0 to 31 loop + if(vec_con = 1) then + rtn := rtn + 1; + return(rtn); + end if; + vec_con := vec_con/2; + rtn := rtn + 1; + end loop; + end function logb2; + + +BEGIN + + ZEROS <= std_logic_vector(to_unsigned(0,ADDR_WIDTH)); + + xhdl0 : IF (PRBS_CMD = "ADDRESS" AND PRBS_WIDTH = 64) GENERATE + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (prbs_seed_init = '1') THEN + lfsr_q <= ('0' & ("0000000000000000000000000000000" & prbs_seed_i)) ; + ELSIF (clk_en = '1') THEN + lfsr_q(64) <= lfsr_q(64) XOR lfsr_q(63) ; + lfsr_q(63) <= lfsr_q(62) ; + lfsr_q(62) <= lfsr_q(64) XOR lfsr_q(61) ; + + lfsr_q(61) <= lfsr_q(64) XOR lfsr_q(60) ; + + lfsr_q(60 DOWNTO 2) <= lfsr_q(59 DOWNTO 1) ; + lfsr_q(1) <= lfsr_q(64) ; + END IF; + END IF; + END PROCESS; + + + PROCESS (lfsr_q(32 DOWNTO 1)) + BEGIN + prbs <= lfsr_q(32 DOWNTO 1); + END PROCESS; + + END GENERATE; + + + xhdl1 : IF (PRBS_CMD = "ADDRESS" AND PRBS_WIDTH = 32) GENERATE + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (prbs_seed_init = '1') THEN + lfsr_q <= prbs_seed_i ; + ELSIF (clk_en = '1') THEN + + lfsr_q(32 DOWNTO 9) <= lfsr_q(31 DOWNTO 8) ; + lfsr_q(8) <= lfsr_q(32) XOR lfsr_q(7) ; + lfsr_q(7) <= lfsr_q(32) XOR lfsr_q(6) ; + + lfsr_q(6 DOWNTO 4) <= lfsr_q(5 DOWNTO 3) ; + lfsr_q(3) <= lfsr_q(32) XOR lfsr_q(2) ; + lfsr_q(2) <= lfsr_q(1) ; + + lfsr_q(1) <= lfsr_q(32) ; + END IF; + END IF; + END PROCESS; + + + + PROCESS (lfsr_q(32 DOWNTO 1)) + BEGIN + + IF (FAMILY = "SPARTAN6") THEN + FOR i IN (logb2(DWIDTH) + 1) TO SEED_WIDTH - 1 LOOP + IF (PRBS_SADDR_MASK_POS(i) = '1') THEN + prbs(i) <= PRBS_SADDR(i) OR lfsr_q(i + 1); + ELSIF (PRBS_EADDR_MASK_POS(i) = '1') THEN + prbs(i) <= PRBS_EADDR(i) AND lfsr_q(i + 1); + ELSE + prbs(i) <= lfsr_q(i + 1); + END IF; + END LOOP; + prbs(logb2(DWIDTH) downto 0) <= (others => '0'); + ELSE + FOR i IN (logb2(DWIDTH) - 4) TO SEED_WIDTH - 1 LOOP + IF (PRBS_SADDR_MASK_POS(i) = '1') THEN + prbs(i) <= PRBS_SADDR(i) OR lfsr_q(i + 1); + ELSIF (PRBS_EADDR_MASK_POS(i) = '1') THEN + prbs(i) <= PRBS_EADDR(i) AND lfsr_q(i + 1); + ELSE + prbs(i) <= lfsr_q(i + 1); + END IF; + END LOOP; + prbs(logb2(DWIDTH) downto 0) <= (others => '0'); + END IF; + + END PROCESS; + + + END GENERATE; + + + xhdl2 : IF (PRBS_CMD = "INSTR" OR PRBS_CMD = "BLEN") GENERATE + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (prbs_seed_init = '1') THEN + lfsr_q <= ("00000" & prbs_seed_i(14 DOWNTO 0)) ; + ELSIF (clk_en = '1') THEN + + lfsr_q(20) <= lfsr_q(19) ; + + lfsr_q(19) <= lfsr_q(18) ; + + lfsr_q(18) <= lfsr_q(20) XOR lfsr_q(17) ; + lfsr_q(17 DOWNTO 2) <= lfsr_q(16 DOWNTO 1) ; + + lfsr_q(1) <= lfsr_q(20) ; + END IF; + END IF; + END PROCESS; + + + PROCESS (lfsr_q(SEED_WIDTH - 1 DOWNTO 1), ZEROS) + BEGIN + prbs <= (ZEROS(SEED_WIDTH - 1 DOWNTO 6) & lfsr_q(6 DOWNTO 1)); + END PROCESS; + + + END GENERATE; + + prbs_o <= prbs; + +END trans; + + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/data_prbs_gen.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/data_prbs_gen.vhd new file mode 100755 index 0000000..b372d7a --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/data_prbs_gen.vhd @@ -0,0 +1,135 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: data_prbs_gen.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:16:39 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This module is used LFSR to generate random data for memory +-- data write or memory data read comparison.The first data is +-- seeded by the input prbs_seed_i which is connected to memory address. +-- Reference: +-- Revision History: + +--***************************************************************************** + + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + + +ENTITY data_prbs_gen IS + GENERIC ( + EYE_TEST : STRING := "FALSE"; + PRBS_WIDTH : INTEGER := 32; + SEED_WIDTH : INTEGER := 32 +-- TAPS : STD_LOGIC_VECTOR(PRBS_WIDTH - 1 DOWNTO 0) := "10000000001000000000000001100010" + ); + PORT ( + + clk_i : IN STD_LOGIC; + clk_en : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + prbs_fseed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + prbs_seed_init : IN STD_LOGIC; + prbs_seed_i : IN STD_LOGIC_VECTOR(PRBS_WIDTH - 1 DOWNTO 0); + + prbs_o : OUT STD_LOGIC_VECTOR(PRBS_WIDTH - 1 DOWNTO 0) + ); +END data_prbs_gen; + +ARCHITECTURE trans OF data_prbs_gen IS + + SIGNAL prbs : STD_LOGIC_VECTOR(PRBS_WIDTH - 1 DOWNTO 0); + SIGNAL lfsr_q : STD_LOGIC_VECTOR(PRBS_WIDTH DOWNTO 1); + SIGNAL i : INTEGER; +BEGIN + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (((prbs_seed_init = '1') AND (EYE_TEST = "FALSE")) OR (rst_i = '1')) THEN + + + lfsr_q <= prbs_seed_i + prbs_fseed_i(31 DOWNTO 0) + "01010101010101010101010101010101"; + ELSIF (clk_en = '1') THEN + + lfsr_q(32 DOWNTO 9) <= lfsr_q(31 DOWNTO 8); + lfsr_q(8) <= lfsr_q(32) XOR lfsr_q(7); + lfsr_q(7) <= lfsr_q(32) XOR lfsr_q(6); + + lfsr_q(6 DOWNTO 4) <= lfsr_q(5 DOWNTO 3); + lfsr_q(3) <= lfsr_q(32) XOR lfsr_q(2); + lfsr_q(2) <= lfsr_q(1); + + lfsr_q(1) <= lfsr_q(32); + END IF; + END IF; + END PROCESS; + + + PROCESS (lfsr_q(PRBS_WIDTH DOWNTO 1)) + BEGIN + prbs <= lfsr_q(PRBS_WIDTH DOWNTO 1); + END PROCESS; + + + prbs_o <= prbs; + +END trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/init_mem_pattern_ctr.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/init_mem_pattern_ctr.vhd new file mode 100755 index 0000000..49d24e3 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/init_mem_pattern_ctr.vhd @@ -0,0 +1,620 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: init_mem_pattern_ctr.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:16:39 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This moduel has a small FSM to control the operation of +-- mcb_traffic_gen module.It first fill up the memory with a selected +-- DATA pattern and then starts the memory testing state. +-- Reference: +-- Revision History: 1.1 Modify to allow data_mode_o to be controlled by parameter DATA_MODE +-- and the fixed_bl_o is fixed at 64 if data_mode_o == PRBS and FAMILY == "SPARTAN6" +-- The fixed_bl_o in Virtex6 is determined by the MEM_BURST_LENGTH. +-- 1.2 05/19/2010 If MEM_BURST_LEN value is passed with value of zero, it is treated as +-- "OTF" Burst Mode and TG will only generate BL 8 traffic. + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + USE ieee.numeric_std.all; + + +ENTITY init_mem_pattern_ctr IS + GENERIC ( + FAMILY : STRING := "SPARTAN6"; + TST_MEM_INSTR_MODE : STRING := "R_W_INSTR_MODE"; + MEM_BURST_LEN : INTEGER := 8; + CMD_PATTERN : STRING := "CGEN_ALL"; + BEGIN_ADDRESS : std_logic_vector(31 downto 0) := X"00000000"; + END_ADDRESS : std_logic_vector(31 downto 0) := X"00000fff"; + ADDR_WIDTH : INTEGER := 30; + DWIDTH : INTEGER := 32; + CMD_SEED_VALUE : std_logic_vector(31 downto 0) := X"12345678"; + DATA_SEED_VALUE : std_logic_vector(31 downto 0) := X"ca345675"; + DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + PORT_MODE : STRING := "BI_MODE"; + EYE_TEST : STRING := "FALSE" + + ); + PORT ( + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + mcb_cmd_bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + mcb_cmd_en_i : IN STD_LOGIC; + mcb_cmd_instr_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + mcb_wr_en_i : IN STD_LOGIC; + vio_modify_enable : IN STD_LOGIC; + vio_data_mode_value : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + vio_addr_mode_value : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + vio_bl_mode_value : IN STD_LOGIC_VECTOR(1 DOWNTO 0); + vio_fixed_bl_value : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + mcb_init_done_i : IN STD_LOGIC; + cmp_error : IN STD_LOGIC; + run_traffic_o : OUT STD_LOGIC; + start_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + end_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + cmd_seed_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + data_seed_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + load_seed_o : OUT STD_LOGIC; + addr_mode_o : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); + instr_mode_o : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); + bl_mode_o : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); + data_mode_o : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); + mode_load_o : OUT STD_LOGIC; + fixed_bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); + fixed_instr_o : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); + fixed_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) + ); +END init_mem_pattern_ctr; + +ARCHITECTURE trans OF init_mem_pattern_ctr IS + + constant IDLE : std_logic_vector(4 downto 0) := "00001"; + constant INIT_MEM_WRITE : std_logic_vector(4 downto 0) := "00010"; + constant INIT_MEM_READ : std_logic_vector(4 downto 0) := "00100"; + constant TEST_MEM : std_logic_vector(4 downto 0) := "01000"; + constant CMP_ERROR1 : std_logic_vector(4 downto 0) := "10000"; + + constant BRAM_ADDR : std_logic_vector(1 downto 0) := "00"; + constant FIXED_ADDR : std_logic_vector(2 downto 0) := "001"; + constant PRBS_ADDR : std_logic_vector(2 downto 0) := "010"; + constant SEQUENTIAL_ADDR : std_logic_vector(2 downto 0) := "011"; + + constant BRAM_INSTR_MODE : std_logic_vector(3 downto 0) := "0000"; + constant FIXED_INSTR_MODE : std_logic_vector(3 downto 0) := "0001"; + constant FIXED_INSTR_MODE_WITH_REFRESH : std_logic_vector(3 downto 0) := "0110"; + + constant R_W_INSTR_MODE : std_logic_vector(3 downto 0) := "0010"; + constant RP_WP_INSTR_MODE : std_logic_vector(3 downto 0) := "0011"; + constant R_RP_W_WP_INSTR_MODE : std_logic_vector(3 downto 0) := "0100"; + constant R_RP_W_WP_REF_INSTR_MODE : std_logic_vector(3 downto 0) := "0101"; + + constant BRAM_BL_MODE : std_logic_vector(1 downto 0) := "00"; + constant FIXED_BL_MODE : std_logic_vector(1 downto 0) := "01"; + constant PRBS_BL_MODE : std_logic_vector(1 downto 0) := "10"; + + constant BRAM_DATAL_MODE : std_logic_vector(3 downto 0) := "0000"; + constant FIXED_DATA_MODE : std_logic_vector(3 downto 0) := "0001"; + constant ADDR_DATA_MODE : std_logic_vector(3 downto 0) := "0010"; + constant HAMMER_DATA_MODE : std_logic_vector(3 downto 0) := "0011"; + constant NEIGHBOR_DATA_MODE : std_logic_vector(3 downto 0) := "0100"; + constant WALKING1_DATA_MODE : std_logic_vector(3 downto 0) := "0101"; + constant WALKING0_DATA_MODE : std_logic_vector(3 downto 0) := "0110"; + constant PRBS_DATA_MODE : std_logic_vector(3 downto 0) := "0111"; + + constant RD_INSTR : std_logic_vector(2 downto 0) := "001"; + constant RDP_INSTR : std_logic_vector(2 downto 0) := "011"; + constant WR_INSTR : std_logic_vector(2 downto 0) := "000"; + + constant WRP_INSTR : std_logic_vector(2 downto 0) := "010"; + constant REFRESH_INSTR : std_logic_vector(2 downto 0) := "100"; + constant NOP_WR_INSTR : std_logic_vector(2 downto 0) := "101"; + + SIGNAL current_state : STD_LOGIC_VECTOR(4 DOWNTO 0); + SIGNAL next_state : STD_LOGIC_VECTOR(4 DOWNTO 0); + SIGNAL mcb_init_done_reg : STD_LOGIC; + SIGNAL mcb_init_done_reg1 : STD_LOGIC; + SIGNAL AC2_G_E2 : STD_LOGIC; + SIGNAL AC1_G_E1 : STD_LOGIC; + SIGNAL AC3_G_E3 : STD_LOGIC; + SIGNAL upper_end_matched : STD_LOGIC; + SIGNAL end_boundary_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + + SIGNAL mcb_cmd_en_r : STD_LOGIC; + SIGNAL mcb_cmd_bl_r : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL lower_end_matched : STD_LOGIC; + SIGNAL end_addr_reached : STD_LOGIC; + SIGNAL run_traffic : STD_LOGIC; + SIGNAL current_address : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL fix_bl_value : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL data_mode_sel : STD_LOGIC_VECTOR(3 DOWNTO 0); + SIGNAL addr_mode_sel : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL bl_mode_sel : STD_LOGIC_VECTOR(1 DOWNTO 0); + SIGNAL addr_mode : STD_LOGIC_VECTOR(2 DOWNTO 0); +-- SIGNAL data_mode1 : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL INC_COUNTS : STD_LOGIC_VECTOR(10 DOWNTO 0); + SIGNAL FIXEDBL : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL FIXED_BL_VALUE : STD_LOGIC_VECTOR(6 DOWNTO 0); + + SIGNAL bram_mode_enable : STD_LOGIC; + SIGNAL syn1_vio_data_mode_value : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL syn1_vio_addr_mode_value : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL test_mem_instr_mode : STD_LOGIC_VECTOR(3 DOWNTO 0); + -- Declare intermediate signals for referenced outputs + SIGNAL bl_mode_o_xhdl0 : STD_LOGIC_VECTOR(1 DOWNTO 0); + SIGNAL data_mode_reg : STD_LOGIC_VECTOR(3 DOWNTO 0); + +BEGIN + + +test_mem_instr_mode <= "0000" when TST_MEM_INSTR_MODE = "BRAM_INSTR_MODE" else + "0001" when (TST_MEM_INSTR_MODE = "FIXED_INSTR_R_MODE") OR + (TST_MEM_INSTR_MODE = "FIXED_INSTR_W_MODE") else + "0010" when TST_MEM_INSTR_MODE = "R_W_INSTR_MODE" else + "0011" when (TST_MEM_INSTR_MODE = "RP_WP_INSTR_MODE" AND + FAMILY = "SPARTAN6") else + "0100" when (TST_MEM_INSTR_MODE = "R_RP_W_WP_INSTR_MODE" AND + FAMILY = "SPARTAN6")else + "0101" when (TST_MEM_INSTR_MODE = "R_RP_W_WP_REF_INSTR_MODE"AND + FAMILY = "SPARTAN6") else + "0010" ; + -- Drive referenced outputs + bl_mode_o <= bl_mode_o_xhdl0; + FIXEDBL <= "000000"; + xhdl1 : IF (FAMILY = "SPARTAN6") GENERATE + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + INC_COUNTS <= std_logic_vector(to_unsigned(DWIDTH/8,11)); + END IF; + END PROCESS; + + END GENERATE; + xhdl2 : IF (FAMILY = "VIRTEX6") GENERATE + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (DWIDTH >= 256 AND DWIDTH <= 576) THEN + INC_COUNTS <= "00000100000"; + ELSIF ((DWIDTH >= 128) AND (DWIDTH <= 224)) THEN + INC_COUNTS <= "00000010000"; + ELSIF ((DWIDTH = 64) OR (DWIDTH = 96)) THEN + INC_COUNTS <= "00000001000"; + ELSIF (DWIDTH = 32) THEN + INC_COUNTS <= "00000000100"; + END IF; + END IF; + END PROCESS; + + END GENERATE; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i = '1') THEN + current_address <= BEGIN_ADDRESS; + ELSIF ( +-- ((mcb_wr_en_i = '1' AND (current_state = INIT_MEM_WRITE AND ((PORT_MODE = "WR_MODE") OR (PORT_MODE = "BI_MODE")))) OR + (mcb_wr_en_i = '1' AND (current_state = INIT_MEM_WRITE AND (PORT_MODE = "WR_MODE" OR PORT_MODE = "BI_MODE"))) OR + + (mcb_wr_en_i = '1' AND (current_state = IDLE AND PORT_MODE = "RD_MODE" )) + ) THEN + current_address <= current_address + ("000000000000000000000" & INC_COUNTS); + ELSE + current_address <= current_address; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (current_address(29 DOWNTO 24) >= end_boundary_addr(29 DOWNTO 24)) THEN + AC3_G_E3 <= '1'; + ELSE + AC3_G_E3 <= '0'; + END IF; + IF (current_address(23 DOWNTO 16) >= end_boundary_addr(23 DOWNTO 16)) THEN + AC2_G_E2 <= '1'; + ELSE + AC2_G_E2 <= '0'; + END IF; + IF (current_address(15 DOWNTO 8) >= end_boundary_addr(15 DOWNTO 8)) THEN + AC1_G_E1 <= '1'; + ELSE + AC1_G_E1 <= '0'; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i = '1') THEN + upper_end_matched <= '0'; + ELSIF (mcb_cmd_en_i = '1') THEN + upper_end_matched <= AC3_G_E3 AND AC2_G_E2 AND AC1_G_E1; + END IF; + END IF; + END PROCESS; + + FIXED_BL_VALUE <= "0000010" WHEN ((FAMILY = "VIRTEX6") AND ((MEM_BURST_LEN = 8) OR (MEM_BURST_LEN = 0))) ELSE + "0000001" WHEN ((FAMILY = "VIRTEX6") AND (MEM_BURST_LEN = 4)) ELSE + ('0' & FIXEDBL); + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + end_boundary_addr <= std_logic_vector(to_unsigned((to_integer(unsigned(END_ADDRESS)) - (DWIDTH / 8) + 1),32)); + + + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (current_address(7 DOWNTO 0) >= end_boundary_addr(7 DOWNTO 0)) THEN + lower_end_matched <= '1'; + ELSE + lower_end_matched <= '0'; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (mcb_cmd_en_i = '1') THEN + mcb_cmd_bl_r <= mcb_cmd_bl_i; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (((upper_end_matched = '1' AND lower_end_matched = '1') AND FAMILY = "SPARTAN6" AND (DWIDTH = 32)) OR + ((upper_end_matched = '1' AND lower_end_matched = '1') AND FAMILY = "SPARTAN6" AND (DWIDTH = 64)) OR + (upper_end_matched = '1' AND DWIDTH = 128 AND FAMILY = "SPARTAN6") OR + ((upper_end_matched = '1' AND lower_end_matched = '1') AND FAMILY = "VIRTEX6")) THEN + end_addr_reached <= '1'; + ELSE + end_addr_reached <= '0'; + END IF; + END IF; + END PROCESS; + + fixed_addr_o <= "00000000000000000001001000110100"; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + mcb_init_done_reg1 <= mcb_init_done_i; + mcb_init_done_reg <= mcb_init_done_reg1; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + run_traffic_o <= run_traffic; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i = '1') THEN + current_state <= "00001"; + ELSE + current_state <= next_state; + END IF; + END IF; + END PROCESS; + + + start_addr_o <= BEGIN_ADDRESS; + end_addr_o <= END_ADDRESS; + cmd_seed_o <= CMD_SEED_VALUE; + data_seed_o <= DATA_SEED_VALUE; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i = '1') THEN + syn1_vio_data_mode_value <= "011"; + syn1_vio_addr_mode_value <= "011"; + ELSIF (vio_modify_enable = '1') THEN + syn1_vio_data_mode_value <= vio_data_mode_value; + syn1_vio_addr_mode_value <= vio_addr_mode_value; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i = '1') THEN + data_mode_sel <= DATA_MODE; --"0101" ADDR_DATA_MODE; + addr_mode_sel <= "011"; + ELSIF (vio_modify_enable = '1') THEN + data_mode_sel <= '0' & syn1_vio_data_mode_value(2 DOWNTO 0); + addr_mode_sel <= vio_addr_mode_value; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i = '1') OR (FAMILY = "VIRTEX6")) THEN + fix_bl_value <= FIXED_BL_VALUE(5 DOWNTO 0); + ELSIF (vio_modify_enable = '1') THEN + fix_bl_value <= vio_fixed_bl_value; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i = '1' OR (FAMILY = "VIRTEX6")) THEN + IF (FAMILY = "VIRTEX6") THEN + bl_mode_sel <= FIXED_BL_MODE; + ELSE + bl_mode_sel <= PRBS_BL_MODE; + END IF; + ELSIF (vio_modify_enable = '1') THEN + bl_mode_sel <= vio_bl_mode_value; + END IF; + END IF; + END PROCESS; + + data_mode_o <= data_mode_reg; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + data_mode_reg <= data_mode_sel; + addr_mode_o <= addr_mode; + IF (syn1_vio_addr_mode_value = 0 AND vio_modify_enable = '1') THEN + bram_mode_enable <= '1'; + ELSE + bram_mode_enable <= '0'; + END IF; + + + END IF; + END PROCESS; + + + PROCESS (FIXED_BL_VALUE,fix_bl_value,bram_mode_enable,test_mem_instr_mode, current_state, mcb_init_done_reg, end_addr_reached, cmp_error, bl_mode_sel, addr_mode_sel, data_mode_reg,bl_mode_o_xhdl0) + BEGIN + load_seed_o <= '0'; + IF (CMD_PATTERN = "CGEN_BRAM" or bram_mode_enable = '1') THEN + addr_mode <= (others => '0'); + ELSE + addr_mode <= SEQUENTIAL_ADDR; + END IF; + + IF (CMD_PATTERN = "CGEN_BRAM" or bram_mode_enable = '1') THEN + instr_mode_o <= (others => '0'); + ELSE + instr_mode_o <= FIXED_INSTR_MODE; + END IF; + + + IF (CMD_PATTERN = "CGEN_BRAM" or bram_mode_enable = '1') THEN + bl_mode_o_xhdl0 <= (others => '0'); + ELSE + bl_mode_o_xhdl0 <= FIXED_BL_MODE; + END IF; +-- data_mode1 <= WALKING1_DATA_MODE; + + IF (FAMILY = "VIRTEX6") THEN + fixed_bl_o <= FIXED_BL_VALUE(5 downto 0); --"000010"; --2 + -- PRBS mode + else if (data_mode_reg(2 downto 0) = "111" and FAMILY = "SPARTAN6") then + fixed_bl_o <= "000000";-- 64 Our current PRBS algorithm wants to maximize the range bl from 1 to 64. + else + fixed_bl_o <= fix_bl_value; + end if; + end if; + + mode_load_o <= '0'; + run_traffic <= '0'; + + next_state <= IDLE; + IF (PORT_MODE = "RD_MODE") THEN + fixed_instr_o <= RD_INSTR; + ELSIF (PORT_MODE = "WR_MODE" OR PORT_MODE = "BI_MODE") THEN + fixed_instr_o <= WR_INSTR; + END IF; + + CASE current_state IS + + WHEN IDLE => + IF (mcb_init_done_reg = '1') THEN + IF (PORT_MODE = "WR_MODE" OR PORT_MODE = "BI_MODE") THEN + next_state <= INIT_MEM_WRITE; + mode_load_o <= '1'; + run_traffic <= '0'; + load_seed_o <= '1'; + ELSIF (PORT_MODE = "RD_MODE" AND end_addr_reached = '1') THEN + next_state <= TEST_MEM; + mode_load_o <= '1'; + run_traffic <= '1'; + load_seed_o <= '1'; + END IF; + ELSE + next_state <= IDLE; + run_traffic <= '0'; + load_seed_o <= '0'; + END IF; + + WHEN INIT_MEM_WRITE => + IF (end_addr_reached = '1' AND EYE_TEST = "FALSE") THEN + next_state <= TEST_MEM; + mode_load_o <= '1'; + load_seed_o <= '1'; + run_traffic <= '1'; + ELSE + next_state <= INIT_MEM_WRITE; + run_traffic <= '1'; + mode_load_o <= '0'; + load_seed_o <= '0'; + IF (EYE_TEST = "TRUE") THEN + addr_mode <= FIXED_ADDR; + ELSIF (CMD_PATTERN = "CGEN_BRAM" OR bram_mode_enable = '1') THEN + addr_mode <= "000"; + ELSE + addr_mode <= SEQUENTIAL_ADDR; + END IF; + END IF; + + WHEN INIT_MEM_READ => + IF (end_addr_reached = '1') THEN + next_state <= TEST_MEM; + mode_load_o <= '1'; + load_seed_o <= '1'; + ELSE + next_state <= INIT_MEM_READ; + run_traffic <= '0'; + mode_load_o <= '0'; + load_seed_o <= '0'; + END IF; + + WHEN TEST_MEM => + IF (cmp_error = '1') THEN + next_state <= CMP_ERROR1; + ELSE + next_state <= TEST_MEM; + END IF; + + run_traffic <= '1'; + + + IF (PORT_MODE = "BI_MODE" AND TST_MEM_INSTR_MODE = "FIXED_INSTR_W_MODE") THEN + fixed_instr_o <= WR_INSTR; + ELSIF (PORT_MODE = "BI_MODE" AND TST_MEM_INSTR_MODE = "FIXED_INSTR_R_MODE") THEN + fixed_instr_o <= RD_INSTR; + + ELSIF (PORT_MODE = "RD_MODE") THEN + fixed_instr_o <= RD_INSTR; + ELSIF (PORT_MODE = "WR_MODE") THEN + fixed_instr_o <= WR_INSTR; + END IF; + + if (FAMILY = "VIRTEX6") then + fixed_bl_o <= fix_bl_value; --"000010"; 2 + else if ((data_mode_reg = "0111") and (FAMILY = "SPARTAN6")) then + fixed_bl_o <= "000000"; -- 64 Our current PRBS algorithm wants to maximize the range bl from 1 to 64. + else + fixed_bl_o <= fix_bl_value; + end if; + end if; + + bl_mode_o_xhdl0 <= bl_mode_sel; + IF (bl_mode_o_xhdl0 = PRBS_BL_MODE) THEN + addr_mode <= PRBS_ADDR; + ELSE + addr_mode <= addr_mode_sel; + END IF; + + IF (PORT_MODE = "BI_MODE") THEN + IF (CMD_PATTERN = "CGEN_BRAM" OR bram_mode_enable = '1') THEN + instr_mode_o <= BRAM_INSTR_MODE; + ELSE + instr_mode_o <= test_mem_instr_mode; + --R_RP_W_WP_REF_INSTR_MODE;--FIXED_INSTR_MODE;--R_W_INSTR_MODE;--R_RP_W_WP_INSTR_MODE;--R_W_INSTR_MODE; + --R_W_INSTR_MODE; --FIXED_INSTR_MODE;-- + END IF; + ELSIF (PORT_MODE = "RD_MODE" OR PORT_MODE = "WR_MODE") THEN + instr_mode_o <= FIXED_INSTR_MODE; + END IF; + + WHEN CMP_ERROR1 => + next_state <= CMP_ERROR1; + bl_mode_o_xhdl0 <= bl_mode_sel; + fixed_instr_o <= RD_INSTR; + addr_mode <= SEQUENTIAL_ADDR; + IF (CMD_PATTERN = "CGEN_BRAM" OR bram_mode_enable = '1') THEN + instr_mode_o <= BRAM_INSTR_MODE; + ELSE + instr_mode_o <= test_mem_instr_mode; + --R_W_INSTR_MODE;--R_W_INSTR_MODE; --FIXED_INSTR_MODE;-- + END IF; + run_traffic <= '1'; + + WHEN OTHERS => + next_state <= IDLE; + END CASE; + END PROCESS; + + +END trans; + + + + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/mcb_flow_control.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/mcb_flow_control.vhd new file mode 100755 index 0000000..123ba93 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/mcb_flow_control.vhd @@ -0,0 +1,539 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: mcb_flow_control.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:16:40 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This module is the main flow control between cmd_gen.v, +-- write_data_path and read_data_path modules. +-- Reference: +-- Revision History: + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + USE ieee.numeric_std.all; + + +ENTITY mcb_flow_control IS + GENERIC ( + TCQ : TIME := 100 ps; + FAMILY : STRING := "SPARTAN6" + ); + PORT ( + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC_VECTOR(9 DOWNTO 0); + cmd_rdy_o : OUT STD_LOGIC; + cmd_valid_i : IN STD_LOGIC; + cmd_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + mcb_cmd_full : IN STD_LOGIC; + cmd_o : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); + addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); + cmd_en_o : OUT STD_LOGIC; + last_word_wr_i : IN STD_LOGIC; + wdp_rdy_i : IN STD_LOGIC; + wdp_valid_o : OUT STD_LOGIC; + wdp_validB_o : OUT STD_LOGIC; + wdp_validC_o : OUT STD_LOGIC; + wr_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + wr_bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); + last_word_rd_i : IN STD_LOGIC; + rdp_rdy_i : IN STD_LOGIC; + rdp_valid_o : OUT STD_LOGIC; + rd_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + rd_bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0) + ); +END mcb_flow_control; + +ARCHITECTURE trans OF mcb_flow_control IS + + constant READY : std_logic_vector(4 downto 0) := "00001"; + constant READ : std_logic_vector(4 downto 0) := "00010"; + constant WRITE : std_logic_vector(4 downto 0) := "00100"; + constant CMD_WAIT : std_logic_vector(4 downto 0) := "01000"; + constant REFRESH_ST : std_logic_vector(4 downto 0) := "10000"; + + constant RD : std_logic_vector(2 downto 0) := "001"; + constant RDP : std_logic_vector(2 downto 0) := "011"; + constant WR : std_logic_vector(2 downto 0) := "000"; + constant WRP : std_logic_vector(2 downto 0) := "010"; + constant REFRESH : std_logic_vector(2 downto 0) := "100"; + constant NOP : std_logic_vector(2 downto 0) := "101"; + + SIGNAL cmd_fifo_rdy : STD_LOGIC; + SIGNAL cmd_rd : STD_LOGIC; + SIGNAL cmd_wr : STD_LOGIC; + SIGNAL cmd_others : STD_LOGIC; + SIGNAL push_cmd : STD_LOGIC; + SIGNAL xfer_cmd : STD_LOGIC; + SIGNAL rd_vld : STD_LOGIC; + SIGNAL wr_vld : STD_LOGIC; + SIGNAL cmd_rdy : STD_LOGIC; + SIGNAL cmd_reg : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL addr_reg : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL bl_reg : STD_LOGIC_VECTOR(5 DOWNTO 0); + + SIGNAL rdp_valid : STD_LOGIC; + SIGNAL wdp_valid : STD_LOGIC; + SIGNAL wdp_validB : STD_LOGIC; + SIGNAL wdp_validC : STD_LOGIC; + + SIGNAL current_state : STD_LOGIC_VECTOR(4 DOWNTO 0); + SIGNAL next_state : STD_LOGIC_VECTOR(4 DOWNTO 0); + SIGNAL tstpointA : STD_LOGIC_VECTOR(3 DOWNTO 0); + SIGNAL push_cmd_r : STD_LOGIC; + SIGNAL wait_done : STD_LOGIC; + SIGNAL cmd_en_r1 : STD_LOGIC; + SIGNAL wr_in_progress : STD_LOGIC; + SIGNAL tst_cmd_rdy_o : STD_LOGIC; + + SIGNAL cmd_wr_pending_r1 : STD_LOGIC; + SIGNAL cmd_rd_pending_r1 : STD_LOGIC; + + -- Declare intermediate signals for referenced outputs + SIGNAL cmd_rdy_o_xhdl0 : STD_LOGIC; +BEGIN + -- Drive referenced outputs + cmd_rdy_o <= cmd_rdy_o_xhdl0; + cmd_en_o <= cmd_en_r1; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + cmd_rdy_o_xhdl0 <= cmd_rdy; + tst_cmd_rdy_o <= cmd_rdy; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(8)) = '1') THEN + cmd_en_r1 <= '0' ; + ELSIF (xfer_cmd = '1') THEN + cmd_en_r1 <= '1' ; + ELSIF ((NOT(mcb_cmd_full)) = '1') THEN + cmd_en_r1 <= '0' ; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(9)) = '1') THEN + cmd_fifo_rdy <= '1'; + ELSIF (xfer_cmd = '1') THEN + cmd_fifo_rdy <= '0'; + ELSIF ((NOT(mcb_cmd_full)) = '1') THEN + cmd_fifo_rdy <= '1'; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(9)) = '1') THEN + addr_o <= (others => '0'); + cmd_o <= (others => '0'); + bl_o <= (others => '0'); + ELSIF (xfer_cmd = '1') THEN + addr_o <= addr_reg; + IF (FAMILY = "SPARTAN6") THEN + cmd_o <= cmd_reg; + ELSE + cmd_o <= ("00" & cmd_reg(0)); + END IF; + bl_o <= bl_reg; + END IF; + END IF; + END PROCESS; + + wr_addr_o <= addr_i; + rd_addr_o <= addr_i; + rd_bl_o <= bl_i; + wr_bl_o <= bl_i; + wdp_valid_o <= wdp_valid; + wdp_validB_o <= wdp_validB; + wdp_validC_o <= wdp_validC; + rdp_valid_o <= rdp_valid; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_i(8)) = '1') THEN + wait_done <= '1' ; + ELSIF (push_cmd_r = '1') THEN + wait_done <= '1' ; + ELSIF ((cmd_rdy_o_xhdl0 AND cmd_valid_i) = '1' AND FAMILY = "SPARTAN6") THEN + wait_done <= '0' ; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + push_cmd_r <= push_cmd ; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (push_cmd = '1') THEN + cmd_reg <= cmd_i ; + addr_reg <= addr_i ; + bl_reg <= bl_i - "000001" ; + END IF; + END IF; + END PROCESS; + + cmd_wr <= '1' WHEN (((cmd_i = WR) OR (cmd_i = WRP)) AND (cmd_valid_i = '1')) ELSE + '0'; + cmd_rd <= '1' WHEN (((cmd_i = RD) OR (cmd_i = RDP)) AND (cmd_valid_i = '1')) ELSE + '0'; + cmd_others <= '1' WHEN ((cmd_i(2) = '1') AND (cmd_valid_i = '1') AND (FAMILY = "SPARTAN6")) ELSE + '0'; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i(0)= '1') THEN + + cmd_wr_pending_r1 <= '0' ; + ELSIF (last_word_wr_i = '1') THEN + + cmd_wr_pending_r1 <= '1' ; + ELSIF (push_cmd = '1') THEN + cmd_wr_pending_r1 <= '0' ; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((cmd_rd AND push_cmd) = '1') THEN + cmd_rd_pending_r1 <= '1' ; + ELSIF (xfer_cmd = '1') THEN + + cmd_rd_pending_r1 <= '0' ; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i(0)= '1') THEN + wr_in_progress <= '0'; + ELSIF (last_word_wr_i = '1') THEN + wr_in_progress <= '0'; + ELSIF (current_state = WRITE) THEN + + wr_in_progress <= '1'; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_i(0)= '1') THEN + current_state <= "00001" ; + ELSE + current_state <= next_state ; + END IF; + END IF; + END PROCESS; + + + PROCESS (current_state, rdp_rdy_i, cmd_rd, cmd_fifo_rdy, wdp_rdy_i, cmd_wr, last_word_rd_i, cmd_others, last_word_wr_i, cmd_valid_i, wait_done, wr_in_progress, cmd_wr_pending_r1) + BEGIN + push_cmd <= '0'; + + xfer_cmd <= '0'; + wdp_valid <= '0'; + wdp_validB <= '0'; + + wdp_validC <= '0'; + rdp_valid <= '0'; + cmd_rdy <= '0'; + next_state <= current_state; + CASE current_state IS + + WHEN READY => + IF ((rdp_rdy_i AND cmd_rd AND cmd_fifo_rdy) = '1') THEN + next_state <= READ; + push_cmd <= '1'; + xfer_cmd <= '0'; + rdp_valid <= '1'; + + ELSIF ((wdp_rdy_i AND cmd_wr AND cmd_fifo_rdy) = '1') THEN + next_state <= WRITE; + push_cmd <= '1'; + wdp_valid <= '1'; + wdp_validB <= '1'; + wdp_validC <= '1'; + + ELSIF ((cmd_others AND cmd_fifo_rdy) = '1') THEN + next_state <= REFRESH_ST; + push_cmd <= '1'; + xfer_cmd <= '0'; + + ELSE + next_state <= READY; + push_cmd <= '0'; + END IF; + + IF (cmd_fifo_rdy = '1') THEN + cmd_rdy <= '1'; + ELSE + cmd_rdy <= '0'; + END IF; + + WHEN REFRESH_ST => + IF ((rdp_rdy_i AND cmd_rd AND cmd_fifo_rdy) = '1') THEN + next_state <= READ; + push_cmd <= '1'; + rdp_valid <= '1'; + wdp_valid <= '0'; + xfer_cmd <= '1'; + + ELSIF ((cmd_fifo_rdy AND cmd_wr AND wdp_rdy_i) = '1') THEN + next_state <= WRITE; + push_cmd <= '1'; + xfer_cmd <= '1'; + + wdp_valid <= '1'; + wdp_validB <= '1'; + wdp_validC <= '1'; + + ELSIF ((cmd_fifo_rdy and cmd_others) = '1') THEN + push_cmd <= '1'; + xfer_cmd <= '1'; + + ELSIF ((not(cmd_fifo_rdy)) = '1') THEN + next_state <= CMD_WAIT; + tstpointA <= "1001"; + + ELSE + next_state <= READ; + + END IF; + + IF ((cmd_fifo_rdy AND ((rdp_rdy_i AND cmd_rd) OR (wdp_rdy_i AND cmd_wr) OR (cmd_others))) = '1') THEN + cmd_rdy <= '1'; + ELSE + cmd_rdy <= '0'; + END IF; + + WHEN READ => + IF ((rdp_rdy_i AND cmd_rd AND cmd_fifo_rdy) = '1') THEN + next_state <= READ; + push_cmd <= '1'; + rdp_valid <= '1'; + wdp_valid <= '0'; + xfer_cmd <= '1'; + tstpointA <= "0101"; + ELSIF ((cmd_fifo_rdy AND cmd_wr AND wdp_rdy_i) = '1') THEN + next_state <= WRITE; + push_cmd <= '1'; + xfer_cmd <= '1'; + wdp_valid <= '1'; + wdp_validB <= '1'; + wdp_validC <= '1'; + tstpointA <= "0110"; + ELSIF ((NOT(rdp_rdy_i)) = '1') THEN + next_state <= READ; + push_cmd <= '0'; + xfer_cmd <= '0'; + tstpointA <= "0111"; + wdp_valid <= '0'; + wdp_validB <= '0'; + wdp_validC <= '0'; + rdp_valid <= '0'; + ELSIF ((last_word_rd_i AND cmd_others AND cmd_fifo_rdy) = '1') THEN + next_state <= REFRESH_ST; + push_cmd <= '1'; + xfer_cmd <= '1'; + wdp_valid <= '0'; + wdp_validB <= '0'; + wdp_validC <= '0'; + rdp_valid <= '0'; + tstpointA <= "1000"; + ELSIF ((NOT(cmd_fifo_rdy) OR NOT(wdp_rdy_i)) = '1') THEN + next_state <= CMD_WAIT; + tstpointA <= "1001"; + ELSE + next_state <= READ; + END IF; + + IF ((((rdp_rdy_i AND cmd_rd) OR (cmd_wr AND wdp_rdy_i) OR cmd_others) AND cmd_fifo_rdy) = '1') THEN + cmd_rdy <= wait_done; --'1'; + ELSE + cmd_rdy <= '0'; + END IF; + + WHEN WRITE => + IF ((cmd_fifo_rdy AND cmd_rd AND rdp_rdy_i AND last_word_wr_i) = '1') THEN + next_state <= READ; + push_cmd <= '1'; + xfer_cmd <= '1'; + rdp_valid <= '1'; + tstpointA <= "0000"; + ELSIF ((NOT(wdp_rdy_i) OR (wdp_rdy_i AND cmd_wr AND cmd_fifo_rdy AND last_word_wr_i)) = '1') THEN + next_state <= WRITE; + tstpointA <= "0001"; + IF ((cmd_wr AND last_word_wr_i) = '1') THEN + wdp_valid <= '1'; + wdp_validB <= '1'; + wdp_validC <= '1'; + ELSE + wdp_valid <= '0'; + wdp_validB <= '0'; + wdp_validC <= '0'; + END IF; + IF (last_word_wr_i = '1') THEN + push_cmd <= '1'; + xfer_cmd <= '1'; + ELSE + push_cmd <= '0'; + xfer_cmd <= '0'; + END IF; + ELSIF ((last_word_wr_i AND cmd_others AND cmd_fifo_rdy) = '1') THEN + next_state <= REFRESH_ST; + push_cmd <= '1'; + xfer_cmd <= '1'; + tstpointA <= "0010"; + wdp_valid <= '0'; + wdp_validB <= '0'; + wdp_validC <= '0'; + rdp_valid <= '0'; + ELSIF ((((NOT(cmd_fifo_rdy)) AND last_word_wr_i) OR (NOT(rdp_rdy_i)) OR (NOT(cmd_valid_i) AND wait_done)) = '1') THEN + next_state <= CMD_WAIT; + push_cmd <= '0'; + xfer_cmd <= '0'; + tstpointA <= "0011"; + ELSE + next_state <= WRITE; + tstpointA <= "0100"; + END IF; + IF ((last_word_wr_i AND (cmd_others OR (rdp_rdy_i AND cmd_rd) OR (cmd_wr AND wdp_rdy_i)) AND cmd_fifo_rdy) = '1') THEN + cmd_rdy <= wait_done; + ELSE + cmd_rdy <= '0'; + END IF; + + WHEN CMD_WAIT => + IF ((NOT(cmd_fifo_rdy) OR wr_in_progress) = '1') THEN + next_state <= CMD_WAIT; + cmd_rdy <= '0'; + tstpointA <= "1010"; + ELSIF ((cmd_fifo_rdy AND rdp_rdy_i AND cmd_rd) = '1') THEN + next_state <= READ; + push_cmd <= '1'; + xfer_cmd <= '1'; + cmd_rdy <= '1'; + rdp_valid <= '1'; + tstpointA <= "1011"; + ELSIF ((cmd_fifo_rdy AND cmd_wr AND (wait_done OR cmd_wr_pending_r1)) = '1') THEN + next_state <= WRITE; + push_cmd <= '1'; + xfer_cmd <= '1'; + wdp_valid <= '1'; + wdp_validB <= '1'; + wdp_validC <= '1'; + cmd_rdy <= '1'; + tstpointA <= "1100"; + ELSIF ((cmd_fifo_rdy AND cmd_others) = '1') THEN + next_state <= REFRESH_ST; + push_cmd <= '1'; + xfer_cmd <= '1'; + tstpointA <= "1101"; + cmd_rdy <= '1'; + ELSE + next_state <= CMD_WAIT; + tstpointA <= "1110"; + IF (((wdp_rdy_i AND rdp_rdy_i)) = '1') THEN + cmd_rdy <= '1'; + ELSE + cmd_rdy <= '0'; + END IF; + END IF; + + WHEN OTHERS => + push_cmd <= '0'; + xfer_cmd <= '0'; + wdp_valid <= '0'; + wdp_validB <= '0'; + wdp_validC <= '0'; + next_state <= READY; + END CASE; + END PROCESS; + + +END trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/mcb_traffic_gen.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/mcb_traffic_gen.vhd new file mode 100755 index 0000000..bb23d62 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/mcb_traffic_gen.vhd @@ -0,0 +1,1001 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: mcb_traffic_gen.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/05/27 15:50:28 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This is top level module of memory traffic generator which can +-- generate different CMD_PATTERN and DATA_PATTERN to Spartan 6 +-- hard memory controller core. +-- Reference: +-- Revision History: 2009 Brought out internal signals cmp_data and cmp_error as outputs. +-- 2010/01/09 Removed the rd_mdata_afull_set term in signal rdpath_data_valid_i . +-- 2010/05/03 Removed local generated version of mcb_rd_empty and mcb_wr_full in TG. +-- 2010/05/20 If MEM_BURST_LEN value is passed with value of zero, it is treated as +-- "OTF" Burst Mode and TG will only generate BL 8 traffic. + +--***************************************************************************** + + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + USE ieee.numeric_std.all; + +ENTITY mcb_traffic_gen IS + GENERIC ( + TCQ : TIME := 100 ps; + FAMILY : STRING := "SPARTAN6"; + SIMULATION : STRING := "FALSE"; + MEM_BURST_LEN : INTEGER := 8; + PORT_MODE : STRING := "BI_MODE"; + DATA_PATTERN : STRING := "DGEN_ADDR"; + CMD_PATTERN : STRING := "CGEN_ALL"; + + ADDR_WIDTH : INTEGER := 30; + + CMP_DATA_PIPE_STAGES : INTEGER := 0; + + MEM_COL_WIDTH : INTEGER := 10; + NUM_DQ_PINS : INTEGER := 16; + DQ_ERROR_WIDTH : integer := 1; + + SEL_VICTIM_LINE : INTEGER := 3; + DWIDTH : INTEGER := 32; + + EYE_TEST : STRING := "FALSE"; + + + PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"FFFFD000"; + PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_EADDR : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_SADDR : std_logic_vector(31 downto 0) := X"00005000" + ); + PORT ( + + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + run_traffic_i : IN STD_LOGIC; + manual_clear_error : IN STD_LOGIC; + start_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + end_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + cmd_seed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + data_seed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + load_seed_i : IN STD_LOGIC; + + addr_mode_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + + instr_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + + bl_mode_i : IN STD_LOGIC_VECTOR(1 DOWNTO 0); + + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + + mode_load_i : IN STD_LOGIC; + + fixed_bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + fixed_instr_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + + fixed_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + fixed_data_i : IN STD_LOGIC_VECTOR(DWIDTH-1 DOWNTO 0) := (others => '0'); + bram_cmd_i : IN STD_LOGIC_VECTOR(38 DOWNTO 0); + bram_valid_i : IN STD_LOGIC; + bram_rdy_o : OUT STD_LOGIC; + + mcb_cmd_en_o : OUT STD_LOGIC; + mcb_cmd_instr_o : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); + mcb_cmd_addr_o : OUT STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + mcb_cmd_bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); + + mcb_cmd_full_i : IN STD_LOGIC; + + mcb_wr_en_o : OUT STD_LOGIC; + mcb_wr_data_o : OUT STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + mcb_wr_data_end_o : OUT STD_LOGIC; + mcb_wr_mask_o : OUT STD_LOGIC_VECTOR((DWIDTH / 8) - 1 DOWNTO 0); + + mcb_wr_full_i : IN STD_LOGIC; + mcb_wr_fifo_counts : IN STD_LOGIC_VECTOR(6 DOWNTO 0); + + mcb_rd_en_o : OUT STD_LOGIC; + mcb_rd_data_i : IN STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + mcb_rd_empty_i : IN STD_LOGIC; + mcb_rd_fifo_counts : IN STD_LOGIC_VECTOR(6 DOWNTO 0); + counts_rst : IN STD_LOGIC; + wr_data_counts : OUT STD_LOGIC_VECTOR(47 DOWNTO 0); + rd_data_counts : OUT STD_LOGIC_VECTOR(47 DOWNTO 0); + + error : OUT STD_LOGIC; + cmp_data_valid : OUT STD_LOGIC; + + error_status : OUT STD_LOGIC_VECTOR(64 + (2 * DWIDTH - 1) DOWNTO 0); + cmp_error : out std_logic; + cmp_data : OUT STD_LOGIC_VECTOR( DWIDTH - 1 DOWNTO 0); + mem_rd_data : OUT STD_LOGIC_VECTOR( DWIDTH - 1 DOWNTO 0); + dq_error_bytelane_cmp :OUT STD_LOGIC_VECTOR(DQ_ERROR_WIDTH - 1 DOWNTO 0); + cumlative_dq_lane_error :OUT STD_LOGIC_VECTOR(DQ_ERROR_WIDTH - 1 DOWNTO 0) + + + ); +END mcb_traffic_gen; + +ARCHITECTURE trans OF mcb_traffic_gen IS + COMPONENT mcb_flow_control IS + GENERIC ( + TCQ : TIME := 100 ps; + FAMILY : string := "SPARTAN6" + ); + PORT ( + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC_VECTOR(9 DOWNTO 0); + cmd_rdy_o : OUT STD_LOGIC; + cmd_valid_i : IN STD_LOGIC; + cmd_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + mcb_cmd_full : IN STD_LOGIC; + cmd_o : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); + addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); + cmd_en_o : OUT STD_LOGIC; + last_word_wr_i : IN STD_LOGIC; + wdp_rdy_i : IN STD_LOGIC; + wdp_valid_o : OUT STD_LOGIC; + wdp_validB_o : OUT STD_LOGIC; + wdp_validC_o : OUT STD_LOGIC; + wr_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + wr_bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); + last_word_rd_i : IN STD_LOGIC; + rdp_rdy_i : IN STD_LOGIC; + rdp_valid_o : OUT STD_LOGIC; + rd_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + rd_bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0) + ); + END COMPONENT; + + COMPONENT cmd_gen IS + GENERIC ( + TCQ : TIME := 100 ps; + PORT_MODE : STRING := "BI_MODE"; + FAMILY : STRING := "SPARTAN6"; + MEM_BURST_LEN : INTEGER := 8; + NUM_DQ_PINS : INTEGER := 8; + DATA_PATTERN : STRING := "DGEN_PRBS"; + CMD_PATTERN : STRING := "CGEN_ALL"; + ADDR_WIDTH : INTEGER := 30; + DWIDTH : INTEGER := 32; + PIPE_STAGES : INTEGER := 0; + MEM_COL_WIDTH : INTEGER := 10; + PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"FFFFD000"; + PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_EADDR : std_logic_vector(31 downto 0) := X"00002000"; + PRBS_SADDR : std_logic_vector(31 downto 0) := X"00005000" + ); + PORT ( + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC_VECTOR(9 DOWNTO 0); + run_traffic_i : IN STD_LOGIC; + rd_buff_avail_i : IN STD_LOGIC_VECTOR(6 DOWNTO 0); + force_wrcmd_gen_i : IN STD_LOGIC; + start_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + end_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + cmd_seed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + data_seed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + load_seed_i : IN STD_LOGIC; + addr_mode_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + instr_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + bl_mode_i : IN STD_LOGIC_VECTOR(1 DOWNTO 0); + mode_load_i : IN STD_LOGIC; + fixed_bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + fixed_instr_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + fixed_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + bram_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + bram_instr_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + bram_bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + bram_valid_i : IN STD_LOGIC; + bram_rdy_o : OUT STD_LOGIC; + reading_rd_data_i : IN STD_LOGIC; + rdy_i : IN STD_LOGIC; + addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + instr_o : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); + bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); +-- m_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + cmd_o_vld : OUT STD_LOGIC + ); + END COMPONENT; + + + component afifo IS + GENERIC ( + TCQ : TIME := 100 ps; + DSIZE : INTEGER := 32; + FIFO_DEPTH : INTEGER := 16; + ASIZE : INTEGER := 4; + SYNC : INTEGER := 1 + ); + PORT ( + wr_clk : IN STD_LOGIC; + rst : IN STD_LOGIC; + wr_en : IN STD_LOGIC; + wr_data : IN STD_LOGIC_VECTOR(DSIZE - 1 DOWNTO 0); + rd_en : IN STD_LOGIC; + rd_clk : IN STD_LOGIC; + rd_data : OUT STD_LOGIC_VECTOR(DSIZE - 1 DOWNTO 0); + full : OUT STD_LOGIC; + almost_full : OUT STD_LOGIC; + empty : OUT STD_LOGIC + ); +END component; + +component read_data_path IS + GENERIC ( + TCQ : TIME := 100 ps; + + FAMILY : STRING := "SPARTAN6"; + MEM_BURST_LEN : INTEGER := 8; + ADDR_WIDTH : INTEGER := 32; + CMP_DATA_PIPE_STAGES : INTEGER := 3; + DWIDTH : INTEGER := 32; + DATA_PATTERN : STRING := "DGEN_PRBS"; --"DGEN__HAMMER", "DGEN_WALING1","DGEN_WALING0","DGEN_ADDR","DGEN_NEIGHBOR","DGEN_PRBS","DGEN_ALL" + NUM_DQ_PINS : INTEGER := 8; + DQ_ERROR_WIDTH : INTEGER := 1; + SEL_VICTIM_LINE : integer := 3; + MEM_COL_WIDTH : INTEGER := 10 + ); + PORT ( + + clk_i : IN STD_LOGIC; + rst_i : in std_logic_vector(9 downto 0); + manual_clear_error : IN STD_LOGIC; + cmd_rdy_o : OUT STD_LOGIC; + cmd_valid_i : IN STD_LOGIC; + prbs_fseed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + cmd_sent : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + bl_sent : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + cmd_en_i : IN STD_LOGIC; +-- m_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + fixed_data_i : IN STD_LOGIC_VECTOR(DWIDTH-1 DOWNTO 0); + + addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + + data_rdy_o : OUT STD_LOGIC; + data_valid_i : IN STD_LOGIC; + data_i : IN STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + last_word_rd_o : OUT STD_LOGIC; + data_error_o : OUT STD_LOGIC; + cmp_data_o : OUT STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + rd_mdata_o : OUT STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + cmp_data_valid : OUT STD_LOGIC; + cmp_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); + + cmp_bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); + force_wrcmd_gen_o : out std_logic; + rd_buff_avail_o : out std_logic_vector(6 downto 0); + dq_error_bytelane_cmp :OUT STD_LOGIC_VECTOR(DQ_ERROR_WIDTH - 1 DOWNTO 0); + cumlative_dq_lane_error_r :OUT STD_LOGIC_VECTOR(DQ_ERROR_WIDTH - 1 DOWNTO 0) + + + ); +END component; + +component write_data_path IS + GENERIC ( + TCQ : TIME := 100 ps; + FAMILY : STRING := "SPARTAN6"; + MEM_BURST_LEN : INTEGER := 8; + ADDR_WIDTH : INTEGER := 32; + DWIDTH : INTEGER := 32; + DATA_PATTERN : STRING := "DGEN_ALL"; + NUM_DQ_PINS : INTEGER := 8; + SEL_VICTIM_LINE : INTEGER := 3; + MEM_COL_WIDTH : INTEGER := 10; + EYE_TEST : string := "FALSE" + ); + PORT ( + + clk_i : IN STD_LOGIC; + rst_i : in std_logic_vector(9 downto 0); + cmd_rdy_o : OUT STD_LOGIC; + cmd_valid_i : IN STD_LOGIC; + cmd_validB_i : IN STD_LOGIC; + cmd_validC_i : IN STD_LOGIC; + prbs_fseed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); +-- m_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + fixed_data_i : IN STD_LOGIC_VECTOR(DWIDTH-1 DOWNTO 0); + + addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + data_rdy_i : IN STD_LOGIC; + data_valid_o : OUT STD_LOGIC; + last_word_wr_o : OUT STD_LOGIC; + data_o : OUT STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + data_mask_o : OUT STD_LOGIC_VECTOR((DWIDTH / 8) - 1 DOWNTO 0); + data_wr_end_o : out std_logic + ); +END component; + +component tg_status IS + GENERIC ( + TCQ : TIME := 100 ps; + DWIDTH : INTEGER := 32 + ); + PORT ( + + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + manual_clear_error : IN STD_LOGIC; + data_error_i : IN STD_LOGIC; + cmp_data_i : IN STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + rd_data_i : IN STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + cmp_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + cmp_bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + mcb_cmd_full_i : IN STD_LOGIC; + mcb_wr_full_i : IN STD_LOGIC; + mcb_rd_empty_i : IN STD_LOGIC; + error_status : OUT STD_LOGIC_VECTOR(64 + (2 * DWIDTH - 1) DOWNTO 0); + error : OUT STD_LOGIC + ); + + +END component; + + attribute KEEP : STRING; + attribute MAX_FANOUT : STRING; + + +function MEM_BLENGTH return integer is + begin + if (MEM_BURST_LEN = 4) then + return 4; + elsif (MEM_BURST_LEN = 8) then + return 8; + else + return 8; + end if; + end function MEM_BLENGTH; + + + constant MEM_BLEN : INTEGER := MEM_BLENGTH; + + SIGNAL mcb_wr_en : STD_LOGIC; + SIGNAL cmd2flow_valid : STD_LOGIC; + SIGNAL cmd2flow_cmd : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL cmd2flow_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL cmd2flow_bl : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL last_word_rd : STD_LOGIC; + SIGNAL last_word_wr : STD_LOGIC; + SIGNAL flow2cmd_rdy : STD_LOGIC; + SIGNAL wr_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL rd_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL wr_bl : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL rd_bl : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL run_traffic_reg : STD_LOGIC; + SIGNAL wr_validB : STD_LOGIC; + SIGNAL wr_valid : STD_LOGIC; + SIGNAL wr_validC : STD_LOGIC; + SIGNAL bram_addr_i : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL bram_instr_i : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL bram_bl_i : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL AC2_G_E2 : STD_LOGIC; + SIGNAL AC1_G_E1 : STD_LOGIC; + SIGNAL AC3_G_E3 : STD_LOGIC; + SIGNAL upper_end_matched : STD_LOGIC; + SIGNAL end_boundary_addr : STD_LOGIC_VECTOR(7 DOWNTO 0); + SIGNAL lower_end_matched : STD_LOGIC; + SIGNAL addr_o : STD_LOGIC_VECTOR(31 DOWNTO 0); +-- SIGNAL m_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL dcount_rst : STD_LOGIC; + SIGNAL rd_addr_error : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL rd_rdy : STD_LOGIC; + SIGNAL cmp_error_int : STD_LOGIC; + SIGNAL cmd_full : STD_LOGIC; + + SIGNAL cmp_data_int : STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + SIGNAL mem_rd_data_i : STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + SIGNAL cmp_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL cmp_bl : STD_LOGIC_VECTOR(5 DOWNTO 0); + + SIGNAL rst_ra : STD_LOGIC_VECTOR(9 DOWNTO 0); + SIGNAL rst_rb : STD_LOGIC_VECTOR(9 DOWNTO 0); + + SIGNAL mcb_wr_full_r1 : STD_LOGIC; + SIGNAL mcb_wr_full_r2 : STD_LOGIC; + SIGNAL mcb_rd_empty_r : STD_LOGIC; + SIGNAL force_wrcmd_gen : STD_LOGIC; + SIGNAL rd_buff_avail : STD_LOGIC_VECTOR(6 DOWNTO 0); + + SIGNAL data_mode_r_a : STD_LOGIC_VECTOR(3 DOWNTO 0); + SIGNAL data_mode_r_b : STD_LOGIC_VECTOR(3 DOWNTO 0); + SIGNAL data_mode_r_c : STD_LOGIC_VECTOR(3 DOWNTO 0); + SIGNAL tmp_address : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL error_access_range : STD_LOGIC ; + + SIGNAL mcb_rd_empty : STD_LOGIC; + + SIGNAL mcb_wr_full : STD_LOGIC; + + SIGNAL end_addr_r : STD_LOGIC_VECTOR(31 DOWNTO 0); + + SIGNAL wr_rdy : STD_LOGIC; + + SIGNAL rd_valid : STD_LOGIC; + + SIGNAL cmd_rd_en : STD_LOGIC; + -- X-HDL generated signals + + SIGNAL xhdl14 : STD_LOGIC_VECTOR(37 DOWNTO 0); + SIGNAL xhdl15 : STD_LOGIC_VECTOR(32 DOWNTO 0); + SIGNAL xhdl17 : STD_LOGIC; + SIGNAL xhdl19 : STD_LOGIC; + SIGNAL ZEROS : STD_LOGIC_VECTOR(31 DOWNTO 0); + + -- Declare intermediate signals for referenced outputs + SIGNAL bram_rdy_o_xhdl0 : STD_LOGIC; + SIGNAL mcb_cmd_en_o_xhdl5 : STD_LOGIC; + SIGNAL mcb_cmd_instr_o_xhdl6 : STD_LOGIC_VECTOR(2 DOWNTO 0); + SIGNAL mcb_cmd_addr_o_xhdl3 : STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + SIGNAL mcb_cmd_bl_o_xhdl4 : STD_LOGIC_VECTOR(5 DOWNTO 0); + SIGNAL mcb_wr_data_o_xhdl9 : STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + SIGNAL mcb_wr_data_end_o_xhdl8 : STD_LOGIC; + SIGNAL mcb_wr_mask_o_xhdl10 : STD_LOGIC_VECTOR((DWIDTH / 8) - 1 DOWNTO 0); + SIGNAL mcb_rd_en : STD_LOGIC; + SIGNAL wr_data_counts_xhdl12 : STD_LOGIC_VECTOR(47 DOWNTO 0); + SIGNAL rd_data_counts_xhdl11 : STD_LOGIC_VECTOR(47 DOWNTO 0); + SIGNAL error_xhdl1 : STD_LOGIC; + SIGNAL error_status_xhdl2 : STD_LOGIC_VECTOR(64 + (2 * DWIDTH - 1) DOWNTO 0); + + SIGNAL cmd_fifo_wr : STD_LOGIC; + SIGNAL xfer_addr : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL fifo_error : STD_LOGIC; + SIGNAL cmd_fifo_rd : STD_LOGIC; + SIGNAL cmd_fifo_empty : STD_LOGIC; + SIGNAL xfer_cmd_bl : STD_LOGIC; + SIGNAL cmd_fifo_full : STD_LOGIC; + SIGNAL rd_mdata_afull_set : STD_LOGIC; + SIGNAL rd_mdata_fifo_afull : STD_LOGIC; + SIGNAL rdpath_data_valid_i : STD_LOGIC; + SIGNAL rdpath_rd_data_i : STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + SIGNAL rd_mdata_fifo_empty : STD_LOGIC; + SIGNAL rd_v6_mdata : STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + SIGNAL mdata_wren : STD_LOGIC; + attribute KEEP of rst_ra : signal is "TRUE"; + attribute KEEP of rst_rb : signal is "TRUE"; + attribute KEEP of mcb_wr_full_r1 : signal is "TRUE"; + attribute KEEP of mcb_wr_full_r2 : signal is "TRUE"; + attribute MAX_FANOUT of rst_ra : signal is "20"; + attribute MAX_FANOUT of rst_rb : signal is "20"; + + +BEGIN + + + mem_rd_data <= mem_rd_data_i; + ZEROS <= (others => '0'); + + cmp_data <= cmp_data_int; + cmp_error <= cmp_error_int; + -- Drive referenced outputs + bram_rdy_o <= bram_rdy_o_xhdl0; + mcb_cmd_en_o <= mcb_cmd_en_o_xhdl5; + mcb_cmd_instr_o <= mcb_cmd_instr_o_xhdl6; + mcb_cmd_addr_o <= mcb_cmd_addr_o_xhdl3; + mcb_cmd_bl_o <= mcb_cmd_bl_o_xhdl4; + mcb_wr_data_o <= mcb_wr_data_o_xhdl9; + mcb_wr_data_end_o <= mcb_wr_data_end_o_xhdl8; + mcb_wr_mask_o <= mcb_wr_mask_o_xhdl10; + mcb_rd_en_o <= mcb_rd_en; + wr_data_counts <= wr_data_counts_xhdl12; + rd_data_counts <= std_logic_vector(rd_data_counts_xhdl11); + error <= error_xhdl1; + error_status <= error_status_xhdl2; + tmp_address <= std_logic_vector(to_unsigned((to_integer(unsigned(mcb_cmd_addr_o_xhdl3)) + to_integer(unsigned(mcb_cmd_bl_o_xhdl4)) * (DWIDTH / 8)),32)); +-- tmp_address <= ("00" & mcb_cmd_addr_o_xhdl3 + ("000000000000000000000000" & mcb_cmd_bl_o_xhdl4 * to_stdlogicvector(DWIDTH, 6) / "001000")); + +--synthesis translate_off + PROCESS + BEGIN + IF ((MEM_BURST_LEN /= 4) AND (MEM_BURST_LEN /= 8)) THEN + report "Current Traffic Generator logic does not support OTF (On The Fly) Burst Mode!"; + report "If memory is set to OTF (On The Fly) , Traffic Generator only generates BL8 traffic."; + + END IF; + WAIT; + END PROCESS; + + PROCESS (mcb_cmd_en_o_xhdl5, mcb_cmd_addr_o_xhdl3, mcb_cmd_bl_o_xhdl4, end_addr_i,tmp_address) + BEGIN + IF (mcb_cmd_en_o_xhdl5 = '1' AND (tmp_address > end_addr_i)) THEN + report "Error ! Data access beyond address range"; -- severity ERROR; + error_access_range <= '1'; + -- $stop(); + END IF; + END PROCESS; +--synthesis translate_on + + mcb_rd_empty <= mcb_rd_empty_i; + + mcb_wr_full <= mcb_wr_full_i; + + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + data_mode_r_a <= data_mode_i; + data_mode_r_b <= data_mode_i; + data_mode_r_c <= data_mode_i; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_ra(0)) = '1') THEN + mcb_wr_full_r1 <= '0'; + ELSIF (mcb_wr_fifo_counts >= "0111111") THEN + mcb_wr_full_r1 <= '1'; + mcb_wr_full_r2 <= '1'; + ELSE + mcb_wr_full_r1 <= '0'; + mcb_wr_full_r2 <= '0'; + END IF; + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF ((rst_ra(0)) = '1') THEN + mcb_rd_empty_r <= '1'; + ELSIF (mcb_rd_fifo_counts <= "0000001") THEN + mcb_rd_empty_r <= '1'; + ELSE + mcb_rd_empty_r <= '0'; + END IF; + END IF; + END PROCESS; + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + rst_ra <= (rst_i & rst_i & rst_i & rst_i & rst_i & rst_i & rst_i & rst_i & rst_i & rst_i); + rst_rb <= (rst_i & rst_i & rst_i & rst_i & rst_i & rst_i & rst_i & rst_i & rst_i & rst_i); + END IF; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + run_traffic_reg <= run_traffic_i; + END IF; + END PROCESS; + + bram_addr_i <= (bram_cmd_i(29 DOWNTO 0) & "00"); + bram_instr_i <= bram_cmd_i(32 DOWNTO 30); + bram_bl_i(5 DOWNTO 0) <= bram_cmd_i(38 DOWNTO 33); + dcount_rst <= counts_rst OR rst_ra(0); + + + + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') then + IF (dcount_rst = '1') THEN + wr_data_counts_xhdl12 <= (OTHERS => '0'); + ELSIF (mcb_wr_en = '1') THEN + wr_data_counts_xhdl12 <= wr_data_counts_xhdl12 + std_logic_vector(to_unsigned(DWIDTH/8,48)); + END IF; + end if; + END PROCESS; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') then + IF (dcount_rst = '1') THEN + rd_data_counts_xhdl11 <= (others => '0'); + ELSIF (mcb_rd_en = '1') THEN + rd_data_counts_xhdl11 <= rd_data_counts_xhdl11 + std_logic_vector(to_unsigned(DWIDTH/8,48)); + END IF; + end if; + END PROCESS; + + xhdl13 : IF (SIMULATION = "TRUE") GENERATE + cmd_fifo_wr <= flow2cmd_rdy AND cmd2flow_valid; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (mcb_cmd_en_o_xhdl5 = '1') THEN + if (xfer_addr /= (ZEROS(31 downto ADDR_WIDTH) & mcb_cmd_addr_o_xhdl3)) then + fifo_error <= '1'; + ELSE + fifo_error <= '0'; + END IF; + END IF; + END IF; + END PROCESS; + + cmd_fifo_rd <= mcb_cmd_en_o_xhdl5 AND NOT(mcb_cmd_full_i) AND NOT(cmd_fifo_empty); + + + xhdl14 <= (cmd2flow_bl & cmd2flow_addr); + xfer_cmd_bl <= xhdl15(32); + xfer_addr <= xhdl15(31 downto 0); + cmd_fifo : afifo + GENERIC MAP ( + TCQ => TCQ, + DSIZE => 38, + FIFO_DEPTH => 16, + ASIZE => 4, + SYNC => 1 + ) + PORT MAP ( + wr_clk => clk_i, + rst => rst_ra(0), + wr_en => cmd_fifo_wr, + wr_data => xhdl14, + rd_en => cmd_fifo_rd, + rd_clk => clk_i, + rd_data => xhdl15, + full => cmd_fifo_full, + almost_full => open, + empty => cmd_fifo_empty + ); + END GENERATE; + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + end_addr_r <= end_addr_i; + END IF; + END PROCESS; + + + + u_c_gen : cmd_gen + GENERIC MAP ( + TCQ => TCQ, + FAMILY => FAMILY, + PORT_MODE => PORT_MODE, + MEM_BURST_LEN => MEM_BLEN, + NUM_DQ_PINS => NUM_DQ_PINS, + DATA_PATTERN => DATA_PATTERN, + CMD_PATTERN => CMD_PATTERN, + ADDR_WIDTH => ADDR_WIDTH, + DWIDTH => DWIDTH, + MEM_COL_WIDTH => MEM_COL_WIDTH, + PRBS_EADDR_MASK_POS => PRBS_EADDR_MASK_POS, + PRBS_SADDR_MASK_POS => PRBS_SADDR_MASK_POS, + PRBS_EADDR => PRBS_EADDR, + PRBS_SADDR => PRBS_SADDR + ) + PORT MAP ( + clk_i => clk_i, + rst_i => rst_ra, + rd_buff_avail_i => rd_buff_avail, + reading_rd_data_i => mcb_rd_en, + force_wrcmd_gen_i => force_wrcmd_gen, + run_traffic_i => run_traffic_reg, + start_addr_i => start_addr_i, + end_addr_i => end_addr_r, + cmd_seed_i => cmd_seed_i, + data_seed_i => data_seed_i, + load_seed_i => load_seed_i, + addr_mode_i => addr_mode_i, + data_mode_i => data_mode_r_a, + instr_mode_i => instr_mode_i, + bl_mode_i => bl_mode_i, + mode_load_i => mode_load_i, + fixed_bl_i => fixed_bl_i, + fixed_addr_i => fixed_addr_i, + fixed_instr_i => fixed_instr_i, + bram_addr_i => bram_addr_i, + bram_instr_i => bram_instr_i, + bram_bl_i => bram_bl_i, + bram_valid_i => bram_valid_i, + bram_rdy_o => bram_rdy_o_xhdl0, + rdy_i => flow2cmd_rdy, + instr_o => cmd2flow_cmd, + addr_o => cmd2flow_addr, + bl_o => cmd2flow_bl, +-- m_addr_o => m_addr, + cmd_o_vld => cmd2flow_valid + ); + mcb_cmd_addr_o_xhdl3 <= addr_o(ADDR_WIDTH - 1 DOWNTO 0); + cmd_full <= mcb_cmd_full_i; + + + mcb_control : mcb_flow_control + GENERIC MAP ( + TCQ => TCQ, + FAMILY => FAMILY + ) + PORT MAP ( + clk_i => clk_i, + rst_i => rst_ra, + cmd_rdy_o => flow2cmd_rdy, + cmd_valid_i => cmd2flow_valid, + cmd_i => cmd2flow_cmd, + addr_i => cmd2flow_addr, + bl_i => cmd2flow_bl, + mcb_cmd_full => cmd_full, + cmd_o => mcb_cmd_instr_o_xhdl6, + addr_o => addr_o, + bl_o => mcb_cmd_bl_o_xhdl4, + cmd_en_o => mcb_cmd_en_o_xhdl5, + last_word_wr_i => last_word_wr, + wdp_rdy_i => wr_rdy, + wdp_valid_o => wr_valid, + wdp_validB_o => wr_validB, + wdp_validC_o => wr_validC, + wr_addr_o => wr_addr, + wr_bl_o => wr_bl, + last_word_rd_i => last_word_rd, + rdp_rdy_i => rd_rdy, + rdp_valid_o => rd_valid, + rd_addr_o => rd_addr, + rd_bl_o => rd_bl + ); + + mdata_wren <= not mcb_rd_empty; + + rd_mdata_fifo : afifo + GENERIC MAP ( + TCQ => TCQ, + DSIZE => DWIDTH, + FIFO_DEPTH => 32, + ASIZE => 5, + SYNC => 1 + ) + PORT MAP ( + wr_clk => clk_i, + rst => rst_rb(0), + wr_en => mdata_wren, + wr_data => mcb_rd_data_i, + rd_en => mcb_rd_en, + rd_clk => clk_i, + rd_data => rd_v6_mdata, + full => open, + almost_full => open, + empty => rd_mdata_fifo_empty + ); + + + + cmd_rd_en <= NOT(mcb_cmd_full_i) AND mcb_cmd_en_o_xhdl5; + + PROCESS (clk_i) + BEGIN + IF (clk_i'EVENT AND clk_i = '1') THEN + IF (rst_rb(0) = '1') THEN + rd_mdata_afull_set <= '0'; + ELSIF (rd_mdata_fifo_afull = '1') THEN + rd_mdata_afull_set <= '1'; + END IF; + END IF; + END PROCESS; + + + PROCESS(rd_mdata_fifo_empty,rd_mdata_afull_set,mcb_rd_empty) + BEGIN + + IF (FAMILY = "VIRTEX6" AND MEM_BLEN = 4) THEN + rdpath_data_valid_i <= not(rd_mdata_fifo_empty); + ELSE + rdpath_data_valid_i <= not(mcb_rd_empty); + + END IF; + END PROCESS; + + PROCESS(rd_v6_mdata,mcb_rd_data_i) + BEGIN + + IF (FAMILY = "VIRTEX6" AND MEM_BLEN = 4) THEN + rdpath_rd_data_i <= rd_v6_mdata; + ELSE + rdpath_rd_data_i <= mcb_rd_data_i; + + END IF; + END PROCESS; + + RD_PATH : IF (PORT_MODE = "RD_MODE" OR PORT_MODE = "BI_MODE") GENERATE + + xhdl17 <= NOT(mcb_rd_empty); + read_data_path_inst : read_data_path + GENERIC MAP ( + TCQ => TCQ, + family => FAMILY, + MEM_BURST_LEN => MEM_BLEN, + cmp_data_pipe_stages => CMP_DATA_PIPE_STAGES, + addr_width => ADDR_WIDTH, + sel_victim_line => SEL_VICTIM_LINE, + data_pattern => DATA_PATTERN, + dwidth => DWIDTH, + num_dq_pins => NUM_DQ_PINS, + DQ_ERROR_WIDTH => DQ_ERROR_WIDTH, + mem_col_width => MEM_COL_WIDTH + ) + PORT MAP ( + clk_i => clk_i, + rst_i => rst_rb, + manual_clear_error => manual_clear_error, + cmd_rdy_o => rd_rdy, + cmd_valid_i => rd_valid, + prbs_fseed_i => data_seed_i, + cmd_sent => mcb_cmd_instr_o_xhdl6, + bl_sent => mcb_cmd_bl_o_xhdl4, + cmd_en_i => cmd_rd_en, + data_mode_i => data_mode_r_b, + last_word_rd_o => last_word_rd, +-- m_addr_i => m_addr, + fixed_data_i => fixed_data_i, + + addr_i => rd_addr, + bl_i => rd_bl, + data_rdy_o => mcb_rd_en, + data_valid_i => rdpath_data_valid_i, + data_i => rdpath_rd_data_i, + data_error_o => cmp_error_int, + cmp_data_o => cmp_data_int, + rd_mdata_o => mem_rd_data_i, + cmp_data_valid => cmp_data_valid, + cmp_addr_o => cmp_addr, + cmp_bl_o => cmp_bl, + force_wrcmd_gen_o => force_wrcmd_gen, + rd_buff_avail_o => rd_buff_avail, + dq_error_bytelane_cmp => dq_error_bytelane_cmp, + cumlative_dq_lane_error_r => cumlative_dq_lane_error + ); + END GENERATE; + + write_only_path_inst: IF ( NOT(PORT_MODE = "RD_MODE" OR PORT_MODE = "BI_MODE")) GENERATE + + cmp_error_int <= '0'; + END GENERATE; + + xhdl18 : IF (PORT_MODE = "WR_MODE" OR PORT_MODE = "BI_MODE") GENERATE + + xhdl19 <= NOT(mcb_wr_full); + write_data_path_inst : write_data_path + GENERIC MAP ( + TCQ => TCQ, + family => FAMILY, + MEM_BURST_LEN => MEM_BLEN, + + addr_width => ADDR_WIDTH, + data_pattern => DATA_PATTERN, + dwidth => DWIDTH, + num_dq_pins => NUM_DQ_PINS, + sel_victim_line => SEL_VICTIM_LINE, + mem_col_width => MEM_COL_WIDTH, + eye_test => EYE_TEST + ) + PORT MAP ( + clk_i => clk_i, + rst_i => rst_rb, + cmd_rdy_o => wr_rdy, + cmd_valid_i => wr_valid, + cmd_validb_i => wr_validB, + cmd_validc_i => wr_validC, + prbs_fseed_i => data_seed_i, + data_mode_i => data_mode_r_c, + last_word_wr_o => last_word_wr, +-- m_addr_i => m_addr, + fixed_data_i => fixed_data_i, + + addr_i => wr_addr, + bl_i => wr_bl, + data_rdy_i => xhdl19, + data_valid_o => mcb_wr_en, + data_o => mcb_wr_data_o_xhdl9, + data_mask_o => mcb_wr_mask_o_xhdl10, + data_wr_end_o => mcb_wr_data_end_o_xhdl8 +-- tpt_hdata => + ); + + END GENERATE; + + mcb_wr_en_o <= mcb_wr_en; + + + + tg_status_inst : tg_status + GENERIC MAP ( + dwidth => DWIDTH + ) + PORT MAP ( + clk_i => clk_i, + rst_i => rst_ra(2), + manual_clear_error => manual_clear_error, + data_error_i => cmp_error_int, + cmp_data_i => cmp_data_int, + rd_data_i => mem_rd_data_i, + cmp_addr_i => cmp_addr, + cmp_bl_i => cmp_bl, + mcb_cmd_full_i => mcb_cmd_full_i, + mcb_wr_full_i => mcb_wr_full, + mcb_rd_empty_i => mcb_rd_empty, + error_status => error_status_xhdl2, + error => error_xhdl1 + ); + +END trans; + + + + + + + + + + + + + + + + + + + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/rd_data_gen.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/rd_data_gen.vhd new file mode 100755 index 0000000..5559ade --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/rd_data_gen.vhd @@ -0,0 +1,434 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: rd_data_gen.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/05/27 15:50:28 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This module has all the timing control for generating "compare data" +-- to compare the read data from memory. +-- Reference: +-- Revision History: 2010/01/09 parameter MEM_BURST_LEN is missing in v6_data_gen instance module. + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + +entity rd_data_gen is + generic ( + + FAMILY : string := "SPARTAN6"; -- "SPARTAN6", "VIRTEX6" + MEM_BURST_LEN : integer := 8; + ADDR_WIDTH : integer := 32; + BL_WIDTH : integer := 6; + DWIDTH : integer := 32; + DATA_PATTERN : string := "DGEN_PRBS"; --"DGEN__HAMMER", "DGEN_WALING1","DGEN_WALING0","DGEN_ADDR","DGEN_NEIGHBOR","DGEN_PRBS","DGEN_ALL" + NUM_DQ_PINS : integer := 8; + SEL_VICTIM_LINE : integer := 3; -- VICTIM LINE is one of the DQ pins is selected to be different than hammer pattern + + COLUMN_WIDTH : integer := 10 + ); + port ( + + clk_i : in std_logic; -- + rst_i : in std_logic_vector(4 downto 0); + prbs_fseed_i : in std_logic_vector(31 downto 0); + data_mode_i : in std_logic_vector(3 downto 0); -- "00" = bram; + rd_mdata_en : in std_logic; + + cmd_rdy_o : out std_logic; -- ready to receive command. It should assert when data_port is ready at the // beginning and will be deasserted once see the cmd_valid_i is asserted. + -- And then it should reasserted when + -- it is generating the last_word. + cmd_valid_i : in std_logic; -- when both cmd_valid_i and cmd_rdy_o is high, the command is valid. + last_word_o : out std_logic; + +-- m_addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); -- generated address used to determine data pattern. + fixed_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + + addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); -- generated address used to determine data pattern. + bl_i : in std_logic_vector(BL_WIDTH - 1 downto 0); -- generated burst length for control the burst data + user_bl_cnt_is_1_o : out std_logic; + data_rdy_i : in std_logic; -- connect from mcb_wr_full when used as wr_data_gen in sp6 + -- connect from mcb_rd_empty when used as rd_data_gen in sp6 + -- connect from rd_data_valid in v6 + -- When both data_rdy and data_valid is asserted, the ouput data is valid. + data_valid_o : out std_logic; -- connect to wr_en or rd_en and is asserted whenever the + -- pattern is available. + data_o : out std_logic_vector(DWIDTH - 1 downto 0) -- generated data pattern + ); +end entity rd_data_gen; + +ARCHITECTURE trans OF rd_data_gen IS + +COMPONENT sp6_data_gen IS + GENERIC ( + + ADDR_WIDTH : INTEGER := 32; + BL_WIDTH : INTEGER := 6; + DWIDTH : INTEGER := 32; + DATA_PATTERN : STRING := "DGEN_PRBS"; + NUM_DQ_PINS : INTEGER := 8; + COLUMN_WIDTH : INTEGER := 10 + ); + PORT ( + + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + prbs_fseed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + data_rdy_i : IN STD_LOGIC; + cmd_startA : IN STD_LOGIC; + cmd_startB : IN STD_LOGIC; + cmd_startC : IN STD_LOGIC; + cmd_startD : IN STD_LOGIC; + cmd_startE : IN STD_LOGIC; + fixed_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + addr_i : IN STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + user_burst_cnt : IN STD_LOGIC_VECTOR(BL_WIDTH DOWNTO 0); + + fifo_rdy_i : IN STD_LOGIC; + data_o : OUT STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0) + ); +END COMPONENT; + +COMPONENT v6_data_gen IS + GENERIC ( + + ADDR_WIDTH : INTEGER := 32; + MEM_BURST_LEN : integer := 8; + + BL_WIDTH : INTEGER := 6; + DWIDTH : INTEGER := 32; + DATA_PATTERN : STRING := "DGEN_ALL"; + NUM_DQ_PINS : INTEGER := 8; + SEL_VICTIM_LINE : INTEGER := 3; + COLUMN_WIDTH : INTEGER := 10 + ); + PORT ( + + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + prbs_fseed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + data_rdy_i : IN STD_LOGIC; + cmd_startA : IN STD_LOGIC; + cmd_startB : IN STD_LOGIC; + cmd_startC : IN STD_LOGIC; + cmd_startD : IN STD_LOGIC; + cmd_startE : IN STD_LOGIC; + fixed_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + + m_addr_i : IN STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + addr_i : IN STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + user_burst_cnt : IN STD_LOGIC_VECTOR(BL_WIDTH DOWNTO 0); + + fifo_rdy_i : IN STD_LOGIC; + data_o : OUT STD_LOGIC_VECTOR(NUM_DQ_PINS*4 - 1 DOWNTO 0) + ); +END COMPONENT; + + + SIGNAL prbs_data : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL cmd_start : STD_LOGIC; + SIGNAL adata : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL hdata : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL ndata : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL w1data : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL v6_w1data : STD_LOGIC_VECTOR(NUM_DQ_PINS * 4 - 1 DOWNTO 0); + + signal w0data : std_logic_vector(31 downto 0); + signal data : std_logic_vector(DWIDTH - 1 downto 0); + signal cmd_rdy : std_logic; + signal data_valid : std_logic; + signal user_burst_cnt : std_logic_vector(6 downto 0); + signal data_rdy_r1 : std_logic; + signal data_rdy_r2 : std_logic; + signal next_count_is_one : std_logic; + signal cmd_valid_r1 : std_logic; + signal w3data : std_logic_vector(31 downto 0); + + signal data_port_fifo_rdy : std_logic; + + --assign cmd_start = cmd_valid_i & cmd_rdy ; + + signal user_bl_cnt_is_1 : std_logic; + + signal cmd_start_b : std_logic; + + -- need to wait for extra cycle for data coming out from rd_post_fifo in V6 interface + -- need to wait for extra cycle for data coming out from rd_post_fifo in V6 interface + + -- counter to count user burst length + + signal u_bcount_2 : std_logic; + + -- Declare intermediate signals for referenced outputs + signal last_word_o_xhdl1 : std_logic; + signal data_o_xhdl0 : std_logic_vector(DWIDTH - 1 downto 0); +begin + -- Drive referenced outputs + last_word_o <= last_word_o_xhdl1; + data_port_fifo_rdy <= data_rdy_i; + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + data_rdy_r1 <= data_rdy_i; + data_rdy_r2 <= data_rdy_r1; + cmd_valid_r1 <= cmd_valid_i; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (user_burst_cnt = "0000010" and data_rdy_i = '1') then + next_count_is_one <= '1'; + else + next_count_is_one <= '0'; + end if; + end if; + end process; + + user_bl_cnt_is_1_o <= user_bl_cnt_is_1; + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((user_burst_cnt = "0000010" and data_port_fifo_rdy = '1' and FAMILY = "SPARTAN6") or + (user_burst_cnt = "0000010" and data_port_fifo_rdy = '1' and FAMILY = "VIRTEX6") ) then + user_bl_cnt_is_1 <= '1'; + else + user_bl_cnt_is_1 <= '0'; + end if; + end if; + end process; + + process (cmd_valid_i, cmd_valid_r1, cmd_rdy, user_bl_cnt_is_1, rd_mdata_en) + begin + if (FAMILY = "SPARTAN6") then + cmd_start <= cmd_valid_i and cmd_rdy; + cmd_start_b <= cmd_valid_i and cmd_rdy; + else + if (MEM_BURST_LEN = 4) then + cmd_start <= rd_mdata_en; + else + cmd_start <= (not(cmd_valid_r1) and cmd_valid_i) or user_bl_cnt_is_1; + cmd_start_b <= (not(cmd_valid_r1) and cmd_valid_i) or user_bl_cnt_is_1; + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + user_burst_cnt <= "0000000"; + elsif (cmd_start = '1') then + if (bl_i = "000000") then + user_burst_cnt <= "1000000" ; + else + user_burst_cnt <= ('0' & bl_i) ; + end if; + elsif (data_port_fifo_rdy = '1') then + if (user_burst_cnt /= "0000000") then + user_burst_cnt <= user_burst_cnt - "0000001"; + else + user_burst_cnt <= "0000000"; + end if; + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((user_burst_cnt = "0000010" and data_rdy_i = '1') or (cmd_start = '1' and bl_i = "000001")) then + u_bcount_2 <= '1'; + elsif (last_word_o_xhdl1 = '1') then + u_bcount_2 <= '0'; + end if; + end if; + end process; + + + last_word_o_xhdl1 <= u_bcount_2 and data_rdy_i; + + -- cmd_rdy_o assert when the dat fifo is not full and deassert once cmd_valid_i + -- is assert and reassert during the last data + + --data_valid_o logic + + cmd_rdy_o <= cmd_rdy; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + cmd_rdy <= '1'; + elsif (cmd_start = '1') then + cmd_rdy <= '0'; + elsif (data_port_fifo_rdy = '1' and user_burst_cnt = "0000001") then + + cmd_rdy <= '1'; + end if; + end if; + end process; + + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + data_valid <= '0'; + elsif (user_burst_cnt = "0000001" and data_port_fifo_rdy = '1') then + data_valid <= '0'; + elsif ((user_burst_cnt >= "0000001") or cmd_start = '1') then + data_valid <= '1'; + end if; + end if; + end process; + + + process (data_valid, data_port_fifo_rdy) + begin + if (FAMILY = "SPARTAN6") then + data_valid_o <= data_valid; + else + + data_valid_o <= data_port_fifo_rdy; + end if; + end process; + + xhdl2 : if (FAMILY = "SPARTAN6") generate + + + + sp6_data_gen_inst : sp6_data_gen + generic map ( + ADDR_WIDTH => 32, + BL_WIDTH => BL_WIDTH, + DWIDTH => DWIDTH, + DATA_PATTERN => DATA_PATTERN, + NUM_DQ_PINS => NUM_DQ_PINS, + COLUMN_WIDTH => COLUMN_WIDTH + ) + port map ( + clk_i => clk_i, + rst_i => rst_i(1), + data_rdy_i => data_rdy_i, + prbs_fseed_i => prbs_fseed_i, + + data_mode_i => data_mode_i, + cmd_startA => cmd_start, + cmd_startB => cmd_start, + cmd_startC => cmd_start, + cmd_startD => cmd_start, + cmd_startE => cmd_start, + fixed_data_i => fixed_data_i, + + addr_i => addr_i, + user_burst_cnt => user_burst_cnt, + fifo_rdy_i => data_port_fifo_rdy, + data_o => data_o + ); + + end generate; + xhdl3 : if (FAMILY = "VIRTEX6") generate + + + + v6_data_gen_inst : v6_data_gen + generic map ( + ADDR_WIDTH => 32, + BL_WIDTH => BL_WIDTH, + MEM_BURST_LEN => MEM_BURST_LEN, + + DWIDTH => DWIDTH, + DATA_PATTERN => DATA_PATTERN, + NUM_DQ_PINS => NUM_DQ_PINS, + SEL_VICTIM_LINE => SEL_VICTIM_LINE, + COLUMN_WIDTH => COLUMN_WIDTH + ) + port map ( + clk_i => clk_i, + rst_i => rst_i(1), + data_rdy_i => data_rdy_i, + prbs_fseed_i => prbs_fseed_i, + + data_mode_i => data_mode_i, + cmd_startA => cmd_start, + cmd_startB => cmd_start, + cmd_startC => cmd_start, + cmd_startD => cmd_start, + cmd_startE => cmd_start, + fixed_data_i => fixed_data_i, + + m_addr_i => addr_i, --(m_addr_i ), + addr_i => addr_i, + user_burst_cnt => user_burst_cnt, + fifo_rdy_i => data_port_fifo_rdy, + data_o => data_o + ); + + end generate; + + +end architecture trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/read_data_path.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/read_data_path.vhd new file mode 100755 index 0000000..0e21887 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/read_data_path.vhd @@ -0,0 +1,638 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: read_data_path.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/05/27 15:50:28 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This is top level of read path and also consist of comparison logic +-- for read data. +-- Reference: +-- Revision History: + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + USE ieee.numeric_std.all; + +entity read_data_path is + generic ( + TCQ : time := 100 ps; + FAMILY : string := "VIRTEX6"; + MEM_BURST_LEN : integer := 8; + ADDR_WIDTH : integer := 32; + CMP_DATA_PIPE_STAGES : integer := 3; + DWIDTH : integer := 32; + DATA_PATTERN : string := "DGEN_ALL"; --"DGEN__HAMMER", "DGEN_WALING1","DGEN_WALING0","DGEN_ADDR","DGEN_NEIGHBOR","DGEN_PRBS","DGEN_ALL" + NUM_DQ_PINS : integer := 8; + DQ_ERROR_WIDTH : integer := 1; + SEL_VICTIM_LINE : integer := 3; -- VICTIM LINE is one of the DQ pins is selected to be different than hammer pattern + + MEM_COL_WIDTH : integer := 10 + ); + port ( + + clk_i : in std_logic; + manual_clear_error : in std_logic; + rst_i : in std_logic_vector(9 downto 0); + cmd_rdy_o : out std_logic; + cmd_valid_i : in std_logic; + prbs_fseed_i : in std_logic_vector(31 downto 0); + + data_mode_i : in std_logic_vector(3 downto 0); + cmd_sent : in std_logic_vector(2 downto 0); + bl_sent : in std_logic_vector(5 downto 0); + cmd_en_i : in std_logic; +-- m_addr_i : in std_logic_vector(31 downto 0); + fixed_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + + addr_i : in std_logic_vector(31 downto 0); + bl_i : in std_logic_vector(5 downto 0); + -- input [5:0] port_data_counts_i,// connect to data port fifo counts + + data_rdy_o : out std_logic; + data_valid_i : in std_logic; + data_i : in std_logic_vector(DWIDTH - 1 downto 0); + last_word_rd_o : out std_logic; + data_error_o : out std_logic; + cmp_data_o : out std_logic_vector(DWIDTH - 1 downto 0); + rd_mdata_o : out std_logic_vector(DWIDTH - 1 downto 0); + cmp_data_valid : out std_logic; + cmp_addr_o : out std_logic_vector(31 downto 0); + cmp_bl_o : out std_logic_vector(5 downto 0); + force_wrcmd_gen_o : out std_logic; + + rd_buff_avail_o : out std_logic_vector(6 downto 0); + dq_error_bytelane_cmp : out std_logic_vector(DQ_ERROR_WIDTH - 1 downto 0); + cumlative_dq_lane_error_r : out std_logic_vector(DQ_ERROR_WIDTH - 1 downto 0) + + + + ); +end entity read_data_path; + +architecture trans of read_data_path is + +function REDUCTION_OR( A: in std_logic_vector) return std_logic is + variable tmp : std_logic := '0'; +begin + for i in A'range loop + tmp := tmp or A(i); + end loop; + return tmp; +end function REDUCTION_OR; + + COMPONENT read_posted_fifo IS + GENERIC ( + TCQ : time := 100 ps; + MEM_BURST_LEN : integer := 4; + FAMILY : STRING := "SPARTAN6"; + ADDR_WIDTH : INTEGER := 32; + BL_WIDTH : INTEGER := 6 + ); + PORT ( + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + cmd_rdy_o : OUT STD_LOGIC; + cmd_valid_i : IN STD_LOGIC; + data_valid_i : IN STD_LOGIC; + addr_i : IN STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + bl_i : IN STD_LOGIC_VECTOR(BL_WIDTH - 1 DOWNTO 0); + user_bl_cnt_is_1 : IN STD_LOGIC; + cmd_sent : IN STD_LOGIC_VECTOR(2 DOWNTO 0); + bl_sent : IN STD_LOGIC_VECTOR(5 DOWNTO 0); + cmd_en_i : IN STD_LOGIC; + gen_rdy_i : IN STD_LOGIC; + gen_valid_o : OUT STD_LOGIC; + gen_addr_o : OUT STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + gen_bl_o : OUT STD_LOGIC_VECTOR(BL_WIDTH - 1 DOWNTO 0); + rd_buff_avail_o : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); + rd_mdata_fifo_empty : IN STD_LOGIC; + rd_mdata_en : OUT STD_LOGIC + ); + END COMPONENT; + + component rd_data_gen is + generic ( + FAMILY : string := "SPARTAN6"; + MEM_BURST_LEN : integer := 8; + ADDR_WIDTH : integer := 32; + BL_WIDTH : integer := 6; + DWIDTH : integer := 32; + DATA_PATTERN : string := "DGEN_PRBS"; + NUM_DQ_PINS : integer := 8; + SEL_VICTIM_LINE : integer := 3; + COLUMN_WIDTH : integer := 10 + ); + port ( + clk_i : in std_logic; + rst_i : in std_logic_vector(4 downto 0); + prbs_fseed_i : in std_logic_vector(31 downto 0); + rd_mdata_en : in std_logic; + data_mode_i : in std_logic_vector(3 downto 0); + cmd_rdy_o : out std_logic; + cmd_valid_i : in std_logic; + last_word_o : out std_logic; +-- m_addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); + fixed_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + + addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); + bl_i : in std_logic_vector(BL_WIDTH - 1 downto 0); + user_bl_cnt_is_1_o : out std_logic; + data_rdy_i : in std_logic; + data_valid_o : out std_logic; + data_o : out std_logic_vector(DWIDTH - 1 downto 0) + ); + end component; + + component afifo IS + GENERIC ( + DSIZE : INTEGER := 32; + FIFO_DEPTH : INTEGER := 16; + ASIZE : INTEGER := 5; + SYNC : INTEGER := 1 + ); + PORT ( + wr_clk : IN STD_LOGIC; + rst : IN STD_LOGIC; + wr_en : IN STD_LOGIC; + wr_data : IN STD_LOGIC_VECTOR(DSIZE - 1 DOWNTO 0); + rd_en : IN STD_LOGIC; + rd_clk : IN STD_LOGIC; + rd_data : OUT STD_LOGIC_VECTOR(DSIZE - 1 DOWNTO 0); + almost_full : OUT STD_LOGIC; + full : OUT STD_LOGIC; + empty : OUT STD_LOGIC + ); +END component; + + signal gen_rdy : std_logic; + signal gen_valid : std_logic; + signal gen_addr : std_logic_vector(31 downto 0); + signal gen_bl : std_logic_vector(5 downto 0); + + signal cmp_rdy : std_logic; + signal cmp_valid : std_logic; + signal cmp_addr : std_logic_vector(31 downto 0); + signal cmp_bl : std_logic_vector(5 downto 0); + + signal data_error : std_logic; + signal cmp_data : std_logic_vector(DWIDTH - 1 downto 0); + signal last_word_rd : std_logic; + signal bl_counter : std_logic_vector(5 downto 0); + signal cmd_rdy : std_logic; + signal user_bl_cnt_is_1 : std_logic; + signal data_rdy : std_logic; + signal delayed_data : std_logic_vector(DWIDTH downto 0); +-- signal cmp_data_piped : std_logic_vector(DWIDTH downto 0); + signal cmp_data_r : std_logic_vector(DWIDTH-1 downto 0); + signal rd_mdata_en : std_logic; + signal rd_data_r : std_logic_vector(DWIDTH - 1 downto 0); + signal force_wrcmd_gen : std_logic; + signal wait_bl_end : std_logic; + signal wait_bl_end_r1 : std_logic; + + signal v6_data_cmp_valid : std_logic; + signal rd_v6_mdata : std_logic_vector(DWIDTH-1 downto 0); + signal cmpdata_r : std_logic_vector(DWIDTH-1 downto 0); + signal rd_mdata : std_logic_vector(DWIDTH-1 downto 0); + signal l_data_error : std_logic; + signal u_data_error : std_logic; + signal cmp_data_en : std_logic; + + signal force_wrcmd_timeout_cnts : std_logic_vector(7 downto 0); + + signal error_byte : std_logic_vector(NUM_DQ_PINS / 2 - 1 downto 0); + signal error_byte_r1 : std_logic_vector(NUM_DQ_PINS / 2 - 1 downto 0); + signal dq_lane_error : std_logic_vector(DQ_ERROR_WIDTH-1 downto 0); + signal dq_lane_error_r1 : std_logic_vector(DQ_ERROR_WIDTH-1 downto 0); + signal dq_lane_error_r2 : std_logic_vector(DQ_ERROR_WIDTH-1 downto 0); + signal cum_dq_lane_error_mask : std_logic_vector(DQ_ERROR_WIDTH-1 downto 0); + signal cumlative_dq_lane_error_reg : std_logic_vector(DQ_ERROR_WIDTH-1 downto 0); + signal cumlative_dq_lane_error_c : std_logic_vector(DQ_ERROR_WIDTH - 1 downto 0); + signal rd_mdata_fifo_empty : std_logic; + signal data_valid_r : std_logic; + -- Declare intermediate signals for referenced outputs +-- SIGNAL xhdl2 : STD_LOGIC_VECTOR(DWIDTH DOWNTO 0); +-- SIGNAL tmp_sig : STD_LOGIC; + signal last_word_rd_o_xhdl0 : std_logic; + signal rd_buff_avail_o_xhdl1 : std_logic_vector(6 downto 0); +begin + -- Drive referenced outputs + last_word_rd_o <= last_word_rd_o_xhdl0; + rd_buff_avail_o <= rd_buff_avail_o_xhdl1; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + wait_bl_end_r1 <= wait_bl_end; + rd_data_r <= data_i; + end if; + end process; + + force_wrcmd_gen_o <= force_wrcmd_gen; + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i(0) = '1') then + force_wrcmd_gen <= '0'; + elsif ((wait_bl_end = '0' and wait_bl_end_r1 = '1') or force_wrcmd_timeout_cnts = "11111111") then + force_wrcmd_gen <= '0'; + elsif ((cmd_valid_i = '1' and bl_i > "010000") or wait_bl_end = '1') then + force_wrcmd_gen <= '1'; + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i(0) = '1') then + force_wrcmd_timeout_cnts <= "00000000"; + elsif (wait_bl_end = '0' and wait_bl_end_r1 = '1') then + force_wrcmd_timeout_cnts <= "00000000"; + elsif (force_wrcmd_gen = '1') then + force_wrcmd_timeout_cnts <= force_wrcmd_timeout_cnts + "00000001"; + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i(0) = '1') then + wait_bl_end <= '0'; + elsif (force_wrcmd_timeout_cnts = "11111111") then + wait_bl_end <= '0'; + elsif ((gen_rdy and gen_valid) = '1' and gen_bl > "010000") then + wait_bl_end <= '1'; + elsif ((wait_bl_end and user_bl_cnt_is_1) = '1') then + wait_bl_end <= '0'; + end if; + end if; + end process; + + cmd_rdy_o <= cmd_rdy; + + + read_postedfifo : read_posted_fifo + GENERIC MAP ( + TCQ => TCQ, + FAMILY => FAMILY, + MEM_BURST_LEN => MEM_BURST_LEN, + ADDR_WIDTH => 32, + BL_WIDTH => 6 + ) + port map ( + clk_i => clk_i, + rst_i => rst_i(0), + cmd_rdy_o => cmd_rdy, + cmd_valid_i => cmd_valid_i, + data_valid_i => data_rdy, + addr_i => addr_i, + bl_i => bl_i, + cmd_sent => cmd_sent, + bl_sent => bl_sent, + cmd_en_i => cmd_en_i, + user_bl_cnt_is_1 => user_bl_cnt_is_1, + gen_rdy_i => gen_rdy, + gen_valid_o => gen_valid, + gen_addr_o => gen_addr, + gen_bl_o => gen_bl, + rd_buff_avail_o => rd_buff_avail_o_xhdl1, + rd_mdata_fifo_empty => rd_mdata_fifo_empty, + rd_mdata_en => rd_mdata_en + ); + + + rd_datagen : rd_data_gen + generic map ( + FAMILY => FAMILY, + MEM_BURST_LEN => MEM_BURST_LEN, + NUM_DQ_PINS => NUM_DQ_PINS, + SEL_VICTIM_LINE => SEL_VICTIM_LINE, + DATA_PATTERN => DATA_PATTERN, + DWIDTH => DWIDTH, + COLUMN_WIDTH => MEM_COL_WIDTH + ) + port map ( + clk_i => clk_i, + rst_i => rst_i(4 downto 0), + prbs_fseed_i => prbs_fseed_i, + data_mode_i => data_mode_i, + cmd_rdy_o => gen_rdy, + cmd_valid_i => gen_valid, + last_word_o => last_word_rd_o_xhdl0, +-- m_addr_i => m_addr_i, + fixed_data_i => fixed_data_i, + addr_i => gen_addr, + bl_i => gen_bl, + user_bl_cnt_is_1_o => user_bl_cnt_is_1, + data_rdy_i => data_valid_i, + data_valid_o => cmp_valid, + data_o => cmp_data, + rd_mdata_en => rd_mdata_en + ); + + rd_mdata_fifo : afifo + GENERIC MAP ( + DSIZE => DWIDTH, + FIFO_DEPTH => 32, + ASIZE => 5, + SYNC => 1 + ) + PORT MAP ( + wr_clk => clk_i, + rst => rst_i(0), + wr_en => data_valid_i, + wr_data => data_i, + rd_en => rd_mdata_en, + rd_clk => clk_i, + rd_data => rd_v6_mdata, + full => open, + empty => rd_mdata_fifo_empty, + almost_full => open + ); + +-- tmp_sig <= cmp_valid AND data_valid_i; +-- xhdl2 <= ( tmp_sig & cmp_data); + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then +-- delayed_data <= (tmp_sig & cmp_data); + cmp_data_r <= cmp_data; + end if; + end process; + + rd_mdata_o <= rd_mdata; + + rd_mdata <= rd_data_r WHEN (FAMILY = "SPARTAN6") ELSE rd_v6_mdata + WHEN ((FAMILY = "VIRTEX6") and (MEM_BURST_LEN = 4)) ELSE data_i; + + cmp_data_valid <= cmp_data_en WHEN (FAMILY = "SPARTAN6") ELSE v6_data_cmp_valid + WHEN ((FAMILY = "VIRTEX6") and (MEM_BURST_LEN = 4)) ELSE data_valid_i; + + + cmp_data_o <= cmp_data_r; + cmp_addr_o <= gen_addr; + cmp_bl_o <= gen_bl; + +-- xhdl4 : if (FAMILY = "SPARTAN6") generate +-- rd_data_o <= rd_data_r; +-- end generate; +-- xhdl5 : if (FAMILY /= "SPARTAN6") generate +-- rd_data_o <= data_i; +-- end generate; + + data_rdy_o <= data_rdy; + data_rdy <= cmp_valid and data_valid_i; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + v6_data_cmp_valid <= rd_mdata_en; + end if; + end process; + + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + cmp_data_en <= data_rdy; + end if; + end process; + + xhdl6 : if (FAMILY = "SPARTAN6") generate + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (cmp_data_en = '1') then + IF ((rd_data_r(DWIDTH / 2 - 1 downto 0) /= cmp_data_r(DWIDTH / 2 - 1 downto 0))) then + l_data_error <= '1' ; + ELSE + l_data_error <= '0' ; + END IF; + else + l_data_error <= '0' ; + end if; + if (cmp_data_en = '1') then + IF ((rd_data_r(DWIDTH - 1 downto DWIDTH / 2) /= cmp_data_r(DWIDTH - 1 downto DWIDTH / 2))) then + u_data_error <= '1' ; + ELSE + u_data_error <= '0' ; + END IF; + else + u_data_error <= '0' ; + end if; + data_error <= l_data_error or u_data_error; + --synthesis translate_off + if (data_error = '1') then + report ("DATA ERROR"); + end if; + --synthesis translate_on + + end if; + end process; + + end generate; + + gen_error_2 : if ((FAMILY = "VIRTEX6") and (MEM_BURST_LEN = 4)) generate + + + gen_cmp : FOR i IN 0 TO NUM_DQ_PINS / 2 - 1 GENERATE + error_byte(i) <= '1' WHEN (rd_mdata_fifo_empty = '0' AND rd_mdata_en = '1' AND (rd_v6_mdata(8 * (i + 1) - 1 DOWNTO 8 * i) /= cmp_data(8 * (i + 1) - 1 DOWNTO 8 * i))) ELSE '0'; + + end generate; + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + IF (rst_i(1) = '1' or manual_clear_error = '1') THEN + error_byte_r1 <= (others => '0'); + data_error <= '0'; + ELSE + + error_byte_r1 <= error_byte; + -- FOR i IN 0 TO DWIDTH - 1 LOOP + data_error <= REDUCTION_OR(error_byte_r1);--error_byte_r1(i) OR data_error; + -- END LOOP; + + + END IF; + end if; + end process; + + + process (data_error) + begin + + --synthesis translate_off + IF (data_error = '1') THEN + + report "DATA ERROR"; -- severity ERROR; + END IF; + --synthesis translate_on + end process; + + + gen_dq_error_map: FOR i IN 0 to DQ_ERROR_WIDTH - 1 generate + dq_lane_error(i) <= (error_byte_r1(i) OR error_byte_r1(i+DQ_ERROR_WIDTH) OR + error_byte_r1(i+ (NUM_DQ_PINS*2/8)) OR + error_byte_r1(i+ (NUM_DQ_PINS*3/8))); + + cumlative_dq_lane_error_c(i) <= cumlative_dq_lane_error_reg(i) OR dq_lane_error_r1(i); + end generate; + + + process (clk_i) + begin + IF (clk_i'event and clk_i = '1') then + IF (rst_i(1) = '1' or manual_clear_error = '1') THEN + + dq_lane_error_r1 <= (others => '0'); + dq_lane_error_r2 <= (others => '0'); + data_valid_r <= '0'; + cumlative_dq_lane_error_reg <= (others => '0'); + + ELSE + data_valid_r <= data_valid_i; + + dq_lane_error_r1 <= dq_lane_error; + cumlative_dq_lane_error_reg <= cumlative_dq_lane_error_c; + END IF; + + + END IF; + end process; + + + + end generate; + + xhdl8 : if ((FAMILY = "VIRTEX6") and (MEM_BURST_LEN = 8)) generate + + gen_cmp_8 : FOR i IN 0 TO NUM_DQ_PINS / 2 - 1 GENERATE + error_byte(i) <= '1' WHEN (data_valid_i = '1' AND (data_i(8 * (i + 1) - 1 DOWNTO 8 * i) /= cmp_data(8 * (i + 1) - 1 DOWNTO 8 * i))) ELSE '0'; + end generate; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + IF (rst_i(1) = '1' or manual_clear_error = '1') THEN + error_byte_r1 <= (others => '0'); + data_error <= '0'; + ELSE + + error_byte_r1 <= error_byte; + --FOR i IN 0 TO DWIDTH - 1 LOOP + -- data_error <= error_byte_r1(i) OR data_error; + --END LOOP; + data_error <= REDUCTION_OR(error_byte_r1);--error_byte_r1(i) OR data_error; + + --synthesis translate_off + IF (data_error = '1') THEN + + report "DATA ERROR"; -- severity ERROR; + end if; + --synthesis translate_on + END IF; + end if; + end process; + + + gen_dq_error_map: FOR i IN 0 to DQ_ERROR_WIDTH - 1 generate + dq_lane_error(i) <= (error_byte_r1(i) OR error_byte_r1(i+DQ_ERROR_WIDTH) OR + error_byte_r1(i+ (NUM_DQ_PINS*2/8)) OR + error_byte_r1(i+ (NUM_DQ_PINS*3/8))); + + cumlative_dq_lane_error_c(i) <= cumlative_dq_lane_error_reg(i) OR dq_lane_error_r1(i); + end generate; + + process (clk_i) + begin + IF (clk_i'event and clk_i = '1') then + IF (rst_i(1) = '1' or manual_clear_error = '1') THEN + + dq_lane_error_r1 <= (others => '0'); + dq_lane_error_r2 <= (others => '0'); + data_valid_r <= '0'; + cumlative_dq_lane_error_reg <= (others => '0'); + + ELSE + data_valid_r <= data_valid_i; + + dq_lane_error_r1 <= dq_lane_error; + cumlative_dq_lane_error_reg <= cumlative_dq_lane_error_c; + END IF; + + + END IF; + end process; + + end generate; + cumlative_dq_lane_error_r <= cumlative_dq_lane_error_reg; + + dq_error_bytelane_cmp <= dq_lane_error_r1; + + data_error_o <= data_error; + +end architecture trans; + + + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/read_posted_fifo.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/read_posted_fifo.vhd new file mode 100755 index 0000000..694ed0d --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/read_posted_fifo.vhd @@ -0,0 +1,339 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: read_posted_fifo.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:16:40 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This module instantiated by read_data_path module and sits between +-- mcb_flow_control module and read_data_gen module to buffer up the +-- commands that has sent to memory controller. +-- Reference: +-- Revision History: + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + +entity read_posted_fifo is + generic ( + TCQ : time := 100 ps; + MEM_BURST_LEN : integer := 4; + FAMILY : string := "SPARTAN6"; + ADDR_WIDTH : integer := 32; + BL_WIDTH : integer := 6 + ); + port ( + clk_i : in std_logic; + rst_i : in std_logic; + cmd_rdy_o : out std_logic; + cmd_valid_i : in std_logic; + data_valid_i : in std_logic; + addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); + bl_i : in std_logic_vector(BL_WIDTH - 1 downto 0); + user_bl_cnt_is_1 : in std_logic; + cmd_sent : in std_logic_vector(2 downto 0); + bl_sent : in std_logic_vector(5 downto 0); + cmd_en_i : in std_logic; + + gen_rdy_i : in std_logic; + gen_valid_o : out std_logic; + gen_addr_o : out std_logic_vector(ADDR_WIDTH - 1 downto 0); + gen_bl_o : out std_logic_vector(BL_WIDTH - 1 downto 0); + + rd_buff_avail_o : out std_logic_vector(6 downto 0); + rd_mdata_fifo_empty : in std_logic; + rd_mdata_en : out std_logic + ); +end entity read_posted_fifo; + +architecture trans of read_posted_fifo is + component afifo is + generic ( + DSIZE : integer := 32; + FIFO_DEPTH : integer := 16; + ASIZE : integer := 4; + SYNC : integer := 1 + ); + port ( + wr_clk : in std_logic; + rst : in std_logic; + wr_en : in std_logic; + wr_data : in std_logic_vector(DSIZE - 1 downto 0); + rd_en : in std_logic; + rd_clk : in std_logic; + rd_data : out std_logic_vector(DSIZE - 1 downto 0); + full : out std_logic; + empty : out std_logic; + almost_full : out std_logic + ); + end component; + + + signal full : std_logic; + signal empty : std_logic; + signal wr_en : std_logic; + signal rd_en : std_logic; + signal data_valid_r : std_logic; + signal user_bl_cnt_not_1 : std_logic; + signal buf_avail_r : std_logic_vector(6 downto 0); + signal rd_data_received_counts : std_logic_vector(6 downto 0); + signal rd_data_counts_asked : std_logic_vector(6 downto 0); + + signal dfifo_has_enough_room : std_logic; + signal wait_cnt : std_logic_vector(1 downto 0); + signal wait_done : std_logic; + + signal dfifo_has_enough_room_d1 : std_logic; + signal empty_r : std_logic; + signal rd_first_data : std_logic; + -- current count is 1 and data_is_valie, then next cycle is not 1 + + -- calculate how many buf still available + -- assign buf_avail = 64 - (rd_data_counts_asked - rd_data_received_counts); + +-- signal tmp_buf_avil : std_logic_vector(5 downto 0); + -- X-HDL generated signals + + signal xhdl3 : std_logic; + signal xhdl4 : std_logic; + signal xhdl5 : std_logic_vector(37 downto 0); + signal xhdl6 : std_logic_vector(37 downto 0); + + -- Declare intermediate signals for referenced outputs + signal cmd_rdy_o_xhdl0 : std_logic; + signal gen_addr_o_xhdl1 : std_logic_vector(ADDR_WIDTH - 1 downto 0); + signal gen_bl_o_xhdl2 : std_logic_vector(BL_WIDTH - 1 downto 0); +begin + -- Drive referenced outputs + cmd_rdy_o <= cmd_rdy_o_xhdl0; +-- gen_addr_o <= gen_addr_o_xhdl1; +-- gen_bl_o <= gen_bl_o_xhdl2; + + gen_bl_o <= xhdl6(BL_WIDTH+ADDR_WIDTH-1 downto ADDR_WIDTH); + gen_addr_o <= xhdl6(ADDR_WIDTH-1 downto 0); + + rd_mdata_en <= rd_en; + rd_buff_avail_o <= buf_avail_r; + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + cmd_rdy_o_xhdl0 <= not(full) and dfifo_has_enough_room and wait_done; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + wait_cnt <= "00"; + elsif ((cmd_rdy_o_xhdl0 and cmd_valid_i) = '1') then + wait_cnt <= "10"; + elsif (wait_cnt > "00") then + wait_cnt <= wait_cnt - "01"; + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + wait_done <= '1'; + elsif ((cmd_rdy_o_xhdl0 and cmd_valid_i) = '1') then + wait_done <= '0'; + elsif (wait_cnt = "00") then + wait_done <= '1'; + else + wait_done <= '0'; + end if; + end if; + end process; + + xhdl3 <= '1' when (buf_avail_r >= "0111110") else + '0'; + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + dfifo_has_enough_room <= xhdl3; + dfifo_has_enough_room_d1 <= dfifo_has_enough_room; + end if; + end process; + + wr_en <= cmd_valid_i and not(full) and dfifo_has_enough_room_d1 and wait_done; + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + data_valid_r <= data_valid_i; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((data_valid_i and user_bl_cnt_is_1) = '1') then + user_bl_cnt_not_1 <= '1'; + else + user_bl_cnt_not_1 <= '0'; + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + rd_data_counts_asked <= (others => '0'); + elsif (cmd_en_i = '1' and cmd_sent(0) = '1') then + rd_data_counts_asked <= rd_data_counts_asked + (bl_sent + "0000001" ); + + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + rd_data_received_counts <= "0000000"; + elsif (data_valid_i = '1') then + rd_data_received_counts <= rd_data_received_counts + "0000001"; + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + buf_avail_r <= "1000000" - (rd_data_counts_asked - rd_data_received_counts); + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + empty_r <= empty; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + + if (rst_i = '1') then + rd_first_data <= '0'; + elsif ( empty = '0' AND empty_r = '1') then + rd_first_data <= '1'; + end if; + end if; + end process; + + process (gen_rdy_i, empty,empty_r, data_valid_i, data_valid_r, user_bl_cnt_not_1,rd_mdata_fifo_empty,rd_first_data) + begin + if (FAMILY = "SPARTAN6") then + rd_en <= gen_rdy_i and not(empty); + else + IF (MEM_BURST_LEN = 4) then + rd_en <= (not(empty) and empty_r and not(rd_first_data)) or (not(rd_mdata_fifo_empty) and not(empty)) or + (user_bl_cnt_not_1 and data_valid_i); + ELSE + rd_en <= (data_valid_i and not(data_valid_r)) or (user_bl_cnt_not_1 and data_valid_i); + END IF; + end if; + end process; + + + + + gen_valid_o <= not(empty); + -- set the SYNC to 1 because rd_clk = wr_clk to reduce latency + + +-- xhdl4 <= to_integer(to_stdlogic(BL_WIDTH) + to_stdlogic(ADDR_WIDTH)); + + xhdl5 <= (bl_i & addr_i); +-- (gen_bl_o_xhdl2, gen_addr_o_xhdl1) <= xhdl6; + + rd_fifo : afifo + GENERIC MAP ( + DSIZE => (BL_WIDTH + ADDR_WIDTH),--xhdl4, + FIFO_DEPTH => 16, + ASIZE => 4, + SYNC => 1 + ) + port map ( + wr_clk => clk_i, + rst => rst_i, + wr_en => wr_en, + wr_data => xhdl5, + rd_en => rd_en, + rd_clk => clk_i, + rd_data => xhdl6, + full => full, + empty => empty, + almost_full => open + ); + +end architecture trans; + + + + + + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/sp6_data_gen.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/sp6_data_gen.vhd new file mode 100755 index 0000000..d85e41b --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/sp6_data_gen.vhd @@ -0,0 +1,793 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: sp6_data_gen.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:16:40 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This module generates different data pattern as described in +-- parameter DATA_PATTERN and is set up for Spartan 6 family. +-- Reference: +-- Revision History: + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + USE ieee.numeric_std.all; + +entity sp6_data_gen is + generic ( + + ADDR_WIDTH : integer := 32; + BL_WIDTH : integer := 6; + DWIDTH : integer := 32; + DATA_PATTERN : string := "DGEN_ALL"; --"DGEN__HAMMER", "DGEN_WALING1","DGEN_WALING0","DGEN_ADDR","DGEN_NEIGHBOR","DGEN_PRBS","DGEN_ALL" + NUM_DQ_PINS : integer := 8; + COLUMN_WIDTH : integer := 10 + ); + port ( + + clk_i : in std_logic; -- + rst_i : in std_logic; + prbs_fseed_i : in std_logic_vector(31 downto 0); + + data_mode_i : in std_logic_vector(3 downto 0); -- "00" = bram; + data_rdy_i : in std_logic; + cmd_startA : in std_logic; + cmd_startB : in std_logic; + cmd_startC : in std_logic; + cmd_startD : in std_logic; + cmd_startE : in std_logic; + fixed_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); -- generated address used to determine data pattern. + user_burst_cnt : in std_logic_vector(6 downto 0); -- generated burst length for control the burst data + + fifo_rdy_i : in std_logic; -- connect from mcb_wr_full when used as wr_data_gen + -- connect from mcb_rd_empty when used as rd_data_gen + -- When both data_rdy and data_valid is asserted, the ouput data is valid. + data_o : out std_logic_vector(DWIDTH - 1 downto 0) -- generated data pattern + ); +end entity sp6_data_gen; + +architecture trans of sp6_data_gen is + +COMPONENT data_prbs_gen IS + GENERIC ( + EYE_TEST : STRING := "FALSE"; + PRBS_WIDTH : INTEGER := 32; + SEED_WIDTH : INTEGER := 32 + ); + PORT ( + + clk_i : IN STD_LOGIC; + clk_en : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + prbs_fseed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + prbs_seed_init : IN STD_LOGIC; + prbs_seed_i : IN STD_LOGIC_VECTOR(PRBS_WIDTH - 1 DOWNTO 0); + + prbs_o : OUT STD_LOGIC_VECTOR(PRBS_WIDTH - 1 DOWNTO 0) + ); +END COMPONENT; + + -- + signal prbs_data : std_logic_vector(31 downto 0); + + signal adata : std_logic_vector(31 downto 0); + signal hdata : std_logic_vector(DWIDTH - 1 downto 0); + signal ndata : std_logic_vector(DWIDTH - 1 downto 0); + signal w1data : std_logic_vector(DWIDTH - 1 downto 0); + signal data : std_logic_vector(DWIDTH - 1 downto 0); + signal burst_count_reached2 : std_logic; + + signal data_valid : std_logic; + signal walk_cnt : std_logic_vector(2 downto 0); + signal user_address : std_logic_vector(ADDR_WIDTH - 1 downto 0); + + signal i : integer; + signal j : integer; + signal user_bl : std_logic_vector(BL_WIDTH - 1 downto 0); + signal BLANK : std_logic_vector(7 downto 0); + + signal SHIFT_0 : std_logic_vector(7 downto 0); + signal SHIFT_1 : std_logic_vector(7 downto 0); + signal SHIFT_2 : std_logic_vector(7 downto 0); + signal SHIFT_3 : std_logic_vector(7 downto 0); + signal SHIFT_4 : std_logic_vector(7 downto 0); + signal SHIFT_5 : std_logic_vector(7 downto 0); + signal SHIFT_6 : std_logic_vector(7 downto 0); + signal SHIFT_7 : std_logic_vector(7 downto 0); + signal SHIFTB_0 : std_logic_vector(31 downto 0); + signal SHIFTB_1 : std_logic_vector(31 downto 0); + signal SHIFTB_2 : std_logic_vector(31 downto 0); + signal SHIFTB_3 : std_logic_vector(31 downto 0); + signal SHIFTB_4 : std_logic_vector(31 downto 0); + signal SHIFTB_5 : std_logic_vector(31 downto 0); + signal SHIFTB_6 : std_logic_vector(31 downto 0); + signal SHIFTB_7 : std_logic_vector(31 downto 0); + signal TSTB : std_logic_vector(3 downto 0); + --********************************************************************************************* + + -- 4'b0000: data = 32'b0; //bram + -- 4'b0001: data = 32'b0; // fixed + -- address as data + -- DGEN_HAMMER + -- DGEN_NEIGHBOUR + -- DGEN_WALKING1 + -- DGEN_WALKING0 + + --bram + -- fixed + -- address as data + -- DGEN_HAMMER + -- DGEN_NEIGHBOUR + -- DGEN_WALKING1 + -- DGEN_WALKING0 + + --bram + -- fixed + -- address as data + -- DGEN_HAMMER + -- DGEN_NEIGHBOUR + -- DGEN_WALKING1 + -- DGEN_WALKING0 + + -- WALKING ONES: + + -- WALKING ONE + + -- NEIGHBOR ONE + + -- WALKING ZERO + + -- WALKING ONE + + -- NEIGHBOR ONE + + -- WALKING ZERO + + signal tmpdata : std_logic_vector(DWIDTH - 1 downto 0); + signal ndata_rising : std_logic; + signal shift_en : std_logic; + signal data_clk_en : std_logic; + SIGNAL ZEROS : STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0) ;--:= (others => '0'); + +begin + ZEROS <= (others => '0'); + data_o <= data; + xhdl0 : if (DWIDTH = 32) generate + process (adata, hdata, ndata, w1data, prbs_data, data_mode_i,fixed_data_i) + begin + case data_mode_i is + when "0001" => + data <= fixed_data_i; + when "0010" => + data <= adata; + when "0011" => + data <= hdata; + when "0100" => + data <= ndata; + when "0101" => + data <= w1data; + when "0110" => + data <= w1data; + when "0111" => + data <= prbs_data; + WHEN OTHERS => + data <= (others => '0'); + END CASE; + END PROCESS; + + end generate; + xhdl1 : if (DWIDTH = 64) generate + process (adata, hdata, ndata, w1data, prbs_data, data_mode_i,fixed_data_i) + begin + case data_mode_i is + when "0000" => + data <= (others => '0'); + when "0001" => + data <= fixed_data_i; + when "0010" => +-- data <= (adata & adata)(31 downto 0); + data <= (adata & adata); + when "0011" => + data <= hdata; + when "0100" => + data <= ndata; + when "0101" => + data <= w1data; + when "0110" => + data <= w1data; + when "0111" => +-- data <= (prbs_data & prbs_data)(31 downto 0); + data <= (prbs_data & prbs_data); + when others => + data <= (others => '0'); + end case; + end process; + + end generate; + xhdl2 : if (DWIDTH = 128) generate + process (adata, hdata, ndata, w1data, prbs_data, data_mode_i,fixed_data_i) + begin + case data_mode_i is + when "0000" => + data <= (others => '0'); + when "0001" => + data <= fixed_data_i; + when "0010" => +-- data <= (adata & adata & adata & adata)(31 downto 0); + data <= (adata & adata & adata & adata); + when "0011" => + data <= hdata; + when "0100" => + data <= ndata; + when "0101" => + data <= w1data; + when "0110" => + data <= w1data; + when "0111" => +-- data <= (prbs_data & prbs_data & prbs_data & prbs_data)(31 downto 0); + data <= (prbs_data & prbs_data & prbs_data & prbs_data); + when others => + data <= (others => '0');--"00000000000000000000000000000000"; + end case; + end process; + + end generate; + xhdl3 : if ((DWIDTH = 64) or (DWIDTH = 128)) generate + process (data_mode_i) + begin + if (data_mode_i = "0101" or data_mode_i = "0100") then + BLANK <= "00000000"; + SHIFT_0 <= "00000001"; + SHIFT_1 <= "00000010"; + SHIFT_2 <= "00000100"; + SHIFT_3 <= "00001000"; + SHIFT_4 <= "00010000"; + SHIFT_5 <= "00100000"; + SHIFT_6 <= "01000000"; + SHIFT_7 <= "10000000"; + elsif (data_mode_i = "0100") then + BLANK <= "00000000"; + SHIFT_0 <= "00000001"; + SHIFT_1 <= "00000010"; + SHIFT_2 <= "00000100"; + SHIFT_3 <= "00001000"; + SHIFT_4 <= "00010000"; + SHIFT_5 <= "00100000"; + SHIFT_6 <= "01000000"; + SHIFT_7 <= "10000000"; + elsif (data_mode_i = "0110") then + BLANK <= "11111111"; + SHIFT_0 <= "11111110"; + SHIFT_1 <= "11111101"; + SHIFT_2 <= "11111011"; + SHIFT_3 <= "11110111"; + SHIFT_4 <= "11101111"; + SHIFT_5 <= "11011111"; + SHIFT_6 <= "10111111"; + SHIFT_7 <= "01111111"; + else + BLANK <= "11111111"; + SHIFT_0 <= "11111110"; + SHIFT_1 <= "11111101"; + SHIFT_2 <= "11111011"; + SHIFT_3 <= "11110111"; + SHIFT_4 <= "11101111"; + SHIFT_5 <= "11011111"; + SHIFT_6 <= "10111111"; + SHIFT_7 <= "01111111"; + end if; + end process; + + end generate; + process (data_mode_i) + begin + if (data_mode_i = "0101") then + SHIFTB_0 <= "00000000000000100000000000000001"; + SHIFTB_1 <= "00000000000010000000000000000100"; + SHIFTB_2 <= "00000000001000000000000000010000"; + SHIFTB_3 <= "00000000100000000000000001000000"; + SHIFTB_4 <= "00000010000000000000000100000000"; + SHIFTB_5 <= "00001000000000000000010000000000"; + SHIFTB_6 <= "00100000000000000001000000000000"; + SHIFTB_7 <= "10000000000000000100000000000000"; + elsif (data_mode_i = "0100") then + SHIFTB_0 <= "00000000000000000000000000000001"; + SHIFTB_1 <= "00000000000000000000000000000010"; + SHIFTB_2 <= "00000000000000000000000000000100"; + SHIFTB_3 <= "00000000000000000000000000001000"; + SHIFTB_4 <= "00000000000000000000000000010000"; + SHIFTB_5 <= "00000000000000000000000000100000"; + SHIFTB_6 <= "00000000000000000000000001000000"; + SHIFTB_7 <= "00000000000000000000000010000000"; + else + SHIFTB_0 <= "11111111111111011111111111111110"; + SHIFTB_1 <= "11111111111101111111111111111011"; + SHIFTB_2 <= "11111111110111111111111111101111"; + SHIFTB_3 <= "11111111011111111111111110111111"; + SHIFTB_4 <= "11111101111111111111111011111111"; + SHIFTB_5 <= "11110111111111111111101111111111"; + SHIFTB_6 <= "11011111111111111110111111111111"; + SHIFTB_7 <= "01111111111111111011111111111111"; + end if; + end process; + + xhdl4 : if (DWIDTH = 32 and (DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + w1data <= (others => '0'); + ndata_rising <= '1'; + shift_en <= '0'; + elsif ((fifo_rdy_i = '1' and user_burst_cnt /= "0000000") or cmd_startC = '1') then + if (NUM_DQ_PINS = 16) then + if (cmd_startC = '1') then + case addr_i(4 downto 2) is + when "000" => + w1data <= SHIFTB_0; + when "001" => + w1data <= SHIFTB_1; + when "010" => + w1data <= SHIFTB_2; + when "011" => + w1data <= SHIFTB_3; + when "100" => + w1data <= SHIFTB_4; + when "101" => + w1data <= SHIFTB_5; + when "110" => + w1data <= SHIFTB_6; + + when "111" => + w1data <= SHIFTB_7; + when others => + w1data <= SHIFTB_0; + end case; + + ndata_rising <= '0'; --(NUM_DQ_PINS == 16) (cmd_startC) + --shifting + elsif (data_mode_i = "0100") then + w1data <= ("0000000000000000" & w1data(14 downto 0) & w1data(15)); + else + + w1data <= (w1data(29 downto 16) & w1data(31 downto 30) & w1data(13 downto 0) & w1data(15 downto 14)); --(DQ_PINS == 16 + end if; + elsif (NUM_DQ_PINS = 8) then + if (cmd_startC = '1') then -- loading data pattern according the incoming address + case addr_i(2) is + when '0' => + w1data <= SHIFTB_0; + when '1' => + w1data <= SHIFTB_1; + when others => + w1data <= SHIFTB_0; + end case; + else + -- (cmd_startC) + -- Shifting + -- need neigbour pattern ******************** + + w1data <= (w1data(27 downto 24) & w1data(31 downto 28) & w1data(19 downto 16) & w1data(23 downto 20) & w1data(11 downto 8) & w1data(15 downto 12) & w1data(3 downto 0) & w1data(7 downto 4)); --(NUM_DQ_PINS == 8) + end if; + elsif (NUM_DQ_PINS = 4) then -- NUM_DQ_PINS == 4 + -- need neigbour pattern ******************** + if (data_mode_i = "0100") then + w1data <= "00001000000001000000001000000001"; + else + w1data <= "10000100001000011000010000100001"; -- (NUM_DQ_PINS_4 + end if; + end if; + end if; + end if; + end process; + + +-- -- DWIDTH == 32 + end generate; + + xhdl5 : if (DWIDTH = 64 and (DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + + w1data <= (others => '0'); + elsif ((fifo_rdy_i = '1' and user_burst_cnt /= "0000000") or cmd_startC = '1') then + + if (NUM_DQ_PINS = 16) then + if (cmd_startC = '1') then + + + case addr_i(4 downto 3) is + -- 7:0 + + when "00" => + w1data(2 * DWIDTH / 4 - 1 downto 0 * DWIDTH / 4) <= SHIFTB_0(31 downto 0); + w1data(4 * DWIDTH / 4 - 1 downto 2 * DWIDTH / 4) <= SHIFTB_1(31 downto 0); + + when "01" => + w1data(2 * DWIDTH / 4 - 1 downto 0 * DWIDTH / 4) <= SHIFTB_2(31 downto 0); + w1data(4 * DWIDTH / 4 - 1 downto 2 * DWIDTH / 4) <= SHIFTB_3(31 downto 0); + when "10" => + w1data(2 * DWIDTH / 4 - 1 downto 0 * DWIDTH / 4) <= SHIFTB_4(31 downto 0); + w1data(4 * DWIDTH / 4 - 1 downto 2 * DWIDTH / 4) <= SHIFTB_5(31 downto 0); + + when "11" => + w1data(2 * DWIDTH / 4 - 1 downto 0 * DWIDTH / 4) <= SHIFTB_6(31 downto 0); + w1data(4 * DWIDTH / 4 - 1 downto 2 * DWIDTH / 4) <= SHIFTB_7(31 downto 0); + --15:8 + + when others => + w1data <= (ZEROS(DWIDTH-1 downto 8) & BLANK); + end case; + else + + --(NUM_DQ_PINS == 16) (cmd_startC) + --shifting + if (data_mode_i = "0100") then + w1data(63 downto 48) <= "0000000000000000"; + w1data(47 downto 32) <= (w1data(45 downto 32) & w1data(47 downto 46)); + w1data(31 downto 16) <= "0000000000000000"; + + w1data(15 downto 0) <= (w1data(13 downto 0) & w1data(15 downto 14)); + else + +-- w1data(DWIDTH - 1 downto 0) <= (w1data(4 * DWIDTH / 4 - 5 downto 4 * DWIDTH / 4 - 16) & w1data(4 * DWIDTH / 4 - 1 downto 4 * DWIDTH / 4 - 4) & w1data(3 * DWIDTH / 4 - 5 downto 3 * DWIDTH / 4 - 16) & w1data(3 * DWIDTH / 4 - 1 downto 3 * DWIDTH / 4 - 4) & w1data(2 * DWIDTH / 4 - 5 downto 2 * DWIDTH / 4 - 16) & w1data(2 * DWIDTH / 4 - 1 downto 2 * DWIDTH / 4 - 4) & w1data(1 * DWIDTH / 4 - 5 to 1 * DWIDTH / 4 - 16) & w1data(1 * DWIDTH / 4 - 1 downto 1 * DWIDTH / 4 - 4))(31 downto 0); + w1data(DWIDTH - 1 downto 0) <= (w1data(4 * DWIDTH / 4 - 5 downto 4 * DWIDTH / 4 - 16) & + w1data(4 * DWIDTH / 4 - 1 downto 4 * DWIDTH / 4 - 4) & + w1data(3 * DWIDTH / 4 - 5 downto 3 * DWIDTH / 4 - 16) & + w1data(3 * DWIDTH / 4 - 1 downto 3 * DWIDTH / 4 - 4) & + w1data(2 * DWIDTH / 4 - 5 downto 2 * DWIDTH / 4 - 16) & + w1data(2 * DWIDTH / 4 - 1 downto 2 * DWIDTH / 4 - 4) & + w1data(1 * DWIDTH / 4 - 5 downto 1 * DWIDTH / 4 - 16) & + w1data(1 * DWIDTH / 4 - 1 downto 1 * DWIDTH / 4 - 4)); + end if; + end if; + + --(DQ_PINS == 16 + elsif (NUM_DQ_PINS = 8) then + if (cmd_startC = '1') then -- loading data pattern according the incoming address + + if (data_mode_i = "0100") then + + case addr_i(3) is + + when '0' => + w1data <= (BLANK & SHIFT_3 & BLANK & SHIFT_2 & BLANK & SHIFT_1 & BLANK & SHIFT_0); + + when '1' => + w1data <= (BLANK & SHIFT_7 & BLANK & SHIFT_6 & BLANK & SHIFT_5 & BLANK & SHIFT_4); + --15:8 + + when others => + w1data <= (others => '0');--"00000000000000000000000000000000"; + end case; + else + + w1data <= ("10000000010000000010000000010000" & "00001000000001000000001000000001"); --**** checked + w1data <= ("10000000010000000010000000010000" & "00001000000001000000001000000001"); --**** checked + w1data <= ("10000000010000000010000000010000" & "00001000000001000000001000000001"); --**** checked + end if; + -- Shifting + elsif (data_mode_i = "0100") then + + w1data(63 downto 56) <= "00000000"; + + w1data(55 downto 48) <= (w1data(51 downto 48) & w1data(55 downto 52)); + w1data(47 downto 40) <= "00000000"; + + w1data(39 downto 32) <= (w1data(35 downto 32) & w1data(39 downto 36)); + w1data(31 downto 24) <= "00000000"; + + w1data(23 downto 16) <= (w1data(19 downto 16) & w1data(23 downto 20)); + w1data(15 downto 8) <= "00000000"; + + w1data(7 downto 0) <= (w1data(3 downto 0) & w1data(7 downto 4)); + else + w1data <= w1data; --(NUM_DQ_PINS == 8) + end if; + elsif (NUM_DQ_PINS = 4) then -- NUM_DQ_PINS == 4 + if (data_mode_i = "0100") then + w1data <= "0000100000000100000000100000000100001000000001000000001000000001"; + else + + w1data <= "1000010000100001100001000010000110000100001000011000010000100001"; + end if; + end if; + end if; + end if; + end process; + + end generate; + + + xhdl6 : if (DWIDTH = 128 and (DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + + w1data <= (others => '0'); + elsif ((fifo_rdy_i = '1' and user_burst_cnt /= "0000000") or cmd_startC = '1') then + + if (NUM_DQ_PINS = 16) then + if (cmd_startC = '1') then + + case addr_i(4) is + + -- 32 + + when '0' => + w1data(1 * DWIDTH / 4 - 1 downto 0 * DWIDTH / 4) <= SHIFTB_0(31 downto 0); + w1data(2 * DWIDTH / 4 - 1 downto 1 * DWIDTH / 4) <= SHIFTB_1(31 downto 0); + w1data(3 * DWIDTH / 4 - 1 downto 2 * DWIDTH / 4) <= SHIFTB_2(31 downto 0); + w1data(4 * DWIDTH / 4 - 1 downto 3 * DWIDTH / 4) <= SHIFTB_3(31 downto 0); + + -- 32 + + when '1' => + w1data(1 * DWIDTH / 4 - 1 downto 0 * DWIDTH / 4) <= SHIFTB_4(31 downto 0); + w1data(2 * DWIDTH / 4 - 1 downto 1 * DWIDTH / 4) <= SHIFTB_5(31 downto 0); + w1data(3 * DWIDTH / 4 - 1 downto 2 * DWIDTH / 4) <= SHIFTB_6(31 downto 0); + w1data(4 * DWIDTH / 4 - 1 downto 3 * DWIDTH / 4) <= SHIFTB_7(31 downto 0); + --15:8 + + when others => + w1data <= ZEROS(DWIDTH-1 downto 8) & BLANK; + end case; + else + + --(NUM_DQ_PINS == 16) (cmd_startC) + --shifting + if (data_mode_i = "0100") then + w1data(127 downto 112) <= "0000000000000000"; + w1data(111 downto 96) <= (w1data(107 downto 96) & w1data(111 downto 108)); + w1data(95 downto 80) <= "0000000000000000"; + + w1data(79 downto 64) <= (w1data(75 downto 64) & w1data(79 downto 76)); + w1data(63 downto 48) <= "0000000000000000"; + w1data(47 downto 32) <= (w1data(43 downto 32) & w1data(47 downto 44)); + w1data(31 downto 16) <= "0000000000000000"; + + w1data(15 downto 0) <= (w1data(11 downto 0) & w1data(15 downto 12)); + else + + w1data(DWIDTH - 1 downto 0) <= (w1data(4 * DWIDTH / 4 - 9 downto 4 * DWIDTH / 4 - 16) & w1data(4 * DWIDTH / 4 - 1 downto 4 * DWIDTH / 4 - 8) & w1data(4 * DWIDTH / 4 - 25 downto 4 * DWIDTH / 4 - 32) & w1data(4 * DWIDTH / 4 - 17 downto 4 * DWIDTH / 4 - 24) & w1data(3 * DWIDTH / 4 - 9 downto 3 * DWIDTH / 4 - 16) & w1data(3 * DWIDTH / 4 - 1 downto 3 * DWIDTH / 4 - 8) & w1data(3 * DWIDTH / 4 - 25 downto 3 * DWIDTH / 4 - 32) & w1data(3 * DWIDTH / 4 - 17 downto 3 * DWIDTH / 4 - 24) & w1data(2 * DWIDTH / 4 - 9 downto 2 * DWIDTH / 4 - 16) & w1data(2 * DWIDTH / 4 - 1 downto 2 * DWIDTH / 4 - 8) & w1data(2 * DWIDTH / 4 - 25 downto 2 * DWIDTH / 4 - 32) & w1data(2 * DWIDTH / 4 - 17 downto 2 * DWIDTH / 4 - 24) & w1data(1 * DWIDTH / 4 - 9 downto 1 * DWIDTH / 4 - 16) & w1data(1 * DWIDTH / 4 - 1 downto 1 * DWIDTH / 4 - 8) & w1data(1 * DWIDTH / 4 - 25 downto 1 * DWIDTH / 4 - 32) & w1data(1 * DWIDTH / 4 - 17 downto 1 * DWIDTH / 4 - 24)); + end if; + end if; + + --(DQ_PINS == 16 + elsif (NUM_DQ_PINS = 8) then + if (cmd_startC = '1') then -- loading data pattern according the incoming address + if (data_mode_i = "0100") then + w1data <= (BLANK & SHIFT_7 & BLANK & SHIFT_6 & BLANK & SHIFT_5 & BLANK & SHIFT_4 & BLANK & SHIFT_3 & BLANK & SHIFT_2 & BLANK & SHIFT_1 & BLANK & SHIFT_0); + else + + w1data <= (SHIFT_7 & SHIFT_6 & SHIFT_5 & SHIFT_4 & SHIFT_3 & SHIFT_2 & SHIFT_1 & SHIFT_0 & SHIFT_7 & SHIFT_6 & SHIFT_5 & SHIFT_4 & SHIFT_3 & SHIFT_2 & SHIFT_1 & SHIFT_0); -- (cmd_startC) + end if; + else + -- Shifting + + --{w1data[96:64], w1data[127:97],w1data[31:0], w1data[63:32]}; + w1data <= w1data; -- else + end if; + --(NUM_DQ_PINS == 8) + elsif (data_mode_i = "0100") then + w1data <= "00001000000001000000001000000001000010000000010000000010000000010000100000000100000000100000000100001000000001000000001000000001"; + else + + w1data <= "10000100001000011000010000100001100001000010000110000100001000011000010000100001100001000010000110000100001000011000010000100001"; + end if; + end if; + end if; + end process; + + end generate; + + -- HAMMER_PATTERN: Alternating 1s and 0s on DQ pins + -- => the rsing data pattern will be 32'b11111111_11111111_11111111_11111111 + -- => the falling data pattern will be 32'b00000000_00000000_00000000_00000000 + xhdl7 : if (DWIDTH = 32 and (DATA_PATTERN = "DGEN_HAMMER" or DATA_PATTERN = "DGEN_ALL")) generate + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + hdata <= (others => '0'); +-- elsif ((fifo_rdy_i = '1' and user_burst_cnt(5 downto 0) /= "000000") or cmd_startC = '1') then + elsif ((fifo_rdy_i = '1' and user_burst_cnt /= 0) or cmd_startC = '1') then + + if (NUM_DQ_PINS = 16) then + hdata <= "00000000000000001111111111111111"; + elsif (NUM_DQ_PINS = 8) then + hdata <= "00000000111111110000000011111111"; -- NUM_DQ_PINS == 4 + elsif (NUM_DQ_PINS = 4) then + hdata <= "00001111000011110000111100001111"; + end if; + end if; + end if; + end process; + + end generate; + + xhdl8 : if (DWIDTH = 64 and (DATA_PATTERN = "DGEN_HAMMER" or DATA_PATTERN = "DGEN_ALL")) generate + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + hdata <= (others => '0'); + elsif ((fifo_rdy_i = '1' and user_burst_cnt /= 0) or cmd_startC = '1') then + if (NUM_DQ_PINS = 16) then + hdata <= "0000000000000000111111111111111100000000000000001111111111111111"; + elsif (NUM_DQ_PINS = 8) then + hdata <= "0000000011111111000000001111111100000000111111110000000011111111"; + elsif (NUM_DQ_PINS = 4) then + + hdata <= "0000111100001111000011110000111100001111000011110000111100001111"; + end if; + end if; + end if; + end process; + + end generate; + + xhdl9 : if (DWIDTH = 128 and (DATA_PATTERN = "DGEN_HAMMER" or DATA_PATTERN = "DGEN_ALL")) generate + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (rst_i = '1') then + hdata <= (others => '0'); + elsif ((fifo_rdy_i = '1' and user_burst_cnt /= 0) or cmd_startC = '1') then + if (NUM_DQ_PINS = 16) then + hdata <= "00000000000000001111111111111111000000000000000011111111111111110000000000000000111111111111111100000000000000001111111111111111"; + elsif (NUM_DQ_PINS = 8) then + hdata <= "00000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111"; + elsif (NUM_DQ_PINS = 4) then + + hdata <= "00001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111"; + end if; + end if; + end if; + end process; + + end generate; + + process (w1data, hdata) + begin + for i in 0 to DWIDTH - 1 loop + + ndata(i) <= hdata(i) xor w1data(i); + end loop; + end process; + + + -- HAMMER_PATTERN_MINUS: generate walking HAMMER data pattern except 1 bit for the whole burst. The incoming addr_i[5:2] determine + -- the position of the pin driving oppsite polarity + -- addr_i[6:2] = 5'h0f ; 32 bit data port + -- => the rsing data pattern will be 32'b11111111_11111111_01111111_11111111 + -- => the falling data pattern will be 32'b00000000_00000000_00000000_00000000 + + -- ADDRESS_PATTERN: use the address as the 1st data pattern for the whole burst. For example + -- Dataport 32 bit width with starting addr_i = 30'h12345678, user burst length 4 + -- => the 1st data pattern : 32'h12345678 + -- => the 2nd data pattern : 32'h12345679 + -- => the 3rd data pattern : 32'h1234567a + -- => the 4th data pattern : 32'h1234567b + + --data_rdy_i + + xhdl10 : if (DATA_PATTERN = "DGEN_ADDR" or DATA_PATTERN = "DGEN_ALL") generate + --data_o logic + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (cmd_startD = '1') then + adata <= addr_i; + elsif ((fifo_rdy_i and data_rdy_i) = '1' and user_burst_cnt > "0000001") then + if (DWIDTH = 128) then + adata <= adata + "00000000000000000000000000010000"; + elsif (DWIDTH = 64) then + adata <= adata + "00000000000000000000000000001000"; -- DWIDTH == 32 + else + adata <= adata + "00000000000000000000000000000100"; + end if; + end if; + end if; + end process; + + end generate; + + -- PRBS_PATTERN: use the address as the PRBS seed data pattern for the whole burst. For example + -- Dataport 32 bit width with starting addr_i = 30'h12345678, user burst length 4 + -- + + xhdl11 : if (DATA_PATTERN = "DGEN_PRBS" or DATA_PATTERN = "DGEN_ALL") generate + + -- PRBS DATA GENERATION + -- xor all the tap positions before feedback to 1st stage. + +-- data_clk_en <= fifo_rdy_i and data_rdy_i and to_stdlogicvector(user_burst_cnt > "0000001", 7)(0); + data_clk_en <= (fifo_rdy_i AND data_rdy_i) when (user_burst_cnt > "0000001") ELSE '0'; + + + data_prbs_gen_inst : data_prbs_gen + generic map ( + prbs_width => 32, + seed_width => 32 + ) + port map ( + clk_i => clk_i, + clk_en => data_clk_en, + rst_i => rst_i, + prbs_fseed_i => prbs_fseed_i, + prbs_seed_init => cmd_startE, + prbs_seed_i => addr_i(31 downto 0), + prbs_o => prbs_data + ); + + end generate; + + +end architecture trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/tg_status.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/tg_status.vhd new file mode 100755 index 0000000..ec3aa9d --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/tg_status.vhd @@ -0,0 +1,142 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: tg_status.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/06/02 07:16:42 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This module compare the memory read data agaisnt compare data that generated from data_gen module. +-- Error signal will be asserted if the comparsion is not equal. +-- Reference: +-- Revision History: + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + +entity tg_status is + generic ( + TCQ : TIME := 100 ps; + DWIDTH : integer := 32 + ); + port ( + + clk_i : in std_logic; + rst_i : in std_logic; + manual_clear_error : in std_logic; + data_error_i : in std_logic; + cmp_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + rd_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + cmp_addr_i : in std_logic_vector(31 downto 0); + cmp_bl_i : in std_logic_vector(5 downto 0); + mcb_cmd_full_i : in std_logic; + mcb_wr_full_i : in std_logic; + mcb_rd_empty_i : in std_logic; + error_status : out std_logic_vector(64 + (2 * DWIDTH - 1) downto 0); + error : out std_logic + ); +end entity tg_status; + +architecture trans of tg_status is + + signal data_error_r : std_logic; + signal error_set : std_logic; +begin + error <= error_set; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + + data_error_r <= data_error_i; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + + if ((rst_i or manual_clear_error) = '1') then +-- error_status <= "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + error_status <= (others => '0'); + error_set <= '0'; + else + -- latch the first error only + if ((data_error_i and not(data_error_r) and not(error_set)) = '1') then + error_status(31 downto 0) <= cmp_addr_i; + error_status(37 downto 32) <= cmp_bl_i; + error_status(40) <= mcb_cmd_full_i; + error_status(41) <= mcb_wr_full_i; + error_status(42) <= mcb_rd_empty_i; + error_set <= '1'; + error_status(64 + (DWIDTH - 1) downto 64) <= cmp_data_i; + + error_status(64 + (2 * DWIDTH - 1) downto 64 + DWIDTH) <= rd_data_i; + end if; + + error_status(39 downto 38) <= "00"; -- reserved + + error_status(63 downto 43) <= "000000000000000000000"; -- reserved + end if; + end if; + end process; + + +end architecture trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/v6_data_gen.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/v6_data_gen.vhd new file mode 100755 index 0000000..34b1766 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/v6_data_gen.vhd @@ -0,0 +1,3276 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor : Xilinx +-- \ \ \/ Version : %version +-- \ \ Application : MIG +-- / / Filename : v6_data_gen.vhd +-- /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:43 $ +-- \ \ / \ Date Created : Jul 03 2009 +-- \___\/\___\ +-- +-- Device : Virtex6 +-- Design Name : DDR2/DDR3 +-- Purpose : This module generates different data pattern as described in +-- parameter DATA_PATTERN and is set up for Virtex 6 family. +-- Reference : +-- Revision History: +--***************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity v6_data_gen is + generic ( + EYE_TEST : string := "FALSE"; + ADDR_WIDTH : integer := 32; + MEM_BURST_LEN : integer := 8; + BL_WIDTH : integer := 6; + DWIDTH : integer := 288; + DATA_PATTERN : string := "DGEN_ALL"; --"DGEN_HAMMER", "DGEN_WALING1","DGEN_WALING0","DGEN_ADDR","DGEN_NEIGHBOR","DGEN_PRBS","DGEN_ALL" + NUM_DQ_PINS : integer := 72; + COLUMN_WIDTH : integer := 10; + SEL_VICTIM_LINE : integer := 3 -- VICTIM LINE is one of the DQ pins is selected to be different than hammer pattern + ); + port ( + clk_i : in std_logic; + rst_i : in std_logic; + prbs_fseed_i : in std_logic_vector(31 downto 0); + data_mode_i : in std_logic_vector(3 downto 0); + data_rdy_i : in std_logic; + cmd_startA : in std_logic; + cmd_startB : in std_logic; + cmd_startC : in std_logic; + cmd_startD : in std_logic; + cmd_startE : in std_logic; + m_addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); + fixed_data_i : in std_logic_vector(DWIDTH-1 downto 0); + addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); + user_burst_cnt : in std_logic_vector(6 downto 0); + fifo_rdy_i : in std_logic; + data_o : out std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0) + ); +end entity v6_data_gen; + +architecture trans of v6_data_gen is + +component data_prbs_gen is + generic ( + EYE_TEST : string := "FALSE"; + PRBS_WIDTH : integer := 32; + SEED_WIDTH : integer := 32 + ); + port ( + clk_i : in std_logic; + clk_en : in std_logic; + rst_i : in std_logic; + prbs_fseed_i : in std_logic_vector(31 downto 0); + prbs_seed_init : in std_logic; + prbs_seed_i : in std_logic_vector(PRBS_WIDTH - 1 downto 0); + + prbs_o : out std_logic_vector(PRBS_WIDTH - 1 downto 0) + ); +end component; + + constant ALL_0 : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0) := (others => '0'); + signal prbs_data : std_logic_vector(31 downto 0); + signal acounts : std_logic_vector(35 downto 0); + signal adata : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0); + signal hdata : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0); + signal ndata : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0); + signal w1data : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0); + signal w0data : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0); + signal data : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0); + signal tstpts : std_logic_vector(7 downto 0); + signal burst_count_reached2 : std_logic; + signal data_valid : std_logic; + signal walk_cnt : std_logic_vector(2 downto 0); + signal user_address : std_logic_vector(ADDR_WIDTH - 1 downto 0); + signal sel_w1gen_logic : std_logic; + --signal BLANK : std_logic_vector(7 downto 0); + --signal SHIFT_0 : std_logic_vector(7 downto 0); + --signal SHIFT_1 : std_logic_vector(7 downto 0); + --signal SHIFT_2 : std_logic_vector(7 downto 0); + --signal SHIFT_3 : std_logic_vector(7 downto 0); + --signal SHIFT_4 : std_logic_vector(7 downto 0); + --signal SHIFT_5 : std_logic_vector(7 downto 0); + --signal SHIFT_6 : std_logic_vector(7 downto 0); + --signal SHIFT_7 : std_logic_vector(7 downto 0); + signal sel_victimline_r : std_logic_vector(4 * NUM_DQ_PINS - 1 downto 0); + signal data_clk_en : std_logic; + signal full_prbs_data : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0); + signal h_prbsdata : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0); + signal i : integer; + signal j : integer; + + signal data_mode_rr_a : std_logic_vector(3 downto 0); + signal data_mode_rr_b : std_logic_vector(3 downto 0); + signal data_mode_rr_c : std_logic_vector(3 downto 0); + signal prbs_seed_i : std_logic_vector(31 downto 0); + + function concat ( in1 : integer; + in2 : std_logic_vector) return std_logic_vector is + variable rang : integer := in2'length; + variable temp : std_logic_vector(in1*rang-1 downto 0); + begin + for i in 0 to in1-1 loop + temp(rang*(i+1)-1 downto rang*i) := in2; + end loop; + + return temp; + end function; + + + function Data_Gen ( int : integer + ) return std_logic_vector is + + variable data_bus : std_logic_vector(4*NUM_DQ_PINS-1 downto 0) := (others => '0'); + variable j : integer; + begin + j := int/2; + if((int mod 2) = 1) then + + data_bus((0*NUM_DQ_PINS+j*8)+7 downto (0*NUM_DQ_PINS+j*8)) := "00010000"; + data_bus((1*NUM_DQ_PINS+j*8)+7 downto (1*NUM_DQ_PINS+j*8)) := "00100000"; + data_bus((2*NUM_DQ_PINS+j*8)+7 downto (2*NUM_DQ_PINS+j*8)) := "01000000"; + data_bus((3*NUM_DQ_PINS+j*8)+7 downto (3*NUM_DQ_PINS+j*8)) := "10000000"; + else + data_bus((0*NUM_DQ_PINS+j*8)+7 downto (0*NUM_DQ_PINS+j*8)) := "00000001"; + data_bus((1*NUM_DQ_PINS+j*8)+7 downto (1*NUM_DQ_PINS+j*8)) := "00000010"; + data_bus((2*NUM_DQ_PINS+j*8)+7 downto (2*NUM_DQ_PINS+j*8)) := "00000100"; + data_bus((3*NUM_DQ_PINS+j*8)+7 downto (3*NUM_DQ_PINS+j*8)) := "00001000"; + end if; + + + + return data_bus; + end function; + + function Data_GenW0 ( int : integer) return std_logic_vector is + + variable data_bus : std_logic_vector(4*NUM_DQ_PINS-1 downto 0) := (others => '0'); + variable j : integer; + begin + j := int/2; + if((int mod 2) = 1) then + data_bus((0*NUM_DQ_PINS+j*8)+7 downto (0*NUM_DQ_PINS+j*8)) := "11101111"; + data_bus((1*NUM_DQ_PINS+j*8)+7 downto (1*NUM_DQ_PINS+j*8)) := "11011111"; + data_bus((2*NUM_DQ_PINS+j*8)+7 downto (2*NUM_DQ_PINS+j*8)) := "10111111"; + data_bus((3*NUM_DQ_PINS+j*8)+7 downto (3*NUM_DQ_PINS+j*8)) := "01111111"; + else + data_bus((0*NUM_DQ_PINS+j*8)+7 downto (0*NUM_DQ_PINS+j*8)) := "11111110"; + data_bus((1*NUM_DQ_PINS+j*8)+7 downto (1*NUM_DQ_PINS+j*8)) := "11111101"; + data_bus((2*NUM_DQ_PINS+j*8)+7 downto (2*NUM_DQ_PINS+j*8)) := "11111011"; + data_bus((3*NUM_DQ_PINS+j*8)+7 downto (3*NUM_DQ_PINS+j*8)) := "11110111"; + end if; + + return data_bus; + end function; + + + +begin + data_o <= data; + full_prbs_data <= concat(DWIDTH/32,prbs_data); + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + data_mode_rr_a <= data_mode_i; + data_mode_rr_b <= data_mode_i; + data_mode_rr_c <= data_mode_i; + end if; + end process; + + + process (data_mode_rr_a, h_prbsdata, fixed_data_i, adata, hdata, ndata, w1data, full_prbs_data) + begin + case data_mode_rr_a is + when "0000" => + data <= h_prbsdata; + when "0001" => -- "0001" = fixed data + data <= fixed_data_i; + when "0010" => -- "0010" = address as data + data <= adata; + when "0011" => -- "0011" = hammer + data <= hdata; + when "0100" => -- "0100" = neighbour + data <= ndata; + when "0101" => -- "0101" = walking 1's + data <= w1data; + + when "0110" => -- "0110" = walking 0's + data <= w1data; + when "0111" => -- "0111" = prbs + data <= full_prbs_data; + when others => + data <= (others => '0'); + end case; + end process; + +-- process (data_mode_rr_a, h_prbsdata, fixed_data_i, adata, hdata, ndata, w1data, full_prbs_data) +-- begin +-- case data_mode_rr_a is +-- when "0000" => +-- data <= h_prbsdata; +-- when "0001" => -- "0001" = fixed data +-- data <= fixed_data_i; +-- when "0010" => -- "0010" = address as data +-- data <= adata; +-- when "0011" => -- "0011" = hammer +-- data <= hdata; +-- when "0100" => -- "0100" = neighbour +-- data <= ndata; +-- when "0111" => -- "0111" = prbs +-- data <= full_prbs_data; +-- when others => +-- data <= w1data; +-- end case; +-- end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (data_mode_rr_c(2 downto 0) = "101" or data_mode_rr_c(2 downto 0) = "100" or data_mode_rr_c(2 downto 0) = "110") then -- WALKING PATTERN + sel_w1gen_logic <= '1'; + else + sel_w1gen_logic <= '0'; + end if; + end if; + end process; + + WALKING_ONE_8_PATTERN : if (NUM_DQ_PINS = 8 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(3) is + + when '0' => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + when '1' => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + WALKING_ONE_16_PATTERN : if (NUM_DQ_PINS = 16 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(4 downto 3) is + + when "00" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "01" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "10" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "11" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + WALKING_ONE_24_PATTERN : if (NUM_DQ_PINS = 24 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(7 downto 3) is + + when "00000" | "00110" | "01100" | + "10010" | "11000" | "11110" => + -- when "10010" | "11000"=> + + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "00001" | "00111" | "01101" | + "10011" | "11001" | "11111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "00010" | "01000" | "01110" | --2,8,14,20,26 + "10100" | "11010" => + + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "00011" | "01001" | "01111" | --3,9,15,21,27 + "10101" | "11011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "00100" | "01010" | "10000" | + "10110" | "11100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "00101" | "01011" | "10001" | + "10111" | "11101" => + + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; -- cmd_startC + end if; --if ( fifo_rdy_i = '1' or cmd_startC = '1') + end if; -- clk + end process; + end generate; + + WALKING_ONE_32_PATTERN : if (NUM_DQ_PINS = 32 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(6 downto 4) is + + when "000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; +-- + WALKING_ONE_40_PATTERN : if (NUM_DQ_PINS = 40 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(7 downto 4) is + + when "0000" | "1010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "0001" | "1011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "0010" | "1100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "0011" | "1101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "0100" | "1110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "0101" | "1111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(7); + end if; + + when "0110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "0111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "1000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "1001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + WALKING_ONE_48_PATTERN : + if (NUM_DQ_PINS = 48 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(7 downto 4) is + + when "0000" | "1100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "0001" | "1101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "0010" | "1110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "0011" | "1111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "0100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "0101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "0110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "0111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "1000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "1001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "1010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "1011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; +-- + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + +WALKING_ONE_56_PATTERN: + if (NUM_DQ_PINS = 56 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(8 downto 5) is + + when "0000" | "1110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + + when "0001" | "1111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + + when "0010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + + when "0011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + when "0100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "0101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "0110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "0111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "1000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "1001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "1010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + when "1011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "1100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "1101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; +-- +WALKING_ONE_64_PATTERN : +if (NUM_DQ_PINS = 64 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(8 downto 5) is + + when "0000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "0001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "0010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "0011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "0100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "0101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "0110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "0111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "1000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "1001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "1010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "1011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "1100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "1101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "1110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "1111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; +WALKING_ONE_72_PATTERN : + if (NUM_DQ_PINS = 72 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(9 downto 5) is + + when "00000" | "10010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "00001" | "10011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "00010" | "10100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "00011" | "10101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "00100" | "10110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "00101" | "10111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "00110" | "11000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "00111" | "11001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "01000" | "11010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "01001" | "11011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "01010" | "11100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "01011" | "11101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "01100" | "11110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "01101" | "11111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "01110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "01111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "10000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "10001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + +WALKING_ONE_80_PATTERN : + + if (NUM_DQ_PINS = 80 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(9 downto 5) is + + when "00000" | "10100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "00001" | "10101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "00010" | "10110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "00011" | "10111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "00100" | "11000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "00101" | "11001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "00110" | "11010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "00111" | "11011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "01000" | "11100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "01001" | "11101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "01010" | "11110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "01011" | "11111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "01100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "01101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "01110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "01111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "10000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "10001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when "10010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(18); + else + w1data <= Data_GenW0(18); + end if; + + when "10011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(19); + else + w1data <= Data_GenW0(19); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + +WALKING_ONE_88_PATTERN: + if (NUM_DQ_PINS = 88 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(9 downto 5) is + + when "00000" | "10110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "00001" | "10111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "00010" | "11000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "00011" | "11001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "00100" | "11010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "00101" | "11011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "00110" | "11100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "00111" | "11101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "01000" | "11110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "01001" | "11111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "01010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "01011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "01100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "01101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "01110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "01111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "10000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "10001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when "10010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(18); + else + w1data <= Data_GenW0(18); + end if; + + when "10011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(19); + else + w1data <= Data_GenW0(19); + end if; + + when "10100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(20); + else + w1data <= Data_GenW0(20); + end if; + + when "10101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(21); + else + w1data <= Data_GenW0(21); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + +WALKING_ONE_96_PATTERN: + if (NUM_DQ_PINS = 96 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(9 downto 5) is + + when "00000" | "11000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "00001" | "11001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "00010" | "11010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "00011" | "11011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "00100" | "11100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "00101" | "11101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "00110" | "11110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "00111" | "11111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "01000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "01001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "01010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "01011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "01100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "01101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "01110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "01111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "10000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "10001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when "10010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(18); + else + w1data <= Data_GenW0(18); + end if; + + when "10011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(19); + else + w1data <= Data_GenW0(19); + end if; + + when "10100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(20); + else + w1data <= Data_GenW0(20); + end if; + + when "10101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(21); + else + w1data <= Data_GenW0(21); + end if; + + when "10110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(22); + else + w1data <= Data_GenW0(22); + end if; + + when "10111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(23); + else + w1data <= Data_GenW0(23); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + WALKING_ONE_104_PATTERN: + if (NUM_DQ_PINS = 104 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(9 downto 5) is + + when "00000" | "11010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "00001" | "11011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "00010" | "11100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "00011" | "11101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "00100" | "11110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "00101" | "11111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "00110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "00111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "01000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "01001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "01010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "01011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "01100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "01101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "01110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "01111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "10000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "10001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when "10010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(18); + else + w1data <= Data_GenW0(18); + end if; + + when "10011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(19); + else + w1data <= Data_GenW0(19); + end if; + + when "10100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(20); + else + w1data <= Data_GenW0(20); + end if; + + when "10101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(21); + else + w1data <= Data_GenW0(21); + end if; + + when "10110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(22); + else + w1data <= Data_GenW0(22); + end if; + + when "10111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(23); + else + w1data <= Data_GenW0(23); + end if; + + when "11000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(24); + else + w1data <= Data_GenW0(24); + end if; + + when "11001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(25); + else + w1data <= Data_GenW0(25); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + WALKING_ONE_112_PATTERN: + if (NUM_DQ_PINS = 112 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(9 downto 5) is + + when "00000" | "11100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "00001" | "11101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "00010" | "11110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "00011" | "11111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "00100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "00101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "00110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "00111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "01000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "01001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "01010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "01011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "01100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "01101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "01110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "01111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "10000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "10001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when "10010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(18); + else + w1data <= Data_GenW0(18); + end if; + + when "10011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(19); + else + w1data <= Data_GenW0(19); + end if; + + when "10100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(20); + else + w1data <= Data_GenW0(20); + end if; + + when "10101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(21); + else + w1data <= Data_GenW0(21); + end if; + + when "10110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(22); + else + w1data <= Data_GenW0(22); + end if; + + when "10111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(23); + else + w1data <= Data_GenW0(23); + end if; + + when "11000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(24); + else + w1data <= Data_GenW0(24); + end if; + + when "11001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(25); + else + w1data <= Data_GenW0(25); + end if; + + when "11010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(26); + else + w1data <= Data_GenW0(26); + end if; + + when "11011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(27); + else + w1data <= Data_GenW0(27); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + WALKING_ONE_120_PATTERN: + if (NUM_DQ_PINS = 120 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(9 downto 5) is + + when "00000" | "11110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "00001" | "11111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "00010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "00011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "00100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "00101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "00110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "00111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "01000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "01001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "01010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "01011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "01100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "01101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "01110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "01111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "10000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "10001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when "10010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(18); + else + w1data <= Data_GenW0(18); + end if; + + when "10011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(19); + else + w1data <= Data_GenW0(19); + end if; + + when "10100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(20); + else + w1data <= Data_GenW0(20); + end if; + + when "10101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(21); + else + w1data <= Data_GenW0(21); + end if; + + when "10110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(22); + else + w1data <= Data_GenW0(22); + end if; + + when "10111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(23); + else + w1data <= Data_GenW0(23); + end if; + + when "11000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(24); + else + w1data <= Data_GenW0(24); + end if; + + when "11001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(25); + else + w1data <= Data_GenW0(25); + end if; + + when "11010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(26); + else + w1data <= Data_GenW0(26); + end if; + + when "11011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(27); + else + w1data <= Data_GenW0(27); + end if; + + when "11100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(28); + else + w1data <= Data_GenW0(28); + end if; + + when "11101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(29); + else + w1data <= Data_GenW0(29); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + WALKING_ONE_128_PATTERN: + if (NUM_DQ_PINS = 128 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(10 downto 6) is + + when "00000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "00001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "00010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "00011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "00100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "00101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "00110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "00111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "01000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "01001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "01010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "01011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "01100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "01101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "01110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "01111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "10000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "10001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when "10010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(18); + else + w1data <= Data_GenW0(18); + end if; + + when "10011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(19); + else + w1data <= Data_GenW0(19); + end if; + + when "10100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(20); + else + w1data <= Data_GenW0(20); + end if; + + when "10101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(21); + else + w1data <= Data_GenW0(21); + end if; + + when "10110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(22); + else + w1data <= Data_GenW0(22); + end if; + + when "10111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(23); + else + w1data <= Data_GenW0(23); + end if; + + when "11000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(24); + else + w1data <= Data_GenW0(24); + end if; + + when "11001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(25); + else + w1data <= Data_GenW0(25); + end if; + + when "11010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(26); + else + w1data <= Data_GenW0(26); + end if; + + when "11011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(27); + else + w1data <= Data_GenW0(27); + end if; + + when "11100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(28); + else + w1data <= Data_GenW0(28); + end if; + + when "11101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(29); + else + w1data <= Data_GenW0(29); + end if; + + when "11110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(30); + else + w1data <= Data_GenW0(30); + end if; + + when "11111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(31); + else + w1data <= Data_GenW0(31); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + WALKING_ONE_136_PATTERN: + if (NUM_DQ_PINS = 136 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(11 downto 6) is + + when "000000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "000001" | "100011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "000010" | "100100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "000011" | "100101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "000100" | "100110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "000101" | "100111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "000110" | "101000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + + when "000111" | "101001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "001000" | "101010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "001001" | "101011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "001010" | "101100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "001011" | "101101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "001100" | "101110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "001101" | "101111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "001110" | "110000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "001111" | "110001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "010000" | "110010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "010001" | "110011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when "010010" | "110100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(18); + else + w1data <= Data_GenW0(18); + end if; + + when "010011" | "110101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(19); + else + w1data <= Data_GenW0(19); + end if; + + when "010100" | "110110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(20); + else + w1data <= Data_GenW0(20); + end if; + + when "010101" | "110111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(21); + else + w1data <= Data_GenW0(21); + end if; + + when "010110" | "111000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(22); + else + w1data <= Data_GenW0(22); + end if; + + when "010111" | "111001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(23); + else + w1data <= Data_GenW0(23); + end if; + + when "011000" | "111010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(24); + else + w1data <= Data_GenW0(24); + end if; + + when "011001" | "111011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(25); + else + w1data <= Data_GenW0(25); + end if; + + when "011010" | "111100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(26); + else + w1data <= Data_GenW0(26); + end if; + + when "011011" | "111101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(27); + else + w1data <= Data_GenW0(27); + end if; + + when "011100" | "111110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(28); + else + w1data <= Data_GenW0(28); + end if; + + when "011101" | "111111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(29); + else + w1data <= Data_GenW0(29); + end if; + + when "011110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(30); + else + w1data <= Data_GenW0(30); + end if; + + when "011111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(31); + else + w1data <= Data_GenW0(31); + end if; + + when "100000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(32); + else + w1data <= Data_GenW0(32); + end if; + + when "100001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(33); + else + w1data <= Data_GenW0(33); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + WALKING_ONE_144_PATTERN: + if (NUM_DQ_PINS = 144 and (DATA_PATTERN = "DGEN_WALKING1" or DATA_PATTERN = "DGEN_WALKING0" or DATA_PATTERN = "DGEN_NEIGHBOR" or DATA_PATTERN = "DGEN_ALL")) generate + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ( fifo_rdy_i = '1' or cmd_startC = '1') then + if (cmd_startC = '1') then + if (sel_w1gen_logic = '1') then + case addr_i(11 downto 6) is + + when "000000" | "100100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(0); + else + w1data <= Data_GenW0(0); + end if; + + when "000001" | "100101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(1); + else + w1data <= Data_GenW0(1); + end if; + + when "000010" | "100110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(2); + else + w1data <= Data_GenW0(2); + end if; + + when "000011" | "100111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(3); + else + w1data <= Data_GenW0(3); + end if; + + when "000100" | "101000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(4); + else + w1data <= Data_GenW0(4); + end if; + + when "000101" | "101001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(5); + else + w1data <= Data_GenW0(5); + end if; + + when "000110" | "101010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(6); + else + w1data <= Data_GenW0(6); + end if; + when "000111" | "101011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(7); + else + w1data <= Data_GenW0(7); + end if; + + when "001000" | "101100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(8); + else + w1data <= Data_GenW0(8); + end if; + + when "001001" | "101101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(9); + else + w1data <= Data_GenW0(9); + end if; + + when "001010" | "101110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(10); + else + w1data <= Data_GenW0(10); + end if; + + when "001011" | "101111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(11); + else + w1data <= Data_GenW0(11); + end if; + + when "001100" | "110000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(12); + else + w1data <= Data_GenW0(12); + end if; + + when "001101" | "110001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(13); + else + w1data <= Data_GenW0(13); + end if; + + when "001110" | "110010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(14); + else + w1data <= Data_GenW0(14); + end if; + + when "001111" | "110011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(15); + else + w1data <= Data_GenW0(15); + end if; + + when "010000" | "110100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(16); + else + w1data <= Data_GenW0(16); + end if; + + when "010001" | "110101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(17); + else + w1data <= Data_GenW0(17); + end if; + + when "010010" | "110110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(18); + else + w1data <= Data_GenW0(18); + end if; + + when "010011" | "110111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(19); + else + w1data <= Data_GenW0(19); + end if; + + when "010100" | "111000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(20); + else + w1data <= Data_GenW0(20); + end if; + + when "010101" | "111001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(21); + else + w1data <= Data_GenW0(21); + end if; + + when "010110" | "111010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(22); + else + w1data <= Data_GenW0(22); + end if; + + when "010111" | "111011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(23); + else + w1data <= Data_GenW0(23); + end if; + + when "011000" | "111100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(24); + else + w1data <= Data_GenW0(24); + end if; + + when "011001" | "111101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(25); + else + w1data <= Data_GenW0(25); + end if; + + when "011010" | "111110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(26); + else + w1data <= Data_GenW0(26); + end if; + + when "011011" | "111111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(27); + else + w1data <= Data_GenW0(27); + end if; + + when "011100" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(28); + else + w1data <= Data_GenW0(28); + end if; + + when "011101" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(29); + else + w1data <= Data_GenW0(29); + end if; + + when "011110" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(30); + else + w1data <= Data_GenW0(30); + end if; + + when "011111" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(31); + else + w1data <= Data_GenW0(31); + end if; + + when "100000" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(32); + else + w1data <= Data_GenW0(32); + end if; + + when "100001" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(33); + else + w1data <= Data_GenW0(33); + end if; + + when "100010" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(34); + else + w1data <= Data_GenW0(34); + end if; + + when "100011" => + if (data_mode_i = "0101") then + w1data <= Data_Gen(35); + else + w1data <= Data_GenW0(35); + end if; + + when others => + w1data <= (others => '0'); + + end case; + end if; + elsif (MEM_BURST_LEN = 8) then + w1data(4 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS) <= (w1data(4 * NUM_DQ_PINS - 5 downto 3 * NUM_DQ_PINS) & w1data(4 * NUM_DQ_PINS - 1 downto 4 * NUM_DQ_PINS - 4)); + w1data(3 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS) <= (w1data(3 * NUM_DQ_PINS - 5 downto 2 * NUM_DQ_PINS) & w1data(3 * NUM_DQ_PINS - 1 downto 3 * NUM_DQ_PINS - 4)); + w1data(2 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS) <= (w1data(2 * NUM_DQ_PINS - 5 downto 1 * NUM_DQ_PINS) & w1data(2 * NUM_DQ_PINS - 1 downto 2 * NUM_DQ_PINS - 4)); + w1data(1 * NUM_DQ_PINS - 1 downto 0 * NUM_DQ_PINS) <= (w1data(1 * NUM_DQ_PINS - 5 downto 0 * NUM_DQ_PINS) & w1data(1 * NUM_DQ_PINS - 1 downto 1 * NUM_DQ_PINS - 4)); + end if; + end if; + end if; + end process; + end generate; + + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + for i in 0 to 4 * NUM_DQ_PINS - 1 loop + if (i = SEL_VICTIM_LINE or (i - NUM_DQ_PINS) = SEL_VICTIM_LINE or (i - (NUM_DQ_PINS * 2)) = SEL_VICTIM_LINE or (i - (NUM_DQ_PINS * 3)) = SEL_VICTIM_LINE) then + hdata(i) <= '1'; + elsif (i >= 0 and i <= 1 * NUM_DQ_PINS - 1) then + hdata(i) <= '1'; + elsif (i >= 1 * NUM_DQ_PINS and i <= 2 * NUM_DQ_PINS - 1) then + hdata(i) <= '0'; + elsif (i >= 2 * NUM_DQ_PINS and i <= 3 * NUM_DQ_PINS - 1) then + hdata(i) <= '1'; + elsif (i >= 3 * NUM_DQ_PINS and i <= 4 * NUM_DQ_PINS - 1) then + hdata(i) <= '0'; + else + hdata(i) <= '1'; + end if; + end loop; + end if; + end process; + + process (w1data, hdata) + begin + for i in 0 to 4 * NUM_DQ_PINS - 1 loop + ndata(i) <= hdata(i) xor w1data(i); + end loop; + end process; + + process (full_prbs_data, hdata) + begin + for i in 0 to 4 * NUM_DQ_PINS - 1 loop + if (i = SEL_VICTIM_LINE or (i - NUM_DQ_PINS) = SEL_VICTIM_LINE or (i - (NUM_DQ_PINS * 2)) = SEL_VICTIM_LINE or (i - (NUM_DQ_PINS * 3)) = SEL_VICTIM_LINE) then + h_prbsdata(i) <= full_prbs_data(SEL_VICTIM_LINE); + else + h_prbsdata(i) <= hdata(i); + end if; + end loop; + end process; + + addr_pattern : if (DATA_PATTERN = "DGEN_ADDR" or DATA_PATTERN = "DGEN_ALL") generate + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (cmd_startD = '1') then + acounts <= ("0000" & addr_i); + elsif (fifo_rdy_i = '1' and data_rdy_i = '1' and MEM_BURST_LEN = 8 ) then + if (NUM_DQ_PINS = 8 ) then + acounts <= acounts + X"000000004"; + elsif (NUM_DQ_PINS = 16 and NUM_DQ_PINS < 32) then + acounts <= acounts + X"000000008"; + elsif (NUM_DQ_PINS >= 32 and NUM_DQ_PINS < 64) then + acounts <= acounts + X"000000010"; + elsif (NUM_DQ_PINS >= 64 and NUM_DQ_PINS < 128) then + acounts <= acounts + X"000000020"; + elsif (NUM_DQ_PINS >= 128 and NUM_DQ_PINS < 256) then + acounts <= acounts + X"000000040"; + end if; + end if; + end if; + end process; + + adata <= concat(DWIDTH/32,acounts(31 downto 0)); -- DWIDTH = 4 * NUM_DQ_PINS + + end generate; + + -- When doing eye_test, traffic gen only does write and want to + -- keep the prbs random and address is fixed at a location. + d_clk_en1 : if (EYE_TEST = "TRUE") generate + data_clk_en <= '1'; --fifo_rdy_i && data_rdy_i && user_burst_cnt > 6'd1; + end generate; + + d_clk_en2 : if (EYE_TEST = "FALSE") generate + data_clk_en <= (fifo_rdy_i and data_rdy_i) when (user_burst_cnt > "0000001") else '0'; + end generate; + + prbs_pattern : if (DATA_PATTERN = "DGEN_PRBS" or DATA_PATTERN = "DGEN_ALL") generate + + -- PRBS DATA GENERATION + -- xor all the tap positions before feedback to 1st stage. + prbs_seed_i <= (m_addr_i(6) & m_addr_i(31) & m_addr_i(8) & m_addr_i(22) & m_addr_i(9) & m_addr_i(24) & m_addr_i(21) & m_addr_i(23) & m_addr_i(18) & m_addr_i(10) & m_addr_i(20) & m_addr_i(17) & m_addr_i(13) & m_addr_i(16) & m_addr_i(12) & m_addr_i(4) & m_addr_i(15 downto 0)); --(m_addr_i[31:0]), + + data_prbs_gen_inst : data_prbs_gen + generic map ( + PRBS_WIDTH => 32, + SEED_WIDTH => 32, + EYE_TEST => EYE_TEST + ) + port map ( + clk_i => clk_i, + rst_i => rst_i, + clk_en => data_clk_en, + prbs_fseed_i => prbs_fseed_i, + prbs_seed_init => cmd_startE, + prbs_seed_i => prbs_seed_i, + prbs_o => prbs_data + ); + + end generate; + +end architecture trans; diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/wr_data_gen.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/wr_data_gen.vhd new file mode 100755 index 0000000..e2c40d2 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/wr_data_gen.vhd @@ -0,0 +1,511 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: wr_data_gen.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/05/27 15:50:28 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: +-- Reference: +-- Revision History: + +--***************************************************************************** + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_unsigned.all; + use ieee.numeric_std.all; + +entity wr_data_gen is + generic ( + + TCQ : TIME := 100 ps; + FAMILY : string := "SPARTAN6"; -- "SPARTAN6", "VIRTEX6" + MEM_BURST_LEN : integer := 8; + + MODE : string := "WR"; --"WR", "RD" + ADDR_WIDTH : integer := 32; + BL_WIDTH : integer := 6; + DWIDTH : integer := 32; + DATA_PATTERN : string := "DGEN_PRBS"; --"DGEN__HAMMER", "DGEN_WALING1","DGEN_WALING0","DGEN_ADDR","DGEN_NEIGHBOR","DGEN_PRBS","DGEN_ALL" + NUM_DQ_PINS : integer := 8; + SEL_VICTIM_LINE : integer := 3; -- VICTIM LINE is one of the DQ pins is selected to be different than hammer pattern + + COLUMN_WIDTH : integer := 10; + EYE_TEST : string := "FALSE" + ); + port ( + + clk_i : in std_logic; -- + rst_i : in std_logic_vector(4 downto 0); + prbs_fseed_i : in std_logic_vector(31 downto 0); + + data_mode_i : in std_logic_vector(3 downto 0); -- "00" = bram; + + cmd_rdy_o : out std_logic; -- ready to receive command. It should assert when data_port is ready at the // beginning and will be deasserted once see the cmd_valid_i is asserted. + -- And then it should reasserted when + -- it is generating the last_word. + cmd_valid_i : in std_logic; -- when both cmd_valid_i and cmd_rdy_o is high, the command is valid. + cmd_validB_i : in std_logic; + cmd_validC_i : in std_logic; + + last_word_o : out std_logic; + + -- input [5:0] port_data_counts_i,// connect to data port fifo counts +-- m_addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); + fixed_data_i : in std_logic_vector(DWIDTH - 1 downto 0); + addr_i : in std_logic_vector(ADDR_WIDTH - 1 downto 0); -- generated address used to determine data pattern. + bl_i : in std_logic_vector(BL_WIDTH - 1 downto 0); -- generated burst length for control the burst data + + data_rdy_i : in std_logic; -- connect from mcb_wr_full when used as wr_data_gen + -- connect from mcb_rd_empty when used as rd_data_gen + -- When both data_rdy and data_valid is asserted, the ouput data is valid. + data_valid_o : out std_logic; -- connect to wr_en or rd_en and is asserted whenever the + -- pattern is available. + data_o : out std_logic_vector(DWIDTH - 1 downto 0); -- generated data pattern + data_wr_end_o : out std_logic + ); +end entity wr_data_gen; + +architecture trans of wr_data_gen is + +COMPONENT sp6_data_gen IS + GENERIC ( + + ADDR_WIDTH : INTEGER := 32; + BL_WIDTH : INTEGER := 6; + DWIDTH : INTEGER := 32; + DATA_PATTERN : STRING := "DGEN_PRBS"; + NUM_DQ_PINS : INTEGER := 8; + COLUMN_WIDTH : INTEGER := 10 + ); + PORT ( + + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + prbs_fseed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + data_rdy_i : IN STD_LOGIC; + cmd_startA : IN STD_LOGIC; + cmd_startB : IN STD_LOGIC; + cmd_startC : IN STD_LOGIC; + cmd_startD : IN STD_LOGIC; + cmd_startE : IN STD_LOGIC; + fixed_data_i : IN std_logic_vector(DWIDTH - 1 downto 0); + + addr_i : IN STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + user_burst_cnt : IN STD_LOGIC_VECTOR(BL_WIDTH DOWNTO 0); + + fifo_rdy_i : IN STD_LOGIC; + data_o : OUT STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0) + ); +END COMPONENT; + +COMPONENT v6_data_gen IS + GENERIC ( + + ADDR_WIDTH : INTEGER := 32; + BL_WIDTH : INTEGER := 6; + MEM_BURST_LEN : integer := 8; + + DWIDTH : INTEGER := 32; + DATA_PATTERN : STRING := "DGEN_PRBS"; + NUM_DQ_PINS : INTEGER := 8; + SEL_VICTIM_LINE : INTEGER := 3; + COLUMN_WIDTH : INTEGER := 10; + EYE_TEST : STRING := "FALSE" + ); + PORT ( + + clk_i : IN STD_LOGIC; + rst_i : IN STD_LOGIC; + prbs_fseed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + data_rdy_i : IN STD_LOGIC; + cmd_startA : IN STD_LOGIC; + cmd_startB : IN STD_LOGIC; + cmd_startC : IN STD_LOGIC; + cmd_startD : IN STD_LOGIC; + fixed_data_i : IN std_logic_vector(DWIDTH - 1 downto 0); + cmd_startE : IN STD_LOGIC; + m_addr_i : IN STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + addr_i : IN STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + user_burst_cnt : IN STD_LOGIC_VECTOR(BL_WIDTH DOWNTO 0); + + fifo_rdy_i : IN STD_LOGIC; + data_o : OUT STD_LOGIC_VECTOR(NUM_DQ_PINS*4 - 1 DOWNTO 0) + ); +END COMPONENT; + + signal data : std_logic_vector(DWIDTH - 1 downto 0); + + signal cmd_rdy : std_logic; + signal cmd_rdyB : std_logic; + signal cmd_rdyC : std_logic; + signal cmd_rdyD : std_logic; + signal cmd_rdyE : std_logic; + signal cmd_rdyF : std_logic; + signal cmd_start : std_logic; + signal cmd_startB : std_logic; + signal cmd_startC : std_logic; + signal cmd_startD : std_logic; + signal cmd_startE : std_logic; + signal cmd_startF : std_logic; + + signal burst_count_reached2 : std_logic; + + signal data_valid : std_logic; + signal user_burst_cnt : std_logic_vector(6 downto 0); + signal walk_cnt : std_logic_vector(2 downto 0); + + signal fifo_not_full : std_logic; + signal i : integer; + signal j : integer; + signal w3data : std_logic_vector(31 downto 0); + + -- counter to count user burst length + + -- bl_i; + + signal u_bcount_2 : std_logic; + signal last_word_t : std_logic; + + -- Declare intermediate signals for referenced outputs + signal last_word_o_xhdl1 : std_logic; + signal data_o_xhdl0 : std_logic_vector(DWIDTH - 1 downto 0); + signal tpt_hdata_xhdl2 : std_logic_vector(NUM_DQ_PINS * 4 - 1 downto 0); +begin + -- Drive referenced outputs + last_word_o <= last_word_o_xhdl1; + data_o <= data_o_xhdl0; + fifo_not_full <= data_rdy_i; + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if (((user_burst_cnt = "0000010") or (((cmd_start = '1') and (bl_i = "000001")) and FAMILY = "VIRTEX6")) and (fifo_not_full = '1')) then + data_wr_end_o <= '1'; + else + data_wr_end_o <= '0'; + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + cmd_start <= cmd_validC_i and cmd_rdyC; + cmd_startB <= cmd_valid_i and cmd_rdyB; + cmd_startC <= cmd_validB_i and cmd_rdyC; + cmd_startD <= cmd_validB_i and cmd_rdyD; + cmd_startE <= cmd_validB_i and cmd_rdyE; + cmd_startF <= cmd_validB_i and cmd_rdyF; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + user_burst_cnt <= "0000000" ; + elsif (cmd_start = '1') then + if (FAMILY = "SPARTAN6") then + if (bl_i = "000000") then + user_burst_cnt <= "1000000" ; + else + user_burst_cnt <= ('0' & bl_i) ; + end if; + else + user_burst_cnt <= ('0' & bl_i) ; + end if; + elsif (fifo_not_full = '1') then + if (user_burst_cnt /= "0000000") then + user_burst_cnt <= user_burst_cnt - "0000001" ; + else + user_burst_cnt <= "0000000" ; + end if; + end if; + end if; + end process; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((user_burst_cnt = "0000010" and fifo_not_full = '1') or (cmd_startC = '1' and bl_i = "000001")) then + u_bcount_2 <= '1' ; + elsif (last_word_o_xhdl1 = '1') then + u_bcount_2 <= '0' ; + end if; + end if; + end process; + + + last_word_o_xhdl1 <= u_bcount_2 and fifo_not_full; + + -- cmd_rdy_o assert when the dat fifo is not full and deassert once cmd_valid_i + -- is assert and reassert during the last data + + cmd_rdy_o <= cmd_rdy and fifo_not_full; + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + cmd_rdy <= '1' ; + elsif (cmd_start = '1') then + if (bl_i = "000001") then + cmd_rdy <= '1' ; + else + cmd_rdy <= '0' ; + end if; + elsif (user_burst_cnt = "0000010" and fifo_not_full = '1') then + + cmd_rdy <= '1' ; + end if; + end if; + end process; + + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + cmd_rdyB <= '1' ; + elsif (cmd_startB = '1') then + if (bl_i = "000001") then + cmd_rdyB <= '1' ; + else + cmd_rdyB <= '0' ; + end if; + elsif (user_burst_cnt = "0000010" and fifo_not_full = '1') then + + cmd_rdyB <= '1' ; + end if; + end if; + end process; + + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + cmd_rdyC <= '1' ; + elsif (cmd_startC = '1') then + if (bl_i = "000001") then + cmd_rdyC <= '1' ; + else + cmd_rdyC <= '0' ; + end if; + elsif (user_burst_cnt = "0000010" and fifo_not_full = '1') then + + cmd_rdyC <= '1' ; + end if; + end if; + end process; + + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + cmd_rdyD <= '1' ; + elsif (cmd_startD = '1') then + if (bl_i = "000001") then + cmd_rdyD <= '1' ; + else + cmd_rdyD <= '0' ; + end if; + elsif (user_burst_cnt = "0000010" and fifo_not_full = '1') then + + cmd_rdyD <= '1' ; + end if; + end if; + end process; + + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + cmd_rdyE <= '1' ; + elsif (cmd_startE = '1') then + if (bl_i = "000001") then + cmd_rdyE <= '1' ; + else + cmd_rdyE <= '0' ; + end if; + elsif (user_burst_cnt = "0000010" and fifo_not_full = '1') then + + cmd_rdyE <= '1' ; + end if; + end if; + end process; + + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(0)) = '1') then + cmd_rdyF <= '1' ; + elsif (cmd_startF = '1') then + if (bl_i = "000001") then + cmd_rdyF <= '1' ; + else + cmd_rdyF <= '0' ; + end if; + elsif (user_burst_cnt = "0000010" and fifo_not_full = '1') then + + cmd_rdyF <= '1' ; + end if; + end if; + end process; + + + process (clk_i) + begin + if (clk_i'event and clk_i = '1') then + if ((rst_i(1)) = '1') then + data_valid <= '0' ; + elsif (cmd_start = '1') then + data_valid <= '1' ; + elsif (fifo_not_full = '1' and user_burst_cnt <= "0000001") then + data_valid <= '0' ; + end if; + end if; + end process; + + + data_valid_o <= data_valid and fifo_not_full; + + s6_wdgen : if (FAMILY = "SPARTAN6") generate + + + + + sp6_data_gen_inst : sp6_data_gen + generic map ( + ADDR_WIDTH => 32, + BL_WIDTH => BL_WIDTH, + DWIDTH => DWIDTH, + DATA_PATTERN => DATA_PATTERN, + NUM_DQ_PINS => NUM_DQ_PINS, + COLUMN_WIDTH => COLUMN_WIDTH + ) + port map ( + clk_i => clk_i, + rst_i => rst_i(1), + data_rdy_i => data_rdy_i, + prbs_fseed_i => prbs_fseed_i, + + data_mode_i => data_mode_i, + cmd_startA => cmd_start, + cmd_startB => cmd_startB, + cmd_startC => cmd_startC, + cmd_startD => cmd_startD, + cmd_startE => cmd_startE, + fixed_data_i => fixed_data_i, + addr_i => addr_i, + user_burst_cnt => user_burst_cnt, + fifo_rdy_i => fifo_not_full, + data_o => data_o_xhdl0 + ); + + end generate; + + v6_wdgen : if (FAMILY = "VIRTEX6") generate + + + + + v6_data_gen_inst : v6_data_gen + generic map ( + ADDR_WIDTH => 32, + BL_WIDTH => BL_WIDTH, + DWIDTH => DWIDTH, + MEM_BURST_LEN => MEM_BURST_LEN, + + DATA_PATTERN => DATA_PATTERN, + NUM_DQ_PINS => NUM_DQ_PINS, + SEL_VICTIM_LINE => SEL_VICTIM_LINE, + COLUMN_WIDTH => COLUMN_WIDTH, + EYE_TEST => EYE_TEST + ) + port map ( + clk_i => clk_i, + rst_i => rst_i(1), + data_rdy_i => data_rdy_i, + prbs_fseed_i => prbs_fseed_i, + + data_mode_i => data_mode_i, + cmd_starta => cmd_start, + cmd_startb => cmd_startB, + cmd_startc => cmd_startC, + cmd_startd => cmd_startD, + cmd_starte => cmd_startE, + fixed_data_i => fixed_data_i, + m_addr_i => addr_i, --m_addr_i, + addr_i => addr_i, + user_burst_cnt => user_burst_cnt, + fifo_rdy_i => fifo_not_full, + data_o => data_o_xhdl0 + ); + end generate; + + +end architecture trans; + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/write_data_path.vhd b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/write_data_path.vhd new file mode 100755 index 0000000..37d0cf4 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/rtl/traffic_gen/write_data_path.vhd @@ -0,0 +1,210 @@ +--***************************************************************************** +-- (c) Copyright 2009 Xilinx, Inc. All rights reserved. +-- +-- This file contains confidential and proprietary information +-- of Xilinx, Inc. and is protected under U.S. and +-- international copyright and other intellectual property +-- laws. +-- +-- DISCLAIMER +-- This disclaimer is not a license and does not grant any +-- rights to the materials distributed herewith. Except as +-- otherwise provided in a valid license issued to you by +-- Xilinx, and to the maximum extent permitted by applicable +-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +-- (2) Xilinx shall not be liable (whether in contract or tort, +-- including negligence, or under any other theory of +-- liability) for any loss or damage of any kind or nature +-- related to, arising under or in connection with these +-- materials, including for any direct, or any indirect, +-- special, incidental, or consequential loss or damage +-- (including loss of data, profits, goodwill, or any type of +-- loss or damage suffered as a result of any action brought +-- by a third party) even if such damage or loss was +-- reasonably foreseeable or Xilinx had been advised of the +-- possibility of the same. +-- +-- CRITICAL APPLICATIONS +-- Xilinx products are not designed or intended to be fail- +-- safe, or for use in any application requiring fail-safe +-- performance, such as life-support or safety devices or +-- systems, Class III medical devices, nuclear facilities, +-- applications related to the deployment of airbags, or any +-- other applications that could lead to death, personal +-- injury, or severe property or environmental damage +-- (individually and collectively, "Critical +-- Applications"). Customer assumes the sole risk and +-- liability of any use of Xilinx products in Critical +-- Applications, subject only to applicable laws and +-- regulations governing limitations on product liability. +-- +-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +-- PART OF THIS FILE AT ALL TIMES. +-- +--***************************************************************************** +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: %version +-- \ \ Application: MIG +-- / / Filename: write_data_path.vhd +-- /___/ /\ Date Last Modified: $Date: 2011/05/27 15:50:28 $ +-- \ \ / \ Date Created: Jul 03 2009 +-- \___\/\___\ +-- +-- Device: Spartan6 +-- Design Name: DDR/DDR2/DDR3/LPDDR +-- Purpose: This is top level of write path. +-- Reference: +-- Revision History: + +--***************************************************************************** + +LIBRARY ieee; + USE ieee.std_logic_1164.all; + USE ieee.std_logic_unsigned.all; + +entity write_data_path is + generic ( + TCQ : TIME := 100 ps; + MEM_BURST_LEN : integer := 8; + FAMILY : string := "SPARTAN6"; + ADDR_WIDTH : integer := 32; + DWIDTH : integer := 32; + DATA_PATTERN : string := "DGEN_ALL"; --"DGEN__HAMMER", "DGEN_WALING1","DGEN_WALING0","DGEN_ADDR","DGEN_NEIGHBOR","DGEN_PRBS","DGEN_ALL" + NUM_DQ_PINS : integer := 8; + SEL_VICTIM_LINE : integer := 3; -- VICTIM LINE is one of the DQ pins is selected to be different than hammer pattern + + MEM_COL_WIDTH : integer := 10; + EYE_TEST : string := "FALSE" + ); + port ( + + clk_i : in std_logic; + rst_i : in std_logic_vector(9 downto 0); + cmd_rdy_o : out std_logic; + cmd_valid_i : in std_logic; + cmd_validB_i : in std_logic; + cmd_validC_i : in std_logic; + prbs_fseed_i : in std_logic_vector(31 downto 0); + data_mode_i : in std_logic_vector(3 downto 0); +-- m_addr_i : in std_logic_vector(31 downto 0); + fixed_data_i : in std_logic_vector(DWIDTH-1 downto 0); + addr_i : in std_logic_vector(31 downto 0); + + bl_i : in std_logic_vector(5 downto 0); + + -- input [5:0] port_data_counts_i,// connect to data port fifo counts + + data_rdy_i : in std_logic; + data_valid_o : out std_logic; + last_word_wr_o : out std_logic; + data_o : out std_logic_vector(DWIDTH - 1 downto 0); + data_mask_o : out std_logic_vector((DWIDTH / 8) - 1 downto 0); + data_wr_end_o : out std_logic ); +end entity write_data_path; + +architecture trans of write_data_path is + + COMPONENT wr_data_gen IS + GENERIC ( + TCQ : TIME := 100 ps; + FAMILY : STRING := "SPARTAN6"; -- "SPARTAN6", "VIRTEX6" + MODE : STRING := "WR"; --"WR", "RD" + MEM_BURST_LEN : integer := 8; + ADDR_WIDTH : INTEGER := 32; + BL_WIDTH : INTEGER := 6; + DWIDTH : INTEGER := 32; + DATA_PATTERN : STRING := "DGEN_PRBS"; --"DGEN__HAMMER", "DGEN_WALING1","DGEN_WALING0","DGEN_ADDR","DGEN_NEIGHBOR","DGEN_PRBS","DGEN_ALL" + NUM_DQ_PINS : INTEGER := 8; + SEL_VICTIM_LINE : INTEGER := 3; -- VICTIM LINE is one of the DQ pins is selected to be different than hammer pattern + COLUMN_WIDTH : INTEGER := 10; + EYE_TEST : STRING := "FALSE" + ); + PORT ( + clk_i : IN STD_LOGIC; + rst_i : in STD_LOGIC_VECTOR(4 downto 0); + prbs_fseed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0); + data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0); + cmd_rdy_o : OUT STD_LOGIC; + cmd_valid_i : IN STD_LOGIC; + cmd_validB_i : IN STD_LOGIC; + cmd_validC_i : IN STD_LOGIC; + last_word_o : OUT STD_LOGIC; + fixed_data_i : IN std_logic_vector(DWIDTH-1 downto 0); + +-- m_addr_i : IN STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + addr_i : IN STD_LOGIC_VECTOR(ADDR_WIDTH - 1 DOWNTO 0); + bl_i : IN STD_LOGIC_VECTOR(BL_WIDTH - 1 DOWNTO 0); + data_rdy_i : IN STD_LOGIC; + data_valid_o : OUT STD_LOGIC; + data_o : OUT STD_LOGIC_VECTOR(DWIDTH - 1 DOWNTO 0); + data_wr_end_o : OUT STD_LOGIC + ); + END COMPONENT; + + signal data_valid : std_logic; + signal cmd_rdy : std_logic; + + -- Declare intermediate signals for referenced outputs + signal cmd_rdy_o_xhdl0 : std_logic; + signal last_word_wr_o_xhdl3 : std_logic; + signal data_o_xhdl1 : std_logic_vector(DWIDTH - 1 downto 0); + signal data_wr_end_o_xhdl2 : std_logic; +begin + -- Drive referenced outputs + cmd_rdy_o <= cmd_rdy_o_xhdl0; + last_word_wr_o <= last_word_wr_o_xhdl3; + data_o <= data_o_xhdl1; + data_wr_end_o <= data_wr_end_o_xhdl2; + + data_valid_o <= data_valid and data_rdy_i; +-- data_mask_o <= "0000"; -- for now + data_mask_o <= (others => '0'); + + + wr_data_gen_inst : wr_data_gen + generic map ( + TCQ => TCQ, + family => FAMILY, + num_dq_pins => NUM_DQ_PINS, + sel_victim_line => SEL_VICTIM_LINE, + MEM_BURST_LEN => MEM_BURST_LEN, + + data_pattern => DATA_PATTERN, + dwidth => DWIDTH, + column_width => MEM_COL_WIDTH, + eye_test => EYE_TEST + ) + port map ( + clk_i => clk_i, + rst_i => rst_i(9 downto 5), + prbs_fseed_i => prbs_fseed_i, + + data_mode_i => data_mode_i, + cmd_rdy_o => cmd_rdy_o_xhdl0, + cmd_valid_i => cmd_valid_i, + cmd_validb_i => cmd_validB_i, + cmd_validc_i => cmd_validC_i, + + last_word_o => last_word_wr_o_xhdl3, + -- .port_data_counts_i (port_data_counts_i), +-- m_addr_i => m_addr_i, + fixed_data_i => fixed_data_i, + addr_i => addr_i, + bl_i => bl_i, + data_rdy_i => data_rdy_i, + data_valid_o => data_valid, + data_o => data_o_xhdl1, + data_wr_end_o => data_wr_end_o_xhdl2 + ); + +end architecture trans; + + + + diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/ddr2_model_c3.v b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/ddr2_model_c3.v new file mode 100755 index 0000000..cba3e7f --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/ddr2_model_c3.v @@ -0,0 +1,2031 @@ +/**************************************************************************************** +* +* File Name: ddr2_model.v +* Version: 5.82 +* Model: BUS Functional +* +* Dependencies: ddr2_model_parameters.vh +* +* Description: Micron SDRAM DDR2 (Double Data Rate 2) +* +* Limitation: - doesn't check for average refresh timings +* - positive ck and ck_n edges are used to form internal clock +* - positive dqs and dqs_n edges are used to latch data +* - test mode is not modeled +* +* Note: - Set simulator resolution to "ps" accuracy +* - Set Debug = 0 to disable $display messages +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +* Rev Author Date Changes +* --------------------------------------------------------------------------------------- +* 1.00 JMK 07/29/03 Initial Release +* 1.10 JMK 08/09/03 Timing Parameter updates to tIS, tIH, tDS, tDH +* 2.20 JMK 08/07/03 General cleanup +* 2.30 JMK 11/26/03 Added CL_MIN, CL_MAX, wl_min and wl_max parameters. +* Added AL_MIN and AL_MAX parameters. +* Removed support for OCD. +* 2.40 JMK 01/15/04 Removed verilog 2001 constructs. +* 2.50 JMK 01/29/04 Removed tRP checks during Precharge command. +* 2.60 JMK 04/20/04 Fixed tWTR check. +* 2.70 JMK 04/30/04 Added tRFC maximum check. +* Combined Self Refresh and Power Down always blocks. +* Added Reset Function (CKE LOW Anytime). +* 2.80 JMK 08/19/04 Precharge is treated as NOP when bank is not active. +* Added checks for tRAS, tWR, tRTP to any bank during Pre-All. +* tRFC maximum violation will only display one time. +* 2.90 JMK 11/05/04 Fixed DQS checking during write. +* Fixed false tRFC max assertion during power up and self ref. +* Added warning for 200us CKE low time during initialization. +* Added -3, -3E, and -37V speed grades to ddr2_parameters.v +* 3.00 JMK 04/22/05 Removed ODT off requirement during power down. +* Added tAOND, tAOFD, tANPD, tAXPD, tAONPD, and tAOFPD parameters. +* Added ODT status messages. +* Updated the initialization sequence. +* Disable ODT and CLK pins during self refresh. +* Disable cmd and addr pins during power down and self refresh. +* 3.10 JMK 06/07/05 Disable trpa checking if the part does not have 8 banks. +* Changed tAXPD message from error to a warning. +* Added tDSS checking. +* Removed tDQSL checking during tWPRE and tWPST. +* Fixed a burst order error during writes. +* Renamed parameters file with .vh extension. +* 3.20 JMK 07/18/05 Removed 14 tCK requirement from LMR to READ. +* 3.30 JMK 08/03/05 Added check for interrupting a burst with auto precharge. +* 4.00 JMK 11/21/05 Parameter names all UPPERCASE, signal names all lowercase. +* Clock jitter can be tolerated within specification range. +* Clock frequency is sampled from the CK pin. +* Scaleable up to 64 DQ and 16 DQS bits. +* Read data can be randomly skewed using RANDOM_OUT_DELAY. +* Parameterized read and write DQS, and read DQ. +* Initialization can be bypassed using initialize task. +* 4.10 JMK 11/30/05 Fixed compile errors when `MAX_MEM was defined. +* 4.20 JMK 12/09/05 Fixed memory addressing error when `MAX_MEM was defined. +* 4.30 JMK 02/15/06 Added dummy write to initialization sequence. +* Removed tWPST maximum checking. +* Rising dqs_n edge latches data when enabled in EMR. +* Fixed a sign error in the tJIT(cc) calculation. +* 4.40 JMK 02/16/06 Fixed dummy write when`MAX_MEM was defined. +* 4.50 JMK 02/27/06 Fixed extra tDQSS assertions. +* Fixed tRCD and tWTR checking. +* Errors entering Power Down or Self Refresh will cause reset. +* Ignore dqs_n when disabled in EMR. +* 5.00 JMK 04/24/06 Test stimulus now included from external file (subtest.vh) +* Fixed tRFC max assertion during self refresh. +* Fixed tANPD checking during Power Down. +* Removed dummy write from initialization sequence. +* 5.01 JMK 04/28/06 Fixed Auto Precharge to Load Mode, Refresh and Self Refresh. +* Removed Auto Precharge error message during Power Down Enter. +* 5.10 JMK 07/26/06 Created internal clock using ck and ck_n. +* RDQS can only be enabled in EMR for x8 configurations. +* CAS latency is checked vs frequency when DLL locks. +* tMOD changed from tCK units to ns units. +* Added 50 Ohm setting for Rtt in EMR. +* Improved checking of DQS during writes. +* 5.20 JMK 10/02/06 Fixed DQS checking for interrupting write to write and x16. +* 5.30 JMK 05/25/07 Fixed checking for 0-Z transition on write postamble. +* 5.50 JMK 05/30/08 Renamed ddr2_dimm.v to ddr2_module.v and added SODIMM support. +* Added a register delay to ddr2_module.v when RDIMM is defined. +* Added multi-chip package model support in ddr2_mcp.v +* Added High Temp Self Refresh rate setting in EMRS2[7] +* 5.70 JMK 04/23/09 Updated tRPA definition +* Increased internal width to 72 bit DQ bus +* 5.80 SPH 08/12/09 Fixed tRAS maximum violation (only check if bank still open) +* 5.81 SPH 12/08/09 Only check tIH for cmd_addr if CS# LOW +* 5.82 SPH 04/08/10 Correct debug message for SRT in EMR2 +* 5.81 SPH 12/08/09 Only check tIH for cmd_addr if CS# LOW +* 5.81 SPH 12/08/09 Only check tIH for cmd_addr if CS# LOW +****************************************************************************************/ + +// DO NOT CHANGE THE TIMESCALE +// MAKE SURE YOUR SIMULATOR USES "PS" RESOLUTION +`timescale 1ps / 1ps + +module ddr2_model_c3 ( + ck, + ck_n, + cke, + cs_n, + ras_n, + cas_n, + we_n, + dm_rdqs, + ba, + addr, + dq, + dqs, + dqs_n, + rdqs_n, + odt +); + + `include "ddr2_model_parameters_c3.vh" + + // text macros + `define DQ_PER_DQS DQ_BITS/DQS_BITS + `define BANKS (1<= 2. \nBL_MAX = %d", BL_MAX); + if ((1< BL_MAX) + $display("%m ERROR: 2^BO_BITS cannot be greater than BL_MAX parameter."); + $timeformat (-12, 1, " ps", 1); + reset_task; + seed = RANDOM_SEED; + ck_cntr = 0; + end + + // calculate the absolute value of a real number + function real abs_value; + input arg; + real arg; + begin + if (arg < 0.0) + abs_value = -1.0 * arg; + else + abs_value = arg; + end + endfunction + +`ifdef MAX_MEM +`else + function get_index; + input [`MAX_BITS-1:0] addr; + begin : index + get_index = 0; + for (memory_index=0; memory_index TRAS_MAX) && (active_bank[bank] === 1'b1)) $display ("%m: at time %t ERROR: tRAS maximum violation during %s to bank %d", $time, cmd_string[cmd], bank); + if ($time - tm_bank_activate[bank] < TRAS_MIN) $display ("%m: at time %t ERROR: tRAS minimum violation during %s to bank %d", $time, cmd_string[cmd], bank);end + {1'b0, ACTIVATE , ACTIVATE } : begin if ($time - tm_activate < TRRD) $display ("%m: at time %t ERROR: tRRD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, ACTIVATE , ACTIVATE } : begin if ($time - tm_bank_activate[bank] < TRC) $display ("%m: at time %t ERROR: tRC violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, ACTIVATE , 4'b010x } : ; // tRCD is checked outside this task + {1'b1, ACTIVATE , PWR_DOWN } : ; // 1 tCK + {1'b1, WRITE , PRECHARGE} : begin if ((ck_cntr - ck_bank_write[bank] <= write_latency + burst_length/2) || ($time - tm_bank_write_end[bank] < TWR)) $display ("%m: at time %t ERROR: tWR violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, WRITE , WRITE } : begin if (ck_cntr - ck_write < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, WRITE , READ } : begin if ((ck_load_mode < ck_write) && (ck_cntr - ck_write < write_latency + burst_length/2 + 2 - additive_latency)) $display ("%m: at time %t ERROR: tWTR violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, WRITE , PWR_DOWN } : begin if ((ck_load_mode < ck_write) && ( + |write_precharge_bank + || (ck_cntr - ck_write_ap < 1) + || (ck_cntr - ck_write < write_latency + burst_length/2 + 2) + || ($time - tm_write_end < TWTR))) begin $display ("%m: at time %t INFO: Write to Reset condition", $time); init_done = 0; end end + {1'b1, READ , PRECHARGE} : begin if ((ck_cntr - ck_bank_read[bank] < additive_latency + burst_length/2) || ($time - tm_bank_read_end[bank] < TRTP)) $display ("%m: at time %t ERROR: tRTP violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, READ , WRITE } : begin if ((ck_load_mode < ck_read) && (ck_cntr - ck_read < read_latency + burst_length/2 + 1 - write_latency)) $display ("%m: at time %t ERROR: tRTW violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, READ , READ } : begin if (ck_cntr - ck_read < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, READ , PWR_DOWN } : begin if ((ck_load_mode < ck_read) && (ck_cntr - ck_read < read_latency + burst_length/2 + 1)) begin $display ("%m: at time %t INFO: Read to Reset condition", $time); init_done = 0; end end + {1'b0, PWR_DOWN , 4'b00xx } : begin if (ck_cntr - ck_power_down < TXP) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); end + {1'b0, PWR_DOWN , WRITE } : begin if (ck_cntr - ck_power_down < TXP) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); end + {1'b0, PWR_DOWN , READ } : begin if (ck_cntr - ck_slow_exit_pd < TXARDS - additive_latency) $display ("%m: at time %t ERROR: tXARDS violation during %s", $time, cmd_string[cmd]); + else if (ck_cntr - ck_power_down < TXARD) $display ("%m: at time %t ERROR: tXARD violation during %s", $time, cmd_string[cmd]); end + {1'b0, SELF_REF , 4'b00xx } : begin if ($time - tm_self_refresh < TXSNR) $display ("%m: at time %t ERROR: tXSNR violation during %s", $time, cmd_string[cmd]); end + {1'b0, SELF_REF , WRITE } : begin if ($time - tm_self_refresh < TXSNR) $display ("%m: at time %t ERROR: tXSNR violation during %s", $time, cmd_string[cmd]); end + {1'b0, SELF_REF , READ } : begin if (ck_cntr - ck_self_refresh < TXSRD) $display ("%m: at time %t ERROR: tXSRD violation during %s", $time, cmd_string[cmd]); end + {1'b0, 4'b100x , 4'b100x } : begin if (ck_cntr - ck_cke < TCKE) begin $display ("%m: at time %t ERROR: tCKE violation on CKE", $time); init_done = 0; end end + endcase + end + endtask + + task cmd_task; + input cke; + input [2:0] cmd; + input [BA_BITS-1:0] bank; + input [ADDR_BITS-1:0] addr; + reg [`BANKS:0] i; + integer j; + reg [`BANKS:0] tfaw_cntr; + reg [COL_BITS-1:0] col; + begin + + // tRFC max check + if (!er_trfc_max && !in_self_refresh) begin + if ($time - tm_refresh > TRFC_MAX) begin + $display ("%m: at time %t ERROR: tRFC maximum violation during %s", $time, cmd_string[cmd]); + er_trfc_max = 1; + end + end + if (cke) begin + if ((cmd < NOP) && ((cmd != PRECHARGE) || !addr[AP])) begin + for (j=0; j= BL_MIN) && (burst_length <= BL_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Length = %d", $time, cmd_string[cmd], bank, burst_length); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Burst Length = %d", $time, cmd_string[cmd], bank, burst_length); + end + // Burst Order + burst_order = addr[3]; + if (!burst_order) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Sequential", $time, cmd_string[cmd], bank); + end else if (burst_order) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Interleaved", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Burst Order = %d", $time, cmd_string[cmd], bank, burst_order); + end + // CAS Latency + cas_latency = addr[6:4]; + read_latency = cas_latency + additive_latency; + write_latency = read_latency - 1; + if ((cas_latency >= CL_MIN) && (cas_latency <= CL_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency); + end + // Test Mode + if (!addr[7]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Test Mode = Normal", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Test Mode = %d", $time, cmd_string[cmd], bank, addr[7]); + end + // DLL Reset + dll_reset = addr[8]; + if (!dll_reset) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Normal", $time, cmd_string[cmd], bank); + end else if (dll_reset) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Reset DLL", $time, cmd_string[cmd], bank); + dll_locked = 0; + ck_dll_reset <= ck_cntr; + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal DLL Reset = %d", $time, cmd_string[cmd], bank, dll_reset); + end + // Write Recovery + write_recovery = addr[11:9] + 1; + if ((write_recovery >= WR_MIN) && (write_recovery <= WR_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery); + end + // Power Down Mode + low_power = addr[12]; + if (!low_power) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = Fast Exit", $time, cmd_string[cmd], bank); + end else if (low_power) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = Slow Exit", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Power Down Mode = %d", $time, cmd_string[cmd], bank, low_power); + end + end + 1 : begin + // DLL Enable + dll_en = !addr[0]; + if (!dll_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (dll_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal DLL Enable = %d", $time, cmd_string[cmd], bank, dll_en); + end + // Output Drive Strength + if (!addr[1]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = Full", $time, cmd_string[cmd], bank); + end else if (addr[1]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = Reduced", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Output Drive Strength = %d", $time, cmd_string[cmd], bank, addr[1]); + end + // ODT Rtt + odt_rtt = {addr[6], addr[2]}; + if (odt_rtt == 2'b00) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = Disabled", $time, cmd_string[cmd], bank); + odt_en = 0; + end else if (odt_rtt == 2'b01) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 75 Ohm", $time, cmd_string[cmd], bank); + odt_en = 1; + tm_odt_en <= $time; + end else if (odt_rtt == 2'b10) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 150 Ohm", $time, cmd_string[cmd], bank); + odt_en = 1; + tm_odt_en <= $time; + end else if (odt_rtt == 2'b11) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 50 Ohm", $time, cmd_string[cmd], bank); + odt_en = 1; + tm_odt_en <= $time; + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal ODT Rtt = %d", $time, cmd_string[cmd], bank, odt_rtt); + odt_en = 0; + end + // Additive Latency + additive_latency = addr[5:3]; + read_latency = cas_latency + additive_latency; + write_latency = read_latency - 1; + if ((additive_latency >= AL_MIN) && (additive_latency <= AL_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Additive Latency = %d", $time, cmd_string[cmd], bank, additive_latency); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Additive Latency = %d", $time, cmd_string[cmd], bank, additive_latency); + end + // OCD Program + ocd = addr[9:7]; + if (ocd == 3'b000) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d OCD Program = OCD Exit", $time, cmd_string[cmd], bank); + end else if (ocd == 3'b111) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d OCD Program = OCD Default", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal OCD Program = %b", $time, cmd_string[cmd], bank, ocd); + end + + // DQS_N Enable + dqs_n_en = !addr[10]; + if (!dqs_n_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DQS_N Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (dqs_n_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DQS_N Enable = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal DQS_N Enable = %d", $time, cmd_string[cmd], bank, dqs_n_en); + end + // RDQS Enable + rdqs_en = addr[11]; + if (!rdqs_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d RDQS Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (rdqs_en) begin +`ifdef x8 + if (DEBUG) $display ("%m: at time %t INFO: %s %d RDQS Enable = Enabled", $time, cmd_string[cmd], bank); +`else + $display ("%m: at time %t WARNING: %s %d Illegal RDQS Enable. RDQS only exists on a x8 part", $time, cmd_string[cmd], bank); + rdqs_en = 0; +`endif + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal RDQS Enable = %d", $time, cmd_string[cmd], bank, rdqs_en); + end + // Output Enable + out_en = !addr[12]; + if (!out_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (out_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Enable = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Output Enable = %d", $time, cmd_string[cmd], bank, out_en); + end + end + 2 : begin + // High Temperature Self Refresh rate + if (!addr[7]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d High Temperature Self Refresh rate = 1X (0C-85C)", $time, cmd_string[cmd], bank); + end else if (addr[7]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d High Temperature Self Refresh rate = 2X (>85C)", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal High Temperature Self Refresh rate = %d", $time, cmd_string[cmd], bank, addr[7]); + end + if ((addr & ~(1<<7)) !== 0) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + end + 3 : begin + if (addr !== 0) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + end + endcase + init_mode_reg[bank] = 1; + ck_load_mode <= ck_cntr; + end + end + REFRESH : begin + if (|active_bank) begin + $display ("%m: at time %t ERROR: %s Failure. All banks must be Precharged.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (DEBUG) $display ("%m: at time %t INFO: %s", $time, cmd_string[cmd]); + er_trfc_max = 0; + ref_cntr = ref_cntr + 1; + tm_refresh <= $time; + end + end + PRECHARGE : begin + if (addr[AP]) begin + // tRPA timing applies when the PRECHARGE (ALL) command is issued, regardless of + // the number of banks already open or closed. + for (i=0; i<`BANKS; i=i+1) begin + for (j=0; j 3) begin + $display ("%m: at time %t ERROR: tFAW violation during %s to bank %d", $time, cmd_string[cmd], bank); + end + end + + if (!init_done) begin + $display ("%m: at time %t ERROR: %s Failure. Initialization sequence is not complete.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else if (active_bank[bank]) begin + $display ("%m: at time %t ERROR: %s Failure. Bank %d must be Precharged.", $time, cmd_string[cmd], bank); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (addr >= 1<>1) & -1*(1<= 1<>1) & -1*(1<= 1< $time) +// $display("%m: at time %t WARNING: NOP or DESELECT is required for 200 us before CKE is brought high", $time); + init_step = init_step + 1; + end + 1 : if (dll_en) init_step = init_step + 1; + 2 : begin + if (&init_mode_reg && dll_reset) begin + active_bank = {`BANKS{1'b1}}; // require Precharge All or bank Precharges + ref_cntr = 0; // require refresh + init_step = init_step + 1; + end + end + 3 : if (ref_cntr == 2) begin + init_step = init_step + 1; + end + 4 : if (!dll_reset) init_step = init_step + 1; + 5 : if (ocd == 3'b111) init_step = init_step + 1; + 6 : begin + if (ocd == 3'b000) begin + if (DEBUG) $display ("%m: at time %t INFO: Initialization Sequence is complete", $time); + init_done = 1; + end + end + endcase + end + end else if (prev_cke) begin + if ((!init_done) && (init_step > 1)) begin + $display ("%m: at time %t ERROR: CKE must remain active until the initialization sequence is complete.", $time); + if (STOP_ON_ERROR) $stop(0); + end + case (cmd) + REFRESH : begin + for (j=0; j TDQSS*tck_avg)) + $display ("%m: at time %t ERROR: tDQSS violation on %s bit %d", $time, dqs_string[i/18], i%18); + end + if (check_write_dqs_low[i]) + $display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period", $time, dqs_string[i/18], i%18); + end + check_write_preamble <= 0; + check_write_postamble <= 0; + check_write_dqs_low <= 0; + end + + if (wr_pipeline[0] || rd_pipeline[0]) begin + bank = ba_pipeline[0]; + row = row_pipeline[0]; + col = col_pipeline[0]; + burst_cntr = 0; + memory_read(bank, row, col, memory_data); + end + + // burst counter + if (burst_cntr < burst_length) begin + burst_position = col ^ burst_cntr; + if (!burst_order) begin + burst_position[BO_BITS-1:0] = col + burst_cntr; + end + burst_cntr = burst_cntr + 1; + end + + // write dqs counter + if (wr_pipeline[WDQS_PRE + 1]) begin + wdqs_cntr = WDQS_PRE + burst_length + WDQS_PST - 1; + end + // write dqs + if ((wdqs_cntr == burst_length + WDQS_PST) && (wdq_cntr == 0)) begin //write preamble + check_write_preamble <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}}; + end + if (wdqs_cntr > 1) begin // write data + if ((wdqs_cntr - WDQS_PST)%2) begin + check_write_dqs_high <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}}; + end else begin + check_write_dqs_low <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}}; + end + end + if (wdqs_cntr == WDQS_PST) begin // write postamble + check_write_postamble <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}}; + end + if (wdqs_cntr > 0) begin + wdqs_cntr = wdqs_cntr - 1; + end + + // write dq + if (dq_in_valid) begin // write data + bit_mask = 0; + if (diff_ck) begin + for (i=0; i>(burst_position*DQ_BITS); + if (DEBUG) $display ("%m: at time %t INFO: WRITE @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp); + if (burst_cntr%BL_MIN == 0) begin + memory_write(bank, row, col, memory_data); + end + end + if (wr_pipeline[1]) begin + wdq_cntr = burst_length; + end + if (wdq_cntr > 0) begin + wdq_cntr = wdq_cntr - 1; + dq_in_valid = 1'b1; + end else begin + dq_in_valid = 1'b0; + dqs_in_valid <= 1'b0; + for (i=0; i<36; i=i+1) begin + wdqs_pos_cntr[i] <= 0; + end + end + if (wr_pipeline[0]) begin + b2b_write <= 1'b0; + end + if (wr_pipeline[2]) begin + if (dqs_in_valid) begin + b2b_write <= 1'b1; + end + dqs_in_valid <= 1'b1; + end + // read dqs enable counter + if (rd_pipeline[RDQSEN_PRE]) begin + rdqsen_cntr = RDQSEN_PRE + burst_length + RDQSEN_PST - 1; + end + if (rdqsen_cntr > 0) begin + rdqsen_cntr = rdqsen_cntr - 1; + dqs_out_en = 1'b1; + end else begin + dqs_out_en = 1'b0; + end + + // read dqs counter + if (rd_pipeline[RDQS_PRE]) begin + rdqs_cntr = RDQS_PRE + burst_length + RDQS_PST - 1; + end + // read dqs + if ((rdqs_cntr >= burst_length + RDQS_PST) && (rdq_cntr == 0)) begin //read preamble + dqs_out = 1'b0; + end else if (rdqs_cntr > RDQS_PST) begin // read data + dqs_out = rdqs_cntr - RDQS_PST; + end else if (rdqs_cntr > 0) begin // read postamble + dqs_out = 1'b0; + end else begin + dqs_out = 1'b1; + end + if (rdqs_cntr > 0) begin + rdqs_cntr = rdqs_cntr - 1; + end + + // read dq enable counter + if (rd_pipeline[RDQEN_PRE]) begin + rdqen_cntr = RDQEN_PRE + burst_length + RDQEN_PST; + end + if (rdqen_cntr > 0) begin + rdqen_cntr = rdqen_cntr - 1; + dq_out_en = 1'b1; + end else begin + dq_out_en = 1'b0; + end + // read dq + if (rd_pipeline[0]) begin + rdq_cntr = burst_length; + end + if (rdq_cntr > 0) begin // read data + dq_temp = memory_data>>(burst_position*DQ_BITS); + dq_out = dq_temp; + if (DEBUG) $display ("%m: at time %t INFO: READ @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp); + rdq_cntr = rdq_cntr - 1; + end else begin + dq_out = {DQ_BITS{1'b1}}; + end + + // delay signals prior to output + if (RANDOM_OUT_DELAY && (dqs_out_en || |dqs_out_en_dly || dq_out_en || |dq_out_en_dly)) begin + for (i=0; i dqsck[i] + TQHS + TDQSQ) begin + dqsck_max = dqsck[i] + TQHS + TDQSQ; + end + dqsck_min = -1*TDQSCK; + if (dqsck_min < dqsck[i] - TQHS - TDQSQ) begin + dqsck_min = dqsck[i] - TQHS - TDQSQ; + end + + // DQSQ requirements + // 1.) less than tAC - DQSCK + // 2.) less than tDQSQ + // 3.) greater than -tAC + // 4.) greater than tQH from previous DQS edge + dqsq_min = -1*TAC; + if (dqsq_min < dqsck[i] - TQHS) begin + dqsq_min = dqsck[i] - TQHS; + end + if (dqsck_min == dqsck_max) begin + dqsck[i] = dqsck_min; + end else begin + dqsck[i] = $dist_uniform(seed, dqsck_min, dqsck_max); + end + dqsq_max = TAC; + if (dqsq_max > TDQSQ + dqsck[i]) begin + dqsq_max = TDQSQ + dqsck[i]; + end + + dqs_out_en_dly[i] <= #(tck_avg/2.0 + ($random % TAC)) dqs_out_en; + dqs_out_dly[i] <= #(tck_avg/2.0 + dqsck[i]) dqs_out; + for (j=0; j<`DQ_PER_DQS; j=j+1) begin + if (dq_out_en) begin // tLZ2 + dq_out_en_dly[i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + $dist_uniform(seed, -2*TAC, dqsq_max)) dq_out_en; + end else begin // tHZ + dq_out_en_dly[i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + ($random % TAC)) dq_out_en; + end + if (dqsq_min == dqsq_max) begin + dq_out_dly [i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + dqsq_min) dq_out[i*`DQ_PER_DQS + j]; + end else begin + dq_out_dly [i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + $dist_uniform(seed, dqsq_min, dqsq_max)) dq_out[i*`DQ_PER_DQS + j]; + end + end + end + end else begin + out_delay = tck_avg/2.0; + dqs_out_en_dly <= #(out_delay) {DQS_BITS{dqs_out_en}}; + dqs_out_dly <= #(out_delay) {DQS_BITS{dqs_out }}; + dq_out_en_dly <= #(out_delay) {DQ_BITS {dq_out_en }}; + dq_out_dly <= #(out_delay) {DQ_BITS {dq_out }}; + end + end + endtask + + always @(diff_ck) begin : main + integer i; + + if (!in_self_refresh && (diff_ck !== 1'b0) && (diff_ck !== 1'b1)) + $display ("%m: at time %t ERROR: CK and CK_N are not allowed to go to an unknown state.", $time); + data_task; + if (diff_ck) begin + // check setup of command signals + if ($time > TIS) begin + if ($time - tm_cke < TIS) + $display ("%m: at time %t ERROR: tIS violation on CKE by %t", $time, tm_cke + TIS - $time); + if (cke_in) begin + for (i=0; i<22; i=i+1) begin + if ($time - tm_cmd_addr[i] < TIS) + $display ("%m: at time %t ERROR: tIS violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIS - $time); + end + end + end + + // update current state + if (!dll_locked && !in_self_refresh && (ck_cntr - ck_dll_reset == TDLLK)) begin + // check CL value against the clock frequency + if (cas_latency*tck_avg < CL_TIME) + $display ("%m: at time %t ERROR: CAS Latency = %d is illegal @tCK(avg) = %f", $time, cas_latency, tck_avg); + // check WR value against the clock frequency + if (write_recovery*tck_avg < TWR) + $display ("%m: at time %t ERROR: Write Recovery = %d is illegal @tCK(avg) = %f", $time, write_recovery, tck_avg); + dll_locked = 1; + end + if (|auto_precharge_bank) begin + for (i=0; i<`BANKS; i=i+1) begin + // Write with Auto Precharge Calculation + // 1. Meet minimum tRAS requirement + // 2. Write Latency PLUS BL/2 cycles PLUS WR after Write command + if (write_precharge_bank[i] + && ($time - tm_bank_activate[i] >= TRAS_MIN) + && (ck_cntr - ck_bank_write[i] >= write_latency + burst_length/2 + write_recovery)) begin + + if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i); + write_precharge_bank[i] = 0; + active_bank[i] = 0; + auto_precharge_bank[i] = 0; + ck_write_ap = ck_cntr; + tm_bank_precharge[i] = $time; + tm_precharge = $time; + end + // Read with Auto Precharge Calculation + // 1. Meet minimum tRAS requirement + // 2. Additive Latency plus BL/2 cycles after Read command + // 3. tRTP after the last 4-bit prefetch + if (read_precharge_bank[i] + && ($time - tm_bank_activate[i] >= TRAS_MIN) + && (ck_cntr - ck_bank_read[i] >= additive_latency + burst_length/2)) begin + + read_precharge_bank[i] = 0; + // In case the internal precharge is pushed out by tRTP, tRP starts at the point where + // the internal precharge happens (not at the next rising clock edge after this event). + if ($time - tm_bank_read_end[i] < TRTP) begin + if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", tm_bank_read_end[i] + TRTP, i); + active_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0; + auto_precharge_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0; + tm_bank_precharge[i] <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP; + tm_precharge <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP; + end else begin + if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i); + active_bank[i] = 0; + auto_precharge_bank[i] = 0; + tm_bank_precharge[i] = $time; + tm_precharge = $time; + end + end + end + end + + // respond to incoming command + if (cke_in ^ prev_cke) begin + ck_cke <= ck_cntr; + end + + cmd_task(cke_in, cmd_n_in, ba_in, addr_in); + if ((cmd_n_in == WRITE) || (cmd_n_in == READ)) begin + al_pipeline[2*additive_latency] = 1'b1; + end + if (al_pipeline[0]) begin + // check tRCD after additive latency + if ($time - tm_bank_activate[ba_pipeline[2*cas_latency - 1]] < TRCD) begin + if (rd_pipeline[2*cas_latency - 1]) begin + $display ("%m: at time %t ERROR: tRCD violation during %s", $time, cmd_string[READ]); + end else begin + $display ("%m: at time %t ERROR: tRCD violation during %s", $time, cmd_string[WRITE]); + end + end + // check tWTR after additive latency + if (rd_pipeline[2*cas_latency - 1]) begin + if ($time - tm_write_end < TWTR) + $display ("%m: at time %t ERROR: tWTR violation during %s", $time, cmd_string[READ]); + end + end + if (rd_pipeline[2*(cas_latency - burst_length/2 + 2) - 1]) begin + tm_bank_read_end[ba_pipeline[2*(cas_latency - burst_length/2 + 2) - 1]] <= $time; + end + for (i=0; i<`BANKS; i=i+1) begin + if ((ck_cntr - ck_bank_write[i] > write_latency) && (ck_cntr - ck_bank_write[i] <= write_latency + burst_length/2)) begin + tm_bank_write_end[i] <= $time; + tm_write_end <= $time; + end + end + + // clk pin is disabled during self refresh + if (!in_self_refresh) begin + tjit_cc_time = $time - tm_ck_pos - tck_i; + tck_i = $time - tm_ck_pos; + tck_avg = tck_avg - tck_sample[ck_cntr%TDLLK]/$itor(TDLLK); + tck_avg = tck_avg + tck_i/$itor(TDLLK); + tck_sample[ck_cntr%TDLLK] = tck_i; + tjit_per_rtime = tck_i - tck_avg; + + if (dll_locked) begin + // check accumulated error + terr_nper_rtime = 0; + for (i=0; i<50; i=i+1) begin + terr_nper_rtime = terr_nper_rtime + tck_sample[i] - tck_avg; + terr_nper_rtime = abs_value(terr_nper_rtime); + case (i) + 0 :; + 1 : if (terr_nper_rtime - TERR_2PER >= 1.0) $display ("%m: at time %t ERROR: tERR(2per) violation by %f ps.", $time, terr_nper_rtime - TERR_2PER); + 2 : if (terr_nper_rtime - TERR_3PER >= 1.0) $display ("%m: at time %t ERROR: tERR(3per) violation by %f ps.", $time, terr_nper_rtime - TERR_3PER); + 3 : if (terr_nper_rtime - TERR_4PER >= 1.0) $display ("%m: at time %t ERROR: tERR(4per) violation by %f ps.", $time, terr_nper_rtime - TERR_4PER); + 4 : if (terr_nper_rtime - TERR_5PER >= 1.0) $display ("%m: at time %t ERROR: tERR(5per) violation by %f ps.", $time, terr_nper_rtime - TERR_5PER); + 5,6,7,8,9 : if (terr_nper_rtime - TERR_N1PER >= 1.0) $display ("%m: at time %t ERROR: tERR(n1per) violation by %f ps.", $time, terr_nper_rtime - TERR_N1PER); + default : if (terr_nper_rtime - TERR_N2PER >= 1.0) $display ("%m: at time %t ERROR: tERR(n2per) violation by %f ps.", $time, terr_nper_rtime - TERR_N2PER); + endcase + end + + // check tCK min/max/jitter + if (abs_value(tjit_per_rtime) - TJIT_PER >= 1.0) + $display ("%m: at time %t ERROR: tJIT(per) violation by %f ps.", $time, abs_value(tjit_per_rtime) - TJIT_PER); + if (abs_value(tjit_cc_time) - TJIT_CC >= 1.0) + $display ("%m: at time %t ERROR: tJIT(cc) violation by %f ps.", $time, abs_value(tjit_cc_time) - TJIT_CC); + if (TCK_MIN - tck_avg >= 1.0) + $display ("%m: at time %t ERROR: tCK(avg) minimum violation by %f ps.", $time, TCK_MIN - tck_avg); + if (tck_avg - TCK_MAX >= 1.0) + $display ("%m: at time %t ERROR: tCK(avg) maximum violation by %f ps.", $time, tck_avg - TCK_MAX); + if (tm_ck_pos + TCK_MIN - TJIT_PER > $time) + $display ("%m: at time %t ERROR: tCK(abs) minimum violation by %t", $time, tm_ck_pos + TCK_MIN - TJIT_PER - $time); + if (tm_ck_pos + TCK_MAX + TJIT_PER < $time) + $display ("%m: at time %t ERROR: tCK(abs) maximum violation by %t", $time, $time - tm_ck_pos - TCK_MAX - TJIT_PER); + + // check tCL + if (tm_ck_neg + TCL_MIN*tck_avg - TJIT_DUTY > $time) + $display ("%m: at time %t ERROR: tCL(abs) minimum violation on CLK by %t", $time, tm_ck_neg + TCL_MIN*tck_avg - TJIT_DUTY - $time); + if (tm_ck_neg + TCL_MAX*tck_avg + TJIT_DUTY < $time) + $display ("%m: at time %t ERROR: tCL(abs) maximum violation on CLK by %t", $time, $time - tm_ck_neg - TCL_MAX*tck_avg - TJIT_DUTY); + if (tcl_avg < TCL_MIN*tck_avg) + $display ("%m: at time %t ERROR: tCL(avg) minimum violation on CLK by %t", $time, TCL_MIN*tck_avg - tcl_avg); + if (tcl_avg > TCL_MAX*tck_avg) + $display ("%m: at time %t ERROR: tCL(avg) maximum violation on CLK by %t", $time, tcl_avg - TCL_MAX*tck_avg); + end + + // calculate the tch avg jitter + tch_avg = tch_avg - tch_sample[ck_cntr%TDLLK]/$itor(TDLLK); + tch_avg = tch_avg + tch_i/$itor(TDLLK); + tch_sample[ck_cntr%TDLLK] = tch_i; + + // update timers/counters + tcl_i <= $time - tm_ck_neg; + end + + prev_odt <= odt_in; + // update timers/counters + ck_cntr <= ck_cntr + 1; + tm_ck_pos <= $time; + end else begin + // clk pin is disabled during self refresh + if (!in_self_refresh) begin + if (dll_locked) begin + if (tm_ck_pos + TCH_MIN*tck_avg - TJIT_DUTY > $time) + $display ("%m: at time %t ERROR: tCH(abs) minimum violation on CLK by %t", $time, tm_ck_pos + TCH_MIN*tck_avg - TJIT_DUTY + $time); + if (tm_ck_pos + TCH_MAX*tck_avg + TJIT_DUTY < $time) + $display ("%m: at time %t ERROR: tCH(abs) maximum violation on CLK by %t", $time, $time - tm_ck_pos - TCH_MAX*tck_avg - TJIT_DUTY); + if (tch_avg < TCH_MIN*tck_avg) + $display ("%m: at time %t ERROR: tCH(avg) minimum violation on CLK by %t", $time, TCH_MIN*tck_avg - tch_avg); + if (tch_avg > TCH_MAX*tck_avg) + $display ("%m: at time %t ERROR: tCH(avg) maximum violation on CLK by %t", $time, tch_avg - TCH_MAX*tck_avg); + end + + // calculate the tcl avg jitter + tcl_avg = tcl_avg - tcl_sample[ck_cntr%TDLLK]/$itor(TDLLK); + tcl_avg = tcl_avg + tcl_i/$itor(TDLLK); + tcl_sample[ck_cntr%TDLLK] = tcl_i; + + // update timers/counters + tch_i <= $time - tm_ck_pos; + end + tm_ck_neg <= $time; + end + + // on die termination + if (odt_en) begin + // clk pin is disabled during self refresh + if (!in_self_refresh && diff_ck) begin + if ($time - tm_odt < TIS) begin + $display ("%m: at time %t ERROR: tIS violation on ODT by %t", $time, tm_odt + TIS - $time); + end + if (prev_odt ^ odt_in) begin + if (!dll_locked) + $display ("%m: at time %t WARNING: tDLLK violation during ODT transition.", $time); + if (odt_in && ($time - tm_odt_en < TMOD)) + $display ("%m: at time %t ERROR: tMOD violation during ODT transition", $time); + if ($time - tm_self_refresh < TXSNR) + $display ("%m: at time %t ERROR: tXSNR violation during ODT transition", $time); + if (in_self_refresh) + $display ("%m: at time %t ERROR: Illegal ODT transition during Self Refresh.", $time); + + // async ODT mode applies: + // 1.) during active power down with slow exit + // 2.) during precharge power down + // 3.) if tANPD has not been satisfied + // 4.) until tAXPD has been satisfied + if ((in_power_down && (low_power || (active_bank == 0))) || (ck_cntr - ck_slow_exit_pd < TAXPD)) begin + if (ck_cntr - ck_slow_exit_pd < TAXPD) + $display ("%m: at time %t WARNING: tAXPD violation during ODT transition. Synchronous or asynchronous change in termination resistance is possible.", $time); + if (odt_in) begin + if (DEBUG) $display ("%m: at time %t INFO: Async On Die Termination = %d", $time + TAONPD, 1'b1); + odt_state <= #(TAONPD) 1'b1; + end else begin + if (DEBUG) $display ("%m: at time %t INFO: Async On Die Termination = %d", $time + TAOFPD, 1'b0); + odt_state <= #(TAOFPD) 1'b0; + end + // sync ODT mode applies: + // 1.) during normal operation + // 2.) during active power down with fast exit + end else begin + if (odt_in) begin + i = TAOND*2; + odt_pipeline[i] = 1'b1; + end else begin + i = TAOFD*2; + odt_pipeline[i] = 1'b1; + end + end + ck_odt <= ck_cntr; + end + end + if (odt_pipeline[0]) begin + odt_state = ~odt_state; + if (DEBUG) $display ("%m: at time %t INFO: Sync On Die Termination = %d", $time, odt_state); + end + end + + // shift pipelines + if (|wr_pipeline || |rd_pipeline || |al_pipeline) begin + al_pipeline = al_pipeline>>1; + wr_pipeline = wr_pipeline>>1; + rd_pipeline = rd_pipeline>>1; + for (i=0; i<`MAX_PIPE; i=i+1) begin + ba_pipeline[i] = ba_pipeline[i+1]; + row_pipeline[i] = row_pipeline[i+1]; + col_pipeline[i] = col_pipeline[i+1]; + end + end + if (|odt_pipeline) begin + odt_pipeline = odt_pipeline>>1; + end + end + + // receiver(s) + task dqs_even_receiver; + input [4:0] i; + reg [71:0] bit_mask; + begin + bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS); + if (dqs_even[i]) begin + if (rdqs_en) begin // rdqs disables dm + dm_in_pos[i] = 1'b0; + end else begin + dm_in_pos[i] = dm_in[i]; + end + dq_in_pos = (dq_in & bit_mask) | (dq_in_pos & ~bit_mask); + end + end + endtask + + always @(posedge dqs_even[ 0]) dqs_even_receiver( 0); + always @(posedge dqs_even[ 1]) dqs_even_receiver( 1); + always @(posedge dqs_even[ 2]) dqs_even_receiver( 2); + always @(posedge dqs_even[ 3]) dqs_even_receiver( 3); + always @(posedge dqs_even[ 4]) dqs_even_receiver( 4); + always @(posedge dqs_even[ 5]) dqs_even_receiver( 5); + always @(posedge dqs_even[ 6]) dqs_even_receiver( 6); + always @(posedge dqs_even[ 7]) dqs_even_receiver( 7); + always @(posedge dqs_even[ 8]) dqs_even_receiver( 8); + always @(posedge dqs_even[ 9]) dqs_even_receiver( 9); + always @(posedge dqs_even[10]) dqs_even_receiver(10); + always @(posedge dqs_even[11]) dqs_even_receiver(11); + always @(posedge dqs_even[12]) dqs_even_receiver(12); + always @(posedge dqs_even[13]) dqs_even_receiver(13); + always @(posedge dqs_even[14]) dqs_even_receiver(14); + always @(posedge dqs_even[15]) dqs_even_receiver(15); + always @(posedge dqs_even[16]) dqs_even_receiver(16); + always @(posedge dqs_even[17]) dqs_even_receiver(17); + + task dqs_odd_receiver; + input [4:0] i; + reg [71:0] bit_mask; + begin + bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS); + if (dqs_odd[i]) begin + if (rdqs_en) begin // rdqs disables dm + dm_in_neg[i] = 1'b0; + end else begin + dm_in_neg[i] = dm_in[i]; + end + dq_in_neg = (dq_in & bit_mask) | (dq_in_neg & ~bit_mask); + end + end + endtask + + always @(posedge dqs_odd[ 0]) dqs_odd_receiver( 0); + always @(posedge dqs_odd[ 1]) dqs_odd_receiver( 1); + always @(posedge dqs_odd[ 2]) dqs_odd_receiver( 2); + always @(posedge dqs_odd[ 3]) dqs_odd_receiver( 3); + always @(posedge dqs_odd[ 4]) dqs_odd_receiver( 4); + always @(posedge dqs_odd[ 5]) dqs_odd_receiver( 5); + always @(posedge dqs_odd[ 6]) dqs_odd_receiver( 6); + always @(posedge dqs_odd[ 7]) dqs_odd_receiver( 7); + always @(posedge dqs_odd[ 8]) dqs_odd_receiver( 8); + always @(posedge dqs_odd[ 9]) dqs_odd_receiver( 9); + always @(posedge dqs_odd[10]) dqs_odd_receiver(10); + always @(posedge dqs_odd[11]) dqs_odd_receiver(11); + always @(posedge dqs_odd[12]) dqs_odd_receiver(12); + always @(posedge dqs_odd[13]) dqs_odd_receiver(13); + always @(posedge dqs_odd[14]) dqs_odd_receiver(14); + always @(posedge dqs_odd[15]) dqs_odd_receiver(15); + always @(posedge dqs_odd[16]) dqs_odd_receiver(16); + always @(posedge dqs_odd[17]) dqs_odd_receiver(17); + + // Processes to check hold and pulse width of control signals + always @(cke_in) begin + if ($time > TIH) begin + if ($time - tm_ck_pos < TIH) + $display ("%m: at time %t ERROR: tIH violation on CKE by %t", $time, tm_ck_pos + TIH - $time); + end + if (dll_locked && ($time - tm_cke < $rtoi(TIPW*tck_avg))) + $display ("%m: at time %t ERROR: tIPW violation on CKE by %t", $time, tm_cke + TIPW*tck_avg - $time); + tm_cke = $time; + end + always @(odt_in) begin + if (odt_en && !in_self_refresh) begin + if ($time - tm_ck_pos < TIH) + $display ("%m: at time %t ERROR: tIH violation on ODT by %t", $time, tm_ck_pos + TIH - $time); + if (dll_locked && ($time - tm_odt < $rtoi(TIPW*tck_avg))) + $display ("%m: at time %t ERROR: tIPW violation on ODT by %t", $time, tm_odt + TIPW*tck_avg - $time); + end + tm_odt = $time; + end + + task cmd_addr_timing_check; + input i; + reg [4:0] i; + begin + if (prev_cke) begin + if ((i == 0) && ($time - tm_ck_pos < TIH)) // Always check tIH for CS# + $display ("%m: at time %t ERROR: tIH violation on %s by %t", $time, cmd_addr_string[i], tm_ck_pos + TIH - $time); + if ((i > 0) && (cs_n_in == 1'b0) && ($time - tm_ck_pos < TIH)) // Only check tIH for cmd_addr if CS# low + $display ("%m: at time %t ERROR: tIH violation on %s by %t", $time, cmd_addr_string[i], tm_ck_pos + TIH - $time); + if (dll_locked && ($time - tm_cmd_addr[i] < $rtoi(TIPW*tck_avg))) + $display ("%m: at time %t ERROR: tIPW violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIPW*tck_avg - $time); + end + tm_cmd_addr[i] = $time; + end + endtask + + always @(cs_n_in ) cmd_addr_timing_check( 0); + always @(ras_n_in ) cmd_addr_timing_check( 1); + always @(cas_n_in ) cmd_addr_timing_check( 2); + always @(we_n_in ) cmd_addr_timing_check( 3); + always @(ba_in [ 0]) cmd_addr_timing_check( 4); + always @(ba_in [ 1]) cmd_addr_timing_check( 5); + always @(ba_in [ 2]) cmd_addr_timing_check( 6); + always @(addr_in[ 0]) cmd_addr_timing_check( 7); + always @(addr_in[ 1]) cmd_addr_timing_check( 8); + always @(addr_in[ 2]) cmd_addr_timing_check( 9); + always @(addr_in[ 3]) cmd_addr_timing_check(10); + always @(addr_in[ 4]) cmd_addr_timing_check(11); + always @(addr_in[ 5]) cmd_addr_timing_check(12); + always @(addr_in[ 6]) cmd_addr_timing_check(13); + always @(addr_in[ 7]) cmd_addr_timing_check(14); + always @(addr_in[ 8]) cmd_addr_timing_check(15); + always @(addr_in[ 9]) cmd_addr_timing_check(16); + always @(addr_in[10]) cmd_addr_timing_check(17); + always @(addr_in[11]) cmd_addr_timing_check(18); + always @(addr_in[12]) cmd_addr_timing_check(19); + always @(addr_in[13]) cmd_addr_timing_check(20); + always @(addr_in[14]) cmd_addr_timing_check(21); + always @(addr_in[15]) cmd_addr_timing_check(22); + + // Processes to check setup and hold of data signals + task dm_timing_check; + input i; + reg [4:0] i; + begin + if (dqs_in_valid) begin + if ($time - tm_dqs[i] < TDH) + $display ("%m: at time %t ERROR: tDH violation on DM bit %d by %t", $time, i, tm_dqs[i] + TDH - $time); + if (check_dm_tdipw[i]) begin + if (dll_locked && ($time - tm_dm[i] < $rtoi(TDIPW*tck_avg))) + $display ("%m: at time %t ERROR: tDIPW violation on DM bit %d by %t", $time, i, tm_dm[i] + TDIPW*tck_avg - $time); + end + end + check_dm_tdipw[i] <= 1'b0; + tm_dm[i] = $time; + end + endtask + + always @(dm_in[ 0]) dm_timing_check( 0); + always @(dm_in[ 1]) dm_timing_check( 1); + always @(dm_in[ 2]) dm_timing_check( 2); + always @(dm_in[ 3]) dm_timing_check( 3); + always @(dm_in[ 4]) dm_timing_check( 4); + always @(dm_in[ 5]) dm_timing_check( 5); + always @(dm_in[ 6]) dm_timing_check( 6); + always @(dm_in[ 7]) dm_timing_check( 7); + always @(dm_in[ 8]) dm_timing_check( 8); + always @(dm_in[ 9]) dm_timing_check( 9); + always @(dm_in[10]) dm_timing_check(10); + always @(dm_in[11]) dm_timing_check(11); + always @(dm_in[12]) dm_timing_check(12); + always @(dm_in[13]) dm_timing_check(13); + always @(dm_in[14]) dm_timing_check(14); + always @(dm_in[15]) dm_timing_check(15); + always @(dm_in[16]) dm_timing_check(16); + always @(dm_in[17]) dm_timing_check(17); + + task dq_timing_check; + input i; + reg [6:0] i; + begin + if (dqs_in_valid) begin + if ($time - tm_dqs[i/`DQ_PER_DQS] < TDH) + $display ("%m: at time %t ERROR: tDH violation on DQ bit %d by %t", $time, i, tm_dqs[i/`DQ_PER_DQS] + TDH - $time); + if (check_dq_tdipw[i]) begin + if (dll_locked && ($time - tm_dq[i] < $rtoi(TDIPW*tck_avg))) + $display ("%m: at time %t ERROR: tDIPW violation on DQ bit %d by %t", $time, i, tm_dq[i] + TDIPW*tck_avg - $time); + end + end + check_dq_tdipw[i] <= 1'b0; + tm_dq[i] = $time; + end + endtask + + always @(dq_in[ 0]) dq_timing_check( 0); + always @(dq_in[ 1]) dq_timing_check( 1); + always @(dq_in[ 2]) dq_timing_check( 2); + always @(dq_in[ 3]) dq_timing_check( 3); + always @(dq_in[ 4]) dq_timing_check( 4); + always @(dq_in[ 5]) dq_timing_check( 5); + always @(dq_in[ 6]) dq_timing_check( 6); + always @(dq_in[ 7]) dq_timing_check( 7); + always @(dq_in[ 8]) dq_timing_check( 8); + always @(dq_in[ 9]) dq_timing_check( 9); + always @(dq_in[10]) dq_timing_check(10); + always @(dq_in[11]) dq_timing_check(11); + always @(dq_in[12]) dq_timing_check(12); + always @(dq_in[13]) dq_timing_check(13); + always @(dq_in[14]) dq_timing_check(14); + always @(dq_in[15]) dq_timing_check(15); + always @(dq_in[16]) dq_timing_check(16); + always @(dq_in[17]) dq_timing_check(17); + always @(dq_in[18]) dq_timing_check(18); + always @(dq_in[19]) dq_timing_check(19); + always @(dq_in[20]) dq_timing_check(20); + always @(dq_in[21]) dq_timing_check(21); + always @(dq_in[22]) dq_timing_check(22); + always @(dq_in[23]) dq_timing_check(23); + always @(dq_in[24]) dq_timing_check(24); + always @(dq_in[25]) dq_timing_check(25); + always @(dq_in[26]) dq_timing_check(26); + always @(dq_in[27]) dq_timing_check(27); + always @(dq_in[28]) dq_timing_check(28); + always @(dq_in[29]) dq_timing_check(29); + always @(dq_in[30]) dq_timing_check(30); + always @(dq_in[31]) dq_timing_check(31); + always @(dq_in[32]) dq_timing_check(32); + always @(dq_in[33]) dq_timing_check(33); + always @(dq_in[34]) dq_timing_check(34); + always @(dq_in[35]) dq_timing_check(35); + always @(dq_in[36]) dq_timing_check(36); + always @(dq_in[37]) dq_timing_check(37); + always @(dq_in[38]) dq_timing_check(38); + always @(dq_in[39]) dq_timing_check(39); + always @(dq_in[40]) dq_timing_check(40); + always @(dq_in[41]) dq_timing_check(41); + always @(dq_in[42]) dq_timing_check(42); + always @(dq_in[43]) dq_timing_check(43); + always @(dq_in[44]) dq_timing_check(44); + always @(dq_in[45]) dq_timing_check(45); + always @(dq_in[46]) dq_timing_check(46); + always @(dq_in[47]) dq_timing_check(47); + always @(dq_in[48]) dq_timing_check(48); + always @(dq_in[49]) dq_timing_check(49); + always @(dq_in[50]) dq_timing_check(50); + always @(dq_in[51]) dq_timing_check(51); + always @(dq_in[52]) dq_timing_check(52); + always @(dq_in[53]) dq_timing_check(53); + always @(dq_in[54]) dq_timing_check(54); + always @(dq_in[55]) dq_timing_check(55); + always @(dq_in[56]) dq_timing_check(56); + always @(dq_in[57]) dq_timing_check(57); + always @(dq_in[58]) dq_timing_check(58); + always @(dq_in[59]) dq_timing_check(59); + always @(dq_in[60]) dq_timing_check(60); + always @(dq_in[61]) dq_timing_check(61); + always @(dq_in[62]) dq_timing_check(62); + always @(dq_in[63]) dq_timing_check(63); + always @(dq_in[64]) dq_timing_check(64); + always @(dq_in[65]) dq_timing_check(65); + always @(dq_in[66]) dq_timing_check(66); + always @(dq_in[67]) dq_timing_check(67); + always @(dq_in[68]) dq_timing_check(68); + always @(dq_in[69]) dq_timing_check(69); + always @(dq_in[70]) dq_timing_check(70); + always @(dq_in[71]) dq_timing_check(71); + + task dqs_pos_timing_check; + input i; + reg [5:0] i; + reg [3:0] j; + begin + if (dqs_in_valid && ((wdqs_pos_cntr[i] < burst_length/2) || b2b_write) && (dqs_n_en || i<18)) begin + if (dqs_in[i] ^ prev_dqs_in[i]) begin + if (dll_locked) begin + if (check_write_preamble[i]) begin + if ($time - tm_dqs_neg[i] < $rtoi(TWPRE*tck_avg)) + $display ("%m: at time %t ERROR: tWPRE violation on &s bit %d", $time, dqs_string[i/18], i%18); + end else if (check_write_postamble[i]) begin + if ($time - tm_dqs_neg[i] < $rtoi(TWPST*tck_avg)) + $display ("%m: at time %t ERROR: tWPST violation on %s bit %d", $time, dqs_string[i/18], i%18); + end else begin + if ($time - tm_dqs_neg[i] < $rtoi(TDQSL*tck_avg)) + $display ("%m: at time %t ERROR: tDQSL violation on %s bit %d", $time, dqs_string[i/18], i%18); + end + end + if ($time - tm_dm[i%18] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i, tm_dm[i%18] + TDS - $time); + if (!dq_out_en) begin + for (j=0; j<`DQ_PER_DQS; j=j+1) begin + if ($time - tm_dq[i*`DQ_PER_DQS+j] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[i*`DQ_PER_DQS+j] + TDS - $time); + check_dq_tdipw[i*`DQ_PER_DQS+j] <= 1'b1; + end + end + if ((wdqs_pos_cntr[i] < burst_length/2) && !b2b_write) begin + wdqs_pos_cntr[i] <= wdqs_pos_cntr[i] + 1; + end else begin + wdqs_pos_cntr[i] <= 1; + end + check_dm_tdipw[i%18] <= 1'b1; + check_write_preamble[i] <= 1'b0; + check_write_postamble[i] <= 1'b0; + check_write_dqs_low[i] <= 1'b0; + tm_dqs[i%18] <= $time; + end else begin + $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/18], i%18); + end + end + tm_dqss_pos[i] <= $time; + tm_dqs_pos[i] = $time; + prev_dqs_in[i] <= dqs_in[i]; + end + endtask + + always @(posedge dqs_in[ 0]) dqs_pos_timing_check( 0); + always @(posedge dqs_in[ 1]) dqs_pos_timing_check( 1); + always @(posedge dqs_in[ 2]) dqs_pos_timing_check( 2); + always @(posedge dqs_in[ 3]) dqs_pos_timing_check( 3); + always @(posedge dqs_in[ 4]) dqs_pos_timing_check( 4); + always @(posedge dqs_in[ 5]) dqs_pos_timing_check( 5); + always @(posedge dqs_in[ 6]) dqs_pos_timing_check( 6); + always @(posedge dqs_in[ 7]) dqs_pos_timing_check( 7); + always @(posedge dqs_in[ 8]) dqs_pos_timing_check( 8); + always @(posedge dqs_in[ 9]) dqs_pos_timing_check( 9); + always @(posedge dqs_in[10]) dqs_pos_timing_check(10); + always @(posedge dqs_in[11]) dqs_pos_timing_check(11); + always @(posedge dqs_in[12]) dqs_pos_timing_check(12); + always @(posedge dqs_in[13]) dqs_pos_timing_check(13); + always @(posedge dqs_in[14]) dqs_pos_timing_check(14); + always @(posedge dqs_in[15]) dqs_pos_timing_check(15); + always @(posedge dqs_in[16]) dqs_pos_timing_check(16); + always @(posedge dqs_in[17]) dqs_pos_timing_check(17); + always @(negedge dqs_in[18]) dqs_pos_timing_check(18); + always @(negedge dqs_in[19]) dqs_pos_timing_check(19); + always @(negedge dqs_in[20]) dqs_pos_timing_check(20); + always @(negedge dqs_in[21]) dqs_pos_timing_check(21); + always @(negedge dqs_in[22]) dqs_pos_timing_check(22); + always @(negedge dqs_in[23]) dqs_pos_timing_check(23); + always @(negedge dqs_in[24]) dqs_pos_timing_check(24); + always @(negedge dqs_in[25]) dqs_pos_timing_check(25); + always @(negedge dqs_in[26]) dqs_pos_timing_check(26); + always @(negedge dqs_in[27]) dqs_pos_timing_check(27); + always @(negedge dqs_in[28]) dqs_pos_timing_check(28); + always @(negedge dqs_in[29]) dqs_pos_timing_check(29); + always @(negedge dqs_in[30]) dqs_pos_timing_check(30); + always @(negedge dqs_in[31]) dqs_pos_timing_check(31); + always @(negedge dqs_in[32]) dqs_neg_timing_check(32); + always @(negedge dqs_in[33]) dqs_neg_timing_check(33); + always @(negedge dqs_in[34]) dqs_neg_timing_check(34); + always @(negedge dqs_in[35]) dqs_neg_timing_check(35); + + task dqs_neg_timing_check; + input i; + reg [5:0] i; + reg [3:0] j; + begin + if (dqs_in_valid && (wdqs_pos_cntr[i] > 0) && check_write_dqs_high[i] && (dqs_n_en || i < 18)) begin + if (dqs_in[i] ^ prev_dqs_in[i]) begin + if (dll_locked) begin + if ($time - tm_dqs_pos[i] < $rtoi(TDQSH*tck_avg)) + $display ("%m: at time %t ERROR: tDQSH violation on %s bit %d", $time, dqs_string[i/18], i%18); + if ($time - tm_ck_pos < $rtoi(TDSH*tck_avg)) + $display ("%m: at time %t ERROR: tDSH violation on %s bit %d", $time, dqs_string[i/18], i%18); + end + if ($time - tm_dm[i%18] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i, tm_dm[i%18] + TDS - $time); + if (!dq_out_en) begin + for (j=0; j<`DQ_PER_DQS; j=j+1) begin + if ($time - tm_dq[i*`DQ_PER_DQS+j] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[i*`DQ_PER_DQS+j] + TDS - $time); + check_dq_tdipw[i*`DQ_PER_DQS+j] <= 1'b1; + end + end + check_dm_tdipw[i%18] <= 1'b1; + check_write_dqs_high[i] <= 1'b0; + tm_dqs[i%18] <= $time; + end else begin + $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/18], i%18); + end + end + tm_dqs_neg[i] = $time; + prev_dqs_in[i] <= dqs_in[i]; + end + endtask + + always @(negedge dqs_in[ 0]) dqs_neg_timing_check( 0); + always @(negedge dqs_in[ 1]) dqs_neg_timing_check( 1); + always @(negedge dqs_in[ 2]) dqs_neg_timing_check( 2); + always @(negedge dqs_in[ 3]) dqs_neg_timing_check( 3); + always @(negedge dqs_in[ 4]) dqs_neg_timing_check( 4); + always @(negedge dqs_in[ 5]) dqs_neg_timing_check( 5); + always @(negedge dqs_in[ 6]) dqs_neg_timing_check( 6); + always @(negedge dqs_in[ 7]) dqs_neg_timing_check( 7); + always @(negedge dqs_in[ 8]) dqs_neg_timing_check( 8); + always @(negedge dqs_in[ 9]) dqs_neg_timing_check( 9); + always @(negedge dqs_in[10]) dqs_neg_timing_check(10); + always @(negedge dqs_in[11]) dqs_neg_timing_check(11); + always @(negedge dqs_in[12]) dqs_neg_timing_check(12); + always @(negedge dqs_in[13]) dqs_neg_timing_check(13); + always @(negedge dqs_in[14]) dqs_neg_timing_check(14); + always @(negedge dqs_in[15]) dqs_neg_timing_check(15); + always @(negedge dqs_in[16]) dqs_neg_timing_check(16); + always @(negedge dqs_in[17]) dqs_neg_timing_check(17); + always @(posedge dqs_in[18]) dqs_neg_timing_check(18); + always @(posedge dqs_in[19]) dqs_neg_timing_check(19); + always @(posedge dqs_in[20]) dqs_neg_timing_check(20); + always @(posedge dqs_in[21]) dqs_neg_timing_check(21); + always @(posedge dqs_in[22]) dqs_neg_timing_check(22); + always @(posedge dqs_in[23]) dqs_neg_timing_check(23); + always @(posedge dqs_in[24]) dqs_neg_timing_check(24); + always @(posedge dqs_in[25]) dqs_neg_timing_check(25); + always @(posedge dqs_in[26]) dqs_neg_timing_check(26); + always @(posedge dqs_in[27]) dqs_neg_timing_check(27); + always @(posedge dqs_in[28]) dqs_neg_timing_check(28); + always @(posedge dqs_in[29]) dqs_neg_timing_check(29); + always @(posedge dqs_in[30]) dqs_neg_timing_check(30); + always @(posedge dqs_in[31]) dqs_neg_timing_check(31); + always @(posedge dqs_in[32]) dqs_neg_timing_check(32); + always @(posedge dqs_in[33]) dqs_neg_timing_check(33); + always @(posedge dqs_in[34]) dqs_neg_timing_check(34); + always @(posedge dqs_in[35]) dqs_neg_timing_check(35); + +endmodule diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/ddr2_model_parameters_c3.vh b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/ddr2_model_parameters_c3.vh new file mode 100755 index 0000000..1c8e277 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/ddr2_model_parameters_c3.vh @@ -0,0 +1,1394 @@ +/**************************************************************************************** +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +****************************************************************************************/ + + // Timing parameters based on Speed Grade + + // SYMBOL UNITS DESCRIPTION + // ------ ----- ----------- +`ifdef x256Mb + + `ifdef sg187E + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 75; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 250; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 425; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 250; // tQHS ps Data hold skew factor + parameter TAC = 350; // tAC ps DQ output access time from CK/CK# + parameter TDS = 0; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 75; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 175; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 125; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13125; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 13125; // tRP ps Precharge command period + parameter TRPA = 13125; // tRPA ps Precharge All period + parameter TXARDS = 10; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 3; // tXARD tCK Exit active power down to a read command + parameter TXP = 3; // tXP tCK Exit power down to a non-read command + parameter TANPD = 4; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 11; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 13125; // CL ps Minimum CAS Latency + `else `ifdef sg25E + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 300; // tQHS ps Data hold skew factor + parameter TAC = 400; // tAC ps DQ output access time from CK/CK# + parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 175; // tIS ps Input Setup Time + parameter TIH = 250; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 12500; // tRP ps Precharge command period + parameter TRPA = 12500; // tRPA ps Precharge All period + parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `else `ifdef sg25 + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 300; // tQHS ps Data hold skew factor + parameter TAC = 400; // tAC ps DQ output access time from CK/CK# + parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 175; // tIS ps Input Setup Time + parameter TIH = 250; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `ifdef sg3E + parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 340; // tQHS ps Data hold skew factor + parameter TAC = 450; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 200; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 12000; // tRP ps Precharge command period + parameter TRPA = 12000; // tRPA ps Precharge All period + parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 12000; // CL ps Minimum CAS Latency + `else `ifdef sg3 + parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 340; // tQHS ps Data hold skew factor + parameter TAC = 450; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 200; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `ifdef sg37E + parameter TCK_MIN = 3750; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 400; // tQHS ps Data hold skew factor + parameter TAC = 500; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 225; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 450; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 300; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 250; // tIS ps Input Setup Time + parameter TIH = 375; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `define sg5E + parameter TCK_MIN = 5000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 150; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 450; // tQHS ps Data hold skew factor + parameter TAC = 600; // tAC ps DQ output access time from CK/CK# + parameter TDS = 150; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 275; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 500; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 350; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 475; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 10000; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `endif `endif `endif `endif `endif `endif + + `ifdef x16 + `ifdef sg187E + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else `ifdef sg25E + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else `ifdef sg25 + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else // sg3E, sg3, sg37E, sg5E + parameter TFAW = 50000; // tFAW ps Four Bank Activate window + `endif `endif `endif + `else // x4, x8 + `ifdef sg187E + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else `ifdef sg25E + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else `ifdef sg25 + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else // sg3E, sg3, sg37E, sg5E + parameter TFAW = 37500; // tFAW ps Four Bank Activate window + `endif `endif `endif + `endif + + // Timing Parameters + + // Mode Register + parameter AL_MIN = 0; // AL tCK Minimum Additive Latency + parameter AL_MAX = 6; // AL tCK Maximum Additive Latency + parameter CL_MIN = 3; // CL tCK Minimum CAS Latency + parameter CL_MAX = 7; // CL tCK Maximum CAS Latency + parameter WR_MIN = 2; // WR tCK Minimum Write Recovery + parameter WR_MAX = 8; // WR tCK Maximum Write Recovery + parameter BL_MIN = 4; // BL tCK Minimum Burst Length + parameter BL_MAX = 8; // BL tCK Minimum Burst Length + // Clock + parameter TCK_MAX = 8000; // tCK ps Maximum Clock Cycle Time + parameter TCH_MIN = 0.48; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCH_MAX = 0.52; // tCH tCK Maximum Clock High-Level Pulse Width + parameter TCL_MIN = 0.48; // tCL tCK Minimum Clock Low-Level Pulse Width + parameter TCL_MAX = 0.52; // tCL tCK Maximum Clock Low-Level Pulse Width + // Data + parameter TLZ = TAC; // tLZ ps Data-out low-impedance window from CK/CK# + parameter THZ = TAC; // tHZ ps Data-out high impedance window from CK/CK# + parameter TDIPW = 0.35; // tDIPW tCK DQ and DM input Pulse Width + // Data Strobe + parameter TDQSH = 0.35; // tDQSH tCK DQS input High Pulse Width + parameter TDQSL = 0.35; // tDQSL tCK DQS input Low Pulse Width + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TWPRE = 0.35; // tWPRE tCK DQS Write Preamble + parameter TWPST = 0.40; // tWPST tCK DQS Write Postamble + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + // Command and Address + parameter TIPW = 0.6; // tIPW tCK Control and Address input Pulse Width + parameter TCCD = 2; // tCCD tCK Cas to Cas command delay + parameter TRAS_MIN = 40000; // tRAS ps Minimum Active to Precharge command time + parameter TRAS_MAX =70000000; // tRAS ps Maximum Active to Precharge command time + parameter TRTP = 7500; // tRTP ps Read to Precharge command delay + parameter TWR = 15000; // tWR ps Write recovery time + parameter TMRD = 2; // tMRD tCK Load Mode Register command cycle time + parameter TDLLK = 200; // tDLLK tCK DLL locking time + // Refresh + parameter TRFC_MIN = 75000; // tRFC ps Refresh to Refresh Command interval minimum value + parameter TRFC_MAX =70000000; // tRFC ps Refresh to Refresh Command Interval maximum value + // Self Refresh + parameter TXSNR = TRFC_MIN + 10000; // tXSNR ps Exit self refesh to a non-read command + parameter TXSRD = 200; // tXSRD tCK Exit self refresh to a read command + parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. + // ODT + parameter TAOND = 2; // tAOND tCK ODT turn-on delay + parameter TAOFD = 2.5; // tAOFD tCK ODT turn-off delay + parameter TAONPD = 2000; // tAONPD ps ODT turn-on (precharge power-down mode) + parameter TAOFPD = 2000; // tAOFPD ps ODT turn-off (precharge power-down mode) + parameter TMOD = 12000; // tMOD ps ODT enable in EMR to ODT pin transition + // Power Down + parameter TCKE = 3; // tCKE tCK CKE minimum high or low pulse width + + // Size Parameters based on Part Width + + `ifdef x4 + parameter DM_BITS = 1; // Number of Data Mask bits + parameter ROW_BITS = 13; // Number of Address bits + parameter COL_BITS = 11; // Number of Column bits + parameter DQ_BITS = 4; // Number of Data bits + parameter DQS_BITS = 1; // Number of Dqs bits + parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time + `else `ifdef x8 + parameter DM_BITS = 1; // Number of Data Mask bits + parameter ROW_BITS = 13; // Number of Address bits + parameter COL_BITS = 10; // Number of Column bits + parameter DQ_BITS = 8; // Number of Data bits + parameter DQS_BITS = 1; // Number of Dqs bits + parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time + `else `define x16 + parameter DM_BITS = 2; // Number of Data Mask bits + parameter ROW_BITS = 13; // Number of Address bits + parameter COL_BITS = 9; // Number of Column bits + parameter DQ_BITS = 16; // Number of Data bits + parameter DQS_BITS = 2; // Number of Dqs bits + parameter TRRD = 10000; // tRRD Active bank a to Active bank b command time + `endif `endif + + `ifdef QUAD_RANK + `define DUAL_RANK // also define DUAL_RANK + parameter CS_BITS = 4; // Number of Chip Select Bits + parameter RANKS = 4; // Number of Chip Select Bits + `else `ifdef DUAL_RANK + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 2; // Number of Chip Select Bits + `else + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 1; // Number of Chip Select Bits + `endif `endif + + // Size Parameters + parameter BA_BITS = 2; // Set this parmaeter to control how many Bank Address bits + parameter ADDR_BITS = 13; // Address Bits + parameter MEM_BITS = 15; // Number of write data bursts can be stored in memory. The default is 2^10=1024. + parameter AP = 10; // the address bit that controls auto-precharge and precharge-all + parameter BL_BITS = 3; // the number of bits required to count to MAX_BL + parameter BO_BITS = 2; // the number of Burst Order Bits + +`else `ifdef x512Mb + + `ifdef sg187E + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 75; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 250; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 425; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 250; // tQHS ps Data hold skew factor + parameter TAC = 350; // tAC ps DQ output access time from CK/CK# + parameter TDS = 0; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 75; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 175; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 125; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13125; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 13125; // tRP ps Precharge command period + parameter TRPA = 13125; // tRPA ps Precharge All period + parameter TXARDS = 10; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 3; // tXARD tCK Exit active power down to a read command + parameter TXP = 3; // tXP tCK Exit power down to a non-read command + parameter TANPD = 4; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 11; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 13125; // CL ps Minimum CAS Latency + `else `ifdef sg25E + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 300; // tQHS ps Data hold skew factor + parameter TAC = 400; // tAC ps DQ output access time from CK/CK# + parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 175; // tIS ps Input Setup Time + parameter TIH = 250; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 12500; // tRP ps Precharge command period + parameter TRPA = 12500; // tRPA ps Precharge All period + parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `else `ifdef sg25 + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 300; // tQHS ps Data hold skew factor + parameter TAC = 400; // tAC ps DQ output access time from CK/CK# + parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 175; // tIS ps Input Setup Time + parameter TIH = 250; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `ifdef sg3E + parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 340; // tQHS ps Data hold skew factor + parameter TAC = 450; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 200; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 12000; // tRP ps Precharge command period + parameter TRPA = 12000; // tRPA ps Precharge All period + parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 12000; // CL ps Minimum CAS Latency + `else `ifdef sg3 + parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 340; // tQHS ps Data hold skew factor + parameter TAC = 450; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 200; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `ifdef sg37E + parameter TCK_MIN = 3750; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 400; // tQHS ps Data hold skew factor + parameter TAC = 500; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 225; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 450; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 300; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 250; // tIS ps Input Setup Time + parameter TIH = 375; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `define sg5E + parameter TCK_MIN = 5000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 150; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 450; // tQHS ps Data hold skew factor + parameter TAC = 600; // tAC ps DQ output access time from CK/CK# + parameter TDS = 150; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 275; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 500; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 350; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 475; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 10000; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `endif `endif `endif `endif `endif `endif + + `ifdef x16 + `ifdef sg187E + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else `ifdef sg25E + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else `ifdef sg25 + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else // sg3E, sg3, sg37E, sg5E + parameter TFAW = 50000; // tFAW ps Four Bank Activate window + `endif `endif `endif + `else // x4, x8 + `ifdef sg187E + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else `ifdef sg25E + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else `ifdef sg25 + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else // sg3E, sg3, sg37E, sg5E + parameter TFAW = 37500; // tFAW ps Four Bank Activate window + `endif `endif `endif + `endif + + // Timing Parameters + + // Mode Register + parameter AL_MIN = 0; // AL tCK Minimum Additive Latency + parameter AL_MAX = 6; // AL tCK Maximum Additive Latency + parameter CL_MIN = 3; // CL tCK Minimum CAS Latency + parameter CL_MAX = 7; // CL tCK Maximum CAS Latency + parameter WR_MIN = 2; // WR tCK Minimum Write Recovery + parameter WR_MAX = 8; // WR tCK Maximum Write Recovery + parameter BL_MIN = 4; // BL tCK Minimum Burst Length + parameter BL_MAX = 8; // BL tCK Minimum Burst Length + // Clock + parameter TCK_MAX = 8000; // tCK ps Maximum Clock Cycle Time + parameter TCH_MIN = 0.48; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCH_MAX = 0.52; // tCH tCK Maximum Clock High-Level Pulse Width + parameter TCL_MIN = 0.48; // tCL tCK Minimum Clock Low-Level Pulse Width + parameter TCL_MAX = 0.52; // tCL tCK Maximum Clock Low-Level Pulse Width + // Data + parameter TLZ = TAC; // tLZ ps Data-out low-impedance window from CK/CK# + parameter THZ = TAC; // tHZ ps Data-out high impedance window from CK/CK# + parameter TDIPW = 0.35; // tDIPW tCK DQ and DM input Pulse Width + // Data Strobe + parameter TDQSH = 0.35; // tDQSH tCK DQS input High Pulse Width + parameter TDQSL = 0.35; // tDQSL tCK DQS input Low Pulse Width + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TWPRE = 0.35; // tWPRE tCK DQS Write Preamble + parameter TWPST = 0.40; // tWPST tCK DQS Write Postamble + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + // Command and Address + parameter TIPW = 0.6; // tIPW tCK Control and Address input Pulse Width + parameter TCCD = 2; // tCCD tCK Cas to Cas command delay + parameter TRAS_MIN = 40000; // tRAS ps Minimum Active to Precharge command time + parameter TRAS_MAX =70000000; // tRAS ps Maximum Active to Precharge command time + parameter TRTP = 7500; // tRTP ps Read to Precharge command delay + parameter TWR = 15000; // tWR ps Write recovery time + parameter TMRD = 2; // tMRD tCK Load Mode Register command cycle time + parameter TDLLK = 200; // tDLLK tCK DLL locking time + // Refresh + parameter TRFC_MIN = 105000; // tRFC ps Refresh to Refresh Command interval minimum value + parameter TRFC_MAX =70000000; // tRFC ps Refresh to Refresh Command Interval maximum value + // Self Refresh + parameter TXSNR = TRFC_MIN + 10000; // tXSNR ps Exit self refesh to a non-read command + parameter TXSRD = 200; // tXSRD tCK Exit self refresh to a read command + parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. + // ODT + parameter TAOND = 2; // tAOND tCK ODT turn-on delay + parameter TAOFD = 2.5; // tAOFD tCK ODT turn-off delay + parameter TAONPD = 2000; // tAONPD ps ODT turn-on (precharge power-down mode) + parameter TAOFPD = 2000; // tAOFPD ps ODT turn-off (precharge power-down mode) + parameter TMOD = 12000; // tMOD ps ODT enable in EMR to ODT pin transition + // Power Down + parameter TCKE = 3; // tCKE tCK CKE minimum high or low pulse width + + // Size Parameters based on Part Width + + `ifdef x4 + parameter ADDR_BITS = 14; // Address Bits + parameter ROW_BITS = 14; // Number of Address bits + parameter COL_BITS = 11; // Number of Column bits + parameter DM_BITS = 1; // Number of Data Mask bits + parameter DQ_BITS = 4; // Number of Data bits + parameter DQS_BITS = 1; // Number of Dqs bits + parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time + `else `ifdef x8 + parameter ADDR_BITS = 14; // Address Bits + parameter ROW_BITS = 14; // Number of Address bits + parameter COL_BITS = 10; // Number of Column bits + parameter DM_BITS = 1; // Number of Data Mask bits + parameter DQ_BITS = 8; // Number of Data bits + parameter DQS_BITS = 1; // Number of Dqs bits + parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time + `else `define x16 + parameter ADDR_BITS = 13; // Address Bits + parameter ROW_BITS = 13; // Number of Address bits + parameter COL_BITS = 10; // Number of Column bits + parameter DM_BITS = 2; // Number of Data Mask bits + parameter DQ_BITS = 16; // Number of Data bits + parameter DQS_BITS = 2; // Number of Dqs bits + parameter TRRD = 10000; // tRRD Active bank a to Active bank b command time + `endif `endif + + `ifdef QUAD_RANK + `define DUAL_RANK // also define DUAL_RANK + parameter CS_BITS = 4; // Number of Chip Select Bits + parameter RANKS = 4; // Number of Chip Select Bits + `else `ifdef DUAL_RANK + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 2; // Number of Chip Select Bits + `else + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 1; // Number of Chip Select Bits + `endif `endif + + // Size Parameters + parameter BA_BITS = 2; // Set this parmaeter to control how many Bank Address bits + parameter MEM_BITS = 15; // Number of write data bursts can be stored in memory. The default is 2^10=1024. + parameter AP = 10; // the address bit that controls auto-precharge and precharge-all + parameter BL_BITS = 3; // the number of bits required to count to MAX_BL + parameter BO_BITS = 2; // the number of Burst Order Bits + +`else `ifdef x1Gb + + `ifdef sg187E + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 75; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 250; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 425; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 250; // tQHS ps Data hold skew factor + parameter TAC = 350; // tAC ps DQ output access time from CK/CK# + parameter TDS = 0; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 75; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 175; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 125; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13125; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 13125; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 10; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 3; // tXARD tCK Exit active power down to a read command + parameter TXP = 3; // tXP tCK Exit power down to a non-read command + parameter TANPD = 4; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 11; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 13125; // CL ps Minimum CAS Latency + `else `ifdef sg25E + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 300; // tQHS ps Data hold skew factor + parameter TAC = 400; // tAC ps DQ output access time from CK/CK# + parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 175; // tIS ps Input Setup Time + parameter TIH = 250; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 12500; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `else `ifdef sg25 + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 300; // tQHS ps Data hold skew factor + parameter TAC = 400; // tAC ps DQ output access time from CK/CK# + parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 175; // tIS ps Input Setup Time + parameter TIH = 250; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 17500; // tRPA ps Precharge All period + parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `ifdef sg3E + parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 340; // tQHS ps Data hold skew factor + parameter TAC = 450; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 200; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 12000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 12000; // CL ps Minimum CAS Latency + `else `ifdef sg3 + parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 340; // tQHS ps Data hold skew factor + parameter TAC = 450; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 200; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 18000; // tRPA ps Precharge All period + parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `ifdef sg37E + parameter TCK_MIN = 3750; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 400; // tQHS ps Data hold skew factor + parameter TAC = 500; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 225; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 450; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 300; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 250; // tIS ps Input Setup Time + parameter TIH = 375; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 18750; // tRPA ps Precharge All period + parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `define sg5E + parameter TCK_MIN = 5000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 150; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 450; // tQHS ps Data hold skew factor + parameter TAC = 600; // tAC ps DQ output access time from CK/CK# + parameter TDS = 150; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 275; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 500; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 350; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 475; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 10000; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 20000; // tRPA ps Precharge All period + parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `endif `endif `endif `endif `endif `endif + + `ifdef x16 + `ifdef sg187E + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else `ifdef sg25E + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else `ifdef sg25 + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else // sg3E, sg3, sg37E, sg5E + parameter TFAW = 50000; // tFAW ps Four Bank Activate window + `endif `endif `endif + `else // x4, x8 + `ifdef sg187E + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else `ifdef sg25E + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else `ifdef sg25 + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else // sg3E, sg3, sg37E, sg5E + parameter TFAW = 37500; // tFAW ps Four Bank Activate window + `endif `endif `endif + `endif + + // Timing Parameters + + // Mode Register + parameter AL_MIN = 0; // AL tCK Minimum Additive Latency + parameter AL_MAX = 6; // AL tCK Maximum Additive Latency + parameter CL_MIN = 3; // CL tCK Minimum CAS Latency + parameter CL_MAX = 7; // CL tCK Maximum CAS Latency + parameter WR_MIN = 2; // WR tCK Minimum Write Recovery + parameter WR_MAX = 8; // WR tCK Maximum Write Recovery + parameter BL_MIN = 4; // BL tCK Minimum Burst Length + parameter BL_MAX = 8; // BL tCK Minimum Burst Length + // Clock + parameter TCK_MAX = 8000; // tCK ps Maximum Clock Cycle Time + parameter TCH_MIN = 0.48; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCH_MAX = 0.52; // tCH tCK Maximum Clock High-Level Pulse Width + parameter TCL_MIN = 0.48; // tCL tCK Minimum Clock Low-Level Pulse Width + parameter TCL_MAX = 0.52; // tCL tCK Maximum Clock Low-Level Pulse Width + // Data + parameter TLZ = TAC; // tLZ ps Data-out low-impedance window from CK/CK# + parameter THZ = TAC; // tHZ ps Data-out high impedance window from CK/CK# + parameter TDIPW = 0.35; // tDIPW tCK DQ and DM input Pulse Width + // Data Strobe + parameter TDQSH = 0.35; // tDQSH tCK DQS input High Pulse Width + parameter TDQSL = 0.35; // tDQSL tCK DQS input Low Pulse Width + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TWPRE = 0.35; // tWPRE tCK DQS Write Preamble + parameter TWPST = 0.40; // tWPST tCK DQS Write Postamble + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + // Command and Address + parameter TIPW = 0.6; // tIPW tCK Control and Address input Pulse Width + parameter TCCD = 2; // tCCD tCK Cas to Cas command delay + parameter TRAS_MIN = 40000; // tRAS ps Minimum Active to Precharge command time + parameter TRAS_MAX =70000000; // tRAS ps Maximum Active to Precharge command time + parameter TRTP = 7500; // tRTP ps Read to Precharge command delay + parameter TWR = 15000; // tWR ps Write recovery time + parameter TMRD = 2; // tMRD tCK Load Mode Register command cycle time + parameter TDLLK = 200; // tDLLK tCK DLL locking time + // Refresh + parameter TRFC_MIN = 127500; // tRFC ps Refresh to Refresh Command interval minimum value + parameter TRFC_MAX =70000000; // tRFC ps Refresh to Refresh Command Interval maximum value + // Self Refresh + parameter TXSNR = TRFC_MIN + 10000; // tXSNR ps Exit self refesh to a non-read command + parameter TXSRD = 200; // tXSRD tCK Exit self refresh to a read command + parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. + // ODT + parameter TAOND = 2; // tAOND tCK ODT turn-on delay + parameter TAOFD = 2.5; // tAOFD tCK ODT turn-off delay + parameter TAONPD = 2000; // tAONPD ps ODT turn-on (precharge power-down mode) + parameter TAOFPD = 2000; // tAOFPD ps ODT turn-off (precharge power-down mode) + parameter TMOD = 12000; // tMOD ps ODT enable in EMR to ODT pin transition + // Power Down + parameter TCKE = 3; // tCKE tCK CKE minimum high or low pulse width + + // Size Parameters based on Part Width + + `ifdef x4 + parameter ADDR_BITS = 14; // Address Bits + parameter ROW_BITS = 14; // Number of Address bits + parameter COL_BITS = 11; // Number of Column bits + parameter DM_BITS = 1; // Number of Data Mask bits + parameter DQ_BITS = 4; // Number of Data bits + parameter DQS_BITS = 1; // Number of Dqs bits + parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time + `else `ifdef x8 + parameter ADDR_BITS = 14; // Address Bits + parameter ROW_BITS = 14; // Number of Address bits + parameter COL_BITS = 10; // Number of Column bits + parameter DM_BITS = 1; // Number of Data Mask bits + parameter DQ_BITS = 8; // Number of Data bits + parameter DQS_BITS = 1; // Number of Dqs bits + parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time + `else `define x16 + parameter ADDR_BITS = 13; // Address Bits + parameter ROW_BITS = 13; // Number of Address bits + parameter COL_BITS = 10; // Number of Column bits + parameter DM_BITS = 2; // Number of Data Mask bits + parameter DQ_BITS = 16; // Number of Data bits + parameter DQS_BITS = 2; // Number of Dqs bits + parameter TRRD = 10000; // tRRD Active bank a to Active bank b command time + `endif `endif + + `ifdef QUAD_RANK + `define DUAL_RANK // also define DUAL_RANK + parameter CS_BITS = 4; // Number of Chip Select Bits + parameter RANKS = 4; // Number of Chip Select Bits + `else `ifdef DUAL_RANK + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 2; // Number of Chip Select Bits + `else + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 1; // Number of Chip Select Bits + `endif `endif + + // Size Parameters + parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits + parameter MEM_BITS = 15; // Number of write data bursts can be stored in memory. The default is 2^10=1024. + parameter AP = 10; // the address bit that controls auto-precharge and precharge-all + parameter BL_BITS = 3; // the number of bits required to count to MAX_BL + parameter BO_BITS = 2; // the number of Burst Order Bits + +`else `define x2Gb + + `ifdef sg187E + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 75; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 250; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 425; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 250; // tQHS ps Data hold skew factor + parameter TAC = 350; // tAC ps DQ output access time from CK/CK# + parameter TDS = 0; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 75; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 175; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 125; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13125; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 13125; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 10; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 3; // tXARD tCK Exit active power down to a read command + parameter TXP = 3; // tXP tCK Exit power down to a non-read command + parameter TANPD = 4; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 11; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 13125; // CL ps Minimum CAS Latency + `else `ifdef sg25E + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 300; // tQHS ps Data hold skew factor + parameter TAC = 400; // tAC ps DQ output access time from CK/CK# + parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 175; // tIS ps Input Setup Time + parameter TIH = 250; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 12500; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `else `ifdef sg25 + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 100; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 150; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 200; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 200; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 300; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 300; // tQHS ps Data hold skew factor + parameter TAC = 400; // tAC ps DQ output access time from CK/CK# + parameter TDS = 50; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 125; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 350; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 175; // tIS ps Input Setup Time + parameter TIH = 250; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 17500; // tRPA ps Precharge All period + parameter TXARDS = 8; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 10; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `ifdef sg3E + parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 340; // tQHS ps Data hold skew factor + parameter TAC = 450; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 200; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRC = 54000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 12000; // tRP ps Precharge command period + parameter TRPA = 15000; // tRPA ps Precharge All period + parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 12000; // CL ps Minimum CAS Latency + `else `ifdef sg3 + parameter TCK_MIN = 3000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 340; // tQHS ps Data hold skew factor + parameter TAC = 450; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 175; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 240; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 200; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 18000; // tRPA ps Precharge All period + parameter TXARDS = 7; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `ifdef sg37E + parameter TCK_MIN = 3750; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 125; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 400; // tQHS ps Data hold skew factor + parameter TAC = 500; // tAC ps DQ output access time from CK/CK# + parameter TDS = 100; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 225; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 450; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 300; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 250; // tIS ps Input Setup Time + parameter TIH = 375; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 18750; // tRPA ps Precharge All period + parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `else `define sg5E + parameter TCK_MIN = 5000; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 125; // tJIT(per) ps Period JItter + parameter TJIT_DUTY = 150; // tJIT(duty) ps Half Period Jitter + parameter TJIT_CC = 250; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 175; // tERR(nper) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 225; // tERR(nper) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 250; // tERR(nper) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 250; // tERR(nper) ps Accumulated Error (5-cycle) + parameter TERR_N1PER = 350; // tERR(nper) ps Accumulated Error (6-10-cycle) + parameter TERR_N2PER = 450; // tERR(nper) ps Accumulated Error (11-50-cycle) + parameter TQHS = 450; // tQHS ps Data hold skew factor + parameter TAC = 600; // tAC ps DQ output access time from CK/CK# + parameter TDS = 150; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 275; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSCK = 500; // tDQSCK ps DQS output access time from CK/CK# + parameter TDQSQ = 350; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 475; // tIH ps Input Hold Time + parameter TRC = 55000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TWTR = 10000; // tWTR ps Write to Read command delay + parameter TRP = 15000; // tRP ps Precharge command period + parameter TRPA = 20000; // tRPA ps Precharge All period + parameter TXARDS = 6; // tXARDS tCK Exit low power active power down to a read command + parameter TXARD = 2; // tXARD tCK Exit active power down to a read command + parameter TXP = 2; // tXP tCK Exit power down to a non-read command + parameter TANPD = 3; // tANPD tCK ODT to power-down entry latency + parameter TAXPD = 8; // tAXPD tCK ODT power-down exit latency + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `endif `endif `endif `endif `endif `endif + + `ifdef x16 + `ifdef sg187E + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else `ifdef sg25E + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else `ifdef sg25 + parameter TFAW = 45000; // tFAW ps Four Bank Activate window + `else // sg3E, sg3, sg37E, sg5E + parameter TFAW = 50000; // tFAW ps Four Bank Activate window + `endif `endif `endif + `else // x4, x8 + `ifdef sg187E + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else `ifdef sg25E + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else `ifdef sg25 + parameter TFAW = 35000; // tFAW ps Four Bank Activate window + `else // sg3E, sg3, sg37E, sg5E + parameter TFAW = 37500; // tFAW ps Four Bank Activate window + `endif `endif `endif + `endif + + // Timing Parameters + + // Mode Register + parameter AL_MIN = 0; // AL tCK Minimum Additive Latency + parameter AL_MAX = 6; // AL tCK Maximum Additive Latency + parameter CL_MIN = 3; // CL tCK Minimum CAS Latency + parameter CL_MAX = 7; // CL tCK Maximum CAS Latency + parameter WR_MIN = 2; // WR tCK Minimum Write Recovery + parameter WR_MAX = 8; // WR tCK Maximum Write Recovery + parameter BL_MIN = 4; // BL tCK Minimum Burst Length + parameter BL_MAX = 8; // BL tCK Minimum Burst Length + // Clock + parameter TCK_MAX = 8000; // tCK ps Maximum Clock Cycle Time + parameter TCH_MIN = 0.48; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCH_MAX = 0.52; // tCH tCK Maximum Clock High-Level Pulse Width + parameter TCL_MIN = 0.48; // tCL tCK Minimum Clock Low-Level Pulse Width + parameter TCL_MAX = 0.52; // tCL tCK Maximum Clock Low-Level Pulse Width + // Data + parameter TLZ = TAC; // tLZ ps Data-out low-impedance window from CK/CK# + parameter THZ = TAC; // tHZ ps Data-out high impedance window from CK/CK# + parameter TDIPW = 0.35; // tDIPW tCK DQ and DM input Pulse Width + // Data Strobe + parameter TDQSH = 0.35; // tDQSH tCK DQS input High Pulse Width + parameter TDQSL = 0.35; // tDQSL tCK DQS input Low Pulse Width + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TWPRE = 0.35; // tWPRE tCK DQS Write Preamble + parameter TWPST = 0.40; // tWPST tCK DQS Write Postamble + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + // Command and Address + parameter TIPW = 0.6; // tIPW tCK Control and Address input Pulse Width + parameter TCCD = 2; // tCCD tCK Cas to Cas command delay + parameter TRAS_MIN = 40000; // tRAS ps Minimum Active to Precharge command time + parameter TRAS_MAX =70000000; // tRAS ps Maximum Active to Precharge command time + parameter TRTP = 7500; // tRTP ps Read to Precharge command delay + parameter TWR = 15000; // tWR ps Write recovery time + parameter TMRD = 2; // tMRD tCK Load Mode Register command cycle time + parameter TDLLK = 200; // tDLLK tCK DLL locking time + // Refresh + parameter TRFC_MIN = 197500; // tRFC ps Refresh to Refresh Command interval minimum value + parameter TRFC_MAX =70000000; // tRFC ps Refresh to Refresh Command Interval maximum value + // Self Refresh + parameter TXSNR = TRFC_MIN + 10000; // tXSNR ps Exit self refesh to a non-read command + parameter TXSRD = 200; // tXSRD tCK Exit self refresh to a read command + parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. + // ODT + parameter TAOND = 2; // tAOND tCK ODT turn-on delay + parameter TAOFD = 2.5; // tAOFD tCK ODT turn-off delay + parameter TAONPD = 2000; // tAONPD ps ODT turn-on (precharge power-down mode) + parameter TAOFPD = 2000; // tAOFPD ps ODT turn-off (precharge power-down mode) + parameter TMOD = 12000; // tMOD ps ODT enable in EMR to ODT pin transition + // Power Down + parameter TCKE = 3; // tCKE tCK CKE minimum high or low pulse width + + // Size Parameters based on Part Width + + `ifdef x4 + parameter ADDR_BITS = 15; // Address Bits + parameter ROW_BITS = 15; // Number of Address bits + parameter COL_BITS = 11; // Number of Column bits + parameter DM_BITS = 1; // Number of Data Mask bits + parameter DQ_BITS = 4; // Number of Data bits + parameter DQS_BITS = 1; // Number of Dqs bits + parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time + `else `ifdef x8 + parameter ADDR_BITS = 15; // Address Bits + parameter ROW_BITS = 15; // Number of Address bits + parameter COL_BITS = 10; // Number of Column bits + parameter DM_BITS = 1; // Number of Data Mask bits + parameter DQ_BITS = 8; // Number of Data bits + parameter DQS_BITS = 1; // Number of Dqs bits + parameter TRRD = 7500; // tRRD Active bank a to Active bank b command time + `else `define x16 + parameter ADDR_BITS = 14; // Address Bits + parameter ROW_BITS = 14; // Number of Address bits + parameter COL_BITS = 10; // Number of Column bits + parameter DM_BITS = 2; // Number of Data Mask bits + parameter DQ_BITS = 16; // Number of Data bits + parameter DQS_BITS = 2; // Number of Dqs bits + parameter TRRD = 10000; // tRRD Active bank a to Active bank b command time + `endif `endif + + `ifdef QUAD_RANK + `define DUAL_RANK // also define DUAL_RANK + parameter CS_BITS = 4; // Number of Chip Select Bits + parameter RANKS = 4; // Number of Chip Select Bits + `else `ifdef DUAL_RANK + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 2; // Number of Chip Select Bits + `else + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 1; // Number of Chip Select Bits + `endif `endif + + // Size Parameters + parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits + parameter MEM_BITS = 15; // Number of write data bursts can be stored in memory. The default is 2^10=1024. + parameter AP = 10; // the address bit that controls auto-precharge and precharge-all + parameter BL_BITS = 3; // the number of bits required to count to MAX_BL + parameter BO_BITS = 2; // the number of Burst Order Bits + +`endif `endif `endif + + // Simulation parameters + parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors + parameter DEBUG = 1; // Turn on Debug messages + parameter BUS_DELAY = 0; // delay in nanoseconds + parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads + parameter RANDOM_SEED = 711689044; //seed value for random generator. + + parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe + parameter RDQSEN_PST = 1; // DQS driving time after last read strobe + parameter RDQS_PRE = 2; // DQS low time prior to first read strobe + parameter RDQS_PST = 1; // DQS low time after last valid read strobe + parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data + parameter RDQEN_PST = 0; // DQ/DM driving time after last read data + parameter WDQS_PRE = 1; // DQS half clock periods prior to first write strobe + parameter WDQS_PST = 1; // DQS half clock periods after last valid write strobe diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/isim.sh b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/isim.sh new file mode 100755 index 0000000..4c23a30 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/isim.sh @@ -0,0 +1,70 @@ +#!/bin/csh -f +#***************************************************************************** +# (c) Copyright 2009 Xilinx, Inc. All rights reserved. +# +# This file contains confidential and proprietary information +# of Xilinx, Inc. and is protected under U.S. and +# international copyright and other intellectual property +# laws. +# +# DISCLAIMER +# This disclaimer is not a license and does not grant any +# rights to the materials distributed herewith. Except as +# otherwise provided in a valid license issued to you by +# Xilinx, and to the maximum extent permitted by applicable +# law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +# WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +# AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +# BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +# INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +# (2) Xilinx shall not be liable (whether in contract or tort, +# including negligence, or under any other theory of +# liability) for any loss or damage of any kind or nature +# related to, arising under or in connection with these +# materials, including for any direct, or any indirect, +# special, incidental, or consequential loss or damage +# (including loss of data, profits, goodwill, or any type of +# loss or damage suffered as a result of any action brought +# by a third party) even if such damage or loss was +# reasonably foreseeable or Xilinx had been advised of the +# possibility of the same. +# +# CRITICAL APPLICATIONS +# Xilinx products are not designed or intended to be fail- +# safe, or for use in any application requiring fail-safe +# performance, such as life-support or safety devices or +# systems, Class III medical devices, nuclear facilities, +# applications related to the deployment of airbags, or any +# other applications that could lead to death, personal +# injury, or severe property or environmental damage +# (individually and collectively, "Critical +# Applications"). Customer assumes the sole risk and +# liability of any use of Xilinx products in Critical +# Applications, subject only to applicable laws and +# regulations governing limitations on product liability. +# +# THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +# PART OF THIS FILE AT ALL TIMES. +# +# **************************************************************************** +# ____ ____ +# / /\/ / +# /___/ \ / Vendor : Xilinx +# \ \ \/ Version : 3.92 +# \ \ Application : MIG +# / / Filename : isim.bat +# /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:55 $ +# \ \ / \ Date Created : Fri Feb 06 2009 +# \___\/\___\ +# +# Device : Spartan-6 +# Design Name : DDR/DDR2/DDR3/LPDDR +# Purpose : Batch file to run Simulation through ISIM +# Reference : +# Revision History : +# **************************************************************************** + +echo Simulation Tool: ISIM +fuse work.sim_tb_top work.glbl -prj ddr2.prj -L unisim -L secureip -timeprecision_vhdl fs -o ddr2 +./ddr2 -gui -tclbatch isim.tcl -wdb ddr2.wdb +echo done diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/isim.tcl b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/isim.tcl new file mode 100755 index 0000000..dc37142 --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/isim.tcl @@ -0,0 +1,72 @@ +############################################################################### +## (c) Copyright 2009 Xilinx, Inc. All rights reserved. +## +## This file contains confidential and proprietary information +## of Xilinx, Inc. and is protected under U.S. and +## international copyright and other intellectual property +## laws. +## +## DISCLAIMER +## This disclaimer is not a license and does not grant any +## rights to the materials distributed herewith. Except as +## otherwise provided in a valid license issued to you by +## Xilinx, and to the maximum extent permitted by applicable +## law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +## WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +## AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +## BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +## INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +## (2) Xilinx shall not be liable (whether in contract or tort, +## including negligence, or under any other theory of +## liability) for any loss or damage of any kind or nature +## related to, arising under or in connection with these +## materials, including for any direct, or any indirect, +## special, incidental, or consequential loss or damage +## (including loss of data, profits, goodwill, or any type of +## loss or damage suffered as a result of any action brought +## by a third party) even if such damage or loss was +## reasonably foreseeable or Xilinx had been advised of the +## possibility of the same. +## +## CRITICAL APPLICATIONS +## Xilinx products are not designed or intended to be fail- +## safe, or for use in any application requiring fail-safe +## performance, such as life-support or safety devices or +## systems, Class III medical devices, nuclear facilities, +## applications related to the deployment of airbags, or any +## other applications that could lead to death, personal +## injury, or severe property or environmental damage +## (individually and collectively, "Critical +## Applications"). Customer assumes the sole risk and +## liability of any use of Xilinx products in Critical +## Applications, subject only to applicable laws and +## regulations governing limitations on product liability. +## +## THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +## PART OF THIS FILE AT ALL TIMES. +## +############################################################################### +## ____ ____ +## / /\/ / +## /___/ \ / Vendor : Xilinx +## \ \ \/ Version : 3.92 +## \ \ Application : MIG +## / / Filename : isim.tcl +## /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:55 $ +## \ \ / \ Date Created : Mon Mar 2 2009 +## \___\/\___\ +## +## Device : Spartan-6 +## Design Name : DDR/DDR2/DDR3/LPDDR +## Purpose : To give commands to ISIM Simulator through batch mode +## Assumptions: +## - Simulation takes place in \sim folder of MIG output directory +## Reference : +## Revision History: +############################################################################### + +onerror {resume} +isim set radix hex +wave add /sim_tb_top +run 200 us +quit diff --git a/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/readme.txt b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/readme.txt new file mode 100755 index 0000000..139937a --- /dev/null +++ b/fpga/src/vendor/xilinx/atlys_ddr2/ddr2/example_design/sim/functional/readme.txt @@ -0,0 +1,131 @@ +############################################################################### +## (c) Copyright 2009 Xilinx, Inc. All rights reserved. +## +## This file contains confidential and proprietary information +## of Xilinx, Inc. and is protected under U.S. and +## international copyright and other intellectual property +## laws. +## +## DISCLAIMER +## This disclaimer is not a license and does not grant any +## rights to the materials distributed herewith. Except as +## otherwise provided in a valid license issued to you by +## Xilinx, and to the maximum extent permitted by applicable +## law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +## WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +## AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +## BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +## INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +## (2) Xilinx shall not be liable (whether in contract or tort, +## including negligence, or under any other theory of +## liability) for any loss or damage of any kind or nature +## related to, arising under or in connection with these +## materials, including for any direct, or any indirect, +## special, incidental, or consequential loss or damage +## (including loss of data, profits, goodwill, or any type of +## loss or damage suffered as a result of any action brought +## by a third party) even if such damage or loss was +## reasonably foreseeable or Xilinx had been advised of the +## possibility of the same. +## +## CRITICAL APPLICATIONS +## Xilinx products are not designed or intended to be fail- +## safe, or for use in any application requiring fail-safe +## performance, such as life-support or safety devices or +## systems, Class III medical devices, nuclear facilities, +## applications related to the deployment of airbags, or any +## other applications that could lead to death, personal +## injury, or severe property or environmental damage +## (individually and collectively, "Critical +## Applications"). Customer assumes the sole risk and +## liability of any use of Xilinx products in Critical +## Applications, subject only to applicable laws and +## regulations governing limitations on product liability. +## +## THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +## PART OF THIS FILE AT ALL TIMES. +## +############################################################################### +## ____ ____ +## / /\/ / +## /___/ \ / Vendor : Xilinx +## \ \ \/ Version : 3.92 +## \ \ Application : MIG +## / / Filename : readme.txt +## /___/ /\ Date Last Modified : $Date: 2011/06/02 07:16:55 $ +## \ \ / \ Date Created : Mon Oct 19 2009 +## \___\/\___\ +## +## Device : Spartan-6 +## Design Name : DDR/DDR2/DDR3/LPDDR +## Purpose : Steps to run simulation using ISIM/Modelsim simualtor in this folder +## Assumptions: +## - Simulation takes place in \sim\ folder of MIG output directory +## Reference : +## Revision History: +############################################################################### + +The sim/functional folder has files to perform functional simulation of the design. + +1. Simulation using Modelsim simulator + +A) sim.do File : + + 1) The 'sim.do' file has commands to compile and simulate memory interface + design and run the simulation for specified period of time. + + 2) It has the syntax to Map the required libraries. + Also, $XILINX environment variable must be set in order to compile glbl.v file + + 3) Displays the waveforms that are listed with "add wave" command. + +B) Steps to run the Modelsim simulation: + + 1) The user should invoke the Modelsim simulator GUI. + 2) Change the present working directory path to the sim/functional folder. + In Transcript window, at Modelsim prompt, type the following command to + change directory path. + cd + + 2) Run the simulation using sim.do file. + At Modelsim prompt, type the following command: + do sim.do + + 3) To exit simulation, type the following command at Modelsim prompt: + quit -f + + 4) Verify the transcript file for the memory transactions. + +C) For simulation with Elpida parts perform the following steps and then + the above mentioned steps in 'B' + + 1) Download the Elpida memory model from Elpida webpage. + + 2) Update the memorymodel name in the vlog command given in sim.do file. + + +2. Simulation using ISIM simulator + +A) Following files are provided : + + 1) The '.prj' file contains the list of all the files associated with the design. + It also contains the hdl, library and the source file name. + + 2) The '.tcl' file contains the Tcl commands for simulation and + resume on error. + + 3) The 'isim.bat' has commands which use '.prj' and '.tcl' files. + + +B) Steps to run the ISIM simulation: + + The user should execute the file isim.bat, which does the following steps: + 1) Compiles, elaborates the design and generates the simulation executable using + the fuse command in 'isim.bat' file. + + 2) Invokes the ISIM GUI. + + 3) User can add required signals from objects window to the waveform viewer and run + simulation for specified time using the command "run :1<75f8`83>>o5<:0;66a=4383>>{e=8=1<7;50;2x 70c28h<7E;87:J620=#9jh1?6g9f;29?l172900e5o50;9j615=831d>9<50;9~f071290>6=4?{%05`?7e?2B>;:5G5778 4ee2:1b:k4?::k44?6=3`2j6=44i360>5<96=44}c721?6==3:1=0D88:;%3`f?5>o?i3:17d<;3;29?j43:3:17pl:1583>0<729q/>;j51c58L0103A?=96*>cc80?l0a2900e:>50;9j4?::m107<722wi9<=50;794?6|,;N2><1/=nl53:k5b?6=3`=;6=44i9c94?=n:=91<75`25094?=zj<;96=4::183!41l3;i;6F:769K133<,8ii6>5f6g83>>o083:17d6n:188m7242900c?:=:188yg3693:197>50z&12a<6j>1C9:94H446?!7dj390e;h50;9j35<722c3m7>5;h077?6=3f8?>7>5;|`655<72<0;6=u+27f95g1<@<=<7E;95:&2gg<43`>i5<;0;66sm51d94?3=83:p(?8k:0`4?M30?2B>:85+1b`97>o1n3:17d9?:188m=g=831b>9=50;9l614=831vn8>k:186>5<7s-8=h7?m7:J632=O=??0(5;h:b>5<86=44o361>5<55;294~"5>m0:n:5G5658L0023-;hn7=4i7d94?=n?90;66g7a;29?l43;3:17b<;2;29?xd28k0;684?:1y'63b=9k=0D898;I751>"6kk087d8i:188m26=831b4l4?::k106<722e98?4?::a15g=83?1<7>t$34g>4d03A?<;6F:649'5fd=;2c=j7>5;h53>5<5<2290;w)<9d;3a3>N2?>1C9;;4$0aa>6=n>o0;66g80;29?l>f2900e?:<:188k7252900qo;?8;291?6=8r.9:i4>b69K121<@<<>7)?lb;18m3`=831b;=4?::k;e?6=3`8??7>5;n076?6=3th><:4?:483>5}#:?n1=o94H454?M31=2.:oo4<;h4e>5<:1<75f8`83>>o5<:0;66a=4383>>{e=9<1<7;50;2x 70c28h<7E;87:J620=#9jh1?6g9f;29?l172900e5o50;9j615=831d>9<50;9~f062290>6=4?{%05`?7e?2B>;:5G5778 4ee2:1b:k4?::k44?6=3`2j6=44i360>5<96=44}c730?6==3:1=0D88:;%3`f?5>o?i3:17d<;3;29?j43:3:17pl:2083>0<729q/>;j51c58L0103A?=96*>cc80?l0a2900e:>50;9j4?::m107<722wi9?>50;794?6|,;N2><1/=nl53:k5b?6=3`=;6=44i9c94?=n:=91<75`25094?=zj<;m6=4::183!41l3;i;6F:769K133<,8ii6>5f6g83>>o083:17d6n:188m7242900c?:=:188yg36m3:197>50z&12a<6j>1C9:94H446?!7dj390e;h50;9j35<722c3m7>5;h077?6=3f8?>7>5;|`65a<72<0;6=u+27f95g1<@<=<7E;95:&2gg<43`>i5<;0;66sm50a94?3=83:p(?8k:0`4?M30?2B>:85+1b`97>o1n3:17d9?:188m=g=831b>9=50;9l614=831vn8?6:186>5<7s-8=h7?m7:J632=O=??0(5;h:b>5<86=44o361>5<55;294~"5>m0:n:5G5658L0023-;hn7=4i7d94?=n?90;66g7a;29?l43;3:17b<;2;29?xd28:0;684?:1y'63b=9k=0D898;I751>"6kk087d8i:188m26=831b4l4?::k106<722e98?4?::a154=83?1<7>t$34g>4d03A?<;6F:649'5fd=;2c=j7>5;h53>5<5c6g=5883>!44m38>46`=3e83?>o5=:0;6)<h5;m0;76g:6b83>!44m3?=n6`=3e83?>o2>h0;6)<h5;m0:76g:6883>!44m3?=n6`=3e81?>o2>10;6)<h5;m0876g;a;29 75b2=30b?=k:198m01=83.9?h4;9:l17a<632c>:7>5$31f>1?o2<3:1(?=j:5;8j75c2=10e8=50;&17`<312d9?i4:;:k66?6=,;9n6974n31g>3=h5;m0<76g:0;29 75b2=30b?=k:998m1`=83.9?h4;9:l17a<>32c?47>5$31f>1?ob03:1(?=j:d;8j75c2810eh850;&17`6=1<7*=3d8f=>h5;m0?76gj3;29 75b2l30b?=k:498m`4=83.9?h4j9:l17a<132cn=7>5$31f>`?ocn3:1(?=j:d;8j75c2010eik50;&17`g=h5;m0h76gka;29 75b2l30b?=k:e98ma?=83.9?h4j9:l17a5$31f>`?=nl?0;6)<>k5e89m66b=9:10ei=50;&17`4:9j`7<72-88i7k6;o00`?7232cm=7>5$31f>`?5<#::o1i45a22f952=h5;m0:465fed83>!44m3o27c<obl3:1(?=j:d;8j75c28k07dkl:18'66c=m01e>>j51c98m`d=83.9?h4j9:l17a<6k21bi:4?:%00a?c>3g88h7?k;:kgg?6=,;9n6h74n31g>4c<3`n:6=4+22g9a<=i::n1=k54i37`>5<#::o1>8l4n31g>5=5<#::o19:>4n31g>5=5<#::o19:>4n31g>7=54i4c94?"5;l0>56`=3e83?>o1?3:1(?=j:4;8j75c2810e;850;&17`<212d9?i4=;:k51?6=,;9n6874n31g>6=1<7*=3d86=>h5;m0?76g93;29 75b2<30b?=k:498m34=83.9?h4:9:l17a<132c==7>5$31f>0?56`=3e8;?>o2n3:1(?=j:4;8j75c2010e8650;&17`<212d9?i4n;:k24g<72-88i7??a:l17a<732c:<44?:%00a?77i2d9?i4>;:k242<72-88i7??a:l17a<532c:<;4?:%00a?77i2d9?i4<;:k240<72-88i7??a:l17a<332c:<94?:%00a?77i2d9?i4:;:k246<72-88i7??a:l17a<132c:n;o00`?g<3`ln6=4+22g955g=nnk0;6)<h5;m0o76gia;29 75b28:j7c<290/>>k511c8j75c2o10ek650;&17`<68h1e>>j51198mc1=83.9?h4>0`9m66b=9810ek850;&17`<68h1e>>j51398mc3=83.9?h4>0`9m66b=9:10ek:50;&17`<68h1e>>j51598mc5=83.9?h4>0`9m66b=9<10e1183>!44m3;;m6`=3e82<>=n99l1<7*=3d824d=i::n1=454i02f>5<#::o1==o4n31g>4g<3`;;h7>5$31f>46f3g88h7?m;:k24f<72-88i7??a:l17a<6k21b==650;&17`<68h1e>>j51e98mcb=83.9?h4>0`9m66b=9l10ek<50;&17`<68h1e>>j51g98m2?=831b=lj50;9j3`<722c:mh4?::k155<722c9;:m2<5<72-88i7?73:l17a<532e:;k4?:%00a?7?;2d9?i4<;:m23`<72-88i7?73:l17a<332e:;i4?:%00a?7?;2d9?i4:;:m23f<72-88i7?73:l17a<132e:;o4?:%00a?7?;2d9?i48;:m23d<72-88i7?73:l17a50;&17`<60:1e>>j51098k40a290/>>k51918j75c28807b?9e;29 75b28287c<i6>m0;6)<h5;m0:865`17a94?"5;l0:4>5a22f950=8:9l5=>=83.9?h4>829m66b=9010c<68:18'66c=9190b?=k:0c8?j7?>3:1(?=j:0:0?k44l3;i76a>8483>!44m3;3?6`=3e82g>=h91;1<7*=3d82<6=i::n1=i54o055>5<#::o1=5=4n31g>4c<3f;=n7>5$31f>4>43g88h7?i;:m2e0<72-88i7?n4:l17a<732e:m>4?:%00a?7f<2d9?i4>;:m2e4<72-88i7?n4:l17a<532e:m=4?:%00a?7f<2d9?i4<;:m2=c<72-88i7?n4:l17a<332e:5h4?:%00a?7f<2d9?i4:;:m2=a<72-88i7?n4:l17a<132e:5n4?:%00a?7f<2d9?i48;:m2=g<72-88i7?n4:l17a4?:%00a?7f<2d9?i4i;:m2=7<72-88i7?n4:l17a<6821d=4?50;&17`<6i=1e>>j51098k4?7290/>>k51`68j75c28807b?7f;29 75b28k?7c<i60l0;6)<h5;m0:865`19f94?"5;l0:m95a22f950=8:9l5d?=83.9?h4>a59m66b=9010c0b?=k:0c8?j7f?3:1(?=j:0c7?k44l3;i76a>a783>!44m3;j86`=3e82g>=h9h81<7*=3d82e1=i::n1=i54o0;4>5<#::o1=l:4n31g>4c<3f;3o7>5$31f>4g33g88h7?i;:m102<72-88i7<;6:l17a<732e99=4?:%00a?43>2d9?i4>;:m10c<72-88i7<;6:l17a<532e98h4?:%00a?43>2d9?i4<;:m10a<72-88i7<;6:l17a<332e98n4?:%00a?43>2d9?i4:;:m10g<72-88i7<;6:l17a<132e98l4?:%00a?43>2d9?i48;:m10<<72-88i7<;6:l17a2d9?i46;:m100<72-88i7<;6:l17a51;294~"5>m0:no5G5658L0023f;im7>5;|`544<72ki1<7>t$34g>7233A?<;6F:649Y2`73=:009:7?j:0c95c<5?3;26p*=3886bf=i0k027c6l:89m56c=82d::=4?;%3bb?7e92.:n=4=6b9'5f5==2.:o94:;%3`1?3<,8i=685+1b591>"6k10>7)?l9;78 4ef2<1/=nm55:&2ga<23-;hi7;4$0ae>0=#9m:196*>d086?!7c:3?0("6l00>7)?ka;78 4be2<1/=im55:&2`a<23-;oi7;4$0fe>0=#9l:196*>e086?!7b:3?0("6m00>7)?ja;78 4ce2<1/=hm55:&2aa<23-;ni7;4$0ge>0=#9o:196*>f086?!7a:3?0("6n00>7)?ia;78 4`e2<1/=km55:&2ba<23-;mi7;4$0de>0=#:9:196*=0086?!47:3?0(?><:49'652==2.9<84:;%032?3<,;:<685+21:91>"5800>7)=m54:&14a<33-8;i7<<7:&11a<5>k1/>8k5719'60`=?91/>;:5689'633=:?=0(?87:59'63?=<2.>;>4:739'122==>80e?;>:188m2?=831b=lk50;9j60g=831b;h4?::k111<722c99:4?::k2ea<722c:=:4?:%00a?76>2d9?i4?;:k250<72-88i7?>6:l17a<632c:=94?:%00a?76>2d9?i4=;:k256<72-88i7?>6:l17a<432c>:n4?:%00a?31j2d9?i4?;:k62d<72-88i7;9b:l17a<632c>:44?:%00a?31j2d9?i4=;:k62=<72-88i7;9b:l17a<432e:?;4?:%00a?74=2d9?i4?;:m271<72-88i7?<5:l17a<632e:??4?:%00a?74=2d9?i4=;:m274<72-88i7?<5:l17a<432e:?=4?:%00a?74=2d9?i4;;:m26c<72-88i7?<5:l17a<232e:>h4?:%00a?74=2d9?i49;:m26a<72-88i7?<5:l17a<032e:>n4?:%00a?74=2d9?i47;:m26g<72-88i7?<5:l17a<>32e:>l4?:%00a?74=2d9?i4n;:m26<<72-88i7?<5:l17a:4?:%00a?74=2d9?i4l;:m263<72-88i7?<5:l17a84?:%00a?74=2d9?i4j;:m261<72-88i7?<5:l17a>4?:%00a?74=2d9?i4>0:9l574=83.9?h4>349m66b=9810c<<>:18'66c=9:?0b?=k:008?j7583:1(?=j:016?k44l3;876a>1g83>!44m3;896`=3e820>=h98o1<7*=3d8270=i::n1=854o01g>5<#::o1=>;4n31g>40<3f;8o7>5$31f>4523g88h7?8;:m27g<72-88i7?<5:l17a<6021d=>o50;&17`<6;<1e>>j51898k45>290/>>k51278j75c28k07b?<8;29 75b289>7c<i6;>0;6)<h5;m0:o65`12194?"5;l0:?85a22f95a=5$31f>1bo3j3:1(?=j:5f8j75c2;10e9o50;&17`<3l2d9?i4<;:k63?6=,;9n69j4n31g>1=h5;m0>76g:5;29 75b2=n0b?=k:798m02=83.9?h4;d:l17a<032c>?7>5$31f>1bo293:1(?=j:5f8j75c2h10e8>50;&17`<3l2d9?i4m;:k7b?6=,;9n69j4n31g>f=h5;m0o76g:e;29 75b2n7>5$31f>0bh6`=3e80?>o1?3:1(?=j:4f8j75c2=10e;850;&17`<2l2d9?i4:;:k51?6=,;9n68j4n31g>3=1<7*=3d86`>h5;m0<76g93;29 75b232c==7>5$31f>0bh6`=3e8a?>o2n3:1(?=j:4f8j75c2j10e8650;&17`<2l2d9?i4k;:k`=?6=,;9n6n64n31g>5=h5;m0:76gl5;29 75b2j20b?=k:398mf2=83.9?h4l8:l17a<432ch?7>5$31f>f>od93:1(?=j:b:8j75c2?10en>50;&17`==h5;m0276gmd;29 75b2j20b?=k:`98mge=83.9?h4l8:l17a5$31f>f>oe03:1(?=j:b:8j75c2l10eo950;&17`46<3`h>6=4+22g9g==i::n1=<54ic694?"5;l0h46`=3e826>=nj:0;6)<>k5c99m66b=9<10ei>50;&17`6:9jgc<72-88i7m7;o00`?7032chi7>5$31f>f>5<#::o1o55a22f95<=h5;m0:m65fcc83>!44m3i37c<odi3:1(?=j:b:8j75c28i07dm9:18'66c=k11e>>j51e98mgd=83.9?h4l8:l17a<6m21bn=4?:%00a?e?3g88h7?i;:m220<72-88i7?94:l17a<732e::>4?:%00a?71<2d9?i4>;:m227<72-88i7?94:l17a<532e::<4?:%00a?71<2d9?i4<;:k25f<72-88i7?>b:l17a<732c:=l4?:%00a?76j2d9?i4>;:k25<<72-88i7?>b:l17a<532c:=54?:%00a?76j2d9?i4<;:m22d<72-88i7?99:l17a<732e::54?:%00a?7112d9?i4>;:m222<72-88i7?99:l17a<532e::;4?:%00a?7112d9?i4<;:m21=<72-88i7?:7:l17a<732e:9;4?:%00a?72?2d9?i4>;:m211<72-88i7?:7:l17a<532e:9>4?:%00a?72?2d9?i4<;:m217<72-88i7?:7:l17a<332e:9<4?:%00a?72?2d9?i4:;:m215<72-88i7?:7:l17a<132e:8k4?:%00a?72?2d9?i48;:m20`<72-88i7?:7:l17a1e>>j51098k424290/>>k51458j75c28807b?;2;29 75b28?<7c<i6<80;6)<h5;m0:865`15294?"5;l0:9:5a22f950=8:9l50e=83.9?h4>569m66b=9010c<;m:18'66c=9<=0b?=k:0c8?j72i3:1(?=j:074?k44l3;i76a>5883>!44m3;>;6`=3e82g>=h95<#::o1=894n31g>4c<3f;8j7>5$31f>4303g88h7?i;:k634<72-88i7;80:l17a<732c>:k4?:%00a?3082d9?i4>;:k62`<72-88i7;80:l17a<532c>:i4?:%00a?3082d9?i4<;:kb5=h5;m0:76gn4;29 75b2h=0b?=k:398md5=83.9?h4n7:l17a<432cj>7>5$31f>d1of83:1(?=j:`58j75c2?10e4h50;&17`==h5;m0276g6c;29 75b2h=0b?=k:`98m5$31f>d1o>?3:1(?=j:`58j75c2l10e4850;&17`46<3`3?6=4+22g9e2=i::n1=<54i8194?"5;l0j;6`=3e826>=n1;0;6)<>k5a69m66b=9<10elh50;&17`6:9je`<72-88i7o8;o00`?7032cjh7>5$31f>d15<#::o1m:5a22f95<=h5;m0:m65fa`83>!44m3k<7c<of13:1(?=j:`58j75c28i07do::18'66c=i>1e>>j51e98m;:5G5778^3c=kr;:6<<52581;4>e;3b>4`=:>0:57s+22;91ce50:&2ec<6j81/=o>527a8 4e42<1/=n:55:&2g0<23-;h:7;4$0a4>0=#9j2196*>c886?!7di3?0("6l;0>7)?k3;78 4b32<1/=i;55:&2`3<23-;o;7;4$0f;>0=#9m3196*>d`86?!7cj3?0("6m;0>7)?j3;78 4c32<1/=h;55:&2a3<23-;n;7;4$0g;>0=#9l3196*>e`86?!7bj3?0("6n;0>7)?i3;78 4`32<1/=k;55:&2b3<23-;m;7;4$0d;>0=#9o3196*>f`86?!7aj3?0("58;0>7)=;55:&143<23-8;;7;4$32;>0=#:93196*=0`86?!47j3?0(?>l:59'65b=<2.9:0(?8;:7;8 7022;<<7)<98;68 70>2=1/9:=55608 0132<=97d<:1;29?l1>2900e8950;9j5db=831b=<950;&17`<69?1e>>j50:9j543=83.9?h4>179m66b=921b=<:50;&17`<69?1e>>j52:9j545=83.9?h4>179m66b=;21b9;m50;&17`<2>k1e>>j50:9j13g=83.9?h4:6c9m66b=921b9;750;&17`<2>k1e>>j52:9j13>=83.9?h4:6c9m66b=;21d=>850;&17`<6;<1e>>j50:9l562=83.9?h4>349m66b=921d=><50;&17`<6;<1e>>j52:9l567=83.9?h4>349m66b=;21d=>>50;&17`<6;<1e>>j54:9l57`=83.9?h4>349m66b==21d=?k50;&17`<6;<1e>>j56:9l57b=83.9?h4>349m66b=?21d=?m50;&17`<6;<1e>>j58:9l57d=83.9?h4>349m66b=121d=?o50;&17`<6;<1e>>j5a:9l57?=83.9?h4>349m66b=j21d=?950;&17`<6;<1e>>j5c:9l570=83.9?h4>349m66b=l21d=?;50;&17`<6;<1e>>j5e:9l572=83.9?h4>349m66b=n21d=?=50;&17`<6;<1e>>j51198k445290/>>k51278j75c28;07b?=1;29 75b289>7c<i6:90;6)<h5;m0:?65`10d94?"5;l0:?85a22f951=7:9l56d=83.9?h4>349m66b=9110c<=n:18'66c=9:?0b?=k:0;8?j7413:1(?=j:016?k44l3;j76a>3983>!44m3;896`=3e82f>=h9:=1<7*=3d8270=i::n1=n54o010>5<#::o1=>;4n31g>4b<3f;947>5$31f>4523g88h7?j;:m25a<72-88i7?<5:l17a<6n21b8h4?:%00a?2c3g88h7>4;h6`>5<#::o18i5a22f95>=n>j53:9j12<72-88i7:k;o00`?2<3`?=6=4+22g90a=i::n1965f5483>!44m3>o7c<>k54e9m66b=?21b9>4?:%00a?2c3g88h764;h71>5<#::o18i5a22f9=>=n=80;6)<>j5b:9j0c<72-88i7:k;o00`?e<3`>36=4+22g90a=i::n1h65f5d83>!44m3?o7c<>k55e9m66b=921b9o4?:%00a?3c3g88h7<4;h7b>5<#::o19i5a22f97>=n>>0;6)<07d89:18'66c==m1e>>j55:9j20<72-88i7;k;o00`?0<3`!44m3?o7c<>k55e9m66b=121b:<4?:%00a?3c3g88h7o4;h43>5<#::o19i5a22f9f>=n=o0;6)<>j5d:9jg<<72-88i7m7;o00`?6<3`i<6=4+22g9g==i::n1=65fc483>!44m3i37c<>k5c99m66b=;21bo>4?:%00a?e?3g88h7:4;ha1>5<#::o1o55a22f91>=nk80;6)<>j57:9jfc<72-88i7m7;o00`?><3`hn6=4+22g9g==i::n1565fbe83>!44m3i37c<>k5c99m66b=j21bnl4?:%00a?e?3g88h7m4;h`:>5<#::o1o55a22f9`>=nj10;6)<>j5f:9jf3<72-88i7m7;o00`?7732ci97>5$31f>f>5<#::o1o55a22f957=h5;m0:?65fb383>!44m3i37c<oe93:1(?=j:b:8j75c28?07dj?:18'66c=k11e>>j51798mf`=83.9?h4l8:l17a<6?21boh4?:%00a?e?3g88h7?7;:k``?6=,;9n6n64n31g>4?<3`ih6=4+22g9g==i::n1=l54ib`94?"5;l0h46`=3e82f>=nkh0;6)<>k5c99m66b=9l10eo>50;&17`f:9l533=83.9?h4>659m66b=821d=;=50;&17`<6>=1e>>j51:9l534=83.9?h4>659m66b=:21d=;?50;&17`<6>=1e>>j53:9j54e=83.9?h4>1c9m66b=821b=>j51:9j54?=83.9?h4>1c9m66b=:21b=<650;&17`<69k1e>>j53:9l53g=83.9?h4>689m66b=821d=;650;&17`<6>01e>>j51:9l531=83.9?h4>689m66b=:21d=;850;&17`<6>01e>>j53:9l50>=83.9?h4>569m66b=821d=8850;&17`<6=>1e>>j51:9l502=83.9?h4>569m66b=:21d=8=50;&17`<6=>1e>>j53:9l504=83.9?h4>569m66b=<21d=8?50;&17`<6=>1e>>j55:9l506=83.9?h4>569m66b=>21d=9h50;&17`<6=>1e>>j57:9l51c=83.9?h4>569m66b=021d=9j50;&17`<6=>1e>>j59:9l51e=83.9?h4>569m66b=i21d=9l50;&17`<6=>1e>>j5b:9l51?=83.9?h4>569m66b=k21d=9650;&17`<6=>1e>>j5d:9l511=83.9?h4>569m66b=m21d=9850;&17`<6=>1e>>j5f:9l513=83.9?h4>569m66b=9910c<:;:18'66c=9<=0b?=k:038?j73;3:1(?=j:074?k44l3;976a>4383>!44m3;>;6`=3e827>=h9=;1<7*=3d8212=i::n1=954o063>5<#::o1=894n31g>43<3f;>j7>5$31f>4303g88h7?9;:m21`<72-88i7?:7:l17a<6?21d=8j50;&17`<6=>1e>>j51998k43d290/>>k51458j75c28307b?:b;29 75b28?<7c<i6=h0;6)<h5;m0:n65`14;94?"5;l0:9:5a22f95f=6=4+22g9501f:9j127=83.9?h4:719m66b=821b9;h50;&17`<2?91e>>j51:9j13c=83.9?h4:719m66b=:21b9;j50;&17`<2?91e>>j53:9je=<72-88i7o8;o00`?6<3`k=6=4+22g9e2=i::n1=65fa583>!44m3k<7c<>k5a69m66b=;21bm?4?:%00a?g03g88h7:4;hc2>5<#::o1m:5a22f91>=ni90;6)<1e>>j57:9j=`<72-88i7o8;o00`?><3`3o6=4+22g9e2=i::n1565f9b83>!44m3k<7c<>k5a69m66b=j21b544?:%00a?g03g88h7m4;h;;>5<#::o1m:5a22f9`>=n1>0;6)<1e>>j5f:9j=0<72-88i7o8;o00`?7732c287>5$31f>d15<#::o1m:5a22f957=h5;m0:?65f9083>!44m3k<7c<o>83:1(?=j:`58j75c28?07doi:18'66c=i>1e>>j51798mdc=83.9?h4n7:l17a<6?21bmi4?:%00a?g03g88h7?7;:kbg?6=,;9n6l94n31g>4?<3`ki6=4+22g9e2=i::n1=l54i`c94?"5;l0j;6`=3e82f>=ni00;6)<>k5a69m66b=9l10e5h50;&17`f:9~f364290io7>50z&12a<5<=1C9:94H446?_0b2jq:=7?=:3696=<5=3826?851d82e?7a2;=1=44r$31:>0`d3g2i645a8b8:?k74m3:0b<8?:19'5d`=9k;0("6kh0>7)?lc;78 4ec2<1/=nk55:&2gc<23-;o<7;4$0f2>0=#9m8196*>d286?!7c<3?0("6lk0>7)?kc;78 4bc2<1/=ik55:&2`c<23-;n<7;4$0g2>0=#9l8196*>e286?!7b<3?0("6mk0>7)?jc;78 4cc2<1/=hk55:&2ac<23-;m<7;4$0d2>0=#9o8196*>f286?!7a<3?0("6nk0>7)?ic;78 4`c2<1/=kk55:&2bc<23-8;<7;4$322>0=#:98196*=0286?!47<3?0(?>::49'650==2.9<:4:;%03"58k0>7)=k52258 73c2;0(89<:451?!30<3?<>6g=5083>>o013:17d?ne;29?l42i3:17d9j:188m7332900e?;8:188m4gc2900e>k51048j75c2810e>k51048j75c2:10e88l:18'66c==?h0b?=k:198m00f290/>>k557`8j75c2810e886:18'66c==?h0b?=k:398m00?290/>>k557`8j75c2:10c<=9:18'66c=9:?0b?=k:198k453290/>>k51278j75c2810c<==:18'66c=9:?0b?=k:398k456290/>>k51278j75c2:10c<=?:18'66c=9:?0b?=k:598k44a290/>>k51278j75c2<10c<>k51278j75c2>10c<>k51278j75c2010c<290/>>k51278j75c2k10c<<8:18'66c=9:?0b?=k:b98k441290/>>k51278j75c2m10c<<::18'66c=9:?0b?=k:d98k443290/>>k51278j75c2o10c<<<:18'66c=9:?0b?=k:028?j75:3:1(?=j:016?k44l3;:76a>2083>!44m3;896`=3e826>=h9;:1<7*=3d8270=i::n1=>54o03e>5<#::o1=>;4n31g>42<3f;:i7>5$31f>4523g88h7?:;:m27a<72-88i7?<5:l17a<6>21d=>m50;&17`<6;<1e>>j51698k45e290/>>k51278j75c28207b?7c<i6;00;6)<h5;m0:m65`12:94?"5;l0:?85a22f95g=54?:%00a?74=2d9?i4>e:9l54b=83.9?h4>349m66b=9o10e9k50;&17`<3l2d9?i4?;:k7g?6=,;9n69j4n31g>4=h5;m0976g;a;29 75b2=n0b?=k:298m01=83.9?h4;d:l17a<332c>:7>5$31f>1bo2<3:1(?=j:5f8j75c2>10e8=50;&17`<3l2d9?i47;:k66?6=,;9n69j4n31g><=h5;m0j76g:0;29 75b2=n0b?=k:c98m1`=83.9?h4;d:l17a5$31f>1bh6`=3e83?>o2k3:1(?=j:4f8j75c2810e8l50;&17`<2l2d9?i4=;:k6e?6=,;9n68j4n31g>6=h5;m0?76g96;29 75b25$31f>0bh6`=3e8;?>o1:3:1(?=j:4f8j75c2010e;?50;&17`<2l2d9?i4n;:k54?6=,;9n68j4n31g>g=h5;m0h76g:8;29 75b25$31f>f>od<3:1(?=j:b:8j75c2:10en=50;&17`0=h5;m0=76gl0;29 75b2j20b?=k:698mg`=83.9?h4l8:l17a5$31f>f>oek3:1(?=j:b:8j75c2k10eoo50;&17`a=h5;m0n76gm7;29 75b2j20b?=k:g98mg0=83.9?h4l8:l17a<6821bn84?:%00a?e?3g88h7?>;:ka0?6=,;9n6n64n31g>44<3`h86=4+22g9g==i::n1=>54ic094?"5;l0h46`=3e820>=nj80;6)<76gk0;29 75b2j20b?=k:048?lea290/>>k5c99m66b=9>10enk50;&17`8:9jga<72-88i7m7;o00`?7>32cho7>5$31f>f>5<#::o1o55a22f95g=h5;m0:o65fc783>!44m3i37c<oej3:1(?=j:b:8j75c28o07dl?:18'66c=k11e>>j51g98k402290/>>k51768j75c2910c<8<:18'66c=9?>0b?=k:098k405290/>>k51768j75c2;10c<8>:18'66c=9?>0b?=k:298m47d290/>>k510`8j75c2910e290/>>k510`8j75c2;10e>k517;8j75c2910c<87:18'66c=9?30b?=k:098k400290/>>k517;8j75c2;10c<89:18'66c=9?30b?=k:298k43?290/>>k51458j75c2910c<;9:18'66c=9<=0b?=k:098k433290/>>k51458j75c2;10c<;<:18'66c=9<=0b?=k:298k435290/>>k51458j75c2=10c<;>:18'66c=9<=0b?=k:498k437290/>>k51458j75c2?10c<:i:18'66c=9<=0b?=k:698k42b290/>>k51458j75c2110c<:k:18'66c=9<=0b?=k:898k42d290/>>k51458j75c2h10c<:m:18'66c=9<=0b?=k:c98k42>290/>>k51458j75c2j10c<:7:18'66c=9<=0b?=k:e98k420290/>>k51458j75c2l10c<:9:18'66c=9<=0b?=k:g98k422290/>>k51458j75c28:07b?;4;29 75b28?<7c<i6<:0;6)<h5;m0:>65`15094?"5;l0:9:5a22f956=:6=4+22g95016:9l50c=83.9?h4>569m66b=9>10c<;k:18'66c=9<=0b?=k:0:8?j72k3:1(?=j:074?k44l3;276a>5c83>!44m3;>;6`=3e82e>=h95<#::o1=894n31g>4e<3f;>97>5$31f>4303g88h7?k;:m20d<72-88i7?:7:l17a<6m21d=>h50;&17`<6=>1e>>j51g98m016290/>>k55628j75c2910e88i:18'66c==>:0b?=k:098m00b290/>>k55628j75c2;10e88k:18'66c==>:0b?=k:298md>=83.9?h4n7:l17a<732cj:7>5$31f>d1of;3:1(?=j:`58j75c2:10el<50;&17`0=h5;m0=76g6f;29 75b2h=0b?=k:698m5$31f>d1o>j3:1(?=j:`58j75c2k10e4750;&17`a=h5;m0n76g66;29 75b2h=0b?=k:g98m<3=83.9?h4n7:l17a<6821b594?:%00a?g03g88h7?>;:k:7?6=,;9n6l94n31g>44<3`396=4+22g9e2=i::n1=>54i8394?"5;l0j;6`=3e820>=n190;6)<76gnf;29 75b2h=0b?=k:048?lgb290/>>k5a69m66b=9>10elj50;&17`8:9jef<72-88i7o8;o00`?7>32cjn7>5$31f>d15<#::o1m:5a22f95g=h5;m0:o65fa483>!44m3k<7c<o>i3:1(?=j:`58j75c28o07d6i:18'66c=i>1e>>j51g98yg07<3:1nn4?:1y'63b=:=>0D898;I751>\1m3ip=<4>2;07>7>=:<0957<9:0g95d<6n38<6<75}%00=?3ak2d3n774n9a9=>h6;l0;7c?90;28 4ga28h:7)?m0;05g>"6k:0>7)?l4;78 4e22<1/=n855:&2g2<23-;h47;4$0a:>0=#9jk196*>cb86?!7dl3?0("6l=0>7)?k5;78 4b12<1/=i955:&2`=<23-;o57;4$0fb>0=#9mh196*>db86?!7cl3?0("6m=0>7)?j5;78 4c12<1/=h955:&2a=<23-;n57;4$0gb>0=#9lh196*>eb86?!7bl3?0("6n=0>7)?i5;78 4`12<1/=k955:&2b=<23-;m57;4$0db>0=#9oh196*>fb86?!7al3?0("58=0>7)=955:&14=<23-8;57;4$32b>0=#:9h196*=0b87?!47l3>0(?>j:314?!42l38=n6*=5d844>"5=o0<<6*=6585=>"5><09::5+27:90>"5>00?7);83;746>"2?=0>;?5f24394?=n?00;66g>ad83>>o5=h0;66g8e;29?l42<3:17d<:7;29?l7fl3:17d?>7;29 75b28;=7c<4;29 75b28;=7c<7c<7c<7c<7c<7c<7c<7c<3:1(?=j:016?k44l3n07b?=5;29 75b289>7c<7c<i6:;0;6)<h5;m0:=65`13394?"5;l0:?85a22f957=5:9l56b=83.9?h4>349m66b=9?10c<=l:18'66c=9:?0b?=k:058?j74j3:1(?=j:016?k44l3;376a>3`83>!44m3;896`=3e82=>=h9:31<7*=3d8270=i::n1=l54o01;>5<#::o1=>;4n31g>4d<3f;8;7>5$31f>4523g88h7?l;:m276<72-88i7?<5:l17a<6l21d=?650;&17`<6;<1e>>j51d98k47c290/>>k51278j75c28l07d:j:18'66c=>j50:9j0f<72-88i7:k;o00`?7<3`>i6=4+22g90a=i::n1>65f4`83>!44m3>o7c<>k54e9m66b=<21b9;4?:%00a?2c3g88h7;4;h76>5<#::o18i5a22f92>=n==0;6)<>j58:9j17<72-88i7:k;o00`??<3`?:6=4+22g90a=i::n1m65f5183>!44m3>o7c<>k54e9m66b=k21b854?:%00a?2c3g88h7j4;h7f>5<#::o19i5a22f94>=n=j0;6)<>j52:9j1d<72-88i7;k;o00`?5<3`<<6=4+22g91a=i::n1865f6783>!44m3?o7c<>k55e9m66b=>21b:94?:%00a?3c3g88h794;h40>5<#::o19i5a22f9<>=n>;0;6)<:18'66c==m1e>>j5a:9j25<72-88i7;k;o00`?d<3`?m6=4+22g91a=i::n1o65f5983>!44m3?o7c<290/>>k5c99m66b=821bo:4?:%00a?e?3g88h7?4;ha6>5<#::o1o55a22f96>=nk=0;6)<>j54:9jg7<72-88i7m7;o00`?3<3`i:6=4+22g9g==i::n1:65fc183>!44m3i37c<>k5c99m66b=021bnh4?:%00a?e?3g88h774;h`g>5<#::o1o55a22f9e>=njj0;6)<>j5c:9jf<<72-88i7m7;o00`?b<3`h36=4+22g9g==i::n1i65fb683>!44m3i37c<>k5c99m66b=9910eo;50;&17`1:9jf1<72-88i7m7;o00`?7532ci?7>5$31f>f>5<#::o1o55a22f951=h5;m0:965fd183>!44m3i37c<odn3:1(?=j:b:8j75c28=07dmj:18'66c=k11e>>j51998mfb=83.9?h4l8:l17a<6121bon4?:%00a?e?3g88h7?n;:k`f?6=,;9n6n64n31g>4d<3`ij6=4+22g9g==i::n1=n54ib494?"5;l0h46`=3e82`>=njk0;6)<a;29 75b28;i7c<8;29 75b28;i7c<07b?:1;29 75b28?<7c<4583>!44m3;>;6`=3e825>=h9=91<7*=3d8212=i::n1=?54o061>5<#::o1=894n31g>45<3f;?=7>5$31f>4303g88h7?;;:m205<72-88i7?:7:l17a<6=21d=8h50;&17`<6=>1e>>j51798k43b290/>>k51458j75c28=07b?:d;29 75b28?<7c<i6=j0;6)<h5;m0:565`14`94?"5;l0:9:5a22f95d=d:9l51g=83.9?h4>569m66b=9l10c<=i:18'66c=9<=0b?=k:0d8?l3093:1(?=j:453?k44l3:07d;9f;29 75b2<=;7c<>k5a69m66b=821bm;4?:%00a?g03g88h7?4;hc7>5<#::o1m:5a22f96>=ni:0;6)<1e>>j54:9je4<72-88i7o8;o00`?3<3`k;6=4+22g9e2=i::n1:65f9g83>!44m3k<7c<>k5a69m66b=021b5i4?:%00a?g03g88h774;h;`>5<#::o1m:5a22f9e>=n1k0;6)<1e>>j5c:9j==<72-88i7o8;o00`?b<3`3<6=4+22g9e2=i::n1i65f9783>!44m3k<7c<>k5a69m66b=9910e4:50;&17`1:9j=6<72-88i7o8;o00`?7532c2>7>5$31f>d15<#::o1m:5a22f951=h5;m0:965fag83>!44m3k<7c<ofm3:1(?=j:`58j75c28=07dok:18'66c=i>1e>>j51998mde=83.9?h4n7:l17a<6121bmo4?:%00a?g03g88h7?n;:kbe?6=,;9n6l94n31g>4d<3`k26=4+22g9e2=i::n1=n54i`794?"5;l0j;6`=3e82`>=n1h0;6)<;18:099:526169601510y]13><5?::688l;<435?31i27=<<4:689>257==?201;>=:44`?807:3?=m63903862<=:>9819;64=720>00d34<;?7;9a:?546<2>016:==557:893632<;18=0>:452616913>j6=4:{_6b?80793>n708?2;6f?807;3>n708?4;6f?xu2?3:19vP:7:?544<3k27=9818o5261190g=:>9>18o5rs4794?3|V>:5c893652=k01;><:5c893632=k0q~;;:186[3334<;=7;8;<436?3034<;?7;8;<430?303ty>?7>55z\67>;1880>:63903862>;18:0>:63905862>{t=;0;68uQ539>257==<16:=<5549>255==<16:=:5549~w07=83?pR8?4=722>02<5?:968:4=720>02<5?:?68:4}r73>5<2sW?;708?1;70?807:3?8708?3;70?807<3?87p};f;291~X3n27=<<4:2:?547<2:27=<>4:2:?541<2:2wx854?:4y]0==:>9;19<52610914=:>9919<52616914=z{o:1<7{tm>0;6?uQe69>257=i<1vim50;0xZae<5?::64o4}rf2>5<5sWn:708?1;:e?xuc13:1>vPk9:?547<69:1vi650;0xZa><5?:96lj4}rf4>5<5sWn<708?2;c`?xuc>3:1>vPk6:?547981ml5rse694?4|Vm>01;>=:`;8yvb42909wSj<;<436?g23tyo>7>52z\g6>;18;02m6s|f083>7}Yn816:=<58g9~w`5=838pRh=4=720>4743tyn>7>52z\f6>;18:0jh6s|e083>7}Ym816:==5ab9~w`6=838pRh>4=720>dd4n9:p`a<72;qUhi526119e0=z{mh1<7{tm10;6?uQe99>252=i01vh850;0xZ`0<5?:?6l;4}rg6>5<5sWo>708?4;;b?xub<3:1>vPj4:?5418m50;7xZ73d34<;=7<:a:?547<5=h16:==524c893632;?j7p}:a;291~X2i27=<<4:e:?547<2m27=<>4:e:?541<2m2wx::4?:4y]22=:>9;19n5261091f=:>9919n5261691f=z{?<1<7;t^74893662=:4`893642;:4`8yv02290>wS8:;<435?3f34<;>7;n;<437?3f34<;87;n;|q50?6==rT=863900853>;18;0=;63902853>;18=0=;6s|6283>0}Y>:16:=?5679>254=>?16:==5679>252=>?1v;<50;7xZ34<5?::6;;4=721>33<5?:86;;4=727>33981:?52611927=:>9>1:?5rs4:94?3|V<201;>>:73893652?;01;><:73893632?;0q~96:186[1>34<;=796;<436?1>34<;?796;<430?1>3ty:mi4?:4y]5db<5?::64>ae9>252=9hn0q~9j:186[1b34<;=79j;<436?1b34<;?79j;<430?1b3ty:mh4?:4y]5dc<5?::64>ad9>252=9ho0q~?nb;296~X6ik16:=?51748yv7fi3:1>vP>a`9>257=9vP>a99>257=916:=?514c8yv7f>3:1>vP>a79>257=9<30q~?n2;296~X6i;16:=?51478yv7>?3:1>vP>969>257=9=k0q~?7c;296~X60j16:=?512d8yv7><3:1>vP>959>254=9?<0q~?63;296~X61:16:=<514f8yv7>:3:1>vP>939>254=983:1>vP>919>254=9vP>8d9>254=9vP>ab9>254=9:l0q~?6e;296~X61l16:==51748yv7>l3:1>vP>9e9>255=9j3:1>vP>9c9>255=913:1>vP>989>255=9<30q~?68;296~X61116:==51478yv7>>3:1>vP>979>255=9=k0q~?65;296~X61<16:==512d8yv7f=3:1>vP>a49>252=9vP>a09>252=9n3:1>vP>9g9>252=9:l0q~6k:1821`}:=>21=oo4^9f8Z7063W8?;6P=519]61`n7S<;d:\10f=Y:=h0R?:n;_07=>X5<11U>9;4=722>73334<;=7<:1:\22g=:>9;19=5261390c=:>9;18552613925=:>9;19k5261391==:>9;1m5526139e3=:>9;1m9526139e6=:>9;1m?526139e4=:>9;1m=526139=c=:>9;15h526139=a=:>9;15n526139=g=:>9;154526139===:>9;15:526139=3=:>9;158526139=1=:>9;15>526139=7=:>9;15<526139=5=:>9;1mk526139e`=:>9;1o4526139g2=:>9;1o8526139g1=:>9;1o>526139g7=:>9;1o<526139g5=:>9;1nk526139f`=:>9;1ni526139ff=:>9;1nl526139f<=:>9;1n5526139f2=:>9;1n;526139f0=:>9;1n9526139f6=:>9;1n?526139f4=:>9;1h=526139gc=:>9;1oh526139ga=:>9;1on526139gg=:>9;1ol526139g3=:>9;1no526139f5=:>9;1=<94=722>47234<;=7?>4:?544<69j16:=?510c8936628;2708?1;32<>;1880>;<52613913`<5?::688j;<435?31l2T:;;5Q1938Z4>23W;3:6P>869]5=>e34<;>7;?;<436?2a34<;>7:7;<436?0734<;>7;i;<436?3?34<;>7o7;<436?g134<;>7o;;<436?g434<;>7o=;<436?g634<;>7o?;<436??a34<;>77j;<436??c34<;>77l;<436??e34<;>776;<436???34<;>778;<436??134<;>77:;<436??334<;>77<;<436??534<;>77>;<436??734<;>7oi;<436?gb34<;>7m6;<436?e034<;>7m:;<436?e334<;>7m<;<436?e534<;>7m>;<436?e734<;>7li;<436?db34<;>7lk;<436?dd34<;>7ln;<436?d>34<;>7l7;<436?d034<;>7l9;<436?d234<;>7l;;<436?d434<;>7l=;<436?d634<;>7j?;<436?ea34<;>7mj;<436?ec34<;>7ml;<436?ee34<;>7mn;<436?e134<;>7lm;<436?d734<;>7?>7:?547<69<16:=<51068936528;h708?2;32e>;18;0:=452610954><5?:9689>;<436?31n27=254==?n0R<8l;_35`>X6>l1U=;h4^053?[7092T:;?5Q161893642;??708?3;065>X6?=16:==5519>255=255=>916:==55g9>255==116:==5a99>255=i?16:==5a59>255=i:16:==5a39>255=i816:==5a19>255=1o16:==59d9>255=1m16:==59b9>255=1k16:==5989>255=1116:==5969>255=1?16:==5949>255=1=16:==5929>255=1;16:==5909>255=1916:==5ag9>255=il16:==5c89>255=k>16:==5c49>255=k=16:==5c29>255=k;16:==5c09>255=k916:==5bg9>255=jl16:==5be9>255=jj16:==5b`9>255=j016:==5b99>255=j>16:==5b79>255=j<16:==5b59>255=j:16:==5b39>255=j816:==5d19>255=ko16:==5cd9>255=km16:==5cb9>255=kk16:==5c`9>255=k?16:==5bc9>255=j916:==51058936428;>708?3;320>;18:0:=n52611954g<5?:864:709>255==?l01;><:44f?807;3?=h6P>749]521h0R<9l;_34`>;18=0999526169607<5?:?6ll4=727>de<5?:?6lj4=727>4743W;;18=0?j6390587<>;18=0=<6390586b>;18=0>4639058b<>;18=0j:639058b0>;18=0j?639058b6>;18=0j=639058b4>;18=02j639058:a>;18=02h639058:g>;18=02n639058:=>;18=024639058:3>;18=02:639058:1>;18=028639058:7>;18=02>639058:5>;18=02<639058bb>;18=0ji639058`=>;18=0h;639058`1>;18=0h8639058`7>;18=0h>639058`5>;18=0h<639058ab>;18=0ii639058a`>;18=0io639058ae>;18=0i5639058a<>;18=0i;639058a2>;18=0i9639058a0>;18=0i?639058a6>;18=0i=639058g4>;18=0hj639058`a>;18=0hh639058`g>;18=0hn639058`e>;18=0h:639058af>;18=0i<639058252=:>9>1=<;4=727>47334<;87?>c:?541<69h16:=:510;8936328;3708?4;745>;18=0>:k52616913c<5?:?688k;_34b>X6091U=5<4^0:7?x{e<>i5;10;66sm44f94?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e<>i5;10;66sm44`94?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e<>i5;10;66sm44d94?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e<>?1<7:50;2x 70c2;;h7E;87:J620=#::319km4i6094?=n0l0;66g=6183>>i5;10;66sm46694?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e<>91<7:50;2x 70c2;;h7E;87:J620=#::319km4i6094?=n0l0;66g=6183>>i5;10;66sm46094?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e<>;1<7:50;2x 70c2;;h7E;87:J620=#::319km4i6094?=n0l0;66g=6183>>i5;10;66sm46494?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e;l<1<7:50;2x 70c2;;h7E;87:J620=#::319km4i6094?=n0l0;66g=6183>>i5;10;66sm3d794?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e;l>1<7:50;2x 70c2;;h7E;87:J620=#::319km4i6094?=n0l0;66g=6183>>i5;10;66sm3d194?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e;l81<7:50;2x 70c2;;h7E;87:J620=#::319km4i6094?=n0l0;66g=6183>>i5;10;66sm3d594?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e;on1<7:50;2x 70c2;;h7E;87:J620=#::319km4i6094?=n0l0;66g=6183>>i5;10;66sm3ga94?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e;oh1<7:50;2x 70c2;;h7E;87:J620=#::319km4i6094?=n0l0;66g=6183>>i5;10;66sm3gc94?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e;o31<7:50;2x 70c2;;h7E;87:J620=#::319km4i6094?=n0l0;66g=6183>>i5;10;66sm3gg94?2=83:p(?8k:33`?M30?2B>:85+22;91ce81<75f8d83>>o5>90;66a=3983>>{e;0k1<7=50;2x 70c2<==7E;87:J620=n?;0;66g=1383>>i5;10;66sm38294?5=83:p(?8k:335?M30?2B>:85+1b`97`=n9kn1<75f1cg94?=h::21<75rb2c0>5<4290;w)<9d;742>N2?>1C9;;4i6094?=n:881<75`22:94?=zj:2n6=4;:183!41l38:o6F:769K13381<75f8d83>>o5>90;66a=3983>>{e;031<7=50;2x 70c2;;=7E;87:J620=#9jh1?h5f1cf94?=n9ko1<75`22:94?=zj:k96=4<:183!41l3?<:6F:769K13381<75f20094?=h::21<75rb2:g>5<3290;w)<9d;02g>N2?>1C9;;4i6094?=n0l0;66g=6183>>i5;10;66sm38:94?5=83:p(?8k:335?M30?2B>:85+1b`97`=n9kn1<75f1cg94?=h::21<75rb2c2>5<4290;w)<9d;742>N2?>1C9;;4i6094?=n:881<75`22:94?=zj:2h6=4;:183!41l38:o6F:769K13381<75f8d83>>o5>90;66a=3983>>{e;0=1<7=50;2x 70c2;;=7E;87:J620=#9jh1?h5f1cf94?=n9ko1<75`22:94?=zj:k;6=4<:183!41l3?<:6F:769K13381<75f20094?=h::21<75rb2:a>5<3290;w)<9d;02g>N2?>1C9;;4i6094?=n0l0;66g=6183>>i5;10;66sm38494?5=83:p(?8k:335?M30?2B>:85+1b`97`=n9kn1<75f1cg94?=h::21<75rb2;e>5<4290;w)<9d;742>N2?>1C9;;4i6094?=n:881<75`22:94?=zj:2j6=4;:183!41l38:o6F:769K13381<75f8d83>>o5>90;66a=3983>>{e;0?1<7=50;2x 70c2;;=7E;87:J620=#9jh1?h5f1cf94?=n9ko1<75`22:94?=zj:3n6=4<:183!41l3?<:6F:769K13381<75f20094?=h::21<75rb2::>5<3290;w)<9d;02g>N2?>1C9;;4i6094?=n0l0;66g=6183>>i5;10;66sm38694?5=83:p(?8k:335?M30?2B>:85+1b`97`=n9kn1<75f1cg94?=h::21<75rb2;g>5<4290;w)<9d;742>N2?>1C9;;4i6094?=n:881<75`22:94?=zj:236=4;:183!41l38:o6F:769K13381<75f8d83>>o5>90;66a=3983>>{e;091<7=50;2x 70c2;;=7E;87:J620=#9jh1?h5f1cf94?=n9ko1<75`22:94?=zj:3h6=4<:183!41l3?<:6F:769K13381<75f20094?=h::21<75rb2:4>5<3290;w)<9d;02g>N2?>1C9;;4i6094?=n0l0;66g=6183>>i5;10;66sm38094?5=83:p(?8k:335?M30?2B>:85+1b`97`=n9kn1<75f1cg94?=h::21<75rb2;a>5<4290;w)<9d;742>N2?>1C9;;4i6094?=n:881<75`22:94?=zj:2=6=4;:183!41l38:o6F:769K13381<75f8d83>>o5>90;66a=3983>>{e;0;1<7=50;2x 70c2;;=7E;87:J620=#9jh1?h5f1cf94?=n9ko1<75`22:94?=zj:2>6=4;:183!41l38:o6F:769K13381<75f8d83>>o5>90;66a=3983>>{e;1l1<7=50;2x 70c2;;=7E;87:J620=#9jh1?h5f1cf94?=n9ko1<75`22:94?=zj:i<6=4;:183!41l3;i?6F:769K133<,8ii6>5f6g83>>o?>3:17d6n:188k7252900qo=l6;290?6=8r.9:i4>b29K121<@<<>7)?lb;18m3`=831b4;4?::k;e?6=3f8?>7>5;|`0gc<72=0;6=u+27f95g5<@<=<7E;95:&2gg<43`>{e;jo1<7:50;2x 70c28h87E;87:J620=#9jh1?6g9f;29?l>12900e5o50;9l614=831vn>mk:187>5<7s-8=h7?m3:J632=O=??0(5;h:b>5<96=44}c1`g?6=<3:1=0D88:;%3`f?5>o?i3:17b<;2;29?xd4kk0;694?:1y'63b=9k90D898;I751>"6kk087d8i:188m=0=831b4l4?::m107<722wi?no50;694?6|,;N2><1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb2a:>5<3290;w)<9d;3a7>N2?>1C9;;4$0aa>6=n>o0;66g76;29?l>f2900c?:=:188yg5d03:187>50z&12a<6j:1C9:94H446?!7dj390e;h50;9j<3<722c3m7>5;n076?6=3th8o84?:583>5}#:?n1=o=4H454?M31=2.:oo4<;h4e>5<>i5<;0;66sm45`94?3=83:p(?8k:0`7?M30?2B>:85+1b`97>o1n3:17d9?:188m=0=831b4l4?::m107<722wi88=50;794?6|,;N2><1/=nl53:k5b?6=3`=;6=44i9494?=n0h0;66a=4383>>{e<<81<7;50;2x 70c28h?7E;87:J620=#9jh1?6g9f;29?l172900e5850;9jt$34g>4d33A?<;6F:649'5fd=;2c=j7>5;h53>5<>i5<;0;66sm44294?3=83:p(?8k:0`7?M30?2B>:85+1b`97>o1n3:17d9?:188m=0=831b4l4?::m107<722wi89h50;794?6|,;N2><1/=nl53:k5b?6=3`=;6=44i9494?=n0h0;66a=4383>>{e<=o1<7;50;2x 70c28h?7E;87:J620=#9jh1?6g9f;29?l172900e5850;9jt$34g>4d33A?<;6F:649'5fd=;2c=j7>5;h53>5<>i5<;0;66sm45a94?3=83:p(?8k:0`7?M30?2B>:85+1b`97>o1n3:17d9?:188m=0=831b4l4?::m107<722wi89o50;794?6|,;N2><1/=nl53:k5b?6=3`=;6=44i9494?=n0h0;66a=4383>>{e<=31<7;50;2x 70c28h?7E;87:J620=#9jh1?6g9f;29?l172900e5850;9jt$34g>4d33A?<;6F:649'5fd=;2c=j7>5;h53>5<>i5<;0;66sm42f94?3=83:p(?8k:0`7?M30?2B>:85+1b`97>o1n3:17d9?:188m=0=831b4l4?::m107<722wi8>m50;794?6|,;N2><1/=nl53:k5b?6=3`=;6=44i9494?=n0h0;66a=4383>>{e<:h1<7;50;2x 70c28h?7E;87:J620=#9jh1?6g9f;29?l172900e5850;9jt$34g>4d33A?<;6F:649'5fd=;2c=j7>5;h53>5<>i5<;0;66sm42;94?3=83:p(?8k:0`7?M30?2B>:85+1b`97>o1n3:17d9?:188m=0=831b4l4?::m107<722wi8>650;794?6|,;N2><1/=nl53:k5b?6=3`=;6=44i9494?=n0h0;66a=4383>>{e<:=1<7;50;2x 70c28h?7E;87:J620=#9jh1?6g9f;29?l172900e5850;9jt$34g>4d33A?<;6F:649'5fd=;2c=j7>5;h53>5<>i5<;0;66sm42694?3=83:p(?8k:0`7?M30?2B>:85+1b`97>o1n3:17d9?:188m=0=831b4l4?::m107<722wi?i;50;694?6|,;N2><1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb2f1>5<3290;w)<9d;3a7>N2?>1C9;;4$0aa>6=n>o0;66g76;29?l>f2900c?:=:188yg5ck3:187>50z&12a<6j:1C9:94H446?!7dj390e;h50;9j<3<722c3m7>5;n076?6=3th8h54?:583>5}#:?n1=o;4H454?M31=2.:oo4l;h4e>5<5<3290;w)<9d;3a1>N2?>1C9;;4$0aa>f=n>o0;66g7a;29?l4383:17b<;2;29?xd3l<0;684?:1y'63b=9k>0D898;I751>"6kk087d8i:188m26=831b4;4?::k;e?6=3f8?>7>5;|`7`a<72<0;6=u+27f95g2<@<=<7E;95:&2gg<43`0<729q/>;j51c68L0103A?=96*>cc80?l0a2900e:>50;9j<3<722c3m7>5;n076?6=3th?ho4?:483>5}#:?n1=o:4H454?M31=2.:oo4<;h4e>5<:1<75f8783>>o?i3:17b<;2;29?xd3lh0;684?:1y'63b=9k>0D898;I751>"6kk087d8i:188m26=831b4;4?::k;e?6=3f8?>7>5;|`7`<<72<0;6=u+27f95g2<@<=<7E;95:&2gg<43`0<729q/>;j51c68L0103A?=96*>cc80?l0a2900e:>50;9j<3<722c3m7>5;n076?6=3th?h:4?:483>5}#:?n1=o:4H454?M31=2.:oo4<;h4e>5<:1<75f8783>>o?i3:17b<;2;29?xd3l?0;684?:1y'63b=9k>0D898;I751>"6kk087d8i:188m26=831b4;4?::k;e?6=3f8?>7>5;|`7g6<72<0;6=u+27f95g2<@<=<7E;95:&2gg<43`0<729q/>;j51c68L0103A?=96*>cc80?l0a2900e:>50;9j<3<722c3m7>5;n076?6=3th?ol4?:483>5}#:?n1=o:4H454?M31=2.:oo4<;h4e>5<:1<75f8783>>o?i3:17b<;2;29?xd3k00;684?:1y'63b=9k>0D898;I751>"6kk087d8i:188m26=831b4;4?::k;e?6=3f8?>7>5;|`7g=<72<0;6=u+27f95g2<@<=<7E;95:&2gg<43`0<729q/>;j51c68L0103A?=96*>cc80?l0a2900e:>50;9j<3<722c3m7>5;n076?6=3th?o;4?:483>5}#:?n1=o:4H454?M31=2.:oo4<;h4e>5<:1<75f8783>>o?i3:17b<;2;29?xd3k<0;684?:1y'63b=9k>0D898;I751>"6kk087d8i:188m26=831b4;4?::k;e?6=3f8?>7>5;|`7g1<72<0;6=u+27f95g2<@<=<7E;95:&2gg<43`0<729q/>;j51c68L0103A?=96*>cc80?l0a2900e:>50;9j<3<722c3m7>5;n076?6=3th?o<4?:483>5}#:?n1=o84H454?M31=2.:oo4l;h4e>5<:1<75f8`83>>o5<90;66a=4383>>{et$34g>4d33A?<;6F:649'5fd=;2c=j7>5;h53>5<>i5<;0;66sm4c694?3=83:p(?8k:0`7?M30?2B>:85+1b`97>o1n3:17d9?:188m=0=831b4l4?::m107<722wi8o=50;794?6|,;N2><1/=nl53:k5b?6=3`=;6=44i9494?=n0h0;66a=4383>>{et$34g>4d33A?<;6F:649'5fd=;2c=j7>5;h53>5<>i5<;0;66sm4c294?3=83:p(?8k:0`7?M30?2B>:85+1b`97>o1n3:17d9?:188m=0=831b4l4?::m107<722wi8lh50;794?6|,;N2><1/=nl53:k5b?6=3`=;6=44i9494?=n0h0;66a=4383>>{et$34g>4d13A?<;6F:649'5fd=k2c=j7>5;h53>5<5<3290;w)<9d;3a7>N2?>1C9;;4$0aa>6=n>o0;66g76;29?l>f2900c?:=:188yg52;3:187>50z&12a<6j:1C9:94H446?!7dj390e;h50;9j<3<722c3m7>5;n076?6=3th89?4?:583>5}#:?n1=o=4H454?M31=2.:oo4<;h4e>5<>i5<;0;66sm34394?2=83:p(?8k:0`0?M30?2B>:85+1b`97>o1n3:17d69:188m=g=831d>9<50;9~f637290?6=4?{%05`?7e;2B>;:5G5778 4ee2:1b:k4?::k;2?6=3`2j6=44o361>5<54;294~"5>m0:n>5G5658L0023-;hn7=4i7d94?=n0?0;66g7a;29?j43:3:17pl<4d83>1<729q/>;j51c18L0103A?=96*>cc80?l0a2900e5850;9j1<7>t$34g>4d43A?<;6F:649'5fd=;2c=j7>5;h:5>5<h6=4;:183!41l3;i?6F:769K133<,8ii6>5f6g83>>o?>3:17d6n:188k7252900qo=;a;290?6=8r.9:i4>b29K121<@<<>7)?lb;18m3`=831b4;4?::k;e?6=3f8?>7>5;|`00<<72=0;6=u+27f95g5<@<=<7E;95:&2gg<43`>{e;8;1<7:50;2x 70c28h87E;87:J620=#9jh1?6g9f;29?l>12900e5o50;9l614=831vn>?6:187>5<7s-8=h7?m3:J632=O=??0(5;h:b>5<96=44}c12=0D88:;%3`f?5>o?i3:17b<;2;29?xd49>0;694?:1y'63b=9k90D898;I751>"6kk087d8i:188m=0=831b4l4?::m107<722wi?<850;694?6|,;N2><1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb236>5<3290;w)<9d;3a7>N2?>1C9;;4$0aa>6=n>o0;66g76;29?l>f2900c?:=:188yg56<3:187>50z&12a<6j:1C9:94H446?!7dj390e;h50;9j<3<722c3m7>5;n076?6=3th8=>4?:583>5}#:?n1=o=4H454?M31=2.:oo4<;h4e>5<>i5<;0;66sm30094?2=83:p(?8k:0`0?M30?2B>:85+1b`97>o1n3:17d69:188m=g=831d>9<50;9~f677290?6=4?{%05`?7e;2B>;:5G5778 4ee2:1b:k4?::k;2?6=3`2j6=44o361>5<54;294~"5>m0:n>5G5658L0023-;hn7=4i7d94?=n0?0;66g7a;29?j43:3:17pl<1b83>1<729q/>;j51c18L0103A?=96*>cc80?l0a2900e5850;9j1<7>t$34g>4d43A?<;6F:649'5fd=;2c=j7>5;h:5>5<5f6g83>>o?>3:17d6n:188k7252900qo==2;290?6=8r.9:i4>b29K121<@<<>7)?lb;18m3`=831b4;4?::k;e?6=3f8?>7>5;|`064<72=0;6=u+27f95g5<@<=<7E;95:&2gg<43`>{e;;:1<7:50;2x 70c28h87E;87:J620=#9jh1?6g9f;29?l>12900e5o50;9l614=831vn>?i:187>5<7s-8=h7?m3:J632=O=??0(5;h:b>5<96=44}c12a?6=<3:1=0D88:;%3`f?5>o?i3:17b<;2;29?xd49m0;694?:1y'63b=9k90D898;I751>"6kk087d8i:188m=0=831b4l4?::m107<722wi?N2><1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb23b>5<3290;w)<9d;3a7>N2?>1C9;;4$0aa>6=n>o0;66g76;29?l>f2900c?:=:188yg52>3:187>50z&12a<6j:1C9:94H446?!7dj390e;h50;9j<3<722c3m7>5;n076?6=3th89h4?:583>5}#:?n1=o=4H454?M31=2.:oo4<;h4e>5<>i5<;0;66sm34f94?2=83:p(?8k:0`0?M30?2B>:85+1b`97>o1n3:17d69:188m=g=831d>9<50;9~f63d290?6=4?{%05`?7e;2B>;:5G5778 4ee2:1b:k4?::k;2?6=3`2j6=44o361>5<n7>54;294~"5>m0:n>5G5658L0023-;hn7=4i7d94?=n0?0;66g7a;29?j43:3:17pl<5`83>1<729q/>;j51c18L0103A?=96*>cc80?l0a2900e5850;9j1<7>t$34g>4d43A?<;6F:649'5fd=;2c=j7>5;h:5>5<5f6g83>>o?>3:17d6n:188k7252900qo=:7;290?6=8r.9:i4>b29K121<@<<>7)?lb;18m3`=831b4;4?::k;e?6=3f8?>7>5;|`010<72=0;6=u+27f95g5<@<=<7E;95:&2gg<43`>{e;<>1<7:50;2x 70c28h87E;87:J620=#9jh1?6g9f;29?l>12900e5o50;9l614=831vn?jn:187>5<7s-8=h7?m3:J632=O=??0D;o4$33a>70d3-;hn7=4i7d94?=n0?0;66g7a;29?j43:3:17pl=e383>1<729q/>;j51c18L0103A?=96F9a:&15g<5>j1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb3g2>5<3290;w)<9d;3a7>N2?>1C9;;4H7c8 77e2;7>5;|`1a5<72=0;6=u+27f95g5<@<=<7E;95:J5e>"59k09:n5+1b`97>o1n3:17d69:188m=g=831d>9<50;9~f7ba290?6=4?{%05`?7e;2B>;:5G5778L3g<,;;i6?8l;%3`f?5>o?i3:17b<;2;29?xd5ll0;694?:1y'63b=9k90D898;I751>N1i2.9=o4=6b9'5fd=;2c=j7>5;h:5>5<5;n076?6=3th9hn4?:583>5}#:?n1=o=4H454?M31=2B=m6*=1c812f=#9jh1?6g9f;29?l>12900e5o50;9l614=831vn?jm:187>5<7s-8=h7?m3:J632=O=??0D;o4$33a>70d3-;hn7=4i7d94?=n0?0;66g7a;29?j43:3:17pl=d883>1<729q/>;j51c18L0103A?=96F9a:&15g<5>j1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb3f;>5<3290;w)<9d;3a7>N2?>1C9;;4H7c8 77e2;7>5;|`1e6<72=0;6=u+27f95g5<@<=<7E;95:J5e>"59k09:n5+1b`97>o1n3:17d69:188m=g=831d>9<50;9~f7ge290?6=4?{%05`?7e;2B>;:5G5778L3g<,;;i6?8l;%3`f?5>o?i3:17b<;2;29?xd5ih0;694?:1y'63b=9k90D898;I751>N1i2.9=o4=6b9'5fd=;2c=j7>5;h:5>5<5;n076?6=3th9m54?:583>5}#:?n1=o=4H454?M31=2B=m6*=1c812f=#9jh1?6g9f;29?l>12900e5o50;9l614=831vn?o8:187>5<7s-8=h7?m3:J632=O=??0D;o4$33a>70d3-;hn7=4i7d94?=n0?0;66g7a;29?j43:3:17pl=a783>1<729q/>;j51c18L0103A?=96F9a:&15g<5>j1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb3c6>5<3290;w)<9d;3a7>N2?>1C9;;4H7c8 77e2;7>5;|`1e1<72=0;6=u+27f95g5<@<=<7E;95:J5e>"59k09:n5+1b`97>o1n3:17d69:188m=g=831d>9<50;9~f7g5290?6=4?{%05`?7e;2B>;:5G5778L3g<,;;i6?8l;%3`f?5>o?i3:17b<;2;29?xd5i80;694?:1y'63b=9k90D898;I751>N1i2.9=o4=6b9'5fd=;2c=j7>5;h:5>5<5;n076?6=3th8<>4?:583>5}#:?n1=o=4H454?M31=2B=m6*=1c812f=#9jh1?6g9f;29?l>12900e5o50;9l614=831vn>>=:187>5<7s-8=h7?m3:J632=O=??0D;o4$33a>70d3-;hn7=4i7d94?=n0?0;66g7a;29?j43:3:17pl<0083>1<729q/>;j51c18L0103A?=96F9a:&15g<5>j1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb223>5<3290;w)<9d;3a7>N2?>1C9;;4H7c8 77e2;7>5;|`1bc<72=0;6=u+27f95g5<@<=<7E;95:J5e>"59k09:n5+1b`97>o1n3:17d69:188m=g=831d>9<50;9~f7`b290?6=4?{%05`?7e;2B>;:5G5778L3g<,;;i6?8l;%3`f?5>o?i3:17b<;2;29?xd5nm0;694?:1y'63b=9k90D898;I751>N1i2.9=o4=6b9'5fd=;2c=j7>5;h:5>5<5;n076?6=3th9jl4?:583>5}#:?n1=o=4H454?M31=2B=m6*=1c812f=#9jh1?6g9f;29?l>12900e5o50;9l614=831vn?h6:187>5<7s-8=h7?m3:J632=O=??0D;o4$33a>70d3-;hn7=4i7d94?=n0?0;66g7a;29?j43:3:17pl=b883>1<729q/>;j51c18L0103A?=96F9a:&15g<5>j1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb3a2>5<3290;w)<9d;3a7>N2?>1C9;;4H7c8 77e2;7>5;|`1g5<72=0;6=u+27f95g5<@<=<7E;95:J5e>"59k09:n5+1b`97>o1n3:17d69:188m=g=831d>9<50;9~f7da290?6=4?{%05`?7e;2B>;:5G5778L3g<,;;i6?8l;%3`f?5>o?i3:17b<;2;29?xd5jl0;694?:1y'63b=9k90D898;I751>N1i2.9=o4=6b9'5fd=;2c=j7>5;h:5>5<5;n076?6=3th9nn4?:583>5}#:?n1=o=4H454?M31=2B=m6*=1c812f=#9jh1?6g9f;29?l>12900e5o50;9l614=831vn?lm:187>5<7s-8=h7?m3:J632=O=??0D;o4$33a>70d3-;hn7=4i7d94?=n0?0;66g7a;29?j43:3:17pl=b`83>1<729q/>;j51c18L0103A?=96F9a:&15g<5>j1/=nl53:k5b?6=3`2=6=44i9c94?=h:=81<75rb3`;>5<3290;w)<9d;3a7>N2?>1C9;;4H7c8 77e2;7>5;|`1f2<72=0;6=u+27f95g5<@<=<7E;95:J5e>"59k09:n5+1b`97>o1n3:17d69:188m=g=831d>9<50;9~f1>?29086=4?{%05`?46>2B>;:5G5778 4ee28=0(?=i:4:a?l7el3:17d?me;29?j4403:17pl;5583>3<729q/>;j520;8L0103A?=96*>cc81f>"5;o0>4o5f1cf94?=n9ko1<75f1cd94?=n9j:1<75f1b394?=h::21<75rb46:>5<4290;w)<9d;022>N2?>1C9;;4$0aa>41<,;9m6879;h3a`?6=3`;ii7>5;n008l4?:283>5}#:?n1><84H454?M31=2.:oo4>7:&17c<21<1b=oj50;9j5gc=831d>>650;9~f03b29086=4?{%05`?46>2B>;:5G5778 4ee28=0(?=i:4;5?l7el3:17d?me;29?j4403:17pl:6583>6<729q/>;j52048L0103A?=96*>cc823>"5;o0>585f1cf94?=n9ko1<75`22:94?=zj=<26=4::183!41l38:46F:769K133<,8ii6>h4i0`g>5<5<5<=;7>55;294~"5>m09=55G5658L0023-;hn7=i;h3a`?6=3`;ii7>5;h3ab?6=3`;h<7>5;n005}#:?n1><64H454?M31=2.:oo4N2><1/=nl53g9j5gb=831b=ok50;9j5g`=831b=n>50;9l66>=831vn98>:186>5<7s-8=h7<>8:J632=O=??0(7)?lb;1f?l7el3:17d?me;29?j4403:17pl;8183>0<729q/>;j520:8L0103A?=96*>cc80b>o6jm0;66g>bd83>>o6jo0;66g>c183>>i5;10;66sm46g94?3=83:p(?8k:33;?M30?2B>:85+1b`97c=n9kn1<75f1cg94?=n9kl1<75f1b294?=h::21<75rb55`>5<2290;w)<9d;02<>N2?>1C9;;4$0aa>6`5<5<=0D88:;%3`f?5a3`;ih7>5;h3aa?6=3`;ij7>5;h3`4?6=3f8847>5;|`7<7<72:0;6=u+27f9640<@<=<7E;95:&2gg<4m2c:ni4?::k2f`<722e9?54?::a7c7=83?1<7>t$34g>77?3A?<;6F:649'5fd=;o1b=oj50;9j5gc=831b=oh50;9j5f6=831d>>650;9~f6ca290>6=4?{%05`?4602B>;:5G5778 4ee2:l0e50z&12a<5911C9:94H446?!7dj39m7d?md;29?l7em3:17d?mf;29?l7d83:17b<<8;29?xd4mk0;684?:1y'63b=:820D898;I751>"6kk08j6g>be83>>o6jl0;66g>bg83>>o6k90;66a=3983>>{e;l31<7;50;2x 70c2;;37E;87:J620=#9jh1?k5f1cf94?=n9ko1<75f1cd94?=n9j:1<75`22:94?=zj:l86=4<:183!41l38::6F:769K133<,8ii6>k4i0`g>5<5<;47>55;294~"5>m09=55G5658L0023-;hn7=i;h3a`?6=3`;ii7>5;h3ab?6=3`;h<7>5;n005}#:?n1><64H454?M31=2.:oo4N2><1/=nl53g9j5gb=831b=ok50;9j5g`=831b=n>50;9l66>=831vn9>=:186>5<7s-8=h7<>8:J632=O=??0(7)?lb;1f?l7el3:17d?me;29?j4403:17pl2<729q/>;j520c8L0103A?=96*>cc80e>o6jm0;66g>bd83>>o6jo0;66g>c183>>o6k80;66g>c383>>i5;10;66sm3`794?3=83:p(?8k:33;?M30?2B>:85+1b`970=n9kn1<75f1cg94?=n9kl1<75f1b294?=h::21<75rb2ce>5<0290;w)<9d;02e>N2?>1C9;;4$0aa>d=n9kn1<75f1cg94?=n9kl1<75f1b294?=n9j;1<75f1b094?=h::21<75rb2:0>5<2290;w)<9d;02<>N2?>1C9;;4$0aa>==#::l195?4i0`g>5<5<5<56;294~"5>m09=45G5658L0023-;hn774$31e>0>63`;ih7>5;h3aa?6=3`;ij7>5;h3`4?6=3`;h=7>5;n005}#:?n1><94H454?M31=2.:oo48;%00b?3?i2c:ni4?::k2f`<722c:nk4?::m17=<722wi8N2><1/=nl5479j5gb=831b=ok50;9j5g`=831b=n>50;9j5f7=831b=n<50;9l66>=831vn9?6:185>5<7s-8=h7<>9:J632=O=??0(50z&12a<59>1C9:94H446?!7dj3o6jm0;66g>bd83>>o6jo0;66a=3983>>{e;mk1<7;50;2x 70c2;;37E;87:J620=#9jh1?i5+22d91=25<5<=0D88:;%3`f?4f3-88j7;6c:k2fa<722c:nh4?::k2fc<722c:o=4?::m17=<722wi?i:50;794?6|,;N2><1/=nl52b9'66`==0i0e3:187>50z&12a<59>1C9:94H446?!7dj3<37)<o6jm0;66g>bd83>>o6jo0;66a=3983>>{e<081<7950;2x 70c2;;j7E;87:J620=#9jh18;5f1cf94?=n9ko1<75f1cd94?=n9j:1<75f1b394?=n9j81<75`22:94?=zj=3:6=49:183!41l38:56F:769K133<,8ii69;4i0`g>5<5<5<=0D88:;%3`f?4c3-88j7;77:k2fa<722c:nh4?::m17=<722wi?:=50;694?6|,;N2><1/=nl5419'66`==1=0e7)?lb;0g?!44n3?3:6g>be83>>o6jl0;66a=3983>>{e;;21<7:50;2x 70c2;;<7E;87:J620=#9jh18=5+22d91=05<5<53;294~"5>m09=;5G5658L0023-;hn75;n005}#:?n1><84H454?M31=2.:oo4=d:&17c<2181b=oj50;9j5gc=831d>>650;9~f7>729086=4?{%05`?46>2B>;:5G5778 4ee2;n0(?=i:4;2?l7el3:17d?me;29?j4403:17pl=7d83>6<729q/>;j52048L0103A?=96*>cc81`>"5;o0>5>5f1cf94?=n9ko1<75`22:94?=zj;=o6=4<:183!41l38::6F:769K133<,8ii6?j4$31e>0?43`;ih7>5;h3aa?6=3f8847>5;|`13d<72:0;6=u+27f9640<@<=<7E;95:&2gg<5l2c:ni4?::k2f`<722e9?54?::a62e=8391<7>t$34g>7713A?<;6F:649'5fd=:m1/>>h55808m4dc2900e7)?lb;0g?!44n3?2>6g>be83>>o6jl0;66a=3983>>{e:>=1<7=50;2x 70c2;;=7E;87:J620=#9jh1>i5f1cf94?=n9ko1<75`22:94?=zj;=?6=4<:183!41l38::6F:769K133<,8ii6?j4i0`g>5<5<53;294~"5>m09=;5G5658L0023-;hn782c:ni4?::k2f`<722e9?54?::a623=8391<7>t$34g>7713A?<;6F:649'5fd=:m1/>>h55828m4dc2900e7)?lb;0g?!44n3?3j6g>be83>>o6jl0;66a=3983>>{e:>81<7=50;2x 70c2;;=7E;87:J620=#9jh1>i5+22d91=`5<=0D88:;%3`f?4c3-88j7;7d:k2fa<722c:nh4?::m17=<722wi>:?50;194?6|,;N2><1/=nl52e9'66`==1o0e50z&12a<59?1C9:94H446?!7dj38o7)<o6jm0;66g>bd83>>i5;10;66sm27g94?5=83:p(?8k:335?M30?2B>:85+1b`96a=#::l195j4i0`g>5<5<57;294~"5>m09=l5G5658L0023-;hn7=>;h3a`?6=3`;ii7>5;h3ab?6=3`;h<7>5;h3`5?6=3`;h>7>5;n0044?:483>5}#:?n1><64H454?M31=2.:oo4=f:&17c<21h1b=oj50;9j5gc=831b=oh50;9j5f6=831d>>650;9~f64e290=6=4?{%05`?4612B>;:5G5778 4ee2=;0(?=i:4;b?l7el3:17d?me;29?l7en3:17d?l0;29?l7d93:17b<<8;29?xd4??0;6;4?:1y'63b=:830D898;I751>"6kk0?=6*=3g86=g=n9kn1<75f1cg94?=n9kl1<75f1b294?=n9j;1<75`22:94?=zj:=?6=4::183!41l38:46F:769K133<,8ii6?h4$31e>0?e3`;ih7>5;h3aa?6=3`;ij7>5;h3`4?6=3f8847>5;|`01c<72>0;6=u+27f964g<@<=<7E;95:&2gg<492c:ni4?::k2f`<722c:nk4?::k2g5<722c:o<4?::k2g7<722e9?54?::a7d1=83?1<7>t$34g>77?3A?<;6F:649'5fd=;11b=oj50;9j5gc=831b=oh50;9j5f6=831d>>650;9~f6g3290<6=4?{%05`?46i2B>;:5G5778 4ee2:k0e:188m4e52900c?=7:188yg5fi3:197>50z&12a<5911C9:94H446?!7dj3937d?md;29?l7em3:17d?mf;29?l7d83:17b<<8;29?xd4i00;6:4?:1y'63b=:8k0D898;I751>"6kk0=7d?md;29?l7em3:17d?mf;29?l7d83:17d?l1;29?l7d:3:17b<<8;29?xd4j>0;6>4?:1y'63b=:8<0D898;I751>"6kk08:6*=3g865<0290;w)<9d;02e>N2?>1C9;;4$0aa>6e5<5<5<=0D88:;%3`f?563`;ih7>5;h3aa?6=3`;ij7>5;h3`4?6=3`;h=7>5;h3`6?6=3f8847>5;|`02a<72>0;6=u+27f964g<@<=<7E;95:&2gg<492c:ni4?::k2f`<722c:nk4?::k2g5<722c:o<4?::k2g7<722e9?54?::a76e=83=1<7>t$34g>77f3A?<;6F:649'5fd=;81b=oj50;9j5gc=831b=oh50;9j5f6=831b=n?50;9j5f4=831d>>650;9~f65e290<6=4?{%05`?46i2B>;:5G5778 4ee2:;0e:188m4e52900c?=7:188yg5483:1?7>50z&12a<59?1C9:94H446?!7dj38o7)<o6jm0;66g>bd83>>i5;10;66sm33d94?1=83:p(?8k:33b?M30?2B>:85+1b`974=n9kn1<75f1cg94?=n9kl1<75f1b294?=n9j;1<75f1b094?=h::21<75rb210>5<3290;w)<9d;023>N2?>1C9;;4$0aa>7c<,;9m6866;h3a`?6=3`;ii7>5;h3ab?6=3f8847>5;|`077<72>0;6=u+27f964g<@<=<7E;95:&2gg<3:2c:ni4?::k2f`<722c:nk4?::k2g5<722c:o<4?::k2g7<722e9?54?::a760=83?1<7>t$34g>77?3A?<;6F:649'5fd=:o1/>>h558;8m4dc2900e7)?lb;12?l7el3:17d?me;29?l7en3:17d?l0;29?l7d93:17d?l2;29?j4403:17pl<3883>3<729q/>;j520;8L0103A?=96*>cc804>"5;o0>545f1cf94?=n9ko1<75f1cd94?=n9j:1<75f1b394?=h::21<75rb21;>5<0290;w)<9d;02e>N2?>1C9;;4$0aa>145<5<5<=0D88:;%3`f?4b3-88j7;78:k2fa<722c:nh4?::k2fc<722e9?54?::a732=83=1<7>t$34g>77f3A?<;6F:649'5fd=<;1b=oj50;9j5gc=831b=oh50;9j5f6=831b=n?50;9j5f4=831d>>650;9~f60529086=4?{%05`?46>2B>;:5G5778 4ee2;n0(?=i:4:;?l7el3:17d?me;29?j4403:17pl<6083>2<729q/>;j520c8L0103A?=96*>cc805>o6jm0;66g>bd83>>o6jo0;66g>c183>>o6k80;66g>c383>>i5;10;66sm37:94?3=83:p(?8k:33;?M30?2B>:85+1b`96c=#::l19464i0`g>5<5<5<57;294~"5>m09=l5G5658L0023-;hn7=>;h3a`?6=3`;ii7>5;h3ab?6=3`;h<7>5;h3`5?6=3`;h>7>5;n005}#:?n1><74H454?M31=2.:oo4<0:&17c<2111b=oj50;9j5gc=831b=oh50;9j5f6=831b=n?50;9l66>=831vn>8n:184>5<7s-8=h7<>a:J632=O=??0(7)?lb;`8m4dc2900e7)?lb;00?l7el3:17d?me;29?l7en3:17d?l0;29?j4403:17pl;0e83>2<729q/>;j520c8L0103A?=96*>cc82f==n9kn1<75f1cg94?=n9kl1<75f1b294?=n9j;1<75f1b094?=h::21<75rb536>5<3290;w)<9d;023>N2?>1C9;;4$0aa>3e<,;9m687k;h3a`?6=3`;ii7>5;h3ab?6=3f8847>5;|`7>650;9~f17d290?6=4?{%05`?46?2B>;:5G5778 4ee2:>0(?=i:4:1?l7el3:17d?me;29?l7en3:17b<<8;29?xd39o0;6:4?:1y'63b=:8k0D898;I751>"6kk0?;6g>be83>>o6jl0;66g>bg83>>o6k90;66g>c083>>o6k;0;66a=3983>>{e<8n1<7;50;2x 70c2;;37E;87:J620=#9jh1?85+22d91=45<5<=0D88:;%3`f?203`;ih7>5;h3aa?6=3`;ij7>5;h3`4?6=3`;h=7>5;h3`6?6=3f8847>5;|`75`<72:0;6=u+27f9640<@<=<7E;95:&2gg<4;2c:ni4?::k2f`<722e9?54?::a04d=83=1<7>t$34g>77f3A?<;6F:649'5fd=<>1b=oj50;9j5gc=831b=oh50;9j5f6=831b=n?50;9j5f4=831d>>650;9~f1?3290?6=4?{%05`?46?2B>;:5G5778 4ee2:>0(?=i:4;f?l7el3:17d?me;29?l7en3:17b<<8;29?xd31>0;6:4?:1y'63b=:8k0D898;I751>"6kk0?;6g>be83>>o6jl0;66g>bg83>>o6k90;66g>c083>>o6k;0;66a=3983>>{e<0?1<7;50;2x 70c2;;37E;87:J620=#9jh1?85+22d915<5<=0D88:;%3`f?203`;ih7>5;h3aa?6=3`;ij7>5;h3`4?6=3`;h=7>5;h3`6?6=3f8847>5;|`7=3<72:0;6=u+27f9640<@<=<7E;95:&2gg<4;2c:ni4?::k2f`<722e9?54?::a0<5=83=1<7>t$34g>77f3A?<;6F:649'5fd=<>1b=oj50;9j5gc=831b=oh50;9j5f6=831b=n?50;9j5f4=831d>>650;9~f6d>290<6=4?{%05`?46i2B>;:5G5778 4ee2:30e:188m4e52900c?=7:188yg5e03:1;7>50z&12a<59h1C9:94H446?!7dj3k0e:188m4e52900c?=7:188yg5e93:1;7>50z&12a<59h1C9:94H446?!7dj3;37d?md;29?l7em3:17d?mf;29?l7d83:17d?l1;29?l7d:3:17b<<8;29?xd4i?0;694?:1y'63b=:8=0D898;I751>"6kk08;6g>be83>>o6jl0;66g>bg83>>i5;10;66sm3c194?1=83:p(?8k:33b?M30?2B>:85+1b`9e>o6jm0;66g>bd83>>o6jo0;66g>c183>>o6k80;66g>c383>>i5;10;66sm26:94?5=83:p(?8k:335?M30?2B>:85+1b`96a=#::l194:4i0`g>5<5<56;294~"5>m09=45G5658L0023-;hn7?m9:&17c<20<1b=oj50;9j5gc=831b=oh50;9j5f6=831b=n?50;9l66>=831vn9?7:184>5<7s-8=h7<>a:J632=O=??0(7;292?6=8r.9:i4=189K121<@<<>7)?lb;66?!44n3?3o6g>be83>>o6jl0;66g>bg83>>o6k90;66g>c083>>i5;10;66sm40194?2=83:p(?8k:334?M30?2B>:85+1b`906=#::l194j4i0`g>5<5<=0D88:;%3`f?233-88j7;7c:k2fa<722c:nh4?::k2fc<722c:o=4?::m17=<722wi8<<50;194?6|,;N2><1/=nl53d9j5gb=831b=ok50;9l66>=831vn97?:184>5<7s-8=h7<>a:J632=O=??0(7)?lb;66?!44n3?2;6g>be83>>o6jl0;66g>bg83>>o6k90;66g>c083>>i5;10;66sm49`94?2=83:p(?8k:334?M30?2B>:85+1b`906=#::l195=4i0`g>5<5<=0D88:;%3`f?233-88j7;67:k2fa<722c:nh4?::k2fc<722c:o=4?::m17=<722wi85o50;194?6|,;N2><1/=nl53d9j5gb=831b=ok50;9l66>=831vn?96:180>5<7s-8=h7<>6:J632=O=??0(o6jj0;66a=3983>>{e==21<7<50;2x 70c2;;:7E;87:J620=n9ki1<75`22:94?=zj=o:6=4=:183!41l38:=6F:769K1335<57z\55<=:==i1>9>4=46g>72734??i7<;0:?61c<5<91698752528902e21<0q~<>f;29<~;2?009?l525509605<5<>96?;9;<66e?1534><=79=;<1f6?15349m579=;<1;1?153ty9><4?:54x901?28hj70;;c;:b?832?32j70;:8;:b?832:32j70;:3;:b?832<32j70;;2;06=>;2<;0>;<52550913`<5<>9688j;<776?31l27>8?4>0c9>114=993018:=:024?833:3;;:63:438240=:==81==:4=461>46434??>7??2:?607<6881699<5112890252ol018:=:gg890252oi018:=:g`890252ok018:=:g;890252o2018:=:g5890252o<018:=:g7890252o>018:=:g18902528;970;;2;325>;2<;0:==52550955`<5<>96<>j;<776?77l27>8?4>0b9>114=992018:=:gf890252o8018:=:333?833:38;j63;5g8;a>;3=h03i63;5c8;a>;3=j03i63;5e8;a>;3=l03i63;778;a>;3?803i63;738;a>;3?:03i63;758;a>;3?<03i63;4m;03i63;4m=03i63;4m?03i63;4n003i63;4nk03i63;4nm03i6s|31694?5|5::m6?:=;<655?7en27?;54>bg9~w6612908w0=>0;076>;3>80:ni5246:95gb53z?057<5<;168;=51cd8911f28hm7p}<0983>6}:;891>9<4=540>4dc34>?;:361?821=3;ij63;7b82fc=z{::j6=4<{<121?43:27?:84>be9>02e=9kn0q~=?b;297~;49?098?5247595g`<5==n6{t;9n1<7=t=23;>72534>=57?mf:?7<5<6jo1v>>j:180856138?>63;6882fa=:<1:1=oj4}r131?6=;r78=<4=439>03d=9kn0196=:0`g?xu4;l0;68u239d95gb<5:2>65k4=26:>725349n57?l0:?745<6jm1v>:?:18685>93;ih63<878;a>;4021o01>:l:361?85bj3;h<63;0382fa=z{:>96=4:{<1:7?7el2784547e:?00a<5<;16?hl51cg8916528hn7p}<4283>0}:;0>1=oj4=2::>=c<5:>n6?:=;<1f`?7d827?<94>c19~w623290>w0=65;3a`>;40h03i63<4g8107=:;ln1=ok4=527>4db3ty8884?:4y>7<0=9kn01>6m:9g896372;>970=jf;3`4>;38?0:o=5rs265>5<2s492;7?md:?07``=9ko019>9:0`f?xu4<>0;68u238:95gb<5:2o65k4=271>725349m=7?l0:?74=<6k91v>:7:18685>13;ih63<8d8;a>;4=:098?523g395gc<5=:3651cf8962e2;>970=i3;3aa>;38h0:nh5rs464>5<58?4:6b9>114==?k018:=:44:?833:3?=463:4382ea=:1;=524b7935=:>64}r6;3?6=:r7?4:4=439]1c>hh7>54z?607<2827?h;4=439>62g=9kn01?96:0`f?xu3kl0;69u2550914=:9<4=35b>4db348p18:=:40891b?2;>970<8c;3a`>;5?k0:nh5rs5f3>5<3s4??>7;<;<6g=?43:279;i4>be9>62e=9ko0q~:k1;290~;2<;0>863;d`8107=::>o1=oj4=35g>4db3ty?h?4?:5y>114==<168il52508971a28ho70<8e;3aa>{t00<5=nh6?:=;<04b?7em2794=4>be9~w1b3290?w0;;2;74?82cl38?>63=8082f`=::1:1=ok4}r6`g?6=8?4;a:?7`0<5<;16?8858`9>6=7=9kn0q~;;5;2953}:<:>1;=52424935=:<:=1;=5242:935=:<:31;=5242c935=:<:h1;=5242a935=:<:n1;=52427935=:<=31;=5245c935=:<=i1;=5245f935=:<=o1;=5245d935=:<<:1;=52443935=:<<81;=52441935=:<=h1;=523e2966>520y>154=?9169==5719>15c=?9169<75719>14e=?916914c=?9169176=?9169??5719>152=?9169=;5719>150=?9169=95719>15>=?9169=75719>15g=?9169=l5719>15e=?9169=j5719>15`=?9169<>5719>147=?9169<<5719>145=?9169<:5719>143=?9169<85719>141=?9169<65719>14g=?91697a7=::20q~:?f;291~;38o098?523e295gb<5:n?6894>be9~w6b?2909wS;i2:?0`=<5<;1v>ll:181[07?278o84=439~w6dc2909wS8?a:?0g=<5<;1v>lj:181[07j278o44=439~w6da2909wS8?c:?0gd<5<;1v>m?:181[07l278oo4=439~w6e62909wS8?e:?0gf<5<;1v>m=:181[07n278oi4=439~w6e42909wS8>0:?0g`<5<;1v>m;:181[069278ok4=439~w6df2909wS8>2:?0g3<5<;1v>lm:181[071278o:4=439~w15b290ow0;;2;7;?85?n3;ii63;488107=:;l31=oh4=34f>4dc34>:97?md:?75=<6jl168<951cg8917428hn70:>6;3aa>;39;0:nh5255:95ge<5=:;67<7=9ko019:n:361?85b13;ih63=6g82fa=::?o1=ok4}r675?6=>r7>8?490:?0=7<6jl1689m5250896ce28hm70<9f;3aa>;5?90:ni5rs561>5<1s4??>78>;<1:7?7em27?8i4=439>7`d=9kn01?9>:0`g?84083;ii6s|45194?0|5<>96;<4=2;7>4db34>?i7<;2:?0aa<6jo16>:<51cf8971628hn7p};4583>3}:==81:>5238795gc<5=>m6?:=;<1f`?7el279;>4>be9>624=9ko0q~:;5;292~;2<;0=863<9782f`=:<<:1>9<4=2ge>4da348<87?md:?136<6jl1v9:9:185833:3<>70=67;3aa>;3=8098?523dd95gb<5;=?677:0`f?822:38?>63<1=oj4=356>4db3ty?854?:7y>114=>>16?4751cg891342;>970=i1;3a`>;5?>0:nh5226495gc8j7>56z?607<2i2785=4>bd9>01d=:=801>?l:9c896`428ho70<87;3a`>{t6s|4df94?4|V{t6s|4g`94?4|V9;076>{t6s|4gf94?4|Vd;076>{t6s|4gd94?4|Vf;076>{t=9:1<76s|51394?4|V{t6s|4d694?4|V{t38?>6s|4d494?4|V70;?7;076>{t6s|4d:94?4|V{t6s|4dc94?4|V{t6s|4da94?4|V{t6s|4dd94?4|V0;076>{t6s|4g394?4|V2;076>{t6s|4g194?4|V4;076>{t1<76s|4g794?4|V6;076>{t6s|4g594?4|V8;076>{t6s|4gc94?4|Vb;076>{t==n1<7:t=5:5>72734>3;7<;0:?60`8i4=439~w02e2909w0;;b;076>;3==0:ni5rs472>5<5?r7?102=:=801>m::94896e?21<01>m6:94896ef21<01>mm:94896ed21<01>mk:94896eb21<01>mi:94896e121<01>m8:948915321<019=9:948915021<019=7:948915>21<019=n:948915e21<019=l:948915c21<019=::948912>21<019:n:948912d21<019:k:948912b21<019:i:948913721<019;>:948913521<019;<:948912e21<01>j8:363?85c038?<63;4l;03:63{t=<:1<7278=i476:?05`278=k476:?065278><476:?067278>>476:?061278=n476:?00<2788l476:?00f2788i476:?00`2788k476:?0152789<476:?0172789>476:?00g279h5476:?1`<279ho476:?1`f279hi476:?1``279hk476:?1a5279i<476:?1a7279hl476:?1e4279m?476:?1e1279m8476:?1e3279m:476:?1e=279m4476:?1ed279mo476:?1e62wx99h50;00832:38?>63:038106=:=991>9=4=42f>72434?:57<;3:?65f<5<:169870;>f;077>;2:9098>525339615<5<:?6?:<;<731?43;27><;4=429>151=:=9018>7:360?837138??63:0`8106=:=9h1>9=4=42`>72434?;h7<;3:?64c<5<:169<>5251890762;>870;>2;077>;29:098>525069615<5<;>6?:<;<722?43;27>=:4=429>14>=:=9018?n:360?836j38??63:43811f=:==>1=n?4}r762?6=9oq69865250891gd2;>;70:ne;:5?82fn32=70:m0;:5?82e932=70:m2;:5?82e;32=70:m4;:5?82e=32=70:nd;:5?82d938?<63;c38;2>;3k=03:63;c48;2>;3k?03:63;c68;2>;3k103:63;c88;2>;3kh03:63;cc8;2>;3k:03:63;d78;2>;3l>03:63;d98;2>;3l003:63;d`8;2>;3lk03:63;db8;2>;3lm03:63;d48;2>{t=2789:476:?01=27894476:?01d2789o476:?01f2789i476:?01`2789;476:?04c278==476:?057278=>476:?051278=8476:?053278=:476:?05=278=4476:?054279j4476:?1bd279jn476:?1ba279jh476:?1bc278<=476:?044278279jo476:?1f2279n5476:?1fd279no476:?1ff279ni476:?1f`279nk476:?1g5279o<476:?1f<2wx:347?md:?711<6k91v;?l:1863~X19j1685856g9>0=1=>o1699m56g9>137=>o1698956g9>10>=>o1699j56g9>134=>o1699k56g9>10`=>o1699l56g9>114=?0168lm56g9>0dc=>o168lh56g9>0g6=>o168o?56g9>0g4=>o168o=56g9>0g2=>o168o;56g9>0db=>o168n?56g9>0f4=>o168n:56g9>0f3=>o168n856g9>0f1=>o168n656g9>0f?=>o168no56g9>0fd=>o168n=56g9>0a0=>o168i956g9>0a>=>o168i756g9>0ag=>o168il56g9>0ae=>o168ij56g9>0a3=>o16?8:56g9>703=>o16?8956g9>70>=>o16?8756g9>70g=>o16?8l56g9>70e=>o16?8j56g9>70c=>o16?8856g9>75`=>o16?<>56g9>744=>o16?<=56g9>742=>o16?<;56g9>740=>o16?<956g9>74>=>o16?<756g9>747=>o16>k756g9>6cg=>o16>km56g9>6cb=>o16>kk56g9>6c`=>o16?=>56g9>757=>o16?=<56g9>755=>o16>kl56g9>6g1=>o16>o656g9>6gg=>o16>ol56g9>6ge=>o16>oj56g9>6gc=>o16>oh56g9>6f6=>o16>n?56g9>6g?=>o1v;?;:18;[06<278hl4>c19>7a6=9j:01>j;:0a3?85c>3;ij63:4582g5=:;m;1=oj4=52g>4dc3ty=<;4?:6cxZ36134>;j78i;<76f?0a34?>>78i;<767?0a34?>878i;<76g?0a34?>578i;<736?0a34?;?78i;<73a?0a34?:578i;<72g?0a34?:h78i;<72a?0a34?:j78i;<714?0a34?9=78i;<730?0a34?;978i;<732?0a34?;;78i;<7378i;<727?0a34?:878i;<721?0a34?::78i;<723?0a34?:478i;<72e?0a34?:n78i;<776?1b349h978i;<1`8:78i;<603?0a34>8478i;<60=?0a34>8m78i;<60f?0a34>8o78i;<60`?0a34>8978i;<67=?0a34>?m78i;<67g?0a34>?h78i;<67a?0a34>?j78i;<664?0a34>>=78i;<666?0a34>>?78i;<67f?0a349o;78i;<1g78i;<117?0a3499878i;<12g?0a349?578i;<17e?0a349?o78i;<17`?0a349?i78i;<17b?0a349><78i;<165?0a349>>78i;<167?0a349?n78i;<0g78i;<0ge?0a348j=78i;<0b6?0a348j878i;<0b1?0a348j:78i;<0b3?0a348j478i;<0b=?0a348jm78i;<0bf?0a348j?78i;|q6f5<72;qU9o>4=461>a752z\6fg=:==81hn5rs4a5>5<5sW?h:63:438f3>{t=jk1<77}Y=jh018:=:da8yv3dk3:1>vP:cb9>114=mm1v8mk:181[3dl27>8?4je:p1fc=838pR8mj;<776?ca3ty>ok4?:3y]1f`<5<>96k>4}r7g4?6=:rT>h=525509b4=z{;2<;0o>6s|5c094?4|V0q~;m4;296~X2j=1699<5d49~w0d22909wS;m5:?6072wx9o850;0xZ0d134??>7j8;|q6f2<72;qU9o94=461>a>52z\6f==:==81h45rs4`:>5<5sW?i563:438ge>{t=kk1<77}Y=ki018:=:ef8yv3el3:1>vP:be9>114=ll1v8lj:181[3em27>8?4kf:p1g`=838pR8li;<776?c73ty>o=4?:3y]1f6<5<>96h?4}r7`5?6=:rT>o<525509a7=z{;2<;0n?6s|5b194?4|V34??>7kn;|q0`f<72kq6?im5250896d228ho70=nf;3a`>;40:0:nh5239695gc<5:296be9>7g>=9kn01>l<:0`g?85fi3;ih6s|3e094?75s49o>7<;2:?0f0<6jl16?lh51cg896>428ho70=74;3a`>;40;0:nh523ec95g`<5:n;6be9>7d2=9ko01>l8:0`f?85e03;ii631=oh4=2f2>4da349jm7?me:?74a<6k91v9??:181823132j70;;8;00<>{t<;;1<77t=517>72534>?m76n;<621?7en27?=54>c19>041=9j:019?<:0`e?826>3;h<63;1382fa=:<9:1=oh4}r616?6=0r7??;4=439>01e=0h168=<51cd8917228hn70:>8;3ab>;39>0:nk5240195gb<5=;=6952508912c21k019?n:0a1?82613;h=63;1g82f`=:<8;1=ok4=53a>4db34>:47?l2:?752<6k8168<851cf8916528i;7p};2583>d}:<:21>9<4=56f>=g<5=:?6bg9>04`=9j:019?>:0a3?826j3;h<63;1982g4=:<8=1=oj4}r611?6=1r7??44=439>01`=0h168=:51cf8917f28i;70:>9;3`4>;39o0:nk5240395g`<5=;i6970::0;:b?827>3;ij63;1`82g4=:<831=oj4=53`>4db34>:h7?me:?75`<6jl1v9<8:184824j38?>63;508;e>;38?0:ni5240c95gb<5=;h6be9~w14?290=w0:;3=;03m63;0982fc=:<8i1=oh4=53g>4e734>:n7?md:p07?=83?p19=k:361?822;32j70:?8;3a`>;39o0:ni5240f95g`9<7>54z?770<5<;1689l58`9>05g=9kn019?>:0`g?xu38j0;6?u241d9>64}r63a?6=:r78jh4=399>05b=9j80q~:?b;296~;4m>09?55241f95f7257>5cz?7ef<5<;168n<58`9>02>=9ko0196k:0`e?84003;ih63;9182g5=:<1l1=n>4=5:a>4da34>3i7?l0:?7:751cf891c628hh7p};9`83>=}:9<4=5a7>=g<5==j6bg9>0=`=9kl0196m:0`g?82?m3;ij6s|48`94?d|5=km6?:=;<6`1?>f34>;31:0:nh5248295f4<5=2m6;<6;a?7el2wx84m50;cx91d72;>970:l6;:b?820k3;h<63;9382fc=:<0;1=oh4=5;4>4e734>357?l0:?7=6<6k91684>51b3891>a28ho7p};9e83><}:9<4=5a4>=g<5==h6c19>0<1=9kl01966:0`e?82>;3;ij63;9182fa=z{=3n6=47{<6a6?43:27?o547a:?73`<6k91684<51b3891?628ho70:64;3aa>;31<0:nh5248495gc2j7>57z?7f6<5<;168n758`9>02c=9ko0197=:0`g?82><3;ih63;9482fa=:<0<1=oj4}r6b4?6=>r7?n94=439>0fg=0h1685>51b2891?328hm70:65;3`4>;31:0:ni5rs5c2>5<2s4>i97<;2:?7ggbd9>0<1=9kn0197::0`e?xu3110;69u24`f9614<5=i865o4=5:1>4db34>357?md:p0g0=83hp19m>:361?82193;h<63;7982g5=:<1n1=oj4=35;>4db34>2<7?me:?7b28hn70:7a;3aa>;3lo0:nn5rs5`;>5<5s4>h>7<;2:?724<6jl1v9l6:18082d<38?>63;d78;e>;3>:0:o=5rs5`b>5<4s4>h97<;2:?7`24>bd9~w1de2908w0:l6;076>;3l103m63;6482g5=z{=hh6=4<{<6`3?43:27?h447a:?720<6jl1v9lk:18082d038?>63;d`8;e>;3>>0:o=5rs5`f>5<4s4>h57<;2:?7`gbd9~w1da2908w0:la;076>;3lj03m63;6882g5=z{=i;6=4<{<6`f?43:27?hi47a:?72<<6jl1v9l8:18082d;38?>63;d48;e>;3>k0:nh5rs5:5>5<4s4>3:7<;2:?7<=<6jl1688:51cd8yv2?<3:1?v3;878;e>;30>03m63;55817==z{=2>6=4={<642?44027?994>bd9~w1>42909w0::f;00<>;3==0:o<5rs47b>5<5s4?>576n;<77=?4402wx98j50;6x90352;>;70;:3;074>;2==098=5254g966>52z?61c8l4=399~w0042908w0;:7;074>;2=1098=52576966>o7>52z?61f<5<;1698k51cg8yv32j3:1?v3:5b8;e>;2=k098?5255;95gc57>54z?61g944=439>11?=9kn018;j:0`g?xu2>;0;6?u25709614<5<137=:=8018:n:0`f?xu2=o0;69u257399<4=46b>4dc34?=87?md:p11c=838p18:m:9c8902b2;>97p}:4b83>7}:==n14l5255a961452z?607<6il1699:522:8yv35:3:1>v3:038;e>;2<;0:4n5rs40g>5<5s4?;?76n;<776?7>?2wx9>650;0x906b21k018:=:0c1?xu2;k0;6?u250;9=n47a:?607<6i>1v8=k:181836l32j70;;2;3b<>{t=:o1<7=g<5<>96114=9hk0q~;;0;296~;2:903m63:4382eg=z{<>:6=4={<715?>f34??>7?nc:p175=838p18>;:9c89025282o7p}:2583>7}:=9?14l5255095=c52z?6438?4>8g9~w0412909w0;?7;:b?833:3;2<6s|53594?4|5<:365o4=461>4?63ty>>54?:3y>15?=0h1699<51808yv3513:1>v3:0`8;e>;2<;0:5>5rs40b>5<5s4?;n76n;<776?7><2wx9?l50;0x906d21k018:=:0;6?xu2:j0;6?u251f9{t=::1<7=g<5<>96<7n;|q674<72;q69<<58`9>114=90h0q~;<2;296~;29:03m63:4382=f=z{<986=4={<720?>f34??>7?6d:p162=838p18?::9c89025283n7p}:3483>7}:=8<14l5255095<`52z?6528?4>a19~w0502909w0;>8;:b?833:3;j=6s|52;94?4|5<;j65o4=461>4g43ty>?l4?:3y>14d=0h1699<51`78yv2213:1>v3;5g846>;3=l09?55rs57;>5<5s4>>h7<<8:?71`<0:2wx88950;0x913d2;9370::d;51?xu3=?0;6?u244`966><5=?h6:<4}r661?6=:r7?9l4=399>00d=?;1v987:181822m38=<63;68817==z{=<=6=4={<66`?41827?::4=399~w1032909w0::c;054>;3><09?55rs541>5<5s4>>n7<90:?726<5;11v98?:181822i38=<63;60817==z{=025=::20199;:608yv21l3:1>v3;73817==:<>91;?5rs54`>5<5s4><=7<<8:?737<0:2wx8:h50;0x91122;<;70:70;00<>{t<>n1<770734>{t<1;1<770734>3>7<<8:p7`7=838p1>k8:60896c12;937p}7}:;l?1>>64=2g5>2452z?0a1<5;116?h;5739~w6bb2909w0=j3;00<>;4m=0<>6s|3ef94?4|5:o96?=7;<1f7?153ty8j=4?:3y>7`0=:?:01>h>:31;?xu4ml0;6?u23d79636<5:om6?=7;|q0af<72;q6?h:5272896cc2;937p}7}:;l91>;>4=2ga>75?3ty8i54?:3y>7`4=:?:01>k6:31;?xu4n;0;6?u23d59636<5:l86?=7;|q0b=<72;q6?kk5739>7cb=::20q~=i7;296~;4nj09?5523gf937=z{:l=6=4={<1ef?440278jn482:p7c3=838p1>hn:31;?85aj3=97p}7}:;o31>>64=2db>24;;7>52z?0ba<5>9168=6522:8yv27=3:1>v3>64}r637?6=:r78jo4=619>052=::20q~:?1;296~;4nh09:=52410966>52z?0b<<5>9168=>522:8yv2713:1>v3>64}r1b7g0=9j801>l::0a1?85f<3;h>63bg9>7d?=9kn0q~=71;290~;4i:09?5523`695f6<5:h3650;7x96g52;9370=n7;3a`>;4j?0:nh523c:95f6<5:k26;4j?0:o=523c:95f7<5:k26q6?l>522:896g028hm70=m6;3`5>;4j:0:nk523c795f6<5:kj6;4j?0:nk523c195f6<5:h>6;<1be?7d8278n44>c39>7g7=9j80q~=8c;292~;41l09?5523`795gb<5:km6be9>7g7=9ko0q~=8b;293~;41m09?5523`795f6<5:km6be9>7g?=9ko01>l>:0`e?xu4?h0;65u238a966><5:k>64>c19>7=2=9j;01>o9:0`f?85e13;ij63bd9>7d`=9j:01>6<:0`e?85?<3;h<63<8382fc=:;h<1=oh4=2`:>4e7349i=7?l1:p7<6=838p1>7?:31;?85>i38:>6s|39g94?4|5:2n6?=7;<1:e?153ty8544?:2y>76j:343?85f;38:>6s|39f94?5|5:2o6?=7;<1;a?15349j?79=;|q0==<72:q6?46522:896>c2;<;70=n2;026>{t;1i1<7=t=2:`>75?3493h79=;<1b6?153ty85:4?:2y>7<1=::201>6l:343?85f938:>6s|39`94?5|5:2i6?=7;<1;g?15349j=79=;|q0=3<72:q6?48522:896>e2;<;70=n0;026>{t;1k1<7=t=2:b>75?3493n79=;<1b4?153ty8584?:2y>7<3=::201>6n:343?85>n38:>6s|39;94?5|5:226?=7;<1;e?153492j79=;|q0=1<72:q6?4:522:896>>2;<;70=6e;026>{t;121<7=t=2:;>75?3493579=;<1:a?153ty85>4?:2y>7<5=::201>67:343?85>l38:>6s|39594?5|5:2<6?=7;<1;02;<;70=6c;026>{t;1<1<7=t=2:5>75?3493;79=;<1:g?153ty85<4?:2y>7<7=::201>69:343?85>j38:>6s|39794?5|5:2>6?=7;<1;2?153492n79=;|q022;<;7p}7}:;j?14l52390966>52z?0g=4=399~w6gc2909w0=l9;:b?85?<38846s|3`g94?4|5:ij65o4=2ce>75?3ty8n=4?:3y>7fd=0h16?o?522:8yv5e:3:1>v3;4j:09?55rs2`7>5<5s49hh76n;<1a1?4402wx?o850;0x96eb21k01>l9:31;?xu4j10;6?u23bd9>64}r1b0?6=:r78o;47a:?0e1<5;11v>o6:18185d?32j70=n9;00<>{t<8>1<78t=53b>4db34>:57?me:?750<5;1168b;3`5>{t<;h1<7=g<5=;96?=7;|q76f<72;q68>858`9>045=::20q~:=d;296~;3;>03m63;17817==z{=8n6=4={<60f34>:;7<<8:p07`=838p19=6:9c8917?2;937p};3183>7}:<:k14l5240;966>8=7>52z?77g75?3ty?>l4?:3y>063=0h168v3;4l=09?55rs2f:>5<4s49o;76n;<1gf349om7<<8:p7ad=839p1>jl:9c896b221k01>j9:31;?xu4l<0;65u23e79614<5:n:6bd9>7a2=9kl01>j9:0`f?827l3;ij63:4582f`=z{:n<6=4={<1g3?43:278hl4>be9~w1>d290=w0:62;3aa>;3180:nh5249f966><5=3<6;<6;=?7d927?5>4>c09~w1g42909w0:nc;:b?82?i38846s|4`694?4|5=kn65o4=5:a>75?3ty?m84?:3y>0d`=0h1685k522:8yv2f>3:1>v3;b18;e>;30o09?55rs5c4>5<5s4>i=76n;<6:4?4402wx8l650;0x91d521k0197>:31;?xu3i00;6?u24c19>64}r6be?6=:r7?n947a:?7=6<5;11v9om:18182e=32j70:67;00<>{t=g<5=226?=7;|q02f<72;q6?9o58`9>73g=::20q~=99;296~;4f349=87<<8:p735=838p1>:j:9c896062;937p}<6183>7}:;=l14l5234d966>52z?01575?3ty8;=4?:3y>705=0h16?:?522:8yv54i3:1>v3<118;e>;4;109?55rs214>5<5s49:>76n;<101?4402wx?>:50;0x967421k01>==:31;?xu4;80;6?u23069>64}r11a?6=:r78=847a:?06a<5;11v>32j70==b;00<>{t;;k1<7=g<5:826?=7;|q062<72;q6?<658`9>77>=::20q~==5;296~;49003m63<27817==z{;296=4={<12e?>f348=i7<<8:p6=5=838p1>?m:9c8970a2;937p}=8583>7}:;8n14l52262966>52z?05`12909w0=>f;:b?840:38846s|29594?4|5:8;65o4=350>75?3ty9454?:3y>777=0h16>::522:8yv4?13:1>v3<238;e>;5?<09?55rs3:b>5<5s499?76n;<042?4402wx>5l50;0x964321k01?98:31;?xu50j0;6?u2346921>>64}r0;`?6=:r789847a:?13<<5;11v?6j:181852?32j70<8a;00<>{t:1l1<7=g<5;=i6?=7;|q1=5<72;q6?8758`9>62e=::20q~<61;296~;4=h03m63=7e817==z{;396=4={<16f?>f348;l:9c8971a2;937p}=9583>7}:;52z?01`75?3ty9mn4?:3y>6g1=0h16?v3=b98;e>;49k098?5rs3ce>5<5s48im76n;<12`?43:2wx>o>50;0x97de21k01>?j:361?xu5j80;6?u22ca99<4}r0a6?6=:r79ni47a:?065<5<;1v?l<:18184em32j70==1;076>{t:k>1<7=g<5:896?:=;|q1f0<72;q6>n>58`9>775=:=80q~f349:o7<;2:p6fb=838p1?j7:361?851m3;ii6s|2bd94?5|5;n26?:=;<15`?7en278:l4>bg9~w7b7290?w0;4>m0:nh5237595gc<5:im52508960c28ho70=94;3a`>;4>>0:ni5237c95gb7>56z?1`a<5<;16?;k51cf8960328i;70=91;3ab>;4>>0:o<5237`95gb57z?1``<5<;16?8h51cg8960c28i:70=94;3ab>;4>80:nh5237595f6<5:;|q1`1<721q6>ih52508961128hn70=:f;3ab>;4>l0:o?5237795g`<5:<96c09~w7b22902w0;4??0:nk5236695gc<5:?m6bd9>734=9kn01>87:0`e?851j3;h<6s|2e494?g|5;o:6?:=;<147?7en278;;4>c19>722=9kl01>;i:0a2?851m3;h<63<6482fa=:;?;1=n?4=24;>4db349=n7?mf:p6a1=83hp1?k=:361?85093;ii63<7282f`=:;><1=n?4=257>4e7349>j7?l2:?02`<6jo16?;:51b38960628i;70=98;3a`>;4>k0:nh5rs3af>5be9>725=9kn01>99:0`g?850<3;ih63<5g82fa=:;?n1=n>4=247>4db349==7?md:?022<6jo16?;o51b28yv4d:3:1>v3=d98;e>;5i8098?5rs3a7>5<5s48o576n;<0b6?43:2wx>n;50;0x97be21k01?o;:361?xu5k?0;6?u22ea99<4}r0`3?6=:r79hi47a:?1e3<5<;1v?m7:18184cm32j70{t:j31<7=g<5;k36?:=;|q1gd<72;q6>h>58`9>6d?=:=80q~f348jn7<;2:p6f5=838p1?jn:9c897g42;>97p}=9783>7}::h;14l52346961452z?1e72909w06s|28c94?4|5;k>65o4=27;>7253ty95o4?:3y>6d0=0h16?8752508yv4>k3:1>v3=a68;e>;4=h098?5rs3;g>5<5s48j476n;<16f?43:2wx>4k50;0x97g>21k01>;l:361?xu51o0;6?u22`c99<4}r0b4?6=:r79mo47a:?01`<5<;1v?78:18184f;32j70=:6;076>{t:lo1<77253498o7?me:p6c6=839p1?hn:361?854j3;ij63<3982fc=z{;l:6=4;{<0eg?43:278?o4>bd9>763=9ko01>=7:0`f?xu5n;0;68u22gf9614<5:9i6be9>76>=9kn0q~c09>76?=9kn0q~;<11b?7em278??4>bg9>763=9j:01>=7:0a2?xu5n<0;65u23129614<5:8o6c39>766=9ko01>=<:0`e?854>3;h<63<3882g4=z{;l=6=46{<135?43:278>i4>c19>77?=9ko01>4da349857?l0:p6c1=83kp1>>=:361?85503;ih63<2e82g4=:;;31=oh4=20a>4e73498o7?l0:?06c<6k816?>=51cf8965128hn70=<9;3ab>{t:o21<7lt=220>7253499:7?me:?06=<6jo16??j51b08964>28i;70==b;3`5>;4;j0:nk5233d95f6<5:996;<102?7el278?44>bd9~w7ca290hw0=>1;:b?84aj38?>63<2782fa=:;;21=ok4=20g>4dc349957?md:?06g<6jm16?>l51b28964a28ho70=<2;3aa>;4;<0:nk5232:95f652z?1b<6s|2d494?4|5;lh65o4=3`b>7253ty9i:4?:3y>6cb=0h16>ol52508yv4b03:1>v3=fd8;e>;5jj098?5rs3g:>5<5s48mj76n;<0a`?43:2wx>ho50;0x966721k01?lj:361?xu5mk0;6?u231399<4}r0fg?6=:r78{t:l>1<7=g<5;h26?:=;|q7``<72:q699<5499>0f7=0h168ih522:8yv2b83:1>v3:4387b>;3m809?55rs303>5<5s49j;7<<8:?0e1<6k81v?<8:18185fi388463be9>7g7=9kn0q~<<5;296~;4>l09?55237f95f47>52z?07f<5;116?>l51b08yv45;3:1>v3<31817==:;;l1=n<4}r010?6=:r78?>4=399>764=9j80q~<=5;296~;4;?09?55232795f452z?07<<5;116?>651b08yv4503:1>v3<64817==:;?>1=n<4}r01=?6=:r78:?4=399>737=9j80q~<=a;296~;4>109?55237595f452z?02g<5;116?;o51b08yv45k3:1>v3;1b817==:<8l1=n<4}r01`?6=:r7?=i4=399>047=9j80q~<=e;296~;39l09?55240`95f452z?7=1<5;11684951b08yv4483:1>v3;94817==:<131=n<4}r005?6=:r7?5;4=399>0<5=9j80q~<<2;296~;4j009?5523c:95f452z?0e3<5;116?o=51b08yxhdko0;6:85rnbf6>5<6sA?=96sace494?7|@<<>7p`ld683>4}O=??0qcmk8;295~N2><1vbnj6:182M31=2weoio50;3xL0023tdhho4?:0yK13351zJ620=zfjno6=4>{I751>{ikmo1<7?tH446?xhdlo0;6:85rnbg6>5<6sA?=96sacd494?7|@<<>7p`le683>4}O=??0qcmj8;297~N2><1vbnk6:182M31=2weoho50;0xL0023tdhio4?:3yK13352zJ620=zfjoo6=4={I751>{iklo1<7vF:649~jf`62909wE;95:mgc4=838pD88:;|l`b6<728qC9;;4}oae0?6=9rB>:85rnbd6>5<6sA?=96sacg494?7|@<<>7p`lf683>4}O=??0qcmi8;295~N2><1vbnh6:182M31=2weoko50;3xL0023tdhjo4?:0yK13351zJ620=zfjlo6=4>{I751>{ikoo1<7?tH446?xhdno0;6:85rne26>5<5sA?=96sad1494?4|@<<>7p`k0683>7}O=??0qcj?8;296~N2><1vbi>6:181M31=2weh=o50;0xL0023tdo52zJ620=zfm:o6=4>{I751>{il9o1<7?tH446?xhc8o0;6:85rne36>5<6sA?=96sad0494?7|@<<>7p`k1683>4}O=??0qcj>8;295~N2><1vbi?6:182M31=2weh51zJ620=zfm;o6=4>{I751>{il8o1<7?tH446?xhc9o0;6:85rne06>5<6sA?=96sad3494?7|@<<>7p`k2683>4}O=??0qcj=8;295~N2><1vbi<6:182M31=2weh?o50;3xL0023tdo>o4?:0yK13351zJ620=zfm8o6=4>{I751>{il;o1<7?tH446?xhc:o0;6:85rne16>5<5sA?=96sad2494?7|@<<>7p`k3683>7}O=??0qcj<8;296~N2><1vbi=6:181M31=2weh>o50;0xL0023tdo?o4?:3yK13352zJ620=zfm9o6=4={I751>{il:o1<7vF:649~ja262909wE;95:m`14=838pD88:;|lg06<72;qC9;;4}of70?6=:rB>:85rne66>5<5sA?=96sad5494?4|@<<>7p`k4683>7}O=??0qcj;8;296~N2><1vbi:6:181M31=2weh9o50;0xL0023tdo8o4?:3yK13352zJ620=zfm>o6=4={I751>{il=o1<7vF:649~ja362909wE;95:m`04=838pD88:;|lg16<72;qC9;;4}of60?6=:rB>:85rne76>5<5sA?=96sad4494?4|@<<>7p`k5683>7}O=??0qcj:8;295~N2><1vbi;6:182M31=2weh8o50;3xL0023tdo9o4?:0yK133o7>51zJ620=zfm?o6=4>{I751>{il:85rne46>5<6sA?=96sad7494?7|@<<>7p`k6683>4}O=??0qcj98;295~N2><1vbi86:182M31=2weh;o50;3xL0023tdo:o4?:0yK13351zJ620=zfm{I751>{il?o1<7?tH446?xhc>o0;6:85rne56>5<6sA?=96sad6494?7|@<<>7p`k7683>4}O=??0qcj88;295~N2><1vbi96:182M31=2weh:o50;3xL0023tdo;o4?:0yK13351zJ620=zfm=o6=4>{I751>{il>o1<7?tH446?xhc?o0;66290:wE;95:m`=4=83;pD88:;|lg<6<728qC9;;4}of;0?6=9rB>:85rne:6>5<6sA?=96sad9494?7|@<<>7p`k8683>4}O=??0qcj78;295~N2><1vbi66:182M31=2weh5o50;3xL0023tdo4o4?:0yK13351zJ620=zfm2o6=4={I751>{il1o1<783:1>vF:649~ja?62909wE;95:m`<4=838pD88:;|lg=6<72;qC9;;4}of:0?6=:rB>:85rne;6>5<5sA?=96sad8494?4|@<<>7p`k9683>7}O=??0qcj68;296~N2><1vbi76:181M31=2weh4o50;0xL0023tdo5o4?:3yK13352zJ620=zfm3o6=4={I751>{il0o1<7vF:649~jag62909wE;95:m`d4=838pD88:;|lge6<72;qC9;;4}ofb0?6=:rB>:85rnec6>5<5sA?=96sad`494?4|@<<>7p`ka683>7}O=??0qcjn8;296~N2><1vbio6:181M31=2wehlo50;0xL0023tdomo4?:3yK13352zJ620=zfmko6=4={I751>{ilho1<7?tH446?xhcio0;6:85rne`6>5<6sA?=96sadc494?7|@<<>7p`kb683>4}O=??0qcjm8;295~N2><1vbil6:182M31=2wehoo50;3xL0023tdono4?:0yK13351zJ620=zfmho6=4>{I751>{ilko1<7?tH446?xhcjo0;6:85rnea6>5<6sA?=96sadb494?7|@<<>7p`kc683>4}O=??0qcjl8;295~N2><1vbim6:182M31=2wehno50;3xL0023tdooo4?:0yK13351zJ620=zfmio6=4>{I751>{iljo1<7?tH446?xhcko0;6:85rnef6>5<6sA?=96sade494?7|@<<>7p`kd683>4}O=??0qcjk8;295~N2><1vbij6:182M31=2wehio50;3xL0023tdoho4?:0yK13351zJ620=zfmno6=4>{I751>{ilmo1<7?tH446?xhclo0;6:85rneg6>5<6sA?=96sadd494?7|@<<>7p`ke683>4}O=??0qcjj8;295~N2><1vbik6:182M31=2wehho50;3xL0023tdoio4?:0yK13351zJ620=zfmoo6=4>{I751>{illo1<7?tH446?xhcmo0;6:85rned6>5<6sA?=96sadg494?7|@<<>7p`kf683>4}O=??0qcji8;295~N2><1vbih6:182M31=2wehko50;3xL0023tdojo4?:0yK13351zJ620=zfmlo6=4>{I751>{iloo1<7?tH446?xhcno0;6:85rnd26>5<6sA?=96sae1494?7|@<<>7p`j0683>4}O=??0qck?8;295~N2><1vbh>6:182M31=2wei=o50;3xL0023tdn51zJ620=zfl:o6=4>{I751>{im9o1<7?tH446?xhb8o0;6:85rnd36>5<6sA?=96sae0494?7|@<<>7p`j1683>4}O=??0qck>8;295~N2><1vbh?6:182M31=2wei51zJ620=zfl;o6=4>{I751>{im8o1<7?tH446?xhb9o0;6:85rnd06>5<6sA?=96sae3494?7|@<<>7p`j2683>4}O=??0qck=8;295~N2><1vbh<6:182M31=2wei?o50;3xL0023tdn>o4?:0yK13351zJ620=zfl8o6=4>{I751>{im;o1<7?tH446?xhb:o0;6:85rnd16>5<6sA?=96sae2494?7|@<<>7p`j3683>4}O=??0qck<8;295~N2><1vbh=6:182M31=2wei>o50;3xL0023tdn?o4?:0yK13351zJ620=zfl9o6=4>{I751>{im:o1<7?tH446?xhb;o0;6:85rnd66>5<6sA?=96sae5494?7|@<<>7p`j4683>4}O=??0qck;8;295~N2><1vbh:6:182M31=2wei9o50;3xL0023tdn8o4?:0yK13351zJ620=zfl>o6=4>{I751>{im=o1<7?tH446?xhb:85rnd76>5<6sA?=96sae4494?7|@<<>7p`j5683>4}O=??0qck:8;295~N2><1vbh;6:182M31=2wei8o50;3xL0023tdn9o4?:0yK133o7>51zJ620=zfl?o6=4>{I751>{im:85rnd46>5<6sA?=96sae7494?7|@<<>7p`j6683>4}O=??0qck98;295~N2><1vbh86:182M31=2wei;o50;3xL0023tdn:o4?:0yK13351zJ620=zfl{I751>{im?o1<7?tH446?xhb>o0;6:85rnd56>5<6sA?=96sae6494?7|@<<>7p`j7683>4}O=??0qck88;295~N2><1vbh96:182M31=2wei:o50;3xL0023tdn;o4?:0yK13351zJ620=zfl=o6=4>{I751>{im>o1<7?tH446?xhb?o0;66290:wE;95:ma=4=83;pD88:;|lf<6<728qC9;;4}og;0?6=9rB>:85rnd:6>5<6sA?=96sae9494?7|@<<>7p`j8683>4}O=??0qck78;295~N2><1vbh66:182M31=2wei5o50;0xL0023tdn4o4?:3yK13351zJ620=zfl2o6=4>{I751>{im1o1<7?tH446?xhb0o0;683:1=vF:649~j`?6290:wE;95:ma<4=83;pD88:;|lf=6<728qC9;;4}og:0?6=9rB>:85rnd;6>5<6sA?=96sae8494?7|@<<>7p`j9683>4}O=??0qck68;295~N2><1vbh76:182M31=2wei4o50;3xL0023tdn5o4?:0yK13351zJ620=zfl3o6=4>{I751>{im0o1<7?tH446?xhb1o0;67290:wE;95:~yxFGKr;;;946935`b 0, + c_application_type_axis => 0, + c_application_type_rach => 0, + c_application_type_rdch => 0, + c_application_type_wach => 0, + c_application_type_wdch => 0, + c_application_type_wrch => 0, + c_axi_addr_width => 32, + c_axi_aruser_width => 1, + c_axi_awuser_width => 1, + c_axi_buser_width => 1, + c_axi_data_width => 64, + c_axi_id_width => 4, + c_axi_ruser_width => 1, + c_axi_type => 0, + c_axi_wuser_width => 1, + c_axis_tdata_width => 64, + c_axis_tdest_width => 4, + c_axis_tid_width => 8, + c_axis_tkeep_width => 4, + c_axis_tstrb_width => 4, + c_axis_tuser_width => 4, + c_axis_type => 0, + c_common_clock => 0, + c_count_type => 0, + c_data_count_width => 11, + c_default_value => "BlankString", + c_din_width => 32, + c_din_width_axis => 1, + c_din_width_rach => 32, + c_din_width_rdch => 64, + c_din_width_wach => 32, + c_din_width_wdch => 64, + c_din_width_wrch => 2, + c_dout_rst_val => "0", + c_dout_width => 32, + c_enable_rlocs => 0, + c_enable_rst_sync => 1, + c_error_injection_type => 0, + c_error_injection_type_axis => 0, + c_error_injection_type_rach => 0, + c_error_injection_type_rdch => 0, + c_error_injection_type_wach => 0, + c_error_injection_type_wdch => 0, + c_error_injection_type_wrch => 0, + c_family => "spartan6", + c_full_flags_rst_val => 1, + c_has_almost_empty => 0, + c_has_almost_full => 0, + c_has_axi_aruser => 0, + c_has_axi_awuser => 0, + c_has_axi_buser => 0, + c_has_axi_rd_channel => 0, + c_has_axi_ruser => 0, + c_has_axi_wr_channel => 0, + c_has_axi_wuser => 0, + c_has_axis_tdata => 0, + c_has_axis_tdest => 0, + c_has_axis_tid => 0, + c_has_axis_tkeep => 0, + c_has_axis_tlast => 0, + c_has_axis_tready => 1, + c_has_axis_tstrb => 0, + c_has_axis_tuser => 0, + c_has_backup => 0, + c_has_data_count => 0, + c_has_data_counts_axis => 0, + c_has_data_counts_rach => 0, + c_has_data_counts_rdch => 0, + c_has_data_counts_wach => 0, + c_has_data_counts_wdch => 0, + c_has_data_counts_wrch => 0, + c_has_int_clk => 0, + c_has_master_ce => 0, + c_has_meminit_file => 0, + c_has_overflow => 0, + c_has_prog_flags_axis => 0, + c_has_prog_flags_rach => 0, + c_has_prog_flags_rdch => 0, + c_has_prog_flags_wach => 0, + c_has_prog_flags_wdch => 0, + c_has_prog_flags_wrch => 0, + c_has_rd_data_count => 1, + c_has_rd_rst => 0, + c_has_rst => 1, + c_has_slave_ce => 0, + c_has_srst => 0, + c_has_underflow => 0, + c_has_valid => 0, + c_has_wr_ack => 0, + c_has_wr_data_count => 0, + c_has_wr_rst => 0, + c_implementation_type => 2, + c_implementation_type_axis => 1, + c_implementation_type_rach => 1, + c_implementation_type_rdch => 1, + c_implementation_type_wach => 1, + c_implementation_type_wdch => 1, + c_implementation_type_wrch => 1, + c_init_wr_pntr_val => 0, + c_interface_type => 0, + c_memory_type => 1, + c_mif_file_name => "BlankString", + c_msgon_val => 1, + c_optimization_mode => 0, + c_overflow_low => 0, + c_preload_latency => 0, + c_preload_regs => 1, + c_prim_fifo_type => "2kx18", + c_prog_empty_thresh_assert_val => 4, + c_prog_empty_thresh_assert_val_axis => 1022, + c_prog_empty_thresh_assert_val_rach => 1022, + c_prog_empty_thresh_assert_val_rdch => 1022, + c_prog_empty_thresh_assert_val_wach => 1022, + c_prog_empty_thresh_assert_val_wdch => 1022, + c_prog_empty_thresh_assert_val_wrch => 1022, + c_prog_empty_thresh_negate_val => 5, + c_prog_empty_type => 0, + c_prog_empty_type_axis => 0, + c_prog_empty_type_rach => 0, + c_prog_empty_type_rdch => 0, + c_prog_empty_type_wach => 0, + c_prog_empty_type_wdch => 0, + c_prog_empty_type_wrch => 0, + c_prog_full_thresh_assert_val => 2047, + c_prog_full_thresh_assert_val_axis => 1023, + c_prog_full_thresh_assert_val_rach => 1023, + c_prog_full_thresh_assert_val_rdch => 1023, + c_prog_full_thresh_assert_val_wach => 1023, + c_prog_full_thresh_assert_val_wdch => 1023, + c_prog_full_thresh_assert_val_wrch => 1023, + c_prog_full_thresh_negate_val => 2046, + c_prog_full_type => 0, + c_prog_full_type_axis => 0, + c_prog_full_type_rach => 0, + c_prog_full_type_rdch => 0, + c_prog_full_type_wach => 0, + c_prog_full_type_wdch => 0, + c_prog_full_type_wrch => 0, + c_rach_type => 0, + c_rd_data_count_width => 11, + c_rd_depth => 2048, + c_rd_freq => 1, + c_rd_pntr_width => 11, + c_rdch_type => 0, + c_reg_slice_mode_axis => 0, + c_reg_slice_mode_rach => 0, + c_reg_slice_mode_rdch => 0, + c_reg_slice_mode_wach => 0, + c_reg_slice_mode_wdch => 0, + c_reg_slice_mode_wrch => 0, + c_synchronizer_stage => 2, + c_underflow_low => 0, + c_use_common_overflow => 0, + c_use_common_underflow => 0, + c_use_default_settings => 0, + c_use_dout_rst => 1, + c_use_ecc => 0, + c_use_ecc_axis => 0, + c_use_ecc_rach => 0, + c_use_ecc_rdch => 0, + c_use_ecc_wach => 0, + c_use_ecc_wdch => 0, + c_use_ecc_wrch => 0, + c_use_embedded_reg => 0, + c_use_fifo16_flags => 0, + c_use_fwft_data_count => 1, + c_valid_low => 0, + c_wach_type => 0, + c_wdch_type => 0, + c_wr_ack_low => 0, + c_wr_data_count_width => 12, + c_wr_depth => 2048, + c_wr_depth_axis => 1024, + c_wr_depth_rach => 16, + c_wr_depth_rdch => 1024, + c_wr_depth_wach => 16, + c_wr_depth_wdch => 1024, + c_wr_depth_wrch => 16, + c_wr_freq => 1, + c_wr_pntr_width => 11, + c_wr_pntr_width_axis => 10, + c_wr_pntr_width_rach => 4, + c_wr_pntr_width_rdch => 10, + c_wr_pntr_width_wach => 4, + c_wr_pntr_width_wdch => 10, + c_wr_pntr_width_wrch => 4, + c_wr_response_latency => 1, + c_wrch_type => 0 + ); +-- synthesis translate_on +BEGIN +-- synthesis translate_off +U0 : wrapped_px_fifo + PORT MAP ( + rst => rst, + wr_clk => wr_clk, + rd_clk => rd_clk, + din => din, + wr_en => wr_en, + rd_en => rd_en, + dout => dout, + full => full, + empty => empty, + rd_data_count => rd_data_count + ); +-- synthesis translate_on + +END px_fifo_a; diff --git a/fpga/src/vendor/xilinx/px_fifo.xco b/fpga/src/vendor/xilinx/px_fifo.xco new file mode 100644 index 0000000..e3d0aef --- /dev/null +++ b/fpga/src/vendor/xilinx/px_fifo.xco @@ -0,0 +1,213 @@ +############################################################## +# +# Xilinx Core Generator version 14.6 +# Date: Fri Aug 23 07:30:57 2013 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# Generated from component: xilinx.com:ip:fifo_generator:9.3 +# +############################################################## +# +# BEGIN Project Options +SET addpads = false +SET asysymbol = true +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = false +SET designentry = VHDL +SET device = xc6slx45 +SET devicefamily = spartan6 +SET flowvendor = Other +SET formalverification = false +SET foundationsym = false +SET implementationfiletype = Ngc +SET package = csg324 +SET removerpms = false +SET simulationfiles = Behavioral +SET speedgrade = -3 +SET verilogsim = false +SET vhdlsim = true +# END Project Options +# BEGIN Select +SELECT FIFO_Generator xilinx.com:ip:fifo_generator:9.3 +# END Select +# BEGIN Parameters +CSET add_ngc_constraint_axi=false +CSET almost_empty_flag=false +CSET almost_full_flag=false +CSET aruser_width=1 +CSET awuser_width=1 +CSET axi_address_width=32 +CSET axi_data_width=64 +CSET axi_type=AXI4_Stream +CSET axis_type=FIFO +CSET buser_width=1 +CSET clock_enable_type=Slave_Interface_Clock_Enable +CSET clock_type_axi=Common_Clock +CSET component_name=px_fifo +CSET data_count=false +CSET data_count_width=11 +CSET disable_timing_violations=false +CSET disable_timing_violations_axi=false +CSET dout_reset_value=0 +CSET empty_threshold_assert_value=4 +CSET empty_threshold_assert_value_axis=1022 +CSET empty_threshold_assert_value_rach=1022 +CSET empty_threshold_assert_value_rdch=1022 +CSET empty_threshold_assert_value_wach=1022 +CSET empty_threshold_assert_value_wdch=1022 +CSET empty_threshold_assert_value_wrch=1022 +CSET empty_threshold_negate_value=5 +CSET enable_aruser=false +CSET enable_awuser=false +CSET enable_buser=false +CSET enable_common_overflow=false +CSET enable_common_underflow=false +CSET enable_data_counts_axis=false +CSET enable_data_counts_rach=false +CSET enable_data_counts_rdch=false +CSET enable_data_counts_wach=false +CSET enable_data_counts_wdch=false +CSET enable_data_counts_wrch=false +CSET enable_ecc=false +CSET enable_ecc_axis=false +CSET enable_ecc_rach=false +CSET enable_ecc_rdch=false +CSET enable_ecc_wach=false +CSET enable_ecc_wdch=false +CSET enable_ecc_wrch=false +CSET enable_read_channel=false +CSET enable_read_pointer_increment_by2=false +CSET enable_reset_synchronization=true +CSET enable_ruser=false +CSET enable_tdata=false +CSET enable_tdest=false +CSET enable_tid=false +CSET enable_tkeep=false +CSET enable_tlast=false +CSET enable_tready=true +CSET enable_tstrobe=false +CSET enable_tuser=false +CSET enable_write_channel=false +CSET enable_wuser=false +CSET fifo_application_type_axis=Data_FIFO +CSET fifo_application_type_rach=Data_FIFO +CSET fifo_application_type_rdch=Data_FIFO +CSET fifo_application_type_wach=Data_FIFO +CSET fifo_application_type_wdch=Data_FIFO +CSET fifo_application_type_wrch=Data_FIFO +CSET fifo_implementation=Independent_Clocks_Block_RAM +CSET fifo_implementation_axis=Common_Clock_Block_RAM +CSET fifo_implementation_rach=Common_Clock_Block_RAM +CSET fifo_implementation_rdch=Common_Clock_Block_RAM +CSET fifo_implementation_wach=Common_Clock_Block_RAM +CSET fifo_implementation_wdch=Common_Clock_Block_RAM +CSET fifo_implementation_wrch=Common_Clock_Block_RAM +CSET full_flags_reset_value=1 +CSET full_threshold_assert_value=2047 +CSET full_threshold_assert_value_axis=1023 +CSET full_threshold_assert_value_rach=1023 +CSET full_threshold_assert_value_rdch=1023 +CSET full_threshold_assert_value_wach=1023 +CSET full_threshold_assert_value_wdch=1023 +CSET full_threshold_assert_value_wrch=1023 +CSET full_threshold_negate_value=2046 +CSET id_width=4 +CSET inject_dbit_error=false +CSET inject_dbit_error_axis=false +CSET inject_dbit_error_rach=false +CSET inject_dbit_error_rdch=false +CSET inject_dbit_error_wach=false +CSET inject_dbit_error_wdch=false +CSET inject_dbit_error_wrch=false +CSET inject_sbit_error=false +CSET inject_sbit_error_axis=false +CSET inject_sbit_error_rach=false +CSET inject_sbit_error_rdch=false +CSET inject_sbit_error_wach=false +CSET inject_sbit_error_wdch=false +CSET inject_sbit_error_wrch=false +CSET input_data_width=32 +CSET input_depth=2048 +CSET input_depth_axis=1024 +CSET input_depth_rach=16 +CSET input_depth_rdch=1024 +CSET input_depth_wach=16 +CSET input_depth_wdch=1024 +CSET input_depth_wrch=16 +CSET interface_type=Native +CSET output_data_width=32 +CSET output_depth=2048 +CSET overflow_flag=false +CSET overflow_flag_axi=false +CSET overflow_sense=Active_High +CSET overflow_sense_axi=Active_High +CSET performance_options=First_Word_Fall_Through +CSET programmable_empty_type=No_Programmable_Empty_Threshold +CSET programmable_empty_type_axis=No_Programmable_Empty_Threshold +CSET programmable_empty_type_rach=No_Programmable_Empty_Threshold +CSET programmable_empty_type_rdch=No_Programmable_Empty_Threshold +CSET programmable_empty_type_wach=No_Programmable_Empty_Threshold +CSET programmable_empty_type_wdch=No_Programmable_Empty_Threshold +CSET programmable_empty_type_wrch=No_Programmable_Empty_Threshold +CSET programmable_full_type=No_Programmable_Full_Threshold +CSET programmable_full_type_axis=No_Programmable_Full_Threshold +CSET programmable_full_type_rach=No_Programmable_Full_Threshold +CSET programmable_full_type_rdch=No_Programmable_Full_Threshold +CSET programmable_full_type_wach=No_Programmable_Full_Threshold +CSET programmable_full_type_wdch=No_Programmable_Full_Threshold +CSET programmable_full_type_wrch=No_Programmable_Full_Threshold +CSET rach_type=FIFO +CSET rdch_type=FIFO +CSET read_clock_frequency=1 +CSET read_data_count=true +CSET read_data_count_width=11 +CSET register_slice_mode_axis=Fully_Registered +CSET register_slice_mode_rach=Fully_Registered +CSET register_slice_mode_rdch=Fully_Registered +CSET register_slice_mode_wach=Fully_Registered +CSET register_slice_mode_wdch=Fully_Registered +CSET register_slice_mode_wrch=Fully_Registered +CSET reset_pin=true +CSET reset_type=Asynchronous_Reset +CSET ruser_width=1 +CSET synchronization_stages=2 +CSET synchronization_stages_axi=2 +CSET tdata_width=64 +CSET tdest_width=4 +CSET tid_width=8 +CSET tkeep_width=4 +CSET tstrb_width=4 +CSET tuser_width=4 +CSET underflow_flag=false +CSET underflow_flag_axi=false +CSET underflow_sense=Active_High +CSET underflow_sense_axi=Active_High +CSET use_clock_enable=false +CSET use_dout_reset=true +CSET use_embedded_registers=false +CSET use_extra_logic=true +CSET valid_flag=false +CSET valid_sense=Active_High +CSET wach_type=FIFO +CSET wdch_type=FIFO +CSET wrch_type=FIFO +CSET write_acknowledge_flag=false +CSET write_acknowledge_sense=Active_High +CSET write_clock_frequency=1 +CSET write_data_count=false +CSET write_data_count_width=12 +CSET wuser_width=1 +# END Parameters +# BEGIN Extra information +MISC pkg_timestamp=2012-11-19T12:39:56Z +# END Extra information +GENERATE +# CRC: 3eb4d24e diff --git a/fpga/syn/Makefile b/fpga/syn/Makefile new file mode 100644 index 0000000..7590a1c --- /dev/null +++ b/fpga/syn/Makefile @@ -0,0 +1,235 @@ +# ############################################################################# +# Copyright (c) 2013 Benjamin Krill +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# ############################################################################# +PROJECT_DEFAULT = atlys_sig +PROJECT_NAME ?= $(PROJECT_DEFAULT) +PROJECT_DIR = $(PROJECT_NAME)_build +PROJECT_SRC = ../src +PROJECT_SRC_TOP = $(PROJECT_SRC)/top +PROJECT_UCF = $(PROJECT_SRC_TOP)/$(PROJECT_NAME).ucf + +##### BUILD FLAGS ############################# +FPGA_PART = $(shell grep FPGA_PART $(PROJECT_UCF) | cut -d'=' -f2) +XST_FLAGS = -intstyle silent +NGDBUILD_FLAGS = -intstyle silent -dd _ngo +NGDBUILD_FLAGS += $(if $(PROJECT_UCF),-uc ../,)$(PROJECT_UCF) +MAP_FLAGS = -intstyle silent -w -logic_opt off -ol high -t 1 -xt 0 -register_duplication off -r 4 \ + -global_opt off -mt off -ir off -pr off -lc off -power off +PAR_FLAGS = -w -intstyle silent -ol high -mt off +TRCE_FLAGS = -intstyle silent -v 3 -s 3 -n 3 -fastpaths +BITGEN_FLAGS = -intstyle silent + +##### SOURCE FILES ############################ +COMMON_SRCS = $(PROJECT_SRC)/snippets/vhdl/rrarbiter.vhd + +FX2_TOP_DIR = ../../fx2/fpga +USB_NGCS = $(FX2_TOP_DIR)/vendor/xilinx/usb_fifo_tx.ngc $(FX2_TOP_DIR)/vendor/xilinx/usb_fifo_rx.ngc \ + $(FX2_TOP_DIR)/vendor/xilinx/usb_fifo_tx_fin.ngc +USB_SRCS = $(FX2_TOP_DIR)/f2p/strm_package.vhd $(FX2_TOP_DIR)/f2p/f2p_master.vhd \ + $(FX2_TOP_DIR)/f2p/f2p_strm_top.vhd $(FX2_TOP_DIR)/strm_ddr2/strm_ddr2.vhd \ + $(FX2_TOP_DIR)/strm_regfile/strm_regfile.vhd + +DVI_TOP_DIR = $(PROJECT_SRC)/dvi +DVI_SRCS = $(DVI_TOP_DIR)/dvi_package.vhd $(DVI_TOP_DIR)/serdes_1_to_5_diff_data.vhd $(DVI_TOP_DIR)/DRAM16XN.vhd \ + $(DVI_TOP_DIR)/phsaligner.vhd $(DVI_TOP_DIR)/chnlbond.vhd $(DVI_TOP_DIR)/serdes_n_to_1.vhd \ + $(DVI_TOP_DIR)/encoder.vhd $(DVI_TOP_DIR)/decoder.vhd $(DVI_TOP_DIR)/convert_30to15_fifo.vhd \ + $(DVI_TOP_DIR)/dvi_encoder.vhd $(DVI_TOP_DIR)/dvi_decoder.vhd + +I2C_TOP_DIR = $(PROJECT_SRC)/i2c +I2C_SRCS = $(I2C_TOP_DIR)/slave/i2c_slave.vhd $(I2C_TOP_DIR)/slave/i2c_rom.vhd + +DDR2_TOP_DIR = $(PROJECT_SRC)/vendor/xilinx/atlys_ddr2/ddr2/user_design/rtl/ +DDR2_SRCS = $(DDR2_TOP_DIR)/iodrp_controller.vhd $(DDR2_TOP_DIR)/mcb_raw_wrapper.vhd \ + $(DDR2_TOP_DIR)/iodrp_mcb_controller.vhd $(DDR2_TOP_DIR)/mcb_soft_calibration_top.vhd \ + $(DDR2_TOP_DIR)/mcb_soft_calibration.vhd $(DDR2_TOP_DIR)/memc3_infrastructure.vhd \ + $(DDR2_TOP_DIR)/memc3_wrapper.vhd $(DDR2_TOP_DIR)/ddr2.vhd + +SIG_TOP_DIR = $(PROJECT_SRC)/sig +SIG_NGCS = $(PROJECT_SRC)/vendor/xilinx/px_fifo.ngc +SIG_SRCS = $(SIG_TOP_DIR)/sig_read.vhd $(SIG_TOP_DIR)/sig_write.vhd $(SIG_TOP_DIR)/sig.vhd \ + $(SIG_TOP_DIR)/ddr2dvi.vhd $(SIG_TOP_DIR)/dvi2ddr.vhd + +NGCS = $(USB_NGCS) $(SIG_NGCS) +SRCS = $(NGCS:%.ngc=%.vhd) \ + $(COMMON_SRCS) \ + $(DVI_SRCS) \ + $(I2C_SRCS) \ + $(DDR2_SRCS) \ + $(USB_SRCS) \ + $(SIG_SRCS) \ + $(PROJECT_SRC_TOP)/$(PROJECT_NAME).vhd + +##### RUN SCRIPTS ############################# +define XST_SCRIPT +set -tmpdir "tmp" +set -xsthdpdir "xst" +run +-ifn $(PROJECT_NAME).prj +-ofn $(PROJECT_NAME) +-ofmt NGC +-p $(FPGA_PART) +-top $(PROJECT_NAME) +-opt_mode Speed +-opt_level 1 +-power NO +-iuc NO +-keep_hierarchy No +-netlist_hierarchy As_Optimized +-rtlview Yes +-glob_opt AllClockNets +-read_cores YES +-write_timing_constraints NO +-cross_clock_analysis NO +-hierarchy_separator / +-bus_delimiter <> +-case Maintain +-slice_utilization_ratio 100 +-bram_utilization_ratio 100 +-dsp_utilization_ratio 100 +-lc Auto +-reduce_control_sets Auto +-fsm_extract YES -fsm_encoding Auto +-safe_implementation No +-fsm_style LUT +-ram_extract Yes +-ram_style Auto +-rom_extract Yes +-shreg_extract YES +-rom_style Auto +-auto_bram_packing NO +-resource_sharing YES +-async_to_sync NO +-shreg_min_size 2 +-use_dsp48 Auto +-iobuf YES +-max_fanout 100000 +-bufg 16 +-register_duplication YES +-register_balancing NO +-optimize_primitives NO +-use_clock_enable Auto +-use_sync_set Auto +-use_sync_reset Auto +-iob Auto +-equivalent_register_removal YES +-slice_utilization_ratio_maxmargin 5 +endef +export XST_SCRIPT + +define BITGEN_FILE +-w +-g DebugBitstream:No +-g Binary:no +-g CRC:Enable +-g Reset_on_err:No +-g ConfigRate:2 +-g ProgPin:PullUp +-g TckPin:PullUp +-g TdiPin:PullUp +-g TdoPin:PullUp +-g TmsPin:PullUp +-g UnusedPin:PullDown +-g UserID:0xFFFFFFFF +-g ExtMasterCclk_en:No +-g SPI_buswidth:1 +-g TIMER_CFG:0xFFFF +-g multipin_wakeup:No +-g StartUpClk:CClk +-g DONE_cycle:4 +-g GTS_cycle:5 +-g GWE_cycle:6 +-g LCK_cycle:NoWait +-g Security:None +-g DonePipe:Yes +-g DriveDone:No +-g en_sw_gsr:No +-g drive_awake:No +-g sw_clk:Startupclk +-g sw_gwe_cycle:5 +-g sw_gts_cycle:4 +endef +export BITGEN_FILE + +##### PRINT ################################### +PW=\033[1m\033[0m +GR=\E[40;32m +WH=\E[40;37m +B=\033[1m +pr_info = "$(B) $(GR)[$(1)]\t $(WH)$(2)$(PW)" + +TARGETS = build help prep syn ngd map par trce bit flash clean +VAR_TARGETS = $(PROJECT_DIR)/tmp $(PROJECT_DIR)/$(PROJECT_NAME).ngc $(PROJECT_DIR)/$(PROJECT_NAME).ngd \ + $(PROJECT_DIR)/$(PROJECT_NAME)_map.ncd $(PROJECT_DIR)/$(PROJECT_NAME).pcf \ + $(PROJECT_DIR)/$(PROJECT_NAME).ncd $(PROJECT_DIR)/$(PROJECT_NAME).twr \ + $(PROJECT_DIR)/$(PROJECT_NAME).bit +##### BUILD RULES ############################# +.SILENT: help $(if $(V),,$(TARGETS) $(VAR_TARGETS)) +.PHONY: $(TARGETS) + +help: + echo -e "$$ make PROJECT_NAME= [V=1]" + echo -e "\tprojects (*=default) .. : $(subst $(PROJECT_DEFAULT),*$(PROJECT_DEFAULT),$(subst $(PROJECT_SRC_TOP)/,,$(subst .ucf,,$(wildcard $(PROJECT_SRC_TOP)/*.ucf))))" + echo -e "\trule .................. : $(TARGETS)" + echo -e "\tV ..................... : verbose" + +prep $(PROJECT_DIR)/tmp: $(SRCS) + echo -e $(call pr_info,PREP,Build ENV for $(PROJECT_NAME)) + mkdir -p $(PROJECT_DIR)/tmp + rm -f $(PROJECT_DIR)/$(PROJECT_NAME).prj + for s in $(SRCS); do \ + if [ "$${s##*.}" = "vhd" ]; then echo "vhdl work \"../$$s\"" >> $(PROJECT_DIR)/$(PROJECT_NAME).prj; fi; \ + if [ "$${s##*.}" = "v" ]; then echo "verilog work \"../$$s\"" >> $(PROJECT_DIR)/$(PROJECT_NAME).prj; fi; \ + done + echo "$$XST_SCRIPT" > $(PROJECT_DIR)/$(PROJECT_NAME).xst + +syn $(PROJECT_DIR)/$(PROJECT_NAME).ngc: $(PROJECT_DIR)/tmp + echo -e $(call pr_info,NGC,Link prebuild IP Cores) + for n in $(NGCS); do ln -sf ../$$n $(PROJECT_DIR)/${n##*/}; done + echo -e $(call pr_info,XST,Synthesis) + cd $(PROJECT_DIR) && xst $(XST_FLAGS) -ifn $(PROJECT_NAME).xst -ofn $(PROJECT_NAME).syr + +ngd $(PROJECT_DIR)/$(PROJECT_NAME).ngd: $(PROJECT_DIR)/$(PROJECT_NAME).ngc $(PROJECT_UCF) + echo -e $(call pr_info,NGD,Native Generic Database) + cd $(PROJECT_DIR) && ngdbuild $(NGDBUILD_FLAGS) -p $(FPGA_PART) $(PROJECT_NAME).ngc $(PROJECT_NAME).ngd + +map $(PROJECT_DIR)/$(PROJECT_NAME)_map.ncd $(PROJECT_DIR)/$(PROJECT_NAME).pcf: $(PROJECT_DIR)/$(PROJECT_NAME).ngd + echo -e $(call pr_info,MAP,Mapping Logic) + cd $(PROJECT_DIR) && map $(MAP_FLAGS) -p $(FPGA_PART) -o $(PROJECT_NAME)_map.ncd $(PROJECT_NAME).ngd $(PROJECT_NAME).pcf + +par $(PROJECT_DIR)/$(PROJECT_NAME).ncd: $(PROJECT_DIR)/$(PROJECT_NAME)_map.ncd $(PROJECT_DIR)/$(PROJECT_NAME).pcf + echo -e $(call pr_info,PAR,Place and Route) + cd $(PROJECT_DIR) && par $(PAR_FLAGS) $(PROJECT_NAME)_map.ncd $(PROJECT_NAME).ncd $(PROJECT_NAME).pcf + +trce $(PROJECT_DIR)/$(PROJECT_NAME).twr: $(PROJECT_DIR)/$(PROJECT_NAME).ncd + echo -e $(call pr_info,TRCE,Timing analyzes) + cd $(PROJECT_DIR) && trce $(TRCE_FLAGS) -xml $(PROJECT_NAME).twx $(PROJECT_NAME).ncd -o $(PROJECT_NAME).twr $(PROJECT_NAME).pcf + +bit build $(PROJECT_DIR)/$(PROJECT_NAME).bit: $(PROJECT_DIR)/$(PROJECT_NAME).ncd $(PROJECT_DIR)/$(PROJECT_NAME).twr + echo -e $(call pr_info,BITG,Bitfile Generation) + echo "$$BITGEN_FILE" > $(PROJECT_DIR)/$(PROJECT_NAME).ut + cd $(PROJECT_DIR) && bitgen $(BITGEN_FLAGS) -f $(PROJECT_NAME).ut $(PROJECT_NAME).ncd + +flash: $(PROJECT_DIR)/$(PROJECT_NAME).bit + echo -e "setmode -bs\nsetCable -p auto\nIdentify -inferir\nidentifyMPM\nassignFile -p 1 -file "$$PWD/$(PROJECT_DIR)/$(PROJECT_NAME).bit"\nprogram -p 1\nquit\n" | impact -batch + +clean: + echo -e $(call pr_info,RM,delete project directory) + rm -rf $(PROJECT_DIR) diff --git a/fpga/syn/syn.gise b/fpga/syn/syn.gise new file mode 100644 index 0000000..3e71169 --- /dev/null +++ b/fpga/syn/syn.gise @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + 11.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fpga/syn/syn.xise b/fpga/syn/syn.xise new file mode 100644 index 0000000..7b6a361 --- /dev/null +++ b/fpga/syn/syn.xise @@ -0,0 +1,513 @@ + + + +

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fpga/tools/edid2dat.sh b/fpga/tools/edid2dat.sh new file mode 100755 index 0000000..8d04378 --- /dev/null +++ b/fpga/tools/edid2dat.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# ############################################################################# +# Copyright (c) 2013 Benjamin Krill +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# ############################################################################# + +if [ $# != 1 ]; then + echo "$0 " + exit -1; +fi + +ofile=$1 + +monitor-get-edid | xxd -i1 | sed 's/ //g' | sed 's/,$//' | sed 's/,/\n/g' | sed 's/0x//' > $ofile diff --git a/fpga/tools/edid_extract_timing.sh b/fpga/tools/edid_extract_timing.sh new file mode 100755 index 0000000..5b03d54 --- /dev/null +++ b/fpga/tools/edid_extract_timing.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# ############################################################################# +# Copyright (c) 2013 Benjamin Krill +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# ############################################################################# + +if [ $# != 1 ]; then + echo "$0 " + exit -1; +fi + +ifile=$1 + +c=0; +for i in `cat $ifile`; do + if [ $[ c % 16 ] -eq 0 ]; then + echo + printf "%04x: " $c + fi + printf " %02x" 0x$i; + d[$c]=$i; + c=$[ $c + 1 ]; +done; +echo; echo + +echo "Pixel Clock Freq: $[ 0x${d[0x37]}${d[0x36]} * 10000 ] Hz" +tmp=$[ (0x${d[0x3a]} & 0xf0) << 4 | 0x${d[0x38]}] +printf "Horizontal Active: %d | x\"%x\"\n" $tmp $tmp +tmp=$[ (0x${d[0x3a]} & 0x0f) << 8 | 0x${d[0x39]}] +printf "Horizontal Blanking: %d | x\"%x\"\n" $tmp $tmp +tmp=$[ (0x${d[0x3d]} & 0xf0) << 4 | 0x${d[0x3b]}] +printf "Vertical Active: %d | x\"%x\"\n" $tmp $tmp +tmp=$[ (0x${d[0x3d]} & 0x0f) << 8 | 0x${d[0x3c]}] +printf "Vertical Blanking: %d | x\"%x\"\n" $tmp $tmp + +tmp=$[ (0x${d[0x41]} & 0xc0) << 2 | 0x${d[0x3e]}] +printf "Horizontal Sync. Offset: %d | x\"%x\"\n" $tmp $tmp +tmp=$[ (0x${d[0x41]} & 0x30) << 4 | 0x${d[0x3f]}] +printf "Horizontal Sync. Pulse Width: %d | x\"%x\"\n" $tmp $tmp + +tmp=$[ (0x${d[0x41]} & 0x0c) << 2 | (0x${d[0x40]} >> 4) ] +printf "Vertical Sync. Offset: %d | x\"%x\"\n" $tmp $tmp +tmp=$[ (0x${d[0x41]} & 0x03) | (0x${d[0x40]} & 0x0f) ] +printf "Vertical Sync. Pulse Width: %d | x\"%x\"\n" $tmp $tmp diff --git a/fx2 b/fx2 new file mode 160000 index 0000000..4d59d22 --- /dev/null +++ b/fx2 @@ -0,0 +1 @@ +Subproject commit 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 z%0A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