-- This file was automatically generated with HECTARE -- -- DO NOT EDIT -- -- input_filename = combpm_protocol_electron_ctrl.rdl library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity combpm_protocol_electron_ctrl_axi is generic( G_ADDR_W: integer := 8 ); port ( sfp_txfault_i : in std_logic; sfp_rxlos_i : in std_logic; sfp_modabs_i : in std_logic; sfp_txdisable_o : out std_logic; gt_powergood_i : in std_logic; gt_qplllock_i : in std_logic; gt_txclkactive_i : in std_logic; gt_rxclkactive_i : in std_logic; gt_rxcdrlock_i : in std_logic; gt_txresetdone_i : in std_logic; gt_rxresetdone_i : in std_logic; gt_rxbyteisaligned_i : in std_logic; gt_rxbyterealign_i : in std_logic; gt_rxcommadet_i : in std_logic; gt_rxcommadeten_o : out std_logic; gt_rstall_o : out std_logic; protocol_framecnt_i : in std_logic_vector(15 downto 0); protocol_frameerror_i : in std_logic; clk : in std_logic; reset : in std_logic; S_AXI_AWADDR : in std_logic_vector(G_ADDR_W-1 downto 0); S_AXI_AWPROT : in std_logic_vector(2 downto 0); S_AXI_AWVALID : in std_logic; S_AXI_AWREADY : out std_logic; S_AXI_WDATA : in std_logic_vector(32-1 downto 0); S_AXI_WSTRB : in std_logic_vector(32/8-1 downto 0); S_AXI_WVALID : in std_logic; S_AXI_WREADY : out std_logic; S_AXI_BRESP : out std_logic_vector(1 downto 0); S_AXI_BVALID : out std_logic; S_AXI_BREADY : in std_logic; S_AXI_ARADDR : in std_logic_vector(G_ADDR_W-1 downto 0); S_AXI_ARPROT : in std_logic_vector(2 downto 0); S_AXI_ARVALID : in std_logic; S_AXI_ARREADY : out std_logic; S_AXI_RDATA : out std_logic_vector(32-1 downto 0); S_AXI_RRESP : out std_logic_vector(1 downto 0); S_AXI_RVALID : out std_logic; S_AXI_RREADY : in std_logic ); end entity; architecture arch of combpm_protocol_electron_ctrl_axi is -- address constants constant C_ADDR_SFP : integer := 0; constant C_ADDR_GT : integer := 1; constant C_ADDR_PROTOCOL : integer := 2; -- field ranges constants constant C_FIELD_SFP_TXFAULT_MSB : integer := 0; constant C_FIELD_SFP_TXFAULT_LSB : integer := 0; constant C_FIELD_SFP_RXLOS_MSB : integer := 1; constant C_FIELD_SFP_RXLOS_LSB : integer := 1; constant C_FIELD_SFP_MODABS_MSB : integer := 2; constant C_FIELD_SFP_MODABS_LSB : integer := 2; constant C_FIELD_SFP_TXDISABLE_MSB : integer := 3; constant C_FIELD_SFP_TXDISABLE_LSB : integer := 3; constant C_FIELD_GT_POWERGOOD_MSB : integer := 0; constant C_FIELD_GT_POWERGOOD_LSB : integer := 0; constant C_FIELD_GT_QPLLLOCK_MSB : integer := 1; constant C_FIELD_GT_QPLLLOCK_LSB : integer := 1; constant C_FIELD_GT_TXCLKACTIVE_MSB : integer := 2; constant C_FIELD_GT_TXCLKACTIVE_LSB : integer := 2; constant C_FIELD_GT_RXCLKACTIVE_MSB : integer := 3; constant C_FIELD_GT_RXCLKACTIVE_LSB : integer := 3; constant C_FIELD_GT_RXCDRLOCK_MSB : integer := 4; constant C_FIELD_GT_RXCDRLOCK_LSB : integer := 4; constant C_FIELD_GT_TXRESETDONE_MSB : integer := 5; constant C_FIELD_GT_TXRESETDONE_LSB : integer := 5; constant C_FIELD_GT_RXRESETDONE_MSB : integer := 6; constant C_FIELD_GT_RXRESETDONE_LSB : integer := 6; constant C_FIELD_GT_RXBYTEISALIGNED_MSB : integer := 7; constant C_FIELD_GT_RXBYTEISALIGNED_LSB : integer := 7; constant C_FIELD_GT_RXBYTEREALIGN_MSB : integer := 8; constant C_FIELD_GT_RXBYTEREALIGN_LSB : integer := 8; constant C_FIELD_GT_RXCOMMADET_MSB : integer := 9; constant C_FIELD_GT_RXCOMMADET_LSB : integer := 9; constant C_FIELD_GT_RXCOMMADETEN_MSB : integer := 10; constant C_FIELD_GT_RXCOMMADETEN_LSB : integer := 10; constant C_FIELD_GT_RSTALL_MSB : integer := 11; constant C_FIELD_GT_RSTALL_LSB : integer := 11; constant C_FIELD_PROTOCOL_FRAMECNT_MSB : integer := 15; constant C_FIELD_PROTOCOL_FRAMECNT_LSB : integer := 0; constant C_FIELD_PROTOCOL_FRAMEERROR_MSB : integer := 16; constant C_FIELD_PROTOCOL_FRAMEERROR_LSB : integer := 16; -- registers signal reg_sfp : std_logic_vector(32-1 downto 0); signal reg_gt : std_logic_vector(32-1 downto 0); signal reg_protocol : std_logic_vector(32-1 downto 0); -- read type t_state_read is (sReadIdle, sReadValid); signal state_read : t_state_read; signal rdata_reg : std_logic_vector(31 downto 0); signal raddr_word : integer; signal arready_wire : std_logic; signal rvalid_wire : std_logic; -- write type t_state_write is (sWriteIdle, sWriteWaitData, sWriteWaitAddr, sWriteResp); signal state_write : t_state_write; signal state_write_prev : t_state_write; signal waddr_reg : std_logic_vector(G_ADDR_W-1 downto 0); signal wdata_reg : std_logic_vector(31 downto 0); signal waddr_word : integer; signal awready_wire : std_logic; signal wready_wire : std_logic; signal bvalid_wire : std_logic; begin reg_sfp(0) <= sfp_txfault_i when rising_edge(clk); reg_sfp(1) <= sfp_rxlos_i when rising_edge(clk); reg_sfp(2) <= sfp_modabs_i when rising_edge(clk); sfp_txdisable_o <= reg_sfp(3); reg_gt(0) <= gt_powergood_i when rising_edge(clk); reg_gt(1) <= gt_qplllock_i when rising_edge(clk); reg_gt(2) <= gt_txclkactive_i when rising_edge(clk); reg_gt(3) <= gt_rxclkactive_i when rising_edge(clk); reg_gt(4) <= gt_rxcdrlock_i when rising_edge(clk); reg_gt(5) <= gt_txresetdone_i when rising_edge(clk); reg_gt(6) <= gt_rxresetdone_i when rising_edge(clk); reg_gt(7) <= gt_rxbyteisaligned_i when rising_edge(clk); reg_gt(8) <= gt_rxbyterealign_i when rising_edge(clk); reg_gt(9) <= gt_rxcommadet_i when rising_edge(clk); gt_rxcommadeten_o <= reg_gt(10); gt_rstall_o <= reg_gt(11); reg_protocol(15 downto 0) <= protocol_framecnt_i when rising_edge(clk); reg_protocol(16) <= protocol_frameerror_i when rising_edge(clk); proc_state_read: process (clk) begin if rising_edge(clk) then if reset = '1' then state_read <= sReadIdle; else case state_read is when sReadIdle => if S_AXI_ARVALID = '1' then state_read <= sReadValid; end if; when sReadValid => if S_AXI_RREADY = '1' then state_read <= sReadIdle; end if; end case; end if; end if; end process; raddr_word <= to_integer(unsigned(S_AXI_ARADDR(G_ADDR_W-1 downto 2))); -- ### read logic proc_rdata_reg: process (clk) begin if rising_edge(clk) then rdata_reg <= (others => '0'); case raddr_word is when C_ADDR_SFP => rdata_reg(0 downto 0) <= reg_sfp(0 downto 0); rdata_reg(1 downto 1) <= reg_sfp(1 downto 1); rdata_reg(2 downto 2) <= reg_sfp(2 downto 2); rdata_reg(3 downto 3) <= reg_sfp(3 downto 3); when C_ADDR_GT => rdata_reg(0 downto 0) <= reg_gt(0 downto 0); rdata_reg(1 downto 1) <= reg_gt(1 downto 1); rdata_reg(2 downto 2) <= reg_gt(2 downto 2); rdata_reg(3 downto 3) <= reg_gt(3 downto 3); rdata_reg(4 downto 4) <= reg_gt(4 downto 4); rdata_reg(5 downto 5) <= reg_gt(5 downto 5); rdata_reg(6 downto 6) <= reg_gt(6 downto 6); rdata_reg(7 downto 7) <= reg_gt(7 downto 7); rdata_reg(8 downto 8) <= reg_gt(8 downto 8); rdata_reg(9 downto 9) <= reg_gt(9 downto 9); rdata_reg(10 downto 10) <= reg_gt(10 downto 10); rdata_reg(11 downto 11) <= reg_gt(11 downto 11); when C_ADDR_PROTOCOL => rdata_reg(15 downto 0) <= reg_protocol(15 downto 0); rdata_reg(16 downto 16) <= reg_protocol(16 downto 16); when others => -- decode error rdata_reg <= x"badc0fee"; end case; end if; end process; proc_read_output: process (state_read) begin case state_read is when sReadIdle => arready_wire <= '1'; rvalid_wire <= '0'; when sReadValid => arready_wire <= '0'; rvalid_wire <= '1'; when others => arready_wire <= '0'; rvalid_wire <= '0'; end case; end process; S_AXI_ARREADY <= arready_wire; S_AXI_RVALID <= rvalid_wire; S_AXI_RDATA <= rdata_reg; S_AXI_RRESP <= "00"; proc_state_write_prev: process (clk) begin if rising_edge(clk) then state_write_prev <= state_write; end if; end process; proc_state_write: process (clk) begin if rising_edge (clk) then if reset = '1' then state_write <= sWriteIdle; else case state_write is when sWriteIdle => if S_AXI_AWVALID = '1' and S_AXI_WVALID = '1' then state_write <= sWriteResp; waddr_reg <= S_AXI_AWADDR; wdata_reg <= S_AXI_WDATA; elsif S_AXI_AWVALID = '1' and S_AXI_WVALID = '0' then state_write <= sWriteWaitData; waddr_reg <= S_AXI_AWADDR; elsif S_AXI_AWVALID = '0' and S_AXI_WVALID = '1' then state_write <= sWriteWaitAddr; wdata_reg <= S_AXI_WDATA; end if; when sWriteWaitData => if S_AXI_WVALID = '1' then state_write <= sWriteResp; wdata_reg <= S_AXI_WDATA; end if; when sWriteWaitAddr => if S_AXI_AWVALID = '1' then state_write <= sWriteResp; waddr_reg <= S_AXI_AWADDR; end if; when sWriteResp => if S_AXI_BREADY = '1' then state_write <= sWriteIdle; end if; end case; end if; end if; end process; waddr_word <= to_integer(unsigned(waddr_reg(G_ADDR_W-1 downto 2))); -- ### write logic (use waddr_word and wdata_reg) proc_write: process (clk) begin if rising_edge(clk) then if reset = '1' then reg_sfp(3 downto 3) <= "0"; reg_gt(10 downto 10) <= "1"; reg_gt(11 downto 11) <= "1"; else -- default (pulse) -- default (swmod) -- default (woclr) if state_write = sWriteResp and state_write_prev /= sWriteResp then case waddr_word is when C_ADDR_SFP => reg_sfp(3 downto 3) <= wdata_reg(3 downto 3); when C_ADDR_GT => reg_gt(10 downto 10) <= wdata_reg(10 downto 10); reg_gt(11 downto 11) <= wdata_reg(11 downto 11); when C_ADDR_PROTOCOL => null; when others => null; end case; end if; end if; end if; end process; proc_write_output: process (state_write) begin case state_write is when sWriteIdle => awready_wire <= '1'; wready_wire <= '1'; bvalid_wire <= '0'; when sWriteWaitData => awready_wire <= '0'; wready_wire <= '1'; bvalid_wire <= '0'; when sWriteWaitAddr => awready_wire <= '1'; wready_wire <= '0'; bvalid_wire <= '0'; when sWriteResp => awready_wire <= '0'; wready_wire <= '0'; bvalid_wire <= '1'; when others => awready_wire <= '0'; wready_wire <= '0'; bvalid_wire <= '0'; end case; end process; S_AXI_AWREADY <= awready_wire; S_AXI_WREADY <= wready_wire; S_AXI_BRESP <= "00"; S_AXI_BVALID <= bvalid_wire; end architecture;