Advertisement
Guest User

axiBlockProcessorAdapter2

a guest
Jul 4th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 5.51 KB | None | 0 0
  1. library ieee;
  2. library work;
  3. use ieee.numeric_std.all;
  4. use ieee.std_logic_1164.all;
  5. USE ieee.math_real.log2;
  6. USE ieee.math_real.ceil;
  7. use work.dcfifo;
  8.  
  9. entity axiBlockProcessorAdapter2 is
  10.     generic(frameSizeOrder: integer := 10;
  11.             wordWidth: integer := 64;
  12.             processorDelay: integer := 100);
  13.     port(
  14.             aclk: in std_logic;
  15.            
  16.             -- if asserted during a frame, flush the processor after this frame
  17.             doFlush: in std_logic;
  18.            
  19.             -- when asserted, forces data phase to 0
  20.             reset: in std_logic;
  21.            
  22.             -- axi stream input
  23.             in_tready: out std_logic;
  24.             in_tvalid: in std_logic;
  25.             in_tdata: in std_logic_vector(wordWidth-1 downto 0);
  26.            
  27.             -- axi stream output
  28.             out_tready: in std_logic;
  29.             out_tvalid: out std_logic;
  30.             out_tdata: out std_logic_vector(wordWidth-1 downto 0);
  31.            
  32.             -- block processor
  33.             -- the processor accepts data when ce=1, and outputs data when ostrobe=1.
  34.             -- ostrobe must be equal to ce or a delayed version of ce.
  35.             bp_ce: out std_logic;
  36.             bp_indata: out std_logic_vector(wordWidth-1 downto 0);
  37.             bp_inphase: out unsigned(frameSizeOrder-1 downto 0);
  38.             bp_ostrobe: in std_logic;
  39.             bp_outdata: in std_logic_vector(wordWidth-1 downto 0)
  40.         );
  41. end entity;
  42. architecture a of axiBlockProcessorAdapter2 is
  43.     constant frameDuration: integer := 2**frameSizeOrder;
  44.     constant armingDuration: integer := 32;
  45.    
  46.     -- istate and icounter together form the state of the input state machine.
  47.     -- in some state groups the counter is ignored.
  48.     type istate_t is (unarmed, arming, armed, running, flushing, wait0, wait1);
  49.     --                   0        1      2       3        4        5      6
  50.     signal istate, istateNext: istate_t := unarmed;
  51.     signal icounter, icounterNext: unsigned(frameSizeOrder-1 downto 0);
  52.     signal idoAdvance_running, idoAdvance_flushing: std_logic;
  53.    
  54.    
  55.     -- ostate and ocounter together form the state of the output state machine.
  56.     -- in some state groups the counter is ignored.
  57.     type ostate_t is (unarmed, wait_arming, wait_pipeline, writing);
  58.     --                   0        1              2            3
  59.     signal ostate, ostateNext: ostate_t := unarmed;
  60.     signal ocounter, ocounterNext: unsigned(frameSizeOrder-1 downto 0);
  61.     signal odoAdvance: std_logic;
  62.    
  63.     signal reset2: std_logic;
  64.    
  65.     -- inter-state-machine signals
  66.     signal frame_indicator, frame_indicator2, latchedFrmInd, flowcontrol_allow, flowcontrol_allow2: std_logic;
  67.    
  68.     -- fifo
  69.     signal fifo_wready, fifo_wvalid, fifo_rvalid, fifo_rready: std_logic;
  70.     signal fifo_wdata, fifo_rdata: std_logic_vector(wordWidth-1 downto 0);
  71. begin
  72.     reset2 <= reset when rising_edge(aclk);
  73.    
  74.     -- ####### input state machine
  75.     istate <= istateNext when rising_edge(aclk);
  76.     icounter <= icounterNext when rising_edge(aclk);
  77.     istateNext <= unarmed when reset2='1' else
  78.                     arming when istate=unarmed and in_tvalid='1' else
  79.                     running when istate=arming and icounter=(icounter'range=>'1') else
  80.                     flushing when istate=running and icounter=(icounter'range=>'1')
  81.                                     and doFlush='1' and idoAdvance_running='1' else
  82.                     wait0 when istate=flushing and icounter=processorDelay-1
  83.                                     and idoAdvance_flushing='1' else
  84.                     wait1 when istate=wait0 else
  85.                     unarmed when istate=wait1 else
  86.                     istate;
  87.    
  88.     icounterNext <= to_unsigned(frameDuration-armingDuration, frameSizeOrder) when istate=unarmed else
  89.                     icounter+1 when istate=arming else
  90.                     icounter+1 when istate=running and idoAdvance_running='1' else
  91.                     icounter+1 when istate=flushing and idoAdvance_flushing='1' else
  92.                     icounter;
  93.    
  94.     idoAdvance_running <= in_tvalid and flowcontrol_allow2;
  95.     idoAdvance_flushing <= flowcontrol_allow2;
  96.    
  97.    
  98.     bp_ce <= '1' when istate=arming else
  99.                 idoAdvance_running when istate=running else
  100.                 idoAdvance_flushing when istate=flushing else
  101.                 '0';
  102.     in_tready <= flowcontrol_allow2 when istate=running else
  103.                     '0';
  104.     frame_indicator <= not frame_indicator when istate=wait0 and rising_edge(aclk);
  105.     frame_indicator2 <= frame_indicator when rising_edge(aclk);
  106.     bp_indata <= in_tdata;
  107.     bp_inphase <= icounter;
  108.    
  109.    
  110.    
  111.     -- ####### output state machine
  112.     ostate <= ostateNext when rising_edge(aclk);
  113.     ocounter <= ocounterNext when rising_edge(aclk);
  114.     ostateNext <= unarmed when reset2='1' else
  115.                     wait_arming when ostate=unarmed else
  116.                     wait_pipeline when ostate=wait_arming and ocounter=(ocounter'range=>'1')
  117.                                         and odoAdvance='1' else
  118.                     writing when ostate=wait_pipeline and ocounter=processorDelay-1
  119.                                     and odoAdvance='1' else
  120.                     unarmed when ostate=writing and ocounter=0
  121.                                     and frame_indicator2 /= latchedFrmInd else
  122.                     ostate;
  123.     ocounterNext <= to_unsigned(frameDuration-armingDuration, frameSizeOrder) when ostate=unarmed else
  124.                     to_unsigned(0, frameSizeOrder) when ostate=wait_pipeline and ocounter=processorDelay-1
  125.                                                         and odoAdvance='1' else
  126.                     ocounter+1 when odoAdvance='1' else
  127.                     ocounter;
  128.     odoAdvance <= bp_ostrobe;
  129.     latchedFrmInd <= frame_indicator2 when ostate=wait_pipeline and rising_edge(aclk);
  130.     fifo_wvalid <= '1' when ostate=writing and odoAdvance='1' else
  131.                     '0';
  132.     fifo_wdata <= bp_outdata;
  133.    
  134.     -- ####### FIFO
  135.     fifo: entity dcfifo
  136.         generic map(width=>wordWidth, depthOrder=>4)
  137.         port map(rdclk=>aclk, wrclk=>aclk,
  138.             rdvalid=>fifo_rvalid, rdready=>fifo_rready, rddata=>fifo_rdata,
  139.             wrvalid=>fifo_wvalid, wrready=>fifo_wready, wrdata=>fifo_wdata);
  140.     out_tvalid <= fifo_rvalid;
  141.     out_tdata <= fifo_rdata;
  142.     fifo_rready <= out_tready;
  143.     flowcontrol_allow <= out_tready or (not fifo_rvalid);
  144.     flowcontrol_allow2 <= flowcontrol_allow when rising_edge(aclk);
  145. end a;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement