SURF  1.0
SsiPrbsRx.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : SsiPrbsRx.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-04-02
5 -- Last update: 2016-10-25
6 -------------------------------------------------------------------------------
7 -- Description: This module generates
8 -- PseudoRandom Binary Sequence (PRBS) on Virtual Channel Lane.
9 -------------------------------------------------------------------------------
10 -- This file is part of 'SLAC Firmware Standard Library'.
11 -- It is subject to the license terms in the LICENSE.txt file found in the
12 -- top-level directory of this distribution and at:
13 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
14 -- No part of 'SLAC Firmware Standard Library', including this file,
15 -- may be copied, modified, propagated, or distributed except according to
16 -- the terms contained in the LICENSE.txt file.
17 -------------------------------------------------------------------------------
18 
19 library ieee;
20 use ieee.std_logic_1164.all;
21 use ieee.std_logic_unsigned.all;
22 use ieee.std_logic_arith.all;
23 
24 use work.StdRtlPkg.all;
25 use work.AxiLitePkg.all;
26 use work.AxiStreamPkg.all;
27 use work.SsiPkg.all;
28 
29 --! @see entity
30  --! @ingroup protocols_ssi
31 entity SsiPrbsRx is
32  generic (
33  -- General Configurations
34  TPD_G : time := 1 ns;
35  STATUS_CNT_WIDTH_G : natural range 1 to 32 := 32;
37  -- FIFO configurations
38  BRAM_EN_G : boolean := true;
39  XIL_DEVICE_G : string := "7SERIES";
40  USE_BUILT_IN_G : boolean := false;
41  GEN_SYNC_FIFO_G : boolean := false;
42  ALTERA_SYN_G : boolean := false;
43  ALTERA_RAM_G : string := "M9K";
44  CASCADE_SIZE_G : natural range 1 to (2**24) := 1;
45  FIFO_ADDR_WIDTH_G : natural range 4 to 48 := 9;
46  FIFO_PAUSE_THRESH_G : natural range 1 to (2**24) := 2**8;
47  -- PRBS Config
48  PRBS_SEED_SIZE_G : natural range 8 to 128 := 32;
49  PRBS_TAPS_G : NaturalArray := (0 => 31, 1 => 6, 2 => 2, 3 => 1);
50  -- AXI Stream IO Config
51  SLAVE_AXI_STREAM_CONFIG_G : AxiStreamConfigType := ssiAxiStreamConfig(4);
52  SLAVE_AXI_PIPE_STAGES_G : natural range 0 to 16 := 0;
53  MASTER_AXI_STREAM_CONFIG_G : AxiStreamConfigType := ssiAxiStreamConfig(4);
54  MASTER_AXI_PIPE_STAGES_G : natural range 0 to 16 := 0);
55  port (
56  -- Streaming RX Data Interface (sAxisClk domain)
57  sAxisClk : in sl;
58  sAxisRst : in sl := '0';
62  -- Optional: Streaming TX Data Interface (mAxisClk domain)
63  mAxisClk : in sl; -- Note: a clock must always be applied to this port
64  mAxisRst : in sl := '0';
67  -- Optional: AXI-Lite Register Interface (axiClk domain)
68  axiClk : in sl := '0';
69  axiRst : in sl := '0';
74  -- Error Detection Signals (sAxisClk domain)
76  errorDet : out sl;-- '1' if any error detected
77  busy : out sl;
79  errLength : out sl;
80  errDataBus : out sl;
81  errEofe : out sl;
82  errWordCnt : out slv(31 downto 0);
83  errbitCnt : out slv(31 downto 0);
84  packetRate : out slv(31 downto 0);
85  packetLength : out slv(31 downto 0));
86 end SsiPrbsRx;
87 
88 architecture rtl of SsiPrbsRx is
89 
90  constant MAX_CNT_C : slv(31 downto 0) := (others => '1');
91  constant PRBS_BYTES_C : natural := wordCount(PRBS_SEED_SIZE_G, 8);
92  constant SLAVE_PRBS_SSI_CONFIG_C : AxiStreamConfigType := ssiAxiStreamConfig(PRBS_BYTES_C, TKEEP_COMP_C);
93  constant MASTER_PRBS_SSI_CONFIG_C : AxiStreamConfigType := ssiAxiStreamConfig(PRBS_BYTES_C, TKEEP_COMP_C);
94 
95  type StateType is (
96  IDLE_S,
97  LENGTH_S,
98  DATA_S,
99  BIT_ERR_S,
100  SEND_RESULT_S);
101 
102  type RegType is record
103  busy : sl;
104  packetLength : slv(31 downto 0);
105  errorDet : sl;
106  eof : sl;
107  eofe : sl;
108  errLength : sl;
109  updatedResults : sl;
111  errDataBus : sl;
112  errWordStrb : sl;
113  errBitStrb : sl;
114  txCnt : slv(3 downto 0);
115  bitPntr : slv(log2(PRBS_SEED_SIZE_G)-1 downto 0);
116  errorBits : slv(PRBS_SEED_SIZE_G-1 downto 0);
117  errWordCnt : slv(31 downto 0);
118  errbitCnt : slv(31 downto 0);
119  eventCnt : slv(PRBS_SEED_SIZE_G-1 downto 0);
120  randomData : slv(PRBS_SEED_SIZE_G-1 downto 0);
121  dataCnt : slv(31 downto 0);
122  stopTime : slv(31 downto 0);
123  startTime : slv(31 downto 0);
124  packetRate : slv(31 downto 0);
125  rxAxisSlave : AxiStreamSlaveType;
126  txAxisMaster : AxiStreamMasterType;
127  state : StateType;
128  end record;
129 
130  constant REG_INIT_C : RegType := (
131  '1',
132  toSlv(2, 32),
133  '0',
134  '0',
135  '0',
136  '0',
137  '0',
138  '0',
139  '0',
140  '0',
141  '0',
142  (others => '0'),
143  (others => '0'),
144  (others => '0'),
145  (others => '0'),
146  (others => '0'),
147  (others => '0'),
148  (others => '0'),
149  (others => '0'),
150  (others => '0'),
151  (others => '1'),
152  (others => '1'),
155  IDLE_S);
156 
157  signal r : RegType := REG_INIT_C;
158  signal rin : RegType;
159 
160  signal txAxisMaster,
161  rxAxisMaster : AxiStreamMasterType;
162 
163  signal txAxisSlave,
164  rxAxisSlave : AxiStreamSlaveType;
165 
166  signal axisCtrl : AxiStreamCtrlArray(0 to 1);
167 
168  constant STATUS_SIZE_C : positive := 10;
169 
170  type LocRegType is record
171  cntRst : sl;
172  dummy : slv(31 downto 0);
173  rollOverEn : slv(STATUS_SIZE_C-1 downto 0);
176  end record;
177 
178  constant LOC_REG_INIT_C : LocRegType := (
179  '1',
180  (others => '0'),
181  (others => '0'),
184 
185  signal rAxiLite : LocRegType := LOC_REG_INIT_C;
186  signal rinAxiLite : LocRegType;
187 
188  signal errBitStrbSync,
189  errWordStrbSync,
190  errDataBusSync,
191  errEofeSync,
192  errLengthSync,
193  errMissedPacketSync : sl;
194 
195  signal overflow,
196  pause : slv(1 downto 0);
197 
198  signal cntOut : SlVectorArray(STATUS_SIZE_C-1 downto 0, STATUS_CNT_WIDTH_G-1 downto 0);
199 
200  signal packetLengthSync,
201  packetRateSync,
202  errbitCntSync,
203  errWordCntSync : slv(31 downto 0);
204 
205  signal pause1Cnt,
206  overflow1Cnt,
207  pause0Cnt,
208  overflow0Cnt,
209  errBitStrbCnt,
210  errWordStrbCnt,
211  errDataBusCnt,
212  errEofeCnt,
213  errLengthCnt,
214  errMissedPacketCnt : slv(STATUS_CNT_WIDTH_G-1 downto 0);
215 
216 begin
217 
218 -- assert (PRBS_SEED_SIZE_G mod 8 = 0) report "PRBS_SEED_SIZE_G must be a multiple of 8" severity failure;
219 
220  sAxisCtrl <= axisCtrl(0);
221 
222  AxiStreamFifo_Rx : entity work.AxiStreamFifoV2
223  generic map(
224  -- General Configurations
225  TPD_G => TPD_G,
228  -- FIFO configurations
229  BRAM_EN_G => BRAM_EN_G,
232  GEN_SYNC_FIFO_G => true,
237  FIFO_FIXED_THRESH_G => true,
239  -- AXI Stream Port Configurations
241  MASTER_AXI_CONFIG_G => SLAVE_PRBS_SSI_CONFIG_C)
242  port map (
243  -- Slave Port
244  sAxisClk => sAxisClk,
245  sAxisRst => sAxisRst,
248  sAxisCtrl => axisCtrl(0),
249  -- Master Port
250  mAxisClk => sAxisClk,
251  mAxisRst => sAxisRst,
252  mAxisMaster => rxAxisMaster,
253  mAxisSlave => rxAxisSlave);
254 
255 
256  comb : process (r, rxAxisMaster, sAxisRst, txAxisSlave) is
257  variable i : integer;
258  variable v : RegType;
259  begin
260  -- Latch the current value
261  v := r;
262 
263  -- Set the AXIS configurations
264  v.txAxisMaster.tKeep := (others => '0');
265  v.txAxisMaster.tStrb := (others => '0');
266  for i in 0 to MASTER_PRBS_SSI_CONFIG_C.TDATA_BYTES_C-1 loop
267  v.txAxisMaster.tKeep(i) := '1';
268  v.txAxisMaster.tStrb(i) := '1';
269  end loop;
270 
271  -- Reset strobe signals
272  v.updatedResults := '0';
273  v.txAxisMaster.tValid := '0';
274  v.txAxisMaster.tLast := '0';
275  v.txAxisMaster.tUser := (others => '0');
276  v.errWordStrb := '0';
277  v.errBitStrb := '0';
278 
279  -- Check for roll over
280  if r.stopTime /= r.startTime then
281  -- Increment the rate counter
282  v.stopTime := r.stopTime + 1;
283  end if;
284 
285  case (r.state) is
286  ----------------------------------------------------------------------
287  when IDLE_S =>
288  -- Reset the flags
289  v.busy := '0';
290  v.errorDet := '0';
291  -- Ready to receive data
292  v.rxAxisSlave.tReady := '1';
293  -- Check for a FIFO read
294  if (rxAxisMaster.tvalid = '1') and (r.rxAxisSlave.tReady = '1') then
295  -- Calculate the time between this packet and the previous one
296  if (r.stopTime = r.startTime) then
297  v.stopTime := r.stopTime + 1;
298  end if;
299  v.packetRate := r.stopTime - r.startTime;
300  v.startTime := r.stopTime;
301  -- Reset the error counters
302  v.errWordCnt := (others => '0');
303  v.errbitCnt := (others => '0');
304  v.errMissedPacket := '0';
305  v.errLength := '0';
306  v.errDataBus := '0';
307  v.eof := '0';
308  v.eofe := '0';
309  -- Check if we have missed a packet
310  if rxAxisMaster.tData(PRBS_SEED_SIZE_G-1 downto 0) /= r.eventCnt then
311  -- Set the error flags
312  v.errMissedPacket := '1';
313  v.errorDet := '1';
314  end if;
315  -- Align the event counter to the next packet
316  v.eventCnt := rxAxisMaster.tData(PRBS_SEED_SIZE_G-1 downto 0) + 1;
317  -- Latch the SEED for the randomization
318  v.randomData := rxAxisMaster.tData(PRBS_SEED_SIZE_G-1 downto 0);
319  -- Check for a data bus error
320 -- for i in 4 to AXI_STREAM_CONFIG_G.TDATA_BYTES_C-1 loop
321 -- if anyBits(rxAxisMaster.tData(i*8+7 downto i*8), '1') then
322 -- v.errDataBus := '1';
323 -- v.errorDet := '1';
324 -- end if;
325 -- end loop;
326  -- Set the busy flag
327  v.busy := '1';
328  -- Increment the counter
329  v.dataCnt := r.dataCnt + 1;
330  -- Next State
331  v.state := LENGTH_S;
332  end if;
333  ----------------------------------------------------------------------
334  when LENGTH_S =>
335  -- Check for a FIFO read
336  if (rxAxisMaster.tvalid = '1') and (r.rxAxisSlave.tReady = '1') then
337  -- Calculate the next data word
338  v.randomData := lfsrShift(r.randomData, PRBS_TAPS_G);
339  -- Latch the packetLength value
340  v.packetLength := rxAxisMaster.tData(31 downto 0);
341  -- Check for a data bus error
342  for i in 4 to SLAVE_PRBS_SSI_CONFIG_C.TDATA_BYTES_C-1 loop
343  if not allBits(rxAxisMaster.tData(i*8+7 downto i*8), '0') then
344  v.errDataBus := '1';
345  v.errorDet := '1';
346  end if;
347  end loop;
348  -- Increment the counter
349  v.dataCnt := r.dataCnt + 1;
350  -- Next State
351  v.state := DATA_S;
352  end if;
353  ----------------------------------------------------------------------
354  when DATA_S =>
355  -- Check for a FIFO read
356  if (rxAxisMaster.tvalid = '1') and (r.rxAxisSlave.tReady = '1') then
357  -- Check for a data bus error
358 -- for i in 0 to (AXI_STREAM_CONFIG_G.TDATA_BYTES_C/4)-1 loop
359 -- if rxAxisMaster.tData(31 downto 0) /= rxAxisMaster.tData(i*32+31 downto i*32) then
360 -- v.errDataBus := '1';
361 -- v.errorDet := '1';
362 -- end if;
363 -- end loop;
364  -- Calculate the next data word
365  v.randomData := lfsrShift(r.randomData, PRBS_TAPS_G);
366  -- Check for end of frame
367  if rxAxisMaster.tLast = '1' then
368  -- Set the local eof flag
369  v.eof := '1';
370  -- Latch the packets eofe flag
371  v.eofe := ssiGetUserEofe(SLAVE_PRBS_SSI_CONFIG_C, rxAxisMaster);
372  -- Check for EOFE
373  if v.eofe = '1' then
374  v.errorDet := '1';
375  end if;
376  -- Check the data packet length
377  if r.dataCnt /= r.packetLength then
378  -- Wrong length detected
379  v.errLength := '1';
380  end if;
381  -- Reset the counter
382  v.dataCnt := (others => '0');
383  -- Stop reading the FIFO
384  v.rxAxisSlave.tReady := '0';
385  -- Next State
386  v.state := SEND_RESULT_S;
387  elsif r.dataCnt /= MAX_CNT_C then
388  -- Increment the counter
389  v.dataCnt := r.dataCnt + 1;
390  end if;
391  -- Compare the data word to calculated data word
392  if r.randomData /= rxAxisMaster.tData(PRBS_SEED_SIZE_G-1 downto 0) then
393  -- Check for roll over
394  if r.errWordCnt /= MAX_CNT_C then
395  -- Error strobe
396  v.errWordStrb := '1';
397  v.errorDet := '1';
398  -- Increment the word error counter
399  v.errWordCnt := r.errWordCnt + 1;
400  end if;
401  -- Latch the bits with error
402  v.errorBits := (r.randomData xor rxAxisMaster.tData(PRBS_SEED_SIZE_G-1 downto 0));
403  -- Stop reading the FIFO
404  v.rxAxisSlave.tReady := '0';
405  -- Next State
406  v.state := BIT_ERR_S;
407  end if;
408  end if;
409  ----------------------------------------------------------------------
410  when BIT_ERR_S =>
411  -- Increment the counter
412  v.bitPntr := r.bitPntr + 1;
413  -- Check for an error bit
414  if r.errorBits(conv_integer(r.bitPntr)) = '1' then
415  -- Check for roll over
416  if r.errbitCnt /= MAX_CNT_C then
417  -- Error strobe
418  v.errBitStrb := '1';
419  v.errorDet := '1';
420  -- Increment the bit error counter
421  v.errbitCnt := r.errbitCnt + 1;
422  end if;
423  end if;
424  -- Check the bit pointer
425  if r.bitPntr = PRBS_SEED_SIZE_G-1 then
426  -- Reset the counter
427  v.bitPntr := (others => '0');
428  -- Check if there was an eof flag
429  if r.eof = '1' then
430  -- Next State
431  v.state := SEND_RESULT_S;
432  else
433  -- Ready for more data
434  v.rxAxisSlave.tReady := '1';
435  -- Next State
436  v.state := DATA_S;
437  end if;
438  end if;
439  ----------------------------------------------------------------------
440  when SEND_RESULT_S =>
441  -- Check the upstream buffer status
442  if txAxisSlave.tReady = '1' then
443  -- Sending Data
444  v.txAxisMaster.tValid := '1';
445  -- Increment the data counter
446  v.txCnt := r.txCnt + 1;
447  -- Send data w.r.t. the counter
448  case (r.txCnt) is
449  when x"0" =>
450  -- Update strobe for the results
451  v.updatedResults := '1';
452  -- Write the data to the TX virtual channel
453  v.txAxisMaster.tData(31 downto 16) := x"FFFF"; -- static pattern for software alignment
454  v.txAxisMaster.tData(15 downto 0) := (others => '0');
455  when x"1" =>
456  v.txAxisMaster.tData(31 downto 0) := r.packetLength;
457  when x"2" =>
458  v.txAxisMaster.tData(31 downto 0) := r.packetRate;
459  when x"3" =>
460  v.txAxisMaster.tData(31 downto 0) := r.errWordCnt;
461  when x"4" =>
462  v.txAxisMaster.tData(31 downto 0) := r.errbitCnt;
463  when others =>
464  -- Reset the counter
465  v.txCnt := (others => '0');
466  -- Send the last word
467  v.txAxisMaster.tLast := '1';
468  v.txAxisMaster.tData(31 downto 4) := (others => '0');
469  v.txAxisMaster.tData(3) := r.errDataBus;
470  v.txAxisMaster.tData(2) := r.eofe;
471  v.txAxisMaster.tData(1) := r.errLength;
472  v.txAxisMaster.tData(0) := r.errMissedPacket;
473  -- Ready to receive data
474  v.rxAxisSlave.tReady := '1';
475  -- Reset the busy flag
476  v.busy := '0';
477  -- Next State
478  v.state := IDLE_S;
479  end case;
480  end if;
481  ----------------------------------------------------------------------
482  end case;
483 
484  -- Reset
485  if (sAxisRst = '1') then
486  v := REG_INIT_C;
487  end if;
488 
489  -- Register the variable for next clock cycle
490  rin <= v;
491 
492  -- Outputs
493  rxAxisSlave <= r.rxAxisSlave;
494  txAxisMaster <= r.txAxisMaster;
497  errLength <= r.errLength;
498  errDataBus <= r.errDataBus;
499  errEofe <= r.eofe;
500  errWordCnt <= r.errWordCnt;
501  errbitCnt <= r.errbitCnt;
502  packetRate <= r.packetRate;
503  busy <= r.busy;
505  errorDet <= r.errorDet;
506 
507  end process comb;
508 
509  seq : process (sAxisClk) is
510  begin
511  if rising_edge(sAxisClk) then
512  r <= rin after TPD_G;
513  end if;
514  end process seq;
515 
516  AxiStreamFifo_Tx : entity work.AxiStreamFifoV2
517  generic map(
518  -- General Configurations
519  TPD_G => TPD_G,
522  -- FIFO configurations
523  BRAM_EN_G => BRAM_EN_G,
531  FIFO_FIXED_THRESH_G => true,
533  -- AXI Stream Port Configurations
534  SLAVE_AXI_CONFIG_G => MASTER_PRBS_SSI_CONFIG_C,
536  port map (
537  -- Slave Port
538  sAxisClk => sAxisClk,
539  sAxisRst => sAxisRst,
540  sAxisMaster => txAxisMaster,
541  sAxisSlave => txAxisSlave,
542  sAxisCtrl => axisCtrl(1),
543  -- Master Port
544  mAxisClk => mAxisClk,
545  mAxisRst => mAxisRst,
547  mAxisSlave => mAxisSlave);
548 
549  SyncFifo_Inst : entity work.SynchronizerFifo
550  generic map (
551  TPD_G => TPD_G,
552  DATA_WIDTH_G => 128)
553  port map (
554  wr_en => r.updatedResults,
555  wr_clk => sAxisClk,
556  din(31 downto 0) => r.packetLength,
557  din(63 downto 32) => r.packetRate,
558  din(95 downto 64) => r.errbitCnt,
559  din(127 downto 96) => r.errWordCnt,
560  rd_clk => axiClk,
561  dout(31 downto 0) => packetLengthSync,
562  dout(63 downto 32) => packetRateSync,
563  dout(95 downto 64) => errbitCntSync,
564  dout(127 downto 96) => errWordCntSync);
565 
566  SyncStatusVec_Inst : entity work.SyncStatusVector
567  generic map (
568  TPD_G => TPD_G,
569  OUT_POLARITY_G => '1',
570  CNT_RST_EDGE_G => false,
571  COMMON_CLK_G => false,
573  WIDTH_G => STATUS_SIZE_C)
574  port map (
575  -- Input Status bit Signals (wrClk domain)
576  statusIn(9) => axisCtrl(1).pause,
577  statusIn(8) => axisCtrl(1).overflow,
578  statusIn(7) => axisCtrl(0).pause,
579  statusIn(6) => axisCtrl(0).overflow,
580  statusIn(5) => r.errBitStrb,
581  statusIn(4) => r.errWordStrb,
582  statusIn(3) => r.errDataBus,
583  statusIn(2) => r.eofe,
584  statusIn(1) => r.errLength,
585  statusIn(0) => r.errMissedPacket,
586  -- Output Status bit Signals (rdClk domain)
587  statusOut(9) => pause(1),
588  statusOut(8) => overflow(1),
589  statusOut(7) => pause(0),
590  statusOut(6) => overflow(0),
591  statusOut(5) => errBitStrbSync,
592  statusOut(4) => errWordStrbSync,
593  statusOut(3) => errDataBusSync,
594  statusOut(2) => errEofeSync,
595  statusOut(1) => errLengthSync,
596  statusOut(0) => errMissedPacketSync,
597  -- Status Bit Counters Signals (rdClk domain)
598  cntRstIn => rAxiLite.cntRst,
599  rollOverEnIn => rAxiLite.rollOverEn,
600  cntOut => cntOut,
601  -- Clocks and Reset Ports
602  wrClk => sAxisClk,
603  rdClk => axiClk);
604 
605  pause1Cnt <= muxSlVectorArray(cntOut, 9);
606  overflow1Cnt <= muxSlVectorArray(cntOut, 8);
607  pause0Cnt <= muxSlVectorArray(cntOut, 7);
608  overflow0Cnt <= muxSlVectorArray(cntOut, 6);
609  errBitStrbCnt <= muxSlVectorArray(cntOut, 5);
610  errWordStrbCnt <= muxSlVectorArray(cntOut, 4);
611  errDataBusCnt <= muxSlVectorArray(cntOut, 3);
612  errEofeCnt <= muxSlVectorArray(cntOut, 2);
613  errLengthCnt <= muxSlVectorArray(cntOut, 1);
614  errMissedPacketCnt <= muxSlVectorArray(cntOut, 0);
615 
616  -------------------------------
617  -- Configuration Register
618  -------------------------------
619  combAxiLite : process (axiReadMaster, axiRst, axiWriteMaster, errBitStrbCnt, errBitStrbSync,
620  errDataBusCnt, errDataBusSync, errEofeCnt, errEofeSync, errLengthCnt,
621  errLengthSync, errMissedPacketCnt, errMissedPacketSync, errWordCntSync,
622  errWordStrbCnt, errWordStrbSync, errbitCntSync, overflow, overflow0Cnt,
623  overflow1Cnt, packetLengthSync, packetRateSync, pause, pause0Cnt,
624  pause1Cnt, rAxiLite) is
625  variable v : LocRegType;
626  variable axiStatus : AxiLiteStatusType;
627  variable axiWriteResp : slv(1 downto 0);
628  variable axiReadResp : slv(1 downto 0);
629  begin
630  -- Latch the current value
631  v := rAxiLite;
632 
633  -- Determine the transaction type
635 
636  -- Reset strobe signals
637  v.cntRst := '0';
638 
639  if (axiStatus.writeEnable = '1') then
640  -- Check for an out of 32 bit aligned address
641  axiWriteResp := ite(axiWriteMaster.awaddr(1 downto 0) = "00", AXI_RESP_OK_C, AXI_ERROR_RESP_G);
642  -- Decode address and perform write
643  case (axiWriteMaster.awaddr(9 downto 2)) is
644  when X"0A" =>
645  v.dummy := axiWriteMaster.wdata;
646  when x"F0" =>
647  v.rollOverEn := axiWriteMaster.wdata(STATUS_SIZE_C-1 downto 0);
648  when x"FF" =>
649  v.cntRst := '1';
650  when others =>
651  axiWriteResp := AXI_ERROR_RESP_G;
652  end case;
653  -- Send AXI response
654  axiSlaveWriteResponse(v.axiWriteSlave, axiWriteResp);
655  end if;
656 
657  if (axiStatus.readEnable = '1') then
658  -- Check for an out of 32 bit aligned address
659  axiReadResp := ite(axiReadMaster.araddr(1 downto 0) = "00", AXI_RESP_OK_C, AXI_ERROR_RESP_G);
660  -- Decode address and assign read data
661  v.axiReadSlave.rdata := (others => '0');
662  case (axiReadMaster.araddr(9 downto 2)) is
663  when x"00" =>
664  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := errMissedPacketCnt;
665  when x"01" =>
666  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := errLengthCnt;
667  when x"02" =>
668  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := errEofeCnt;
669  when x"03" =>
670  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := errDataBusCnt;
671  when x"04" =>
672  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := errWordStrbCnt;
673  when x"05" =>
674  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := errBitStrbCnt;
675  when x"06" =>
676  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := overflow0Cnt;
677  when x"07" =>
678  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := pause0Cnt;
679  when x"08" =>
680  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := overflow1Cnt;
681  when x"09" =>
682  v.axiReadSlave.rdata(STATUS_CNT_WIDTH_G-1 downto 0) := pause1Cnt;
683  when X"0A" =>
684  v.axiReadSlave.rdata := rAxiLite.dummy;
685  when x"70" =>
686  v.axiReadSlave.rdata(0) := errMissedPacketSync;
687  v.axiReadSlave.rdata(1) := errLengthSync;
688  v.axiReadSlave.rdata(2) := errEofeSync;
689  v.axiReadSlave.rdata(3) := errDataBusSync;
690  v.axiReadSlave.rdata(4) := errWordStrbSync;
691  v.axiReadSlave.rdata(5) := errBitStrbSync;
692  v.axiReadSlave.rdata(6) := overflow(0);
693  v.axiReadSlave.rdata(7) := pause(0);
694  v.axiReadSlave.rdata(8) := overflow(1);
695  v.axiReadSlave.rdata(9) := pause(1);
696  when x"71" =>
697  v.axiReadSlave.rdata := packetLengthSync;
698  when x"72" =>
699  v.axiReadSlave.rdata := packetRateSync;
700  when x"73" =>
701  v.axiReadSlave.rdata := errbitCntSync;
702  when x"74" =>
703  v.axiReadSlave.rdata := errWordCntSync;
704  when x"F0" =>
705  v.axiReadSlave.rdata(STATUS_SIZE_C-1 downto 0) := rAxiLite.rollOverEn;
706  when others =>
707  axiReadResp := AXI_ERROR_RESP_G;
708  end case;
709  -- Send Axi Response
710  axiSlaveReadResponse(v.axiReadSlave, axiReadResp);
711  end if;
712 
713  -- Synchronous Reset
714  if axiRst = '1' then
715  v := LOC_REG_INIT_C;
716  end if;
717 
718  -- Register the variable for next clock cycle
719  rinAxiLite <= v;
720 
721  -- Outputs
722  axiReadSlave <= rAxiLite.axiReadSlave;
723  axiWriteSlave <= rAxiLite.axiWriteSlave;
724 
725  end process combAxiLite;
726 
727  seqAxiLite : process (axiClk) is
728  begin
729  if rising_edge(axiClk) then
730  rAxiLite <= rinAxiLite after TPD_G;
731  end if;
732  end process seqAxiLite;
733 
734 end rtl;
FIFO_ADDR_WIDTH_Ginteger range 4 to 48:= 9
CASCADE_SIZE_Gnatural range 1 to ( 2** 24):= 1
Definition: SsiPrbsRx.vhd:44
out sAxisCtrlAxiStreamCtrlType
ALTERA_RAM_Gstring := "M9K"
_library_ ieeeieee
FIFO_ADDR_WIDTH_Gnatural range 4 to 48:= 9
Definition: SsiPrbsRx.vhd:45
out errDataBussl
Definition: SsiPrbsRx.vhd:80
PIPE_STAGES_Gnatural range 0 to 16:= 1
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
std_logic sl
Definition: StdRtlPkg.vhd:28
AxiStreamMasterType :=(tValid => '0',tData =>( others => '0'),tStrb =>( others => '1'),tKeep =>( others => '1'),tLast => '0',tDest =>( others => '0'),tId =>( others => '0'),tUser =>( others => '0')) AXI_STREAM_MASTER_INIT_C
BRAM_EN_Gboolean := true
Definition: SsiPrbsRx.vhd:38
sl eofe
Definition: SsiPkg.vhd:74
SLAVE_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
USE_BUILT_IN_Gboolean := false
Definition: SsiPrbsRx.vhd:40
slv( 31 downto 0) rdata
Definition: AxiLitePkg.vhd:89
array(natural range <> ,natural range <> ) of sl SlVectorArray
Definition: StdRtlPkg.vhd:669
slv( 15 downto 0) tStrb
slv( 15 downto 0) tKeep
STATUS_CNT_WIDTH_Gnatural range 1 to 32:= 32
Definition: SsiPrbsRx.vhd:35
SLAVE_AXI_PIPE_STAGES_Gnatural range 0 to 16:= 0
Definition: SsiPrbsRx.vhd:52
out errorDetsl
Definition: SsiPrbsRx.vhd:76
FIFO_FIXED_THRESH_Gboolean := true
FIFO_PAUSE_THRESH_Gnatural range 1 to ( 2** 24):= 2** 8
Definition: SsiPrbsRx.vhd:46
MASTER_AXI_PIPE_STAGES_Gnatural range 0 to 16:= 0
Definition: SsiPrbsRx.vhd:54
WIDTH_Gpositive := 16
out axiWriteSlaveAxiLiteWriteSlaveType
Definition: SsiPrbsRx.vhd:73
natural range 1 to 16 TDATA_BYTES_C
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_SLVERR_C
Definition: SsiPrbsRx.vhd:36
GEN_SYNC_FIFO_Gboolean := false
COMMON_CLK_Gboolean := false
out errLengthsl
Definition: SsiPrbsRx.vhd:79
out cntOutSlVectorArray ( WIDTH_G- 1 downto 0, CNT_WIDTH_G- 1 downto 0)
TPD_Gtime := 1 ns
Definition: SsiPrbsRx.vhd:34
XIL_DEVICE_Gstring := "7SERIES"
slv( 31 downto 0) wdata
Definition: AxiLitePkg.vhd:117
AxiLiteStatusType axiStatus
Definition: AxiLitePkg.vhd:183
out sAxisSlaveAxiStreamSlaveType
Definition: SsiPrbsRx.vhd:60
out packetLengthslv( 31 downto 0)
Definition: SsiPrbsRx.vhd:85
CNT_WIDTH_Gpositive := 32
out mAxisMasterAxiStreamMasterType
Definition: SsiPrbsRx.vhd:65
in sAxisMasterAxiStreamMasterType
Definition: SsiPrbsRx.vhd:59
in sAxisClksl
Definition: SsiPrbsRx.vhd:57
in sAxisRstsl := '0'
Definition: SsiPrbsRx.vhd:58
in axiClksl := '0'
Definition: SsiPrbsRx.vhd:68
slv( 1 downto 0) := "10" AXI_RESP_SLVERR_C
Definition: AxiLitePkg.vhd:36
slv( 127 downto 0) tData
in mAxisSlaveAxiStreamSlaveType := AXI_STREAM_SLAVE_FORCE_C
Definition: SsiPrbsRx.vhd:66
ALTERA_RAM_Gstring := "M9K"
Definition: SsiPrbsRx.vhd:43
out packetRateslv( 31 downto 0)
Definition: SsiPrbsRx.vhd:84
ALTERA_SYN_Gboolean := false
Definition: SsiPrbsRx.vhd:42
INT_PIPE_STAGES_Gnatural range 0 to 16:= 0
GEN_SYNC_FIFO_Gboolean := false
Definition: SsiPrbsRx.vhd:41
array(natural range <> ) of natural NaturalArray
Definition: StdRtlPkg.vhd:34
in rollOverEnInslv( WIDTH_G- 1 downto 0) :=( others => '0')
AxiStreamSlaveType :=(tReady => '0') AXI_STREAM_SLAVE_INIT_C
out errMissedPacketsl
Definition: SsiPrbsRx.vhd:78
in axiWriteMasterAxiLiteWriteMasterType := AXI_LITE_WRITE_MASTER_INIT_C
Definition: SsiPrbsRx.vhd:72
PRBS_SEED_SIZE_Gnatural range 8 to 128:= 32
Definition: SsiPrbsRx.vhd:48
AxiLiteReadMasterType
Definition: AxiLitePkg.vhd:59
in axiRstsl := '0'
Definition: SsiPrbsRx.vhd:69
BRAM_EN_Gboolean := true
out axiReadSlaveAxiLiteReadSlaveType
Definition: SsiPrbsRx.vhd:71
out errWordCntslv( 31 downto 0)
Definition: SsiPrbsRx.vhd:82
slv( 31 downto 0) awaddr
Definition: AxiLitePkg.vhd:113
slv( 127 downto 0) tUser
array(natural range <> ) of AxiStreamCtrlType AxiStreamCtrlArray
in mAxisClksl
Definition: SsiPrbsRx.vhd:63
TPD_Gtime := 1 ns
AxiLiteReadSlaveType :=(arready => '0',rdata =>( others => '0'),rresp =>( others => '0'),rvalid => '0') AXI_LITE_READ_SLAVE_INIT_C
Definition: AxiLitePkg.vhd:95
SLAVE_AXI_STREAM_CONFIG_GAxiStreamConfigType := ssiAxiStreamConfig( 4)
Definition: SsiPrbsRx.vhd:51
out sAxisCtrlAxiStreamCtrlType
Definition: SsiPrbsRx.vhd:61
out busysl
Definition: SsiPrbsRx.vhd:77
in mAxisRstsl := '0'
Definition: SsiPrbsRx.vhd:64
out sAxisSlaveAxiStreamSlaveType
ALTERA_SYN_Gboolean := false
CNT_RST_EDGE_Gboolean := true
AxiLiteReadMasterType :=(araddr =>( others => '0'),arprot =>( others => '0'),arvalid => '0',rready => '1') AXI_LITE_READ_MASTER_INIT_C
Definition: AxiLitePkg.vhd:69
out updatedResultssl
Definition: SsiPrbsRx.vhd:75
PRBS_TAPS_GNaturalArray :=( 0=> 31, 1=> 6, 2=> 2, 3=> 1)
Definition: SsiPrbsRx.vhd:49
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
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
Definition: AxiLitePkg.vhd:125
in sAxisMasterAxiStreamMasterType
out mAxisMasterAxiStreamMasterType
slv( 1 downto 0) := "00" AXI_RESP_OK_C
Definition: AxiLitePkg.vhd:31
AxiStreamSlaveType :=(tReady => '1') AXI_STREAM_SLAVE_FORCE_C
slv( 31 downto 0) araddr
Definition: AxiLitePkg.vhd:61
out errbitCntslv( 31 downto 0)
Definition: SsiPrbsRx.vhd:83
in mAxisSlaveAxiStreamSlaveType
CASCADE_SIZE_Ginteger range 1 to ( 2** 24):= 1
USE_BUILT_IN_Gboolean := false
out errEofesl
Definition: SsiPrbsRx.vhd:81
FIFO_PAUSE_THRESH_Ginteger range 1 to ( 2** 24):= 1
in axiReadMasterAxiLiteReadMasterType := AXI_LITE_READ_MASTER_INIT_C
Definition: SsiPrbsRx.vhd:70
sl eof
Definition: SsiPkg.vhd:73
AxiLiteWriteSlaveType :=(awready => '0',wready => '0',bresp =>( others => '0'),bvalid => '0') AXI_LITE_WRITE_SLAVE_INIT_C
Definition: AxiLitePkg.vhd:156
MASTER_AXI_CONFIG_GAxiStreamConfigType := AXI_STREAM_CONFIG_INIT_C
XIL_DEVICE_Gstring := "7SERIES"
Definition: SsiPrbsRx.vhd:39
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
MASTER_AXI_STREAM_CONFIG_GAxiStreamConfigType := ssiAxiStreamConfig( 4)
Definition: SsiPrbsRx.vhd:53