Skip to content
Snippets Groups Projects
Select Git revision
  • 8e9803ea7606a5b24ddf38da2dfac7369c043222
  • master default protected
  • L2SDP-1102
  • sdptr_lift
  • v1.5.0
  • v1.4.0
  • v1.3.0
  • v1.2.0
  • v1.1.2
  • v1.1.1
  • v1.1.0
  • v1.0.0
12 results

fpga.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    sim_transceiver_serializer.vhd 6.05 KiB
    --------------------------------------------------------------------------------
    --
    -- Copyright (C) 2012
    -- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
    -- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>
    -- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
    --
    -- This program is free software: you can redistribute it and/or modify
    -- it under the terms of the GNU General Public License as published by
    -- the Free Software Foundation, either version 3 of the License, or
    -- (at your option) any later version.
    --
    -- This program is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -- GNU General Public License for more details.
    --
    -- You should have received a copy of the GNU General Public License
    -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
    --
    --------------------------------------------------------------------------------
    
    -- Purpose:
    --   Basic serializer model for fast transceiver simulation
    -- Description:
    --   The model serializes parallel data using 10 serial bits per byte. The two 
    --   extra bits are used to transfer (XGMII) control. The model can represent
    --   any real transceiver encoding scheme (10b/8b, 66b/64b) because it the
    --   modelled line rate does not have to be the same as the true line rate.
    --   The key feature that the model provides is that the parallel data gets
    --   transported via a single 1-bit lane. This allows fast simulation of the 
    --   link using the true port widths. The model also assumes that the
    --   transceivers on both sides of the link use the same tr_clk. Therefore any
    --   delay on the link must be an integer number of tr_clk cycles.
    --   This model can be connected to the transmitter entity serial transmitter
    --   output in simulation. As all serializers in the simualation are
    --   simultaneously released from reset and share the same transceiver
    --   reference clock, we don't need to worry about synchronization and can
    --   simply assign one or more bits per serial group as validity indicator. The
    --   most straightforward is to mimic 10/8 encoding for as far as data rates
    --   and clock ratios are concerned (not the encoding itself):
    --   * User data rate = (8/10)*line data rate
    --   * User clock frequency = User data rate / user data width
    --   * Serial data block size = 10 bits [9..0] LSb sent first
    --     *  [9] = Unused, '0'., indiced by 'x' (so 9/8 encoding would suffice too).
    --     *  [8] = Control bit.
    --     *  [7..0] = Data
    --   * Word/byte alignment is not required because reference clk and rst are
    --     global in simulation: what gets transmitted first is received first.
    --   
    --  The following diagram shows the serialization of the 32-bit word 0x2. The
    --  grid of dots indicates the bit resolution. Note the 1 serial cycle of delay
    --  before the first bit is put on the line.
    --
    --               . _______________________________________ . . . . . . . . . . . . . . . . . . . . .
    -- tr_clk        _|. . . . . . . . . . . . . . . . . . . .|_________________________________________
    --               _ . . _ . . . . . . _ . . . . . . . . . _ . . . . . . . . . _ . . . . . . . . . _ .        
    -- tx_serial_out .|___|.|___________|.|_________________|.|_________________|.|_________________|.|_
    --              
    --               c x 0 1 2 3 4 5 6 7 c x 0 1 2 3 4 5 6 7 c x 0 1 2 3 4 5 6 7 c x 0 1 2 3 4 5 6 7 c x
    --                  |<----- Byte 0 ---->|<----- Byte 1 ---->|<----- Byte 2 ---->|<----- Byte 3 ---->|
    --
    -- Remarks:
    -- . All serializers in the simualation should be simultaneously released from 
    --   reset and have to share the same transceiver reference clock.
    -- . The number of line clock cycles to transmit one data word fits within 1
    --   tr_clk period. After every data word the data is realigned to the tr_clk.
    
    
    LIBRARY IEEE, common_lib;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;
    USE common_lib.common_pkg.ALL;
    
    ENTITY sim_transceiver_serializer IS 
      GENERIC(
        g_data_w         : NATURAL := 32;
        g_tr_clk_period  : TIME := 6.4 ns
      );      
      PORT(
        tb_end        : IN  STD_LOGIC := '0';
        
        tr_clk        : IN  STD_LOGIC;
        tr_rst        : IN  STD_LOGIC;
    
        tx_in_data    : IN  STD_LOGIC_VECTOR(g_data_w-1 DOWNTO 0);
        tx_in_ctrl    : IN  STD_LOGIC_VECTOR(g_data_w/c_byte_w-1 DOWNTO 0);
    
        tx_serial_out : OUT STD_LOGIC
      );
    
    END sim_transceiver_serializer;
    
    
    ARCHITECTURE beh OF sim_transceiver_serializer IS
    
      CONSTANT c_line_clk_period   : TIME    := g_tr_clk_period * 8 / 10 / g_data_w;
      CONSTANT c_tr_clk_period_sim : TIME    := c_line_clk_period * g_data_w * 10 / 8;
    
      CONSTANT c_nof_bytes_per_data : NATURAL := g_data_w / c_byte_w;
    
    BEGIN
     
      p_serialize: PROCESS
        VARIABLE v_tx_in_data : STD_LOGIC_VECTOR(g_data_w-1 DOWNTO 0);
        VARIABLE v_tx_in_ctrl : STD_LOGIC_VECTOR(g_data_w/c_byte_w-1 DOWNTO 0);
      BEGIN
        tx_serial_out <= '0';
        WAIT UNTIL tr_rst='0';
    
        -- Align to tr_clk
        WAIT UNTIL rising_edge(tr_clk);
        v_tx_in_data := tx_in_data;
        v_tx_in_ctrl := tx_in_ctrl;
    
        WHILE tb_end='0' LOOP
          -- Data word serialization cycle
          FOR byte IN 0 TO c_nof_bytes_per_data-1 LOOP
            -- Serialize each data byte using 10 bits per byte on the line
            FOR bit IN 0 TO c_byte_w-1 LOOP
              tx_serial_out <= v_tx_in_data(byte*c_byte_w+bit);   -- Put the 8 data bits of the data byte on the line
              WAIT FOR c_line_clk_period;
            END LOOP;
            tx_serial_out <= v_tx_in_ctrl(byte);                  -- Put the 1 control bit on the line for each byte
            WAIT FOR c_line_clk_period;
            tx_serial_out <= '0';                                 -- Put the 1 unused tenth bit = '0' on the line
            IF byte<c_nof_bytes_per_data-1 THEN
              WAIT FOR c_line_clk_period;  -- exit loop in last line clock cycle
            END IF;
          END LOOP;
          
          -- Realign to tr_clk rising edge if necessary
          WAIT UNTIL rising_edge(tr_clk);
          
          v_tx_in_data := tx_in_data;
          v_tx_in_ctrl := tx_in_ctrl;
        END LOOP;
    
      END PROCESS;
    
    END beh;