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

📄 bit_align_machine.vhd

📁 FPGA之间的LVDS传输
💻 VHD
📖 第 1 页 / 共 2 页
字号:
--/////////////////////////////////////////////////////////////////////////////----    File Name:  BIT_ALIGN_MACHINE.vhd--      Version:  1.0--         Date:  08/07/06--        Model:  Channel Alignment Module----      Company:  Xilinx, Inc.--  Contributor:  APD Applications Group----   Disclaimer:  XILINX IS PROVIDING THIS DESIGN, CODE, OR--                INFORMATION "AS IS" SOLELY FOR USE IN DEVELOPING--                PROGRAMS AND SOLUTIONS FOR XILINX DEVICES.  BY--                PROVIDING THIS DESIGN, CODE, OR INFORMATION AS--                ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,--                APPLICATION OR STANDARD, XILINX IS MAKING NO--                REPRESENTATION THAT THIS IMPLEMENTATION IS FREE--                FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE--                RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY--                REQUIRE FOR YOUR IMPLEMENTATION.  XILINX--                EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH--                RESPECT TO THE ADEQUACY OF THE IMPLEMENTATION,--                INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR--                REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE--                FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES--                OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR--                PURPOSE.----                (c) Copyright 2006 Xilinx, Inc.--                All rights reserved.----/////////////////////////////////////////////////////////////////////////////-- -- Summary:---- The BIT_ALIGN_MACHINE module analyzes the data input of a single channel-- to determine the optimal clock/data relationship for that channel.  By-- dynamically changing the delay of the data channel (with respect to the -- sampling clock), the machine places the sampling point at the center of-- the data eye.--  -------------------------------------------------------------------------- Library declarations---- Standard IEEE libraries--library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;library unisim;use unisim.vcomponents.all;--ENTITY BIT_ALIGN_MACHINE IS   PORT (      RXCLKDIV    : IN std_logic;   -- RX PARALLEL SIDE CLOCK      RXDATA      : IN std_logic_vector(3 DOWNTO 0);                       -- DATA FROM ONE CHANNEL ONLY      RST         : IN std_logic;   -- RESET ALL CIRCUITRY IN MACHINE      USE_BITSLIP : IN std_logic;   -- OPTION TO BYPASS/INCLUDE BITSLIP FUNCTION      SAP         : IN std_logic;                        -- INDICATES THAT DATA IS STABLE AFTER CHANNEL TRANSITION                     --E.G. MACHINE FINISHES CHANNEL 12 AND GOES ON TO 13      INC         : OUT std_logic;                      -- MACHINE ISSUES DELAY INCREMENT TO APPROPRIATE DATA CHANNEL      ICE         : OUT std_logic;                      -- MACHINE ISSUES DELAY DECREMENT TO APPROPRIATE DATA CHANNEL      BITSLIP      : OUT std_logic;                      -- MACHINE ISSUES BITSLIP COMMAND TO APPROPRIATE DATA CHANNEL      DATA_ALIGNED : OUT std_logic);                      -- FLAG INDICATING ALIGNMENT COMPLETE ON THIS CHANNELEND BIT_ALIGN_MACHINE;ARCHITECTURE translated OF BIT_ALIGN_MACHINE IS---------------------------------------------------------------------------------------- Component Declarationcomponent count_to_128    PORT (      clk                     : IN std_logic;         rst                     : IN std_logic;         count                   : IN std_logic;         ud                      : IN std_logic;         counter_value           : OUT std_logic_vector(6 DOWNTO 0));   end component;component seven_bit_reg_w_ce    PORT (      Q                       : OUT std_logic_vector(6 DOWNTO 0);         CLK                     : IN std_logic;         CE                      : IN std_logic;         D                       : IN std_logic_vector(6 DOWNTO 0);         RST                     : IN std_logic);   end component;---------------------------------------------------------------------------------------- Signal Declaration   SIGNAL COUNT                    :  std_logic;      SIGNAL UD                       :  std_logic;      SIGNAL STORE                    :  std_logic;      SIGNAL STORE_DATA_PREV          :  std_logic;      SIGNAL COUNT_SAMPLE             :  std_logic;      SIGNAL UD_SAMPLE                :  std_logic;      SIGNAL CURRENT_STATE            :  std_logic_vector(4 DOWNTO 0);      SIGNAL NEXT_STATE               :  std_logic_vector(4 DOWNTO 0);      SIGNAL COUNT_VALUE              :  std_logic_vector(6 DOWNTO 0);      SIGNAL HALF_DATA_EYE            :  std_logic_vector(6 DOWNTO 0);      SIGNAL RXDATA_PREV              :  std_logic_vector(3 DOWNTO 0);      SIGNAL COUNT_VALUE_SAMPLE       :  std_logic_vector(6 DOWNTO 0);      SIGNAL CVS                      :  std_logic_vector(6 DOWNTO 0);      SIGNAL CVS_ADJUSTED             :  std_logic_vector(6 DOWNTO 0);      SIGNAL CHECK_PATTERN            :  std_logic_vector(3 DOWNTO 0);      SIGNAL DATA_ALIGNEDx            :  std_logic;   BEGIN   machine_counter_total : count_to_128       PORT MAP (         clk => RXCLKDIV,         rst => RST,         count => COUNT_SAMPLE,         ud => UD_SAMPLE,         counter_value => COUNT_VALUE_SAMPLE);         machine_counter : count_to_128       PORT MAP (         clk => RXCLKDIV,         rst => RST,         count => COUNT,         ud => UD,         counter_value => COUNT_VALUE);         tap_reserve : seven_bit_reg_w_ce       PORT MAP (         Q => CVS,         CLK => RXCLKDIV,         CE => STORE,         D => COUNT_VALUE,         RST => RST);         count_reg : FDR       PORT MAP (         Q => DATA_ALIGNED,         C => RXCLKDIV,         D => DATA_ALIGNEDx,         R => RST);            --STORE ENTIRE DATA BUS FOR COMPARISON AFTER CHANGING DELAY   bit0 : FDRE       PORT MAP (         Q => RXDATA_PREV(0),         C => RXCLKDIV,         CE => STORE_DATA_PREV,         D => RXDATA(0),         R => RST);         bit1 : FDRE       PORT MAP (         Q => RXDATA_PREV(1),         C => RXCLKDIV,         CE => STORE_DATA_PREV,         D => RXDATA(1),         R => RST);         bit2 : FDRE       PORT MAP (         Q => RXDATA_PREV(2),         C => RXCLKDIV,         CE => STORE_DATA_PREV,         D => RXDATA(2),         R => RST);         bit3 : FDRE       PORT MAP (         Q => RXDATA_PREV(3),         C => RXCLKDIV,         CE => STORE_DATA_PREV,         D => RXDATA(3),         R => RST);      --   bit4 : FDRE --      PORT MAP (--         Q => RXDATA_PREV(4),--         C => RXCLKDIV,--         CE => STORE_DATA_PREV,--         D => RXDATA(4),--         R => RST);   --   --   bit5 : FDRE --      PORT MAP (--         Q => RXDATA_PREV(5),--         C => RXCLKDIV,--         CE => STORE_DATA_PREV,--         D => RXDATA(5),--         R => RST);         DATA_ALIGNEDx <= (((NOT CURRENT_STATE(4) AND NOT CURRENT_STATE(3))    AND CURRENT_STATE(2)) AND CURRENT_STATE(1)) AND CURRENT_STATE(0) ;   CHECK_PATTERN <= "1001";--"101100" ;   -- CVS IS A SNAPSHOT OF THE TAP COUNTER.  IT'S VALUE IS THE SIZE OF THE DATA -- VALID WINDOW OUR INTENTION IS TO DECREMENT THE DELAY TO 1/2 THIS VALUE TO BE-- AT THE CENTER OF THE EYE. SINCE IT MAY BE POSSIBLE TO HAVE AN ODD COUNTER -- VALUE, THE HALVED VALUE WILL BE A DECIMAL. IN CASES WHERE CVS IS A DECIMAL,-- WE WILL ROUND UP.  E.G CVS = 4.5, SO DECREMENT 5 TAPS. CVS_ADJUSTED AND-- HALF_DATA_EYE ARE FINE TUNED ADJUSTMENTS FOR OPTIMAL OPERATION AT HIGH RATES      CVS_ADJUSTED <= CVS - "0000001" ;   HALF_DATA_EYE <= '0' & CVS_ADJUSTED(6 DOWNTO 1) + CVS_ADJUSTED(0) ;   --CURRENT STATE LOGIC      PROCESS (RXCLKDIV, RST)   BEGIN      IF (RST = '1') THEN         CURRENT_STATE  <= "00000";          ELSIF (RXCLKDIV'EVENT AND RXCLKDIV = '1') THEN         CURRENT_STATE  <= NEXT_STATE;          END IF;   END PROCESS;   --NEXT_STATE LOGIC      PROCESS (CURRENT_STATE, COUNT_VALUE, USE_BITSLIP, RXDATA,    CHECK_PATTERN, RXDATA_PREV, COUNT_VALUE_SAMPLE, SAP, HALF_DATA_EYE)   BEGIN      CASE CURRENT_STATE IS         WHEN "00000" =>                  IF (SAP = '0') THEN   --RST STATE                     NEXT_STATE <= "00001";                      ELSE                     NEXT_STATE <= "00000";                      END IF;         WHEN "00001" =>      --INITIAL STATE, SAMPLE TRAINING BIT                  IF (RXDATA_PREV /= RXDATA) THEN                     NEXT_STATE <= "01111";                      ELSE                     NEXT_STATE <= "01000";                      END IF;         WHEN "01000" =>       --CHECK SAMPLE TO SEE IF IT IS ON A TRANSITION                  IF (RXDATA_PREV /= RXDATA) THEN                     NEXT_STATE <= "01111";                      ELSE                     IF (COUNT_VALUE_SAMPLE > "0001111") THEN                        NEXT_STATE <= "01011";                         ELSE                        NEXT_STATE <= "01000";                         END IF;                  END IF;         WHEN "01111" =>          --IF SAMPLED POINT IS TRANSITION, EDGE IS                                   --FOUND, SO INC DELAY TO EXIT TRANSITION                  NEXT_STATE <= "01101";             WHEN "01101" =>                  --WAIT 16 CYCLES WHILE APPLYING BITSLIP TO FIND CHECK_PATTERN                                    IF (COUNT_VALUE_SAMPLE > "0001110") THEN                     NEXT_STATE <= "01111";                      ELSE                     IF (RXDATA = CHECK_PATTERN) THEN                        --IF CHECK_PATTERN IS FOUND, WE ARE CLOSE TO END OF                        -- TRANSITION                                                NEXT_STATE <= "01100";                         ELSE                        NEXT_STATE <= "01101";                         END IF;                  END IF;         WHEN "01100" =>   --IDLE (NEEDED FOR COUNTER RESET BEFORE NEXT STATE)                  NEXT_STATE <= "10000";             WHEN "10000" =>   --IDLE (NEEDED FOR STABILIZATION)                  NEXT_STATE <= "00010";             WHEN "00010" =>                  --CHECK SAMPLE AGAIN TO SEE IF WE HAVE EXITED TRANSITION                                    IF (COUNT_VALUE_SAMPLE < "0000011") THEN                     --ALLOW TIME FOR BITSLIP OP TO STABILIZE                                          NEXT_STATE <= "00010";                      ELSE                     IF (RXDATA_PREV /= RXDATA) THEN                        NEXT_STATE <= "01111";                         ELSE                        IF (COUNT_VALUE_SAMPLE > "1111110") THEN                           --SCAN FOR STABILITY FOR 128 CYCLES                                                      NEXT_STATE <= "01110";                            ELSE                           NEXT_STATE <= "00010";                            END IF;                     END IF;                  END IF;         WHEN "01011" =>                  --INITIAL STATE WAS STABLE, SO INC ONCE TO SEARCH FOR TRANS                                    NEXT_STATE <= "00100";             WHEN "00100" =>                  --WAIT 8 CYCLES, COMPARE RXDATA WITH PREVIOUS DATA                                    IF (COUNT_VALUE_SAMPLE < "0000111") THEN                     NEXT_STATE <= "00100";                      ELSE

⌨️ 快捷键说明

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