SURF  1.0
SsiCmdMaster.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : SsiCmdMaster.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-04-09
5 -- Last update: 2015-06-23
6 -------------------------------------------------------------------------------
7 -- Description:
8 -- Block for Command protocol over the VC.
9 -- The receive packet is 4 x 32-bits.
10 -- Word 0 Data[1:0] = VC (unused, legacy)
11 -- Word 0 Data[7:2] = Dest_ID (unused, legacy)
12 -- Word 0 Data[31:8] = CmdCtx[31:0] (unused, legacy)
13 -- Word 1 Data[7:0] = OpCode[7:0]
14 -- Word 1 Data[31:8] = Don't Care
15 -- Word 2 = Don't Care
16 -- Word 3 = Don't Care
17 -------------------------------------------------------------------------------
18 -- This file is part of 'SLAC Firmware Standard Library'.
19 -- It is subject to the license terms in the LICENSE.txt file found in the
20 -- top-level directory of this distribution and at:
21 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
22 -- No part of 'SLAC Firmware Standard Library', including this file,
23 -- may be copied, modified, propagated, or distributed except according to
24 -- the terms contained in the LICENSE.txt file.
25 -------------------------------------------------------------------------------
26 
27 library ieee;
28 use ieee.std_logic_1164.all;
29 use ieee.std_logic_arith.all;
30 use ieee.std_logic_unsigned.all;
31 
32 use work.StdRtlPkg.all;
33 use work.AxiStreamPkg.all;
34 use work.SsiPkg.all;
35 use work.SsiCmdMasterPkg.all;
36 
37 --! @see entity
38  --! @ingroup protocols_ssi
39 entity SsiCmdMaster is
40  generic (
41  TPD_G : time := 1 ns;
42 
43  -- AXI Stream FIFO Config
44  SLAVE_READY_EN_G : boolean := false;
45  BRAM_EN_G : boolean := false;
46  XIL_DEVICE_G : string := "7SERIES"; --Xilinx only generic parameter
47  USE_BUILT_IN_G : boolean := false; --if set to true, this module is only Xilinx compatible only!!!
48  GEN_SYNC_FIFO_G : boolean := false;
49  ALTERA_SYN_G : boolean := false;
50  ALTERA_RAM_G : string := "M9K";
51  CASCADE_SIZE_G : integer range 1 to (2**24) := 1;
52  FIFO_ADDR_WIDTH_G : integer range 4 to 48 := 4;
53  FIFO_FIXED_THRESH_G : boolean := true;
54  FIFO_PAUSE_THRESH_G : integer range 1 to (2**24) := 8;
55 
56  -- AXI Stream Configuration
58  );
59  port (
60 
61  -- Streaming Data Interface
62  axisClk : in sl;
63  axisRst : in sl := '0';
67 
68  -- Command signals
69  cmdClk : in sl;
70  cmdRst : in sl;
71  cmdMaster : out SsiCmdMasterType
72  );
73 end SsiCmdMaster;
74 
75 architecture rtl of SsiCmdMaster is
76 
77  signal fifoAxisMaster : AxiStreamMasterType;
78  signal fifoAxisSlave : AxiStreamSlaveType;
79 
80  type StateType is (IDLE_S, CMD_S, DUMP_S);
81 
82  type RegType is record
83  txnNumber : slv(2 downto 0);
84  cmdMaster : SsiCmdMasterType;
85  end record RegType;
86 
87  constant REG_INIT_C : RegType := (
88  txnNumber => (others => '0'),
89  cmdMaster => SSI_CMD_MASTER_INIT_C
90  );
91 
92  signal r : RegType := REG_INIT_C;
93  signal rin : RegType;
94 
95  constant INT_CONFIG_C : AxiStreamConfigType := ssiAxiStreamConfig(4);
96 
97 begin
98 
99  ----------------------------------
100  -- Fifo
101  ----------------------------------
102  SlaveAxiStreamFifo : entity work.AxiStreamFifoV2
103  generic map (
104  TPD_G => TPD_G,
106  BRAM_EN_G => BRAM_EN_G,
114  FIFO_FIXED_THRESH_G => true,
117  MASTER_AXI_CONFIG_G => INT_CONFIG_C)
118  port map (
119  sAxisClk => axisClk,
120  sAxisRst => axisRst,
123  sAxisCtrl => sAxisCtrl,
124  mAxisClk => cmdClk,
125  mAxisRst => cmdRst,
126  mAxisMaster => fifoAxisMaster,
127  mAxisSlave => fifoAxisSlave);
128 
129 
130  ----------------------------------
131  -- Command State Machine
132  ----------------------------------
133 
134  -- Always read
135  fifoAxisSlave <= AXI_STREAM_SLAVE_FORCE_C;
136 
137  comb : process (cmdRst, fifoAxisMaster, r) is
138  variable v : RegType;
139  begin
140  v := r;
141 
142  -- Init, always read
143  v.cmdMaster.valid := '0';
144 
145 
146  if (fifoAxisMaster.tValid = '1') then
147  v.txnNumber := r.txnNumber + 1;
148 
149  case r.txnNumber is
150  when "000" =>
151  v.cmdMaster.context := fifoAxisMaster.tData(31 downto 8);
152  when "001" =>
153  v.cmdMaster.opCode := fifoAxisMaster.tData(7 downto 0);
154  when "011" =>
155  v.cmdMaster.valid := fifoAxisMaster.tLast and not ssiGetUserEofe(INT_CONFIG_C, fifoAxisMaster);
156  when "100" =>
157  -- Too many txns in frame, freeze counting
158  -- Will auto reset txnNumber to 0 on tLast
159  v.txnNumber := r.txnNumber;
160  when others => null;
161  end case;
162 
163 
164  --if (not axiStreamPacked(INT_CONFIG_C, fifoAxisMaster)) then
165  -- -- Fail frame if any txn is not packed
166  -- v.txnNumber := "100";
167  -- v.cmdMaster.valid := '0';
168  --end if;
169 
170  if (fifoAxisMaster.tLast = '1') then
171  -- Reset frame on tLast or EOFE
172  v.txnNumber := "000";
173  end if;
174 
175  end if;
176 
177  if (cmdRst = '1') then
178  v := REG_INIT_C;
179  end if;
180 
181  rin <= v;
182 
183  cmdMaster <= r.cmdMaster;
184 
185  end process comb;
186 
187  seq : process (cmdClk) is
188  begin
189  if (rising_edge(cmdClk)) then
190  r <= rin after TPD_G;
191  end if;
192  end process seq;
193 
194 end architecture rtl;
195 
FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 9
out sAxisCtrlAxiStreamCtrlType
out sAxisCtrlAxiStreamCtrlType
ALTERA_RAM_Gstring := "M9K"
XIL_DEVICE_Gstring := "7SERIES"
ALTERA_RAM_Gstring := "M9K"
std_logic sl
Definition: StdRtlPkg.vhd:28
SLAVE_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
SLAVE_READY_EN_Gboolean := true
FIFO_FIXED_THRESH_Gboolean := true
in sAxisMasterAxiStreamMasterType
USE_BUILT_IN_Gboolean := false
SLAVE_READY_EN_Gboolean := false
FIFO_PAUSE_THRESH_Ginteger range 1 to ( 2** 24):= 8
GEN_SYNC_FIFO_Gboolean := false
XIL_DEVICE_Gstring := "7SERIES"
out cmdMasterSsiCmdMasterType
out sAxisSlaveAxiStreamSlaveType
slv( 127 downto 0) tData
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
AXI_STREAM_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
TPD_Gtime := 1 ns
BRAM_EN_Gboolean := true
TPD_Gtime := 1 ns
sl valid
Definition: SsiPkg.vhd:66
out sAxisSlaveAxiStreamSlaveType
ALTERA_SYN_Gboolean := false
FIFO_FIXED_THRESH_Gboolean := true
AxiStreamConfigType :=(TSTRB_EN_C => false,TDATA_BYTES_C => 16,TDEST_BITS_C => 4,TID_BITS_C => 0,TKEEP_MODE_C => TKEEP_NORMAL_C,TUSER_BITS_C => 4,TUSER_MODE_C => TUSER_NORMAL_C) AXI_STREAM_CONFIG_INIT_C
BRAM_EN_Gboolean := false
_library_ ieeeieee
in sAxisMasterAxiStreamMasterType
out mAxisMasterAxiStreamMasterType
AxiStreamSlaveType :=(tReady => '1') AXI_STREAM_SLAVE_FORCE_C
FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 4
ALTERA_SYN_Gboolean := false
in mAxisSlaveAxiStreamSlaveType
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
USE_BUILT_IN_Gboolean := false
FIFO_PAUSE_THRESH_Ginteger range 1 to ( 2** 24):= 1
in axisRstsl := '0'
MASTER_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
GEN_SYNC_FIFO_Gboolean := false
std_logic_vector slv
Definition: StdRtlPkg.vhd:29