00001 --**************************************************************
00002 --* *
00003 --* The source code for the ATLAS BCM "AAA" FPGA is made *
00004 --* available via the GNU General Public License (GPL) *
00005 --* unless otherwise stated below. *
00006 --* *
00007 --* In case of problems/questions/bug reports etc. please *
00008 --* contact michael.niegl@cern.ch *
00009 --* *
00010 --**************************************************************
00011
00012 --**************************************************************
00013 --* *
00014 --* $Source: /local/reps/bcmfpga/bcm_aaa/bcm_aaa/ddr2/ddr2_mem_data_write_0.vhd,v $
00015 --* $Revision: 1.3.2.4 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 21:55:52 $ *
00019
00020
00021 --* *
00022 --**************************************************************
00023 -------------------------------------------------------------------------------
00024 -- Copyright (c) 2005 Xilinx, Inc.
00025 -- This design is confidential and proprietary of Xilinx, All Rights Reserved.
00026 -------------------------------------------------------------------------------
00027 -- ____ ____
00028 -- / /\/ /
00029 -- /___/ \ / Vendor: Xilinx
00030 -- \ \ \/ Version: 1.6
00031 -- \ \ Application : MIG
00032 -- / / Filename: ddr2_mem_data_write_0.vhd
00033 -- /___/ /\ Date Last Modified: Wed Jun 1 2005
00034 -- \ \ / \Date Created: Mon May 2 2005
00035 -- \___\/\___\
00036 --
00037 -- Device: Virtex-4
00038 -- Design Name: DDR2_V4
00039 -------------------------------------------------------------------------------
00040
00041
00042 library ieee;
00043
00044 use ieee.std_logic_1164.all;
00045
00046 use ieee.std_logic_unsigned.all;
00047
00048 use ieee.numeric_std.all;
00049 library work;
00050 use work.ddr2_mem_parameters_0.all;
00051 -- pragma translate_off
00052
00053 library unisim;
00054
00055 use unisim.vcomponents.all;
00056 -- pragma translate_on
00057
00058
00059
00060 entity ddr2_mem_data_write_0 is
00061 port (
00062 CLK : in ;
00063 CLK90 : in ;
00064 RESET0 : in ;
00065 RESET90 : in ;
00066 CTRL_DUMMY_WR_SEL : in ;
00067 WDF_DATA : in (dq_width*2-1 downto 0);
00068 MASK_DATA : in (dm_width*2-1 downto 0);
00069 CTRL_WREN : in ;
00070 CTRL_DQS_RST : in ;
00071 CTRL_DQS_EN : in ;
00072 wr_data_fall : out (dq_width-1 downto 0);
00073 wr_data_rise : out (dq_width-1 downto 0);
00074 mask_data_fall : out (data_mask_width-1 downto 0);
00075 mask_data_rise : out (data_mask_width-1 downto 0);
00076 wr_en : out ;
00077 dqs_rst : out ;
00078 dqs_en : out
00079 );
00080 end entity;
00081
00082
00083
00084 architecture arc_data_write of ddr2_mem_data_write_0 is
00085
00086 signal dqs_rst_r1 : ;
00087 signal dqs_rst_r2 : ;
00088 signal dqs_en_r1 : ;
00089 signal dqs_en_r2 : ;
00090 signal dqs_en_r3 : ;
00091 signal wr_en_clk270_r1 : ;
00092 signal wr_en_clk90_r3 : ;
00093 signal dummy_rise_pattern : (dq_width-1 downto 0);
00094 signal dummy_fall_pattern : (dq_width-1 downto 0);
00095 signal dummy_flag : ;
00096 signal CTRL_DUMMY_WR_SEL_270 : ;
00097 signal CTRL_DUMMY_WR_SEL_90 : ;
00098 signal CTRL_DUMMY_WR_SEL_r1 : ;
00099 signal patA : (143 downto 0);
00100 signal pat5 : (143 downto 0);
00101 signal pat9 : (143 downto 0);
00102 signal pat6 : (143 downto 0);
00103
00104 begin
00105
00106 patA <= X"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
00107 pat5 <= X"555555555555555555555555555555555555";
00108 pat9 <= X"999999999999999999999999999999999999";
00109 pat6 <= X"666666666666666666666666666666666666";
00110 dqs_rst <= dqs_rst_r2;
00111 dqs_en <= dqs_en_r3;
00112 wr_en <= wr_en_clk90_r3;
00113
00114 process(CLK90)
00115 begin
00116 if (CLK90'event and CLK90 = '0') then
00117 if (RESET90 = '1') then
00118 wr_en_clk270_r1 <= '0';
00119 dqs_rst_r1 <= '0';
00120 dqs_en_r1 <= '0';
00121 CTRL_DUMMY_WR_SEL_270 <= '0';
00122 else
00123 wr_en_clk270_r1 <= CTRL_WREN;
00124 dqs_rst_r1 <= CTRL_DQS_RST;
00125 dqs_en_r1 <= not CTRL_DQS_EN;
00126 CTRL_DUMMY_WR_SEL_270 <= CTRL_DUMMY_WR_SEL;
00127 end if;
00128 end if;
00129 end process;
00130
00131 process (CLK)
00132 begin
00133 if (CLK'event and CLK = '0') then
00134 if (RESET0 = '1') then
00135 dqs_rst_r2 <= '0';
00136 dqs_en_r2 <= '0';
00137 dqs_en_r3 <= '0';
00138 else
00139 dqs_rst_r2 <= dqs_rst_r1;
00140 dqs_en_r2 <= dqs_en_r1;
00141 dqs_en_r3 <= dqs_en_r2;
00142 end if;
00143 end if;
00144 end process;
00145
00146 process(CLK90)
00147 begin
00148 if (CLK90'event and CLK90 = '1') then
00149 if (RESET90 = '1') then
00150 wr_en_clk90_r3 <= '0';
00151 CTRL_DUMMY_WR_SEL_90 <= '0';
00152 CTRL_DUMMY_WR_SEL_r1 <= '0';
00153 else
00154 wr_en_clk90_r3 <= wr_en_clk270_r1;
00155 CTRL_DUMMY_WR_SEL_90 <= CTRL_DUMMY_WR_SEL_270;
00156 CTRL_DUMMY_WR_SEL_r1 <= CTRL_DUMMY_WR_SEL_90;
00157 end if;
00158 end if;
00159 end process;
00160
00161 process(CLK90)
00162 begin
00163 if (CLK90'event and CLK90 = '1') then
00164 if (RESET90 = '1') then
00165 dummy_rise_pattern <= (others => '0');
00166 dummy_fall_pattern <= (others => '0');
00167 dummy_flag <= '1';
00168
00169 elsif(CTRL_DUMMY_WR_SEL_90 = '1') then
00170 if(dummy_flag = '1') then
00171 dummy_rise_pattern <= patA((dq_width-1) downto 0);
00172 dummy_fall_pattern <= pat5((dq_width-1) downto 0);
00173 else
00174 dummy_rise_pattern <= pat9((dq_width-1) downto 0);
00175 dummy_fall_pattern <= pat6((dq_width-1) downto 0);
00176 end if;
00177 dummy_flag <= not dummy_flag;
00178 end if;
00179 end if;
00180 end process;
00181
00182 wr_data_rise <= dummy_rise_pattern when (CTRL_DUMMY_WR_SEL_r1 = '1') else WDF_DATA((dq_width*2)-1 downto dq_width);
00183 wr_data_fall <= dummy_fall_pattern when (CTRL_DUMMY_WR_SEL_r1 = '1') else WDF_DATA((dq_width-1) downto 0);
00184 mask_data_rise <= (others => '0') when (CTRL_DUMMY_WR_SEL_r1 = '1' or wr_en_clk90_r3 = '0') else MASK_DATA((dm_width*2)-1 downto dm_width);
00185 mask_data_fall <= (others => '0') when (CTRL_DUMMY_WR_SEL_r1 = '1' or wr_en_clk90_r3 = '0') else MASK_DATA((dm_width-1) downto 0);
00186
00187 end arc_data_write;