ddr_6to1_16chan_rt_rx.vhd

来自「FPGA之间的LVDS传输」· VHDL 代码 · 共 1,696 行 · 第 1/5 页

VHD
1,696
字号
signal RST_BIT_ALIGN_MACHINE:std_logic;--SIGNAL RXCLK_USR_BUF					: std_logic;--SIGNAL RXCLKDIV	: std_logic;attribute DIFF_TERM : string;  attribute DIFF_TERM of RX_DATA_IN_00  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_01  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_02  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_03  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_04  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_05  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_06  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_07  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_08  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_09  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_10  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_11  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_12  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_13  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_14  : label is "TRUE";attribute DIFF_TERM of RX_DATA_IN_15  : label is "TRUE";attribute DIFF_TERM of RX_CNTL  : label is "TRUE";BEGIN   DATA_FROM_ISERDES <= DATA_FROM_ISERDES_TEMP;   --RXCLK <= RXCLK_TEMP;	NOT_RXCLK_TEMP <= not RXCLK_TEMP;   TRAINING_DONE <= TRAINING_DONE_TEMP;   INC_DELAY <= INC_PULSE ;   ICE_DELAY <= INC_PULSE OR DEC_PULSE ;--	OBUF_i : OBUF--		PORT MAP (--         I => RXCLK_TEMP,--         O => RXCLK);      RXCLKDIV <= RXCLKDIV_TEMP;   --IDELAYCTRL MODULE	--wr_en <= DATA_FROM_ISERDES(3) and DATA_FROM_ISERDES(2) and DATA_FROM_ISERDES(1) and DATA_FROM_ISERDES(0);	--wr_en <= DATA_FROM_ISERDES(2) ;	--rd_en <= not empty;	--	U_IBUFG: IBUFG--	PORT MAP--	(--		I=> RXCLK_USR,--		O => RXCLK_USR_BUF--	);			process(RXCLK_USR)	begin		IF (RXCLK_USR'EVENT AND RXCLK_USR = '1') THEN				rd_en <= not almost_empty;				rd_en_reg <= rd_en;	    END IF;   END PROCESS;			process(RXCLK_USR)	begin		IF (RXCLK_USR'EVENT AND RXCLK_USR = '1') THEN				--DATA_RX_FIFO_VLD <=rd_en;				DATA_RX_FIFO_VLD <= rd_en_reg;	--to meet timing for 200MHz timing, adjust if other freq				DATA_RX_FIFO <= dout;      END IF;   END PROCESS;		process(RXCLKDIV_TEMP)	begin		IF (RXCLKDIV_TEMP'EVENT AND RXCLKDIV_TEMP = '1') THEN				din <= DATA_FROM_ISERDES(63 downto 0);				wr_en <= DATA_FROM_ISERDES(64) and DATA_FROM_ISERDES(65) and DATA_FROM_ISERDES(66) and DATA_FROM_ISERDES(67) and TRAINING_DONE_TEMP ;				      END IF;   END PROCESS;   	U_FIFO : fifo_rx 		port map(		din => din,		rd_clk => RXCLK_USR,		rd_en	=> rd_en,		rst => RESET,		wr_clk =>RXCLKDIV_TEMP,		wr_en =>wr_en,		almost_empty =>almost_empty,		almost_full =>open,		dout  => dout,		empty => open,		full => open);		RX_IDELAYCTRL : IDELAYCTRL       PORT MAP (         RDY => IDELAY_READY,         REFCLK => CLK200,         RST => IDELAYCTRL_RESET);            --SOURCE SYNCHRONOUS CLOCK INPUT   SOURCE_SYNC_CLOCK_IN : IBUFDS       GENERIC MAP(         DIFF_TERM => TRUE, IOSTANDARD =>"LVDS_25")       PORT MAP (         O => CLOCK_RX_BUF,         I => CLOCK_RX_P,         IB => CLOCK_RX_N);            --IDELAY IN CLOCK PATH   ISERDES_CLOCK_RX : IODELAY       GENERIC MAP(         IDELAY_TYPE => "FIXED", IDELAY_VALUE => 0,          ODELAY_VALUE => 0, REFCLK_FREQUENCY => 200.00,          HIGH_PERFORMANCE_MODE => true)       PORT MAP (         DATAOUT => CLOCK_RX_ISERDES_OUT,         IDATAIN => CLOCK_RX_BUF,         ODATAIN => '0',         DATAIN => '0',         T => '1',         CE => '0',         INC => '0',         C => '0',         RST => RESET);            --CLOCK BUFFER FOR SERIAL SIDE CLOCK	   RX_CLK_BUFIO : BUFIO       PORT MAP (         O => RXCLK_TEMP,         I => CLOCK_RX_ISERDES_OUT);            --CLOCK BUFFER/DIVIDER FOR PARALLEL SIDE CLOCK   --RX_CLK_BUFR : BUFR    --   GENERIC MAP(    --      BUFR_DIVIDE => "2" )   --   PORT MAP (   --      O => RXCLKDIV_TEMP,   --      CE => '1',   --     CLR => '0',   --      I => CLOCK_RX_ISERDES_OUT);     process(CLOCK_RX_ISERDES_OUT)	begin		if CLOCK_RX_ISERDES_OUT'event and CLOCK_RX_ISERDES_OUT='1' then			RXCLKDIV_TEMP<=not RXCLKDIV_TEMP;		end if;	end process;      -- CHANNEL SELECT LOGIC TO SHARE ALIGNMENT MACHINE    -- RESOURCES IN ROUND ROBIN FASHION      PROCESS (RXCLKDIV_TEMP)   BEGIN      IF (RXCLKDIV_TEMP'EVENT AND RXCLKDIV_TEMP = '1') THEN         CASE CHAN_SEL IS            WHEN "00000" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(3 DOWNTO 0);                      INC_TO_ISERDES <= "0000000000000000" & INC_FROM_MACHINE;                      ICE_TO_ISERDES <= "0000000000000000" & ICE_FROM_MACHINE;                      BITSLIP_TO_ISERDES <= "0000000000000000" &                                               BITSLIP_FROM_MACHINE;                WHEN "00001" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(7 DOWNTO 4);                      INC_TO_ISERDES <= "000000000000000" & INC_FROM_MACHINE & '0';                      ICE_TO_ISERDES <= "000000000000000" & ICE_FROM_MACHINE & '0';                      BITSLIP_TO_ISERDES <= "000000000000000" &                      BITSLIP_FROM_MACHINE & '0';                WHEN "00010" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(11 DOWNTO 8);                      INC_TO_ISERDES <= "00000000000000" & INC_FROM_MACHINE & "00";                      ICE_TO_ISERDES <= "00000000000000" & ICE_FROM_MACHINE & "00";                      BITSLIP_TO_ISERDES <= "00000000000000" &                      BITSLIP_FROM_MACHINE & "00";                WHEN "00011" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(15 DOWNTO 12);                      INC_TO_ISERDES <= "0000000000000" & INC_FROM_MACHINE & "000";                      ICE_TO_ISERDES <= "0000000000000" & ICE_FROM_MACHINE & "000";                      BITSLIP_TO_ISERDES <= "0000000000000" &                      BITSLIP_FROM_MACHINE & "000";                WHEN "00100" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(19 DOWNTO 16);                      INC_TO_ISERDES <= "000000000000" & INC_FROM_MACHINE & "0000";                      ICE_TO_ISERDES <= "000000000000" & ICE_FROM_MACHINE & "0000";                      BITSLIP_TO_ISERDES <= "000000000000" &                      BITSLIP_FROM_MACHINE & "0000";                WHEN "00101" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(23 DOWNTO 20);                      INC_TO_ISERDES <= "00000000000" & INC_FROM_MACHINE & "00000";                      ICE_TO_ISERDES <= "00000000000" & ICE_FROM_MACHINE & "00000";                      BITSLIP_TO_ISERDES <= "00000000000" &                      BITSLIP_FROM_MACHINE & "00000";                WHEN "00110" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(27 DOWNTO 24);                      INC_TO_ISERDES <= "0000000000" & INC_FROM_MACHINE & "000000";                      ICE_TO_ISERDES <= "0000000000" & ICE_FROM_MACHINE & "000000";                      BITSLIP_TO_ISERDES <= "0000000000" &                      BITSLIP_FROM_MACHINE & "000000";                WHEN "00111" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(31 DOWNTO 28);                      INC_TO_ISERDES <= "000000000" & INC_FROM_MACHINE & "0000000";                      ICE_TO_ISERDES <= "000000000" & ICE_FROM_MACHINE & "0000000";                      BITSLIP_TO_ISERDES <= "000000000" &                      BITSLIP_FROM_MACHINE & "0000000";                WHEN "01000" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(35 DOWNTO 32);                      INC_TO_ISERDES <= "00000000" & INC_FROM_MACHINE & "00000000";                      ICE_TO_ISERDES <= "00000000" & ICE_FROM_MACHINE & "00000000";                      BITSLIP_TO_ISERDES <= "00000000" &                      BITSLIP_FROM_MACHINE & "00000000";                WHEN "01001" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(39 DOWNTO 36);                      INC_TO_ISERDES <= "0000000" & INC_FROM_MACHINE & "000000000";                      ICE_TO_ISERDES <= "0000000" & ICE_FROM_MACHINE & "000000000";                      BITSLIP_TO_ISERDES <= "0000000" &                      BITSLIP_FROM_MACHINE & "000000000";                WHEN "01010" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(43 DOWNTO 40);                      INC_TO_ISERDES <= "000000" & INC_FROM_MACHINE & "0000000000";                      ICE_TO_ISERDES <= "000000" & ICE_FROM_MACHINE & "0000000000";                      BITSLIP_TO_ISERDES <= "000000" &                      BITSLIP_FROM_MACHINE & "0000000000";                WHEN "01011" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(47 DOWNTO 44);                      INC_TO_ISERDES <= "00000" & INC_FROM_MACHINE & "00000000000";                      ICE_TO_ISERDES <= "00000" & ICE_FROM_MACHINE & "00000000000";                      BITSLIP_TO_ISERDES <= "00000" & BITSLIP_FROM_MACHINE                      & "00000000000";                WHEN "01100" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(51 DOWNTO 48);                      INC_TO_ISERDES <= "0000" & INC_FROM_MACHINE & "000000000000";                      ICE_TO_ISERDES <= "0000" & ICE_FROM_MACHINE & "000000000000";                      BITSLIP_TO_ISERDES <= "0000" & BITSLIP_FROM_MACHINE                      & "000000000000";                WHEN "01101" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(55 DOWNTO 52);                      INC_TO_ISERDES <= "000" & INC_FROM_MACHINE & "0000000000000";                      ICE_TO_ISERDES <= "000" & ICE_FROM_MACHINE & "0000000000000";                      BITSLIP_TO_ISERDES <= "000" & BITSLIP_FROM_MACHINE &                      "0000000000000";                WHEN "01110" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(59 DOWNTO 56);                      INC_TO_ISERDES <= "00" & INC_FROM_MACHINE & "00000000000000";                      ICE_TO_ISERDES <= "00" & ICE_FROM_MACHINE & "00000000000000";                      BITSLIP_TO_ISERDES <= "00" & BITSLIP_FROM_MACHINE &                      "00000000000000";                WHEN "01111" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(63 DOWNTO 60);                      INC_TO_ISERDES <= '0' & INC_FROM_MACHINE & "000000000000000";                      ICE_TO_ISERDES <= '0' &ICE_FROM_MACHINE & "000000000000000";                      BITSLIP_TO_ISERDES <= '0' & BITSLIP_FROM_MACHINE &                      "000000000000000";				WHEN "10000" =>                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(67 DOWNTO 64);                      INC_TO_ISERDES <=   INC_FROM_MACHINE & "0000000000000000";                      ICE_TO_ISERDES <=  ICE_FROM_MACHINE & "0000000000000000";                      BITSLIP_TO_ISERDES <=  BITSLIP_FROM_MACHINE &                      "0000000000000000";            WHEN OTHERS => NULL;                     END CASE;      END IF;   END PROCESS;--MACHINE THAT ALLOCATES BIT_ALIGN_MACHINE TO EACH OF THE 16 DATA CHANNELS, ONE --AT A TIME    RESOURCE_SHARING_CONTROL_0 : RESOURCE_SHARING_CONTROL       PORT MAP (         CHAN_SEL => CHAN_SEL,         ALL_CHANNELS_ALIGNED => TRAINING_DONE_TEMP,         DATA_ALIGNED => DATA_ALIGNED,         START_ALIGN => START_ALIGN,         CLK => RXCLKDIV_TEMP,         RST => RESET,         REPEAT_PROC => '0');      		 BIT_ALIGN_MACHINE_RESET <= RESET OR RESET_SM(15);--MACHINE THAT ADJUSTS DELAY OF A SINGLE DATA CHANNEL TO OPTIMIZE SAMPLING POINT    BIT_ALIGN_MACHINE_0 : BIT_ALIGN_MACHINE       PORT MAP (         RXCLKDIV => RXCLKDIV_TEMP,         RXDATA => DATA_TO_MACHINE,         RST => BIT_ALIGN_MACHINE_RESET,         USE_BITSLIP => '1',         SAP => START_ALIGN,         INC => INC_FROM_MACHINE,         ICE => ICE_FROM_MACHINE,         BITSLIP => BITSLIP_FROM_MACHINE,         DATA_ALIGNED => DATA_ALIGNED);      --MACHINE THAT ALLOCATES RT_WINDOW_MONITOR TO EACH OF THE 16 DATA CHANNELS, ONE --AT A TIME    RESOURCE_SHARING_CONTROL_1 : RESOURCE_SHARING_CONTROL       PORT MAP (         CHAN_SEL => CHAN_SEL_RT,         ALL_CHANNELS_ALIGNED => open,         DATA_ALIGNED => DATA_ALIGNED_RT,         START_ALIGN => START_ALIGN_RT,         CLK => RXCLKDIV_TEMP,         RST => RESET,         REPEAT_PROC => '1');      --MACHINE THAT ADJUSTS DATA CHANNEL DELAYS IN REAL-TIME TO ACCOUNT FOR VT --VARIATIONRT_WINDOW_MONITOR_TRAINING <= (TRAINING_DONE_TEMP AND RT_MANUAL_DISABLE);   RT_WINDOW_MONITOR_0 : RT_WINDOW_MONITOR       PORT MAP (         CLOCK => RXCLKDIV_TEMP,         RESET => RESET,         TRAINING_DONE => RT_WINDOW_MONITOR_TRAINING,         START => START_ALIGN_RT,         DATA_MASTER => DATA_TO_RT,         DATA_MONITOR => MONITOR_TO_RT,         INC_MONITOR => INC_MONITOR,         ICE_MONITOR => ICE_MONITOR,         INC_DATABUS => INC_DATABUS,         ICE_DATABUS => ICE_DATABUS,         DATA_ALIGNED_RT => DATA_ALIGNED_RT);         --CHANNEL SELECT LOGIC TO SHARE RT_WINDOW_MONITOR IN ROUND ROBIN FASHION      PROCESS (RXCLKDIV_TEMP)   BEGIN      IF (RXCLKDIV_TEMP'EVENT AND RXCLKDIV_TEMP  = '1') THEN         CASE CHAN_SEL_RT IS            WHEN "00000" =>                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(3 DOWNTO 0);                       MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(3 DOWNTO 0);                      INC_TO_ISERDES_RT <= "0000000000000000" & INC_DATABUS;                         ICE_TO_ISERDES_RT <= "0000000000000000" & ICE_DATABUS;    

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?