⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddr_6to1_16chan_rt_rx.vhd

📁 FPGA之间的LVDS传输
💻 VHD
📖 第 1 页 / 共 5 页
字号:
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";

BEGIN
   DATA_FROM_ISERDES <= DATA_FROM_ISERDES_TEMP;
   RXCLK <= RXCLK_TEMP;

   TRAINING_DONE <= TRAINING_DONE_TEMP;

   INC_DELAY <= INC_PULSE ;
   ICE_DELAY <= INC_PULSE OR DEC_PULSE ;

   
RXCLKDIV <= RXCLKDIV_TEMP;

   --IDELAYCTRL MODULE

   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 => "3" )
      PORT MAP (
         O => RXCLKDIV_TEMP,
         CE => '1',
         CLR => '0',
         I => CLOCK_RX_ISERDES_OUT);   
   

   -- 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 "0000" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(5 DOWNTO 0);    
                  INC_TO_ISERDES <= "000000000000000" & INC_FROM_MACHINE;    
                  ICE_TO_ISERDES <= "000000000000000" & ICE_FROM_MACHINE;    
                  BITSLIP_TO_ISERDES <= "000000000000000" &    
                                           BITSLIP_FROM_MACHINE;    
            WHEN "0001" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(11 DOWNTO 6);    
                  INC_TO_ISERDES <= "00000000000000" & INC_FROM_MACHINE & '0';    
                  ICE_TO_ISERDES <= "00000000000000" & ICE_FROM_MACHINE & '0';    
                  BITSLIP_TO_ISERDES <= "00000000000000" & 
                     BITSLIP_FROM_MACHINE & '0';    
            WHEN "0010" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(17 DOWNTO 12);    
                  INC_TO_ISERDES <= "0000000000000" & INC_FROM_MACHINE & "00";    
                  ICE_TO_ISERDES <= "0000000000000" & ICE_FROM_MACHINE & "00";    
                  BITSLIP_TO_ISERDES <= "0000000000000" & 
                     BITSLIP_FROM_MACHINE & "00";    
            WHEN "0011" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(23 DOWNTO 18);    
                  INC_TO_ISERDES <= "000000000000" & INC_FROM_MACHINE & "000";    
                  ICE_TO_ISERDES <= "000000000000" & ICE_FROM_MACHINE & "000";    
                  BITSLIP_TO_ISERDES <= "000000000000" & 
                     BITSLIP_FROM_MACHINE & "000";    
            WHEN "0100" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(29 DOWNTO 24);    
                  INC_TO_ISERDES <= "00000000000" & INC_FROM_MACHINE & "0000";    
                  ICE_TO_ISERDES <= "00000000000" & ICE_FROM_MACHINE & "0000";    
                  BITSLIP_TO_ISERDES <= "00000000000" & 
                     BITSLIP_FROM_MACHINE & "0000";    
            WHEN "0101" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(35 DOWNTO 30);    
                  INC_TO_ISERDES <= "0000000000" & INC_FROM_MACHINE & "00000";    
                  ICE_TO_ISERDES <= "0000000000" & ICE_FROM_MACHINE & "00000";    
                  BITSLIP_TO_ISERDES <= "0000000000" & 
                     BITSLIP_FROM_MACHINE & "00000";    
            WHEN "0110" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(41 DOWNTO 36);    
                  INC_TO_ISERDES <= "000000000" & INC_FROM_MACHINE & "000000";    
                  ICE_TO_ISERDES <= "000000000" & ICE_FROM_MACHINE & "000000";    
                  BITSLIP_TO_ISERDES <= "000000000" & 
                     BITSLIP_FROM_MACHINE & "000000";    
            WHEN "0111" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(47 DOWNTO 42);    
                  INC_TO_ISERDES <= "00000000" & INC_FROM_MACHINE & "0000000";    
                  ICE_TO_ISERDES <= "00000000" & ICE_FROM_MACHINE & "0000000";    
                  BITSLIP_TO_ISERDES <= "00000000" & 
                     BITSLIP_FROM_MACHINE & "0000000";    
            WHEN "1000" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(53 DOWNTO 48);    
                  INC_TO_ISERDES <= "0000000" & INC_FROM_MACHINE & "00000000";    
                  ICE_TO_ISERDES <= "0000000" & ICE_FROM_MACHINE & "00000000";    
                  BITSLIP_TO_ISERDES <= "0000000" & 
                     BITSLIP_FROM_MACHINE & "00000000";    
            WHEN "1001" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(59 DOWNTO 54);    
                  INC_TO_ISERDES <= "000000" & INC_FROM_MACHINE & "000000000";    
                  ICE_TO_ISERDES <= "000000" & ICE_FROM_MACHINE & "000000000";    
                  BITSLIP_TO_ISERDES <= "000000" & 
                     BITSLIP_FROM_MACHINE & "000000000";    
            WHEN "1010" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(65 DOWNTO 60);    
                  INC_TO_ISERDES <= "00000" & INC_FROM_MACHINE & "0000000000";    
                  ICE_TO_ISERDES <= "00000" & ICE_FROM_MACHINE & "0000000000";    
                  BITSLIP_TO_ISERDES <= "00000" & 
                     BITSLIP_FROM_MACHINE & "0000000000";    
            WHEN "1011" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(71 DOWNTO 66);    
                  INC_TO_ISERDES <= "0000" & INC_FROM_MACHINE & "00000000000";    
                  ICE_TO_ISERDES <= "0000" & ICE_FROM_MACHINE & "00000000000";    
                  BITSLIP_TO_ISERDES <= "0000" & BITSLIP_FROM_MACHINE 
                     & "00000000000";    
            WHEN "1100" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(77 DOWNTO 72);    
                  INC_TO_ISERDES <= "000" & INC_FROM_MACHINE & "000000000000";    
                  ICE_TO_ISERDES <= "000" & ICE_FROM_MACHINE & "000000000000";    
                  BITSLIP_TO_ISERDES <= "000" & BITSLIP_FROM_MACHINE 
                     & "000000000000";    
            WHEN "1101" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(83 DOWNTO 78);    
                  INC_TO_ISERDES <= "00" & INC_FROM_MACHINE & "0000000000000";    
                  ICE_TO_ISERDES <= "00" & ICE_FROM_MACHINE & "0000000000000";    
                  BITSLIP_TO_ISERDES <= "00" & BITSLIP_FROM_MACHINE & 
                     "0000000000000";    
            WHEN "1110" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(89 DOWNTO 84);    
                  INC_TO_ISERDES <= '0' & INC_FROM_MACHINE & "00000000000000";    
                  ICE_TO_ISERDES <= '0' & ICE_FROM_MACHINE & "00000000000000";    
                  BITSLIP_TO_ISERDES <= '0' & BITSLIP_FROM_MACHINE & 
                     "00000000000000";    
            WHEN "1111" =>
                  DATA_TO_MACHINE <= DATA_FROM_ISERDES_TEMP(95 DOWNTO 90);    
                  INC_TO_ISERDES <= INC_FROM_MACHINE & "000000000000000";    
                  ICE_TO_ISERDES <= ICE_FROM_MACHINE & "000000000000000";    
                  BITSLIP_TO_ISERDES <= BITSLIP_FROM_MACHINE & 
                     "000000000000000";    
            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 
--VARIATION

RT_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 "0000" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(5 DOWNTO 0);  
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(5 DOWNTO 0); 
                     INC_TO_ISERDES_RT <= "000000000000000" & INC_DATABUS;    
                     ICE_TO_ISERDES_RT <= "000000000000000" & ICE_DATABUS;    
                     INC_TO_MONITOR_RT <= "000000000000000" & INC_MONITOR;    
                     ICE_TO_MONITOR_RT <= "000000000000000" & ICE_MONITOR;    
            WHEN "0001" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(11 DOWNTO 6); 
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(11 DOWNTO 6);    
                     INC_TO_ISERDES_RT <= "00000000000000" & INC_DATABUS & '0';    
                     ICE_TO_ISERDES_RT <= "00000000000000" & ICE_DATABUS & '0';    
                     INC_TO_MONITOR_RT <= "00000000000000" & INC_MONITOR & '0';    
                     ICE_TO_MONITOR_RT <= "00000000000000" & ICE_MONITOR & '0';    
            WHEN "0010" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(17 DOWNTO 12);    
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(17 DOWNTO 12);    
                     INC_TO_ISERDES_RT <= "0000000000000" & INC_DATABUS & "00";    
                     ICE_TO_ISERDES_RT <= "0000000000000" & ICE_DATABUS & "00";    
                     INC_TO_MONITOR_RT <= "0000000000000" & INC_MONITOR & "00";    
                     ICE_TO_MONITOR_RT <= "0000000000000" & ICE_MONITOR & "00";    
            WHEN "0011" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(23 DOWNTO 18);    
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(23 DOWNTO 18);    
                     INC_TO_ISERDES_RT <= "000000000000" & INC_DATABUS & "000";    
                     ICE_TO_ISERDES_RT <= "000000000000" & ICE_DATABUS & "000";    
                     INC_TO_MONITOR_RT <= "000000000000" & INC_MONITOR & "000";    
                     ICE_TO_MONITOR_RT <= "000000000000" & ICE_MONITOR & "000";    
            WHEN "0100" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(29 DOWNTO 24);    
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(29 DOWNTO 24);    
                     INC_TO_ISERDES_RT <= "00000000000" & INC_DATABUS & "0000";    
                     ICE_TO_ISERDES_RT <= "00000000000" & ICE_DATABUS & "0000";    
                     INC_TO_MONITOR_RT <= "00000000000" & INC_MONITOR & "0000";    
                     ICE_TO_MONITOR_RT <= "00000000000" & ICE_MONITOR & "0000";    
            WHEN "0101" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(35 DOWNTO 30);    
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(35 DOWNTO 30);    
                     INC_TO_ISERDES_RT <= "0000000000" & INC_DATABUS & "00000";    
                     ICE_TO_ISERDES_RT <= "0000000000" & ICE_DATABUS & "00000";    
                     INC_TO_MONITOR_RT <= "0000000000" & INC_MONITOR & "00000";    
                     ICE_TO_MONITOR_RT <= "0000000000" & ICE_MONITOR & "00000";    
            WHEN "0110" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(41 DOWNTO 36);    
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(41 DOWNTO 36);    
                     INC_TO_ISERDES_RT <= "000000000" & INC_DATABUS & "000000";    
                     ICE_TO_ISERDES_RT <= "000000000" & ICE_DATABUS & "000000";    
                     INC_TO_MONITOR_RT <= "000000000" & INC_MONITOR & "000000";    
                     ICE_TO_MONITOR_RT <= "000000000" & ICE_MONITOR & "000000";    
            WHEN "0111" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(47 DOWNTO 42);    
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(47 DOWNTO 42);    
                     INC_TO_ISERDES_RT <= "00000000" & INC_DATABUS & "0000000";    
                     ICE_TO_ISERDES_RT <= "00000000" & ICE_DATABUS & "0000000";    
                     INC_TO_MONITOR_RT <= "00000000" & INC_MONITOR & "0000000";    
                     ICE_TO_MONITOR_RT <= "00000000" & ICE_MONITOR & "0000000";    
            WHEN "1000" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(53 DOWNTO 48);    
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(53 DOWNTO 48);    
                     INC_TO_ISERDES_RT <= "0000000" & INC_DATABUS & "00000000";    
                     ICE_TO_ISERDES_RT <= "0000000" & ICE_DATABUS & "00000000";    
                     INC_TO_MONITOR_RT <= "0000000" & INC_MONITOR & "00000000";    
                     ICE_TO_MONITOR_RT <= "0000000" & ICE_MONITOR & "00000000";    
            WHEN "1001" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(59 DOWNTO 54);    
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(59 DOWNTO 54);    
                     INC_TO_ISERDES_RT <= "000000" & INC_DATABUS & "000000000";    
                     ICE_TO_ISERDES_RT <= "000000" & ICE_DATABUS & "000000000";    
                     INC_TO_MONITOR_RT <= "000000" & INC_MONITOR & "000000000";    
                     ICE_TO_MONITOR_RT <= "000000" & ICE_MONITOR & "000000000";    
            WHEN "1010" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(65 DOWNTO 60);    
                     MONITOR_TO_RT <= DATA_FROM_ISERDES_MON(65 DOWNTO 60);    
                     INC_TO_ISERDES_RT <= "00000" & INC_DATABUS & "0000000000";    
                     ICE_TO_ISERDES_RT <= "00000" & ICE_DATABUS & "0000000000";    
                     INC_TO_MONITOR_RT <= "00000" & INC_MONITOR & "0000000000";    
                     ICE_TO_MONITOR_RT <= "00000" & ICE_MONITOR & "0000000000";    
            WHEN "1011" =>
                     DATA_TO_RT <= DATA_FROM_ISERDES_TEMP(71 DOWNTO 66);    

⌨️ 快捷键说明

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