conv_regs.vhd 7.94 KB
Newer Older
1 2 3 4 5
---------------------------------------------------------------------------------------
-- Title          : Wishbone slave core for Converter board registers
---------------------------------------------------------------------------------------
-- File           : conv_regs.vhd
-- Author         : auto-generated by wbgen2 from conv_regs.wb
6
-- Created        : Sat Dec  7 14:11:02 2013
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
-- Standard       : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE conv_regs.wb
-- DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
---------------------------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity conv_regs is
  port (
    rst_n_i                                  : in     std_logic;
    clk_sys_i                                : in     std_logic;
    wb_adr_i                                 : in     std_logic_vector(1 downto 0);
    wb_dat_i                                 : in     std_logic_vector(31 downto 0);
    wb_dat_o                                 : out    std_logic_vector(31 downto 0);
    wb_cyc_i                                 : in     std_logic;
    wb_sel_i                                 : in     std_logic_vector(3 downto 0);
    wb_stb_i                                 : in     std_logic;
    wb_we_i                                  : in     std_logic;
    wb_ack_o                                 : out    std_logic;
    wb_stall_o                               : out    std_logic;
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
-- Port for std_logic_vector field: 'bits' in reg: 'Board ID Register'
    reg_id_bits_i                            : in     std_logic_vector(31 downto 0);
-- Port for std_logic_vector field: 'fwvers' in reg: 'Status Register'
    reg_sr_fwvers_i                          : in     std_logic_vector(7 downto 0);
-- Port for std_logic_vector field: 'switches' in reg: 'Status Register'
    reg_sr_switches_i                        : in     std_logic_vector(7 downto 0);
-- Port for std_logic_vector field: 'RTM detection' in reg: 'Status Register'
    reg_sr_rtm_i                             : in     std_logic_vector(5 downto 0);
-- Ports for BIT field: 'I2C Watchdog Timeout' in reg: 'Status Register'
    reg_sr_i2c_wdto_o                        : out    std_logic;
    reg_sr_i2c_wdto_i                        : in     std_logic;
    reg_sr_i2c_wdto_load_o                   : out    std_logic;
-- Ports for BIT field: 'Reset unlock bit' in reg: 'Control Register'
    reg_cr_rst_unlock_o                      : out    std_logic;
    reg_cr_rst_unlock_i                      : in     std_logic;
    reg_cr_rst_unlock_load_o                 : out    std_logic;
-- Ports for BIT field: 'Reset bit' in reg: 'Control Register'
    reg_cr_rst_o                             : out    std_logic;
    reg_cr_rst_i                             : in     std_logic;
    reg_cr_rst_load_o                        : out    std_logic
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
  );
end conv_regs;

architecture syn of conv_regs is

signal ack_sreg                                 : std_logic_vector(9 downto 0);
signal rddata_reg                               : std_logic_vector(31 downto 0);
signal wrdata_reg                               : std_logic_vector(31 downto 0);
signal bwsel_reg                                : std_logic_vector(3 downto 0);
signal rwaddr_reg                               : std_logic_vector(1 downto 0);
signal ack_in_progress                          : std_logic      ;
signal wr_int                                   : std_logic      ;
signal rd_int                                   : std_logic      ;
signal allones                                  : std_logic_vector(31 downto 0);
signal allzeros                                 : std_logic_vector(31 downto 0);

begin
-- Some internal signals assignments. For (foreseen) compatibility with other bus standards.
  wrdata_reg <= wb_dat_i;
  bwsel_reg <= wb_sel_i;
  rd_int <= wb_cyc_i and (wb_stb_i and (not wb_we_i));
  wr_int <= wb_cyc_i and (wb_stb_i and wb_we_i);
  allones <= (others => '1');
  allzeros <= (others => '0');
-- 
-- Main register bank access process.
  process (clk_sys_i, rst_n_i)
  begin
    if (rst_n_i = '0') then 
      ack_sreg <= "0000000000";
      ack_in_progress <= '0';
      rddata_reg <= "00000000000000000000000000000000";
82 83 84
      reg_sr_i2c_wdto_load_o <= '0';
      reg_cr_rst_unlock_load_o <= '0';
      reg_cr_rst_load_o <= '0';
85 86 87 88 89 90
    elsif rising_edge(clk_sys_i) then
-- advance the ACK generator shift register
      ack_sreg(8 downto 0) <= ack_sreg(9 downto 1);
      ack_sreg(9) <= '0';
      if (ack_in_progress = '1') then
        if (ack_sreg(0) = '1') then
91 92 93
          reg_sr_i2c_wdto_load_o <= '0';
          reg_cr_rst_unlock_load_o <= '0';
          reg_cr_rst_load_o <= '0';
94 95
          ack_in_progress <= '0';
        else
96 97 98
          reg_sr_i2c_wdto_load_o <= '0';
          reg_cr_rst_unlock_load_o <= '0';
          reg_cr_rst_load_o <= '0';
99 100 101 102 103 104 105
        end if;
      else
        if ((wb_cyc_i = '1') and (wb_stb_i = '1')) then
          case rwaddr_reg(1 downto 0) is
          when "00" => 
            if (wb_we_i = '1') then
            end if;
106
            rddata_reg(31 downto 0) <= reg_id_bits_i;
107 108 109 110
            ack_sreg(0) <= '1';
            ack_in_progress <= '1';
          when "01" => 
            if (wb_we_i = '1') then
111
              reg_sr_i2c_wdto_load_o <= '1';
112
            end if;
113 114 115 116 117 118 119 120 121 122 123
            rddata_reg(7 downto 0) <= reg_sr_fwvers_i;
            rddata_reg(15 downto 8) <= reg_sr_switches_i;
            rddata_reg(21 downto 16) <= reg_sr_rtm_i;
            rddata_reg(22) <= reg_sr_i2c_wdto_i;
            rddata_reg(23) <= 'X';
            rddata_reg(24) <= 'X';
            rddata_reg(25) <= 'X';
            rddata_reg(26) <= 'X';
            rddata_reg(27) <= 'X';
            rddata_reg(28) <= 'X';
            rddata_reg(29) <= 'X';
124 125 126 127 128 129
            rddata_reg(30) <= 'X';
            rddata_reg(31) <= 'X';
            ack_sreg(0) <= '1';
            ack_in_progress <= '1';
          when "10" => 
            if (wb_we_i = '1') then
130 131
              reg_cr_rst_unlock_load_o <= '1';
              reg_cr_rst_load_o <= '1';
132
            end if;
133 134
            rddata_reg(0) <= reg_cr_rst_unlock_i;
            rddata_reg(1) <= reg_cr_rst_i;
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
            rddata_reg(2) <= 'X';
            rddata_reg(3) <= 'X';
            rddata_reg(4) <= 'X';
            rddata_reg(5) <= 'X';
            rddata_reg(6) <= 'X';
            rddata_reg(7) <= 'X';
            rddata_reg(8) <= 'X';
            rddata_reg(9) <= 'X';
            rddata_reg(10) <= 'X';
            rddata_reg(11) <= 'X';
            rddata_reg(12) <= 'X';
            rddata_reg(13) <= 'X';
            rddata_reg(14) <= 'X';
            rddata_reg(15) <= 'X';
            rddata_reg(16) <= 'X';
            rddata_reg(17) <= 'X';
            rddata_reg(18) <= 'X';
            rddata_reg(19) <= 'X';
            rddata_reg(20) <= 'X';
            rddata_reg(21) <= 'X';
            rddata_reg(22) <= 'X';
            rddata_reg(23) <= 'X';
            rddata_reg(24) <= 'X';
            rddata_reg(25) <= 'X';
            rddata_reg(26) <= 'X';
            rddata_reg(27) <= 'X';
            rddata_reg(28) <= 'X';
            rddata_reg(29) <= 'X';
            rddata_reg(30) <= 'X';
164
            rddata_reg(31) <= 'X';
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
            ack_sreg(0) <= '1';
            ack_in_progress <= '1';
          when others =>
-- prevent the slave from hanging the bus on invalid address
            ack_in_progress <= '1';
            ack_sreg(0) <= '1';
          end case;
        end if;
      end if;
    end if;
  end process;
  
  
-- Drive the data output bus
  wb_dat_o <= rddata_reg;
-- bits
-- fwvers
-- switches
-- RTM detection
184 185
-- I2C Watchdog Timeout
  reg_sr_i2c_wdto_o <= wrdata_reg(22);
186
-- Reset unlock bit
187
  reg_cr_rst_unlock_o <= wrdata_reg(0);
188
-- Reset bit
189
  reg_cr_rst_o <= wrdata_reg(1);
190 191 192 193 194
  rwaddr_reg <= wb_adr_i;
  wb_stall_o <= (not ack_sreg(0)) and (wb_stb_i and wb_cyc_i);
-- ACK signal generation. Just pass the LSB of ACK counter.
  wb_ack_o <= ack_sreg(0);
end syn;