OpenCores
URL https://opencores.org/ocsvn/spi_boot/spi_boot/trunk

Subversion Repositories spi_boot

[/] [spi_boot/] [trunk/] [rtl/] [vhdl/] [spi_boot.vhd] - Diff between revs 13 and 17

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 13 Rev 17
Line 1... Line 1...
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--
--
-- SD/MMC Bootloader
-- SD/MMC Bootloader
--
--
-- $Id: spi_boot.vhd,v 1.3 2005-02-16 18:59:10 arniml Exp $
-- $Id: spi_boot.vhd,v 1.4 2005-02-18 06:42:08 arniml Exp $
--
--
-- Copyright (c) 2005, Arnim Laeuger (arniml@opencores.org)
-- Copyright (c) 2005, Arnim Laeuger (arniml@opencores.org)
--
--
-- All rights reserved, see COPYING.
-- All rights reserved, see COPYING.
--
--
Line 50... Line 50...
entity spi_boot is
entity spi_boot is
 
 
  generic (
  generic (
    -- width of bit counter: minimum 6, maximum 12
    -- width of bit counter: minimum 6, maximum 12
    width_bit_cnt_g      : integer := 6;
    width_bit_cnt_g      : integer := 6;
    -- width of set counter: minimum 0, maximum n
    -- width of image counter: minimum 0, maximum n
    width_set_cnt_g      : integer := 2;
    width_img_cnt_g      : integer := 2;
    -- number of bits required to address one set
    -- number of bits required to address one image
    num_bits_per_set_g   : integer := 18;
    num_bits_per_img_g   : integer := 18;
    -- SD specific initialization
    -- SD specific initialization
    sd_init_g            : integer := 0;
    sd_init_g            : integer := 0;
    -- clock divider to reach 400 kHz for MMC compatibility
    -- clock divider to reach 400 kHz for MMC compatibility
    mmc_compat_clk_div_g : integer := 0;
    mmc_compat_clk_div_g : integer := 0;
    width_mmc_clk_div_g  : integer := 0;
    width_mmc_clk_div_g  : integer := 0;
Line 121... Line 121...
                         CMD16,
                         CMD16,
                         WAIT_START,
                         WAIT_START,
                         WAIT_INIT_LOW, WAIT_INIT_HIGH,
                         WAIT_INIT_LOW, WAIT_INIT_HIGH,
                         CMD18, CMD18_DATA,
                         CMD18, CMD18_DATA,
                         CMD12,
                         CMD12,
                         INC_SET_CNT);
                         INC_IMG_CNT);
  --
  --
  signal ctrl_fsm_q,
  signal ctrl_fsm_q,
         ctrl_fsm_s  : ctrl_states_t;
         ctrl_fsm_s  : ctrl_states_t;
  --
  --
  -----------------------------------------------------------------------------
  -----------------------------------------------------------------------------
Line 158... Line 158...
 
 
  signal cfg_clk_q      : std_logic;
  signal cfg_clk_q      : std_logic;
 
 
  signal start_q        : std_logic;
  signal start_q        : std_logic;
 
 
  signal set_cnt_s      : std_logic_vector(width_set_cnt_g downto 0);
  signal img_cnt_s      : std_logic_vector(width_img_cnt_g downto 0);
  signal cnt_en_set_s   : boolean;
  signal cnt_en_img_s   : boolean;
  signal mmc_cnt_ovfl_s : boolean;
  signal mmc_cnt_ovfl_s : boolean;
  signal mmc_compat_s   : boolean;
  signal mmc_compat_s   : boolean;
 
 
  signal cmd_finished_s : boolean;
  signal cmd_finished_s : boolean;
 
 
Line 456... Line 456...
 
 
  begin
  begin
    -- default assignments
    -- default assignments
    ctrl_fsm_s   <= POWER_UP1;
    ctrl_fsm_s   <= POWER_UP1;
    config_n_o   <= '1';
    config_n_o   <= '1';
    cnt_en_set_s <= false;
    cnt_en_img_s <= false;
    spi_cs_n_s   <= '0';
    spi_cs_n_s   <= '0';
    mmc_compat_v := false;
    mmc_compat_v := false;
    en_outs_s    <= true;
    en_outs_s    <= true;
 
 
    case ctrl_fsm_q is
    case ctrl_fsm_q is
Line 626... Line 626...
 
 
 
 
       -- Issued CMD12: STOP_TRANSMISSION --------------------------------------
       -- Issued CMD12: STOP_TRANSMISSION --------------------------------------
       when CMD12 =>
       when CMD12 =>
         if cmd_finished_s then
         if cmd_finished_s then
           ctrl_fsm_s <= INC_SET_CNT;
           ctrl_fsm_s <= INC_IMG_CNT;
         else
         else
           ctrl_fsm_s <= CMD12;
           ctrl_fsm_s <= CMD12;
         end if;
         end if;
 
 
 
 
      -- Increment Set Counter ------------------------------------------------
      -- Increment Image Counter ----------------------------------------------
      when INC_SET_CNT =>
      when INC_IMG_CNT =>
        spi_cs_n_s   <= '1';
        spi_cs_n_s   <= '1';
        ctrl_fsm_s   <= WAIT_START;
        ctrl_fsm_s   <= WAIT_START;
        cnt_en_set_s <= true;
        cnt_en_img_s <= true;
 
 
 
 
 
 
      when others =>
      when others =>
        null;
        null;
Line 793... Line 793...
  --   * Reduces logic.
  --   * Reduces logic.
  --
  --
  transmit: process (ctrl_fsm_q,
  transmit: process (ctrl_fsm_q,
                     cmd_fsm_q,
                     cmd_fsm_q,
                     bit_cnt_q,
                     bit_cnt_q,
                     set_cnt_s,
                     img_cnt_s,
                     send_cmd12_q,
                     send_cmd12_q,
                     upper_bitcnt_zero_s)
                     upper_bitcnt_zero_s)
 
 
    subtype cmd_r is natural range 47 downto 0;
    subtype cmd_r is natural range 47 downto 0;
    subtype cmd_t is std_logic_vector(cmd_r);
    subtype cmd_t is std_logic_vector(cmd_r);
Line 832... Line 832...
          cmd_v(cmd_r) := cmd16_c;
          cmd_v(cmd_r) := cmd16_c;
          cmd_v(8 + width_bit_cnt_g-3) := '1';
          cmd_v(8 + width_bit_cnt_g-3) := '1';
          tx_v := true;
          tx_v := true;
        when CMD18 =>
        when CMD18 =>
          cmd_v(cmd_r) := cmd18_c;
          cmd_v(cmd_r) := cmd18_c;
          cmd_v(8 + num_bits_per_set_g + width_set_cnt_g downto 8 + num_bits_per_set_g)
          cmd_v(8 + num_bits_per_img_g + width_img_cnt_g downto 8 + num_bits_per_img_g)
            := set_cnt_s;
            := img_cnt_s;
          tx_v := true;
          tx_v := true;
        when CMD18_DATA =>
        when CMD18_DATA =>
          cmd_v(cmd_r) := cmd12_c;
          cmd_v(cmd_r) := cmd12_c;
 
 
          if send_cmd12_q and upper_bitcnt_zero_s then
          if send_cmd12_q and upper_bitcnt_zero_s then
Line 863... Line 863...
  --
  --
  -----------------------------------------------------------------------------
  -----------------------------------------------------------------------------
 
 
 
 
  -----------------------------------------------------------------------------
  -----------------------------------------------------------------------------
  -- Optional Set Counter
  -- Optional Image Counter
  -----------------------------------------------------------------------------
  -----------------------------------------------------------------------------
  set_cnt: if width_set_cnt_g > 0 generate
  img_cnt: if width_img_cnt_g > 0 generate
    set_cnt_b : spi_counter
    img_cnt_b : spi_counter
      generic map (
      generic map (
        cnt_width_g   => width_set_cnt_g,
        cnt_width_g   => width_img_cnt_g,
        cnt_max_g     => 2**width_set_cnt_g - 1,
        cnt_max_g     => 2**width_img_cnt_g - 1,
        reset_level_g => reset_level_g
        reset_level_g => reset_level_g
      )
      )
      port map (
      port map (
        clk_i         => clk_i,
        clk_i         => clk_i,
        reset_i       => reset_i,
        reset_i       => reset_i,
        cnt_en_i      => cnt_en_set_s,
        cnt_en_i      => cnt_en_img_s,
        cnt_o         => set_cnt_s(width_set_cnt_g-1 downto 0),
        cnt_o         => img_cnt_s(width_img_cnt_g-1 downto 0),
        cnt_ovfl_o    => open
        cnt_ovfl_o    => open
      );
      );
    set_cnt_s(width_set_cnt_g) <= '0';
    img_cnt_s(width_img_cnt_g) <= '0';
  end generate;
  end generate;
 
 
  no_set_cnt: if width_set_cnt_g = 0 generate
  no_img_cnt: if width_img_cnt_g = 0 generate
    set_cnt_s <= (others => '0');
    img_cnt_s <= (others => '0');
  end generate;
  end generate;
 
 
 
 
  -----------------------------------------------------------------------------
  -----------------------------------------------------------------------------
  -- Optional MMC compatibility counter
  -- Optional MMC compatibility counter
Line 930... Line 930...
 
 
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- File History:
-- File History:
--
--
-- $Log: not supported by cvs2svn $
-- $Log: not supported by cvs2svn $
 
-- Revision 1.3  2005/02/16 18:59:10  arniml
 
-- include output enable control for SPI outputs
 
--
-- Revision 1.2  2005/02/13 17:25:51  arniml
-- Revision 1.2  2005/02/13 17:25:51  arniml
-- major update to fix several problems
-- major update to fix several problems
-- configuration/data download of multiple sets works now
-- configuration/data download of multiple sets works now
--
--
-- Revision 1.1  2005/02/08 20:41:33  arniml
-- Revision 1.1  2005/02/08 20:41:33  arniml

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.