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)