1 -------------------------------------------------------------------------------     2 -- File       : JesdTxReg.vhd     3 -- Company    : SLAC National Accelerator Laboratory     4 -- Created    : 2015-04-15     5 -- Last update: 2016-02-12     6 -------------------------------------------------------------------------------     7 -- Description: AXI-Lite interface for register access       8 -------------------------------------------------------------------------------     9 -- This file is part of 'SLAC Firmware Standard Library'.    10 -- It is subject to the license terms in the LICENSE.txt file found in the     11 -- top-level directory of this distribution and at:     12 --    https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.     13 -- No part of 'SLAC Firmware Standard Library', including this file,     14 -- may be copied, modified, propagated, or distributed except according to     15 -- the terms contained in the LICENSE.txt file.    16 -------------------------------------------------------------------------------    19 use ieee.std_logic_1164.
all;
    20 use ieee.std_logic_unsigned.
all;
    21 use ieee.std_logic_arith.
all;
    28  --! @ingroup protocols_jesd204b    31       -- General Configurations    35       L_G : positive range 1 to 16 := 2;
    42       -- Axi-Lite Register Interface (locClk domain)    60       enableTx_o      : 
out slv(L_G-1 
downto 0);
    70       enableTestSig_o : 
out sl;
    75       -- TX Configurable Driver Ports    85    type RegType is record    87       enableTx        : slv(L_G-1 
downto 0);
    88       invertData      : slv(L_G-1 downto 0);      
    89       commonCtrl      : slv(6 downto 0);
    92       periodStep      : slv(
31 downto 0);
    93       posAmplitude    : slv(F_G*8-1 downto 0);
    94       negAmplitude    : slv(F_G*8-1 downto 0);
   105    constant REG_INIT_C : RegType := (   106       enableTx        => (
others => '0'),
   107       invertData     => (others => '0'),         108       commonCtrl      => "0110011",   109       sysrefDlyTx     => (others => '0'),   110       --signalSelectArr=> (others => b"0010_0011"), -- Set to squarewave   111       --periodStep     => intToSlv(1,PER_STEP_WIDTH_C) & intToSlv(4096,PER_STEP_WIDTH_C),   112       signalSelectArr => (others => b"0000_0001"),  -- Set to external   113       periodStep      => intToSlv(
1, PER_STEP_WIDTH_C) & intToSlv(
1, PER_STEP_WIDTH_C),
   114       --signalSelectArr=> (others => b"0001_0011"), -- Set to ramp   115       --periodStep     => intToSlv(1,PER_STEP_WIDTH_C) & intToSlv(1,PER_STEP_WIDTH_C),         117       posAmplitude => (others => '1'),   118       negAmplitude => (others => '0'),   129    signal r   : RegType := REG_INIT_C;
   130    signal rin : RegType;
   133    signal s_RdAddr :  := 0;
   134    signal s_WrAddr :  := 0;
   136    -- Synced status signals   139    signal s_adcValids   : slv(L_G-1 downto 0);
   143    ----------------------------------------------------------------------------------------------   144    -- Data Valid Status Counter   145    ----------------------------------------------------------------------------------------------   146    GEN_LANES : for I in L_G-1 downto 0 generate   148    end generate GEN_LANES;
   159       -- Input Status bit Signals (wrClk domain)   161       -- Output Status bit Signals (rdClk domain)     163       -- Status Bit Counters Signals (rdClk domain)    166       -- Clocks and Reset Ports   170    -- Convert address to integer (lower two bits of address are always '0')   175       variable v             : RegType;
   177       variable axilWriteResp : slv(1 downto 0);
   178       variable axilReadResp  : slv(1 downto 0);
   180       -- Latch the current value   183       ----------------------------------------------------------------------------------------------   184       -- Axi-Lite interface   185       ----------------------------------------------------------------------------------------------   191             when 16#00# =>              -- ADDR (0x0)   193             when 16#01# =>              -- ADDR (0x4)   195             when 16#02# =>              -- ADDR (0x8)   197             when 16#03# =>              -- ADDR (0xC)   199             when 16#04# =>              -- ADDR (0x10)   201             when 16#05# =>              -- ADDR (0x14)   203             when 16#06# =>              -- ADDR (0x18)   205             when 16#07# =>              -- ADDR (0x1C)   207             when 16#08# =>              -- ADDR (0x20)   209             when 16#20# to 16#2F# =>   210                for I in (L_G-1) downto 0 loop   215             when 16#80# to 16#9F# =>   216                for I in (L_G-1) downto 0 loop   233             when 16#00# =>              -- ADDR (0x0)   235             when 16#01# =>              -- ADDR (0x4)   237             when 16#02# =>              -- ADDR (0x8)   239             when 16#03# =>              -- ADDR (0xC)   241             when 16#04# =>              -- ADDR (0x10)   243             when 16#05# =>              -- ADDR (0x14)   245             when 16#06# =>              -- ADDR (0x18)   247             when 16#07# =>              -- ADDR (0x1C)   249             when 16#08# =>              -- ADDR (0x20)   251             when 16#10# to 16#1F# =>   252                for I in (L_G-1) downto 0 loop   257             when 16#20# to 16#2F# =>   258                for I in (L_G-1) downto 0 loop   264             when 16#40# to 16#4F# =>   265                for I in (L_G-1) downto 0 loop   267                      for J in 31 downto 0 loop   272             when 16#80# to 16#9F# =>   273                for I in (L_G-1) downto 0 loop   291       -- Register the variable for next clock cycle   308          r <= rin after TPD_G;
   312    -- Input assignment and synchronization   313    GEN_0 : for I in L_G-1 downto 0 generate   323             dout   => s_statusTxArr
(I
)   328    -- Output assignment and synchronization   337          din    => r.sysrefDlyTx,
   362          dataIn  => r.commonCtrl
(0),
   373          dataIn  => r.commonCtrl
(1),
   384          dataIn  => r.commonCtrl
(2),
   395          dataIn  => r.commonCtrl
(3),
   406          dataIn  => r.commonCtrl
(4),
   417          dataIn  => r.commonCtrl
(5),
   428          dataIn  => r.commonCtrl
(6),
   453          din    => r.periodStep
(16+PER_STEP_WIDTH_C-
1 downto 16),
   466          din    => r.posAmplitude,
   479          din    => r.negAmplitude,
   496    GEN_1 : for I in L_G-1 downto 0 generate   505             din    => r.signalSelectArr
(I
)(2 downto 0),
   518             din    => r.signalSelectArr
(I
)(5 downto 4),
   523 --------------------------------------------------------------------- 
out loopbackslv(   L_G- 1 downto  0)  
 
out negAmplitude_oslv(   F_G* 8- 1 downto  0)  
 
array(natural range <> ) of slv( 2 downto  0)   Slv3Array
 
out txPreCursorSlv8Array(   L_G- 1 downto  0)  
 
positive  := 16 PER_STEP_WIDTH_C
 
in rstsl  :=not    RST_POLARITY_G
 
array(natural range <> ) of slv((   TX_STAT_WIDTH_C)- 1 downto  0)   txStatuRegisterArray
 
in dinslv(   DATA_WIDTH_G- 1 downto  0)  
 
out axilWriteSlaveAxiLiteWriteSlaveType  
 
positive  := 6 TX_STAT_WIDTH_C
 
array(natural range <> ,natural range <> ) of sl   SlVectorArray
 
PIPE_STAGES_Gnatural   range  0 to  16:= 0
 
out sigTypeArr_oSlv2Array(   L_G- 1 downto  0)  
 
out squarePeriod_oslv(   PER_STEP_WIDTH_C- 1 downto  0)  
 
out cntOutSlVectorArray  (   WIDTH_G- 1 downto  0,   CNT_WIDTH_G- 1 downto  0)
 
out doutslv(   DATA_WIDTH_G- 1 downto  0)  
 
CNT_WIDTH_Gpositive  := 32
 
slv( 1 downto  0)  :=   "10" AXI_RESP_SLVERR_C
 
out sysrefDlyTx_oslv(   SYSRF_DLY_WIDTH_C- 1 downto  0)  
 
in axilWriteMasterAxiLiteWriteMasterType  :=   AXI_LITE_WRITE_MASTER_INIT_C
 
L_Gpositive   range  1 to  16:= 2
 
out txPolarityslv(   L_G- 1 downto  0)  
 
AxiLiteReadSlaveType  :=(arready  => '0',rdata  =>( others => '0'),rresp  =>( others => '0'),rvalid  => '0') AXI_LITE_READ_SLAVE_INIT_C
 
in axilReadMasterAxiLiteReadMasterType  :=   AXI_LITE_READ_MASTER_INIT_C
 
in statusTxArr_itxStatuRegisterArray(   L_G- 1 downto  0)  
 
AXI_ERROR_RESP_Gslv( 1 downto  0)  :=   AXI_RESP_SLVERR_C
 
out invertData_oslv(   L_G- 1 downto  0)  
 
out txDiffCtrlSlv8Array(   L_G- 1 downto  0)  
 
CNT_RST_EDGE_Gboolean  :=   true
 
positive  := 5 SYSRF_DLY_WIDTH_C
 
AxiLiteReadMasterType  :=(araddr  =>( others => '0'),arprot  =>( others => '0'),arvalid  => '0',rready  => '1') AXI_LITE_READ_MASTER_INIT_C
 
out txPostCursorSlv8Array(   L_G- 1 downto  0)  
 
AxiLiteWriteMasterType  :=(awaddr  =>( others => '0'),awprot  =>( others => '0'),awvalid  => '0',wdata  =>( others => '0'),wstrb  =>( others => '1'),wvalid  => '0',bready  => '1') AXI_LITE_WRITE_MASTER_INIT_C
 
slv( 1 downto  0)  :=   "00" AXI_RESP_OK_C
 
array(natural range <> ) of slv( 7 downto  0)   Slv8Array
 
out statusOutslv(   WIDTH_G- 1 downto  0)  
 
AxiLiteWriteSlaveType  :=(awready  => '0',wready  => '0',bresp  =>( others => '0'),bvalid  => '0') AXI_LITE_WRITE_SLAVE_INIT_C
 
out posAmplitude_oslv(   F_G* 8- 1 downto  0)  
 
out muxOutSelArr_oSlv3Array(   L_G- 1 downto  0)  
 
out rampStep_oslv(   PER_STEP_WIDTH_C- 1 downto  0)  
 
out axilReadSlaveAxiLiteReadSlaveType  
 
DATA_WIDTH_Ginteger   range  1 to ( 2** 24):= 16
 
in statusInslv(   WIDTH_G- 1 downto  0)  
 
array(natural range <> ) of slv( 1 downto  0)   Slv2Array
 
out enableTx_oslv(   L_G- 1 downto  0)