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

📄 resource_sharing_control.vhd

📁 FPGA之间的LVDS传输
💻 VHD
字号:
--/////////////////////////////////////////////////////////////////////////////----    File Name:  RESOURCE_SHARING_CONTROL.vhd--      Version:  1.0--         Date:  08/07/06--        Model:  Round Robin Channel Alignment----      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 RESOURCE_SHARING_CONTROL module allocates the BIT_ALIGN_MACHINE and RT_WINDOW_MONITORING-- modules to each of the 16 data channels of the interface.  Each channel -- must be aligned one at a time, such that the RESOURCE_SHARING_CONTROL module-- must determine when training on a given channel is complete, and then -- switch the context to the next channel. ---------------------------------------------------------------------------- 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 RESOURCE_SHARING_CONTROL IS   PORT (      CHAN_SEL                : OUT std_logic_vector(4 DOWNTO 0);   -- VECTOR INDICATING CURRENT CHANNEL BEING ALIGNED      ALL_CHANNELS_ALIGNED    : OUT std_logic;   -- SIGNAL THAT ALL CHANNELS ARE ALIGNED      DATA_ALIGNED            : IN std_logic;   -- FLAG: ALIGNMENT DONE ON CURRENT CHANNEL, GO TO NEXT      START_ALIGN             : OUT std_logic;   -- SIGNAL THAT ALIGNMENT PROCESS MAY BEGIN ON NEXT CHANNEL      CLK                     : IN std_logic;   -- CLOCK      RST                     : IN std_logic;   -- RESET      REPEAT_PROC             : IN std_logic);   -- IF SET TO 1, CAUSES PROCEDURE TO REPEAT INFINITELYEND RESOURCE_SHARING_CONTROL;ARCHITECTURE translated OF RESOURCE_SHARING_CONTROL IS   COMPONENT 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 count_to_16x    PORT (      --This module counts from 0 to 16      clk                     : IN std_logic;         rst                     : IN std_logic;         count                   : IN std_logic;         counter_value           : OUT std_logic_vector(4 DOWNTO 0));       END COMPONENT;   SIGNAL COUNT_VALUE              :  std_logic_vector(6 DOWNTO 0);      SIGNAL UD_DELAY                 :  std_logic;      SIGNAL COUNT_DELAY              :  std_logic;      SIGNAL COUNT_CHAN               :  std_logic;      SIGNAL CS                       :  std_logic_vector(2 DOWNTO 0);      SIGNAL NS                       :  std_logic_vector(2 DOWNTO 0);      SIGNAL CHAN_SEL_TEMP            :  std_logic_vector(4 DOWNTO 0);      CONSTANT  INIT         :  std_logic_vector(2 DOWNTO 0) :=  "000";       CONSTANT  INC_CHAN_SEL :  std_logic_vector(2 DOWNTO 0) :=  "001";       CONSTANT  WAIT_8       :  std_logic_vector(2 DOWNTO 0) :=  "010";       CONSTANT  START_NEXT   :  std_logic_vector(2 DOWNTO 0) :=  "011";       CONSTANT  LAST_CHAN    :  std_logic_vector(2 DOWNTO 0) :=  "100";       CONSTANT  TRAIN_DONE   :  std_logic_vector(2 DOWNTO 0) :=  "101";       CONSTANT  IDLE         :  std_logic_vector(2 DOWNTO 0) :=  "110";       CONSTANT  START_LAST   :  std_logic_vector(2 DOWNTO 0) :=  "111";     BEGIN      ALL_CHANNELS_ALIGNED <= (CS(2) AND NOT CS(1)) AND CS(0) ;   CHAN_SEL <= CHAN_SEL_TEMP;  delay_counter : count_to_128       PORT MAP (         clk => CLK,         rst => RST,         count => COUNT_DELAY,         ud => UD_DELAY,         counter_value => COUNT_VALUE);         channel_counter : count_to_16x       PORT MAP (         clk => CLK,         rst => RST,         count => COUNT_CHAN,         counter_value => CHAN_SEL_TEMP);         --CURRENT STATE LOGIC      PROCESS (CLK)   BEGIN
		IF (CLK'EVENT AND CLK = '1') THEN         IF (RST = '1') THEN            CS <= INIT;             ELSE            CS <= NS;             END IF;      END IF;   END PROCESS;	--NEXT_STATE LOGIC	      PROCESS (CS, DATA_ALIGNED, COUNT_VALUE, CHAN_SEL_TEMP, REPEAT_PROC)   BEGIN      CASE CS IS         WHEN INIT =>						IF (COUNT_VALUE < "0001000" OR DATA_ALIGNED = '0')                   THEN                     NS <= INIT;                      ELSE                     NS <= IDLE;                      END IF;         WHEN IDLE =>                  NS <= INC_CHAN_SEL;             WHEN INC_CHAN_SEL =>                  NS <= WAIT_8;             WHEN WAIT_8 =>                  IF (COUNT_VALUE < "0001000") THEN                     NS <= WAIT_8;                      ELSE                     IF (CHAN_SEL_TEMP = "10000") THEN                        NS <= START_LAST;                         ELSE                        NS <= START_NEXT;                         END IF;                  END IF;         WHEN START_NEXT =>                  NS <= INIT;             WHEN START_LAST =>                  NS <= LAST_CHAN;             WHEN LAST_CHAN =>                  IF (COUNT_VALUE < "0001000" OR DATA_ALIGNED = '0')                   THEN                     NS <= LAST_CHAN;                      ELSE                     NS <= TRAIN_DONE;                      END IF;         WHEN TRAIN_DONE =>                  IF (REPEAT_PROC = '0') THEN                     NS <= TRAIN_DONE;                      ELSE                     NS <= INIT;                      END IF;         WHEN OTHERS  =>                  NS <= INIT;                   END CASE;   END PROCESS;   --OUTPUT LOGIC      PROCESS (CS)   BEGIN      CASE CS IS         WHEN INIT =>                  COUNT_CHAN <= '0';                      COUNT_DELAY <= '1';                      UD_DELAY <= '1';                      START_ALIGN <= '0';             WHEN IDLE =>                  COUNT_CHAN <= '0';                      COUNT_DELAY <= '0';                      UD_DELAY <= '0';                      START_ALIGN <= '0';             WHEN INC_CHAN_SEL =>                  COUNT_CHAN <= '1';                      COUNT_DELAY <= '0';                      UD_DELAY <= '0';                      START_ALIGN <= '0';             WHEN WAIT_8 =>                  COUNT_CHAN <= '0';                      COUNT_DELAY <= '1';                      UD_DELAY <= '1';                      START_ALIGN  <= '0';             WHEN START_NEXT =>                  COUNT_CHAN <= '0';                      COUNT_DELAY <= '0';                      UD_DELAY <= '0';                      START_ALIGN  <= '1';             WHEN START_LAST =>                  COUNT_CHAN <= '0';                      COUNT_DELAY <= '0';                      UD_DELAY <= '0';                      START_ALIGN  <= '1';             WHEN LAST_CHAN =>                  COUNT_CHAN <= '0';                      COUNT_DELAY <= '1';                      UD_DELAY <= '1';                      START_ALIGN  <= '0';             WHEN TRAIN_DONE =>                  COUNT_CHAN <= '0';                      COUNT_DELAY <= '0';                      UD_DELAY <= '0';                      START_ALIGN  <= '1';             WHEN OTHERS  =>                  COUNT_CHAN <= '0';                      COUNT_DELAY <= '0';                      UD_DELAY <= '0';                      START_ALIGN  <= '0';                   END CASE;   END PROCESS;END translated;

⌨️ 快捷键说明

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