📄 ddr_6to1_16chan_rt_rx.vhd
字号:
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 + -