Split the SPI translator into two entities.
authorMalte S. Stretz <mss@apache.org>
Fri, 26 Jun 2009 16:30:44 +0000 (18:30 +0200)
committerMalte S. Stretz <mss@apache.org>
Fri, 26 Jun 2009 16:30:44 +0000 (18:30 +0200)
bos2k9.qsf
fhw_sd/sd_host.vhd
fhw_sd/sd_io_e.vhd
fhw_sd/sd_manager_e.vhd
fhw_sd/sd_parser_e.vhd [new file with mode: 0644]

index 02bc375..6c92622 100644 (file)
@@ -35,6 +35,7 @@ set_global_assignment -name PROJECT_OUTPUT_DIRECTORY out
 set_global_assignment -name MISC_FILE "E:/vhdl/bos2k9/bos2k9.dpf"
 set_global_assignment -name VHDL_FILE fhw_sd/sd_host.vhd -library fhw_sd
 set_global_assignment -name VHDL_FILE fhw_sd/sd_manager_e.vhd -library fhw_sd
+set_global_assignment -name VHDL_FILE fhw_sd/sd_parser_e.vhd -library fhw_sd
 set_global_assignment -name VHDL_FILE fhw_sd/sd_io_e.vhd -library fhw_sd
 set_global_assignment -name VHDL_FILE fhw_sd/sd_counter_e.vhd -library fhw_sd
 set_global_assignment -name VHDL_FILE fhw_sd/sd_commands_p.vhd -library fhw_sd
@@ -154,6 +155,7 @@ set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
 set_global_assignment -name FAMILY "Cyclone II"
 set_global_assignment -name EDA_DESIGN_ENTRY_SYNTHESIS_TOOL "Design Compiler"
 set_global_assignment -name TOP_LEVEL_ENTITY bos2k9
+set_global_assignment -name TOP_LEVEL_ENTITY bos2k9
 
 # Fitter Assignments
 # ==================
@@ -179,6 +181,16 @@ set_global_assignment -name VECTOR_COMPARE_TRIGGER_MODE INPUT_EDGE
 set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW"
 set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)"
 
+# start EDA_TOOL_SETTINGS(eda_simulation)
+# ---------------------------------------
+
+       # EDA Netlist Writer Assignments
+       # ==============================
+       set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation
+
+# end EDA_TOOL_SETTINGS(eda_simulation)
+# -------------------------------------
+
 # start EDA_TOOL_SETTINGS(eda_design_synthesis)
 # ---------------------------------------------
 
@@ -191,16 +203,6 @@ set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)"
 # end EDA_TOOL_SETTINGS(eda_design_synthesis)
 # -------------------------------------------
 
-# start EDA_TOOL_SETTINGS(eda_simulation)
-# ---------------------------------------
-
-       # EDA Netlist Writer Assignments
-       # ==============================
-       set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation
-
-# end EDA_TOOL_SETTINGS(eda_simulation)
-# -------------------------------------
-
 # start EDA_TOOL_SETTINGS(eda_blast_fpga)
 # ---------------------------------------
 
index 560f9a5..03fc927 100644 (file)
@@ -46,6 +46,9 @@ entity sd_host is
 -----------------------------------------------------------------------
 
 architecture rtl of sd_host is
+
+  constant counter_max_c : positive := 511;
+  subtype  counter_top_t is natural range 1 to counter_max_c;
   
   component sd_manager_e is
     port(
@@ -66,7 +69,9 @@ architecture rtl of sd_host is
       shifting : in  std_logic);
   end component;
   
-  component sd_io_e is
+  component sd_parser_e is
+    generic(
+      counter_max : positive := counter_max_c);
     port(
       clock : in std_logic;
       reset : in std_logic;
@@ -77,15 +82,49 @@ architecture rtl of sd_host is
       response : out std_logic_rsp_t;
       shifting : out std_logic;
       
-      data  : out std_logic_byte_t;
-      shift : out std_logic;
+      pipe     : out std_logic;
       
+      io_frame : out std_logic_frame_t;
+      io_start : out std_logic;
+      io_busy  : in  std_logic;
+      io_data  : in  std_logic_byte_t;
+      io_shift : in  std_logic;
+      
+      cnt_top  : out counter_top_t);
+  end component;
+  
+  component sd_io_e is
+    port(
+      clock : in std_logic;
+      reset : in std_logic;
+    
+      frame  : in  std_logic_frame_t;
+      start  : in  std_logic;
+      busy   : out std_logic;
+      data   : out std_logic_byte_t;
+      shift  : out std_logic;
+    
+      cnt_tick : out std_logic;
+      cnt_done : in  std_logic;
+    
       spi_start : out std_logic;
       spi_busy  : in  std_logic;
       spi_txd   : out std_logic_byte_t;
       spi_rxd   : in  std_logic_byte_t);
   end component;
 
+  component sd_counter_e is
+    generic(
+      max : positive := counter_max_c);
+    port(
+      clock  : in  std_logic;
+      reset  : in  std_logic;
+      enable : in  std_logic;
+    
+      top  : in  counter_top_t;
+      done : out std_logic);
+  end component;
+  
   component spi_master 
     generic(
       clk_div    : positive := clock_divider;
@@ -111,6 +150,16 @@ architecture rtl of sd_host is
   signal sd_response_s : std_logic_rsp_t;
   signal sd_shifting_s : std_logic;
   
+  signal io_frame_s : std_logic_frame_t;
+  signal io_start_s : std_logic;
+  signal io_busy_s  : std_logic;
+  signal io_data_s  : std_logic_byte_t;
+  signal io_shift_s : std_logic;
+  
+  signal cnt_top_s  : counter_top_t;
+  signal cnt_tick_s : std_logic;
+  signal cnt_done_s : std_logic;
+  
   signal spi_start_s : std_logic;
   signal spi_busy_s  : std_logic;
   signal spi_txd_s   : std_logic_byte_t;
@@ -118,6 +167,7 @@ architecture rtl of sd_host is
   signal spi_cs_n    : std_logic;
   
 begin
+  rxd <= spi_rxd_s;
   
   driver : sd_manager_e port map(
     clock => clk,
@@ -136,7 +186,7 @@ begin
     response => sd_response_s,
     shifting => sd_shifting_s);
   
-  io : sd_io_e port map(
+  parser : sd_parser_e port map(
     clock => clk,
     reset => rst,
     
@@ -146,14 +196,42 @@ begin
     response => sd_response_s,
     shifting => sd_shifting_s,
     
-    data  => rxd,
-    shift => shd,
+    pipe => shd,
+    
+    io_frame  => io_frame_s,
+    io_start  => io_start_s,
+    io_busy   => io_busy_s,
+    io_data   => io_data_s,
+    io_shift  => io_shift_s,
+    
+    cnt_top   => cnt_top_s);
+    
+  io : sd_io_e port map(
+    clock => clk,
+    reset => rst,
+  
+    frame  => io_frame_s,
+    start  => io_start_s,
+    busy   => io_busy_s,
+    data   => io_data_s,
+    shift  => io_shift_s,
+    
+    cnt_tick => cnt_tick_s,
+    cnt_done => cnt_done_s,
   
     spi_start => spi_start_s,
     spi_busy  => spi_busy_s,
     spi_txd   => spi_txd_s,
     spi_rxd   => spi_rxd_s);
   
+  counter : sd_counter_e port map(
+    clock => clk,
+    reset => rst,
+    enable => cnt_tick_s,
+    
+    top  => cnt_top_s,
+    done => cnt_done_s);
+  
   spi : spi_master port map(
     clk => clk,
     rst => rst,
index 9d81bef..33ed26a 100644 (file)
@@ -8,7 +8,6 @@
 -- pragma library fhw_sd
 library fhw_sd;
 use fhw_sd.sd_globals_p.all;
-use fhw_sd.sd_commands_p.all;
 
 library fhw_spi;
 use fhw_spi.spi_master;
@@ -25,14 +24,14 @@ entity sd_io_e is
     clock : in std_logic;
     reset : in std_logic;
     
-    command  : in  std_logic_cmd_t;
-    argument : in  std_logic_arg_t;
-    trigger  : in  std_logic;
-    response : out std_logic_rsp_t;
-    shifting : out std_logic;
+    frame  : in  std_logic_frame_t;
+    start  : in  std_logic;
+    busy   : out std_logic;
+    data   : out std_logic_byte_t;
+    shift  : out std_logic;
     
-    data  : out std_logic_byte_t;
-    shift : out std_logic;
+    cnt_tick : out std_logic;
+    cnt_done : in  std_logic;
     
     spi_start : out std_logic;
     spi_busy  : in  std_logic;
@@ -43,42 +42,29 @@ end sd_io_e;
 -----------------------------------------------------------------------
 
 architecture rtl of sd_io_e is
-  component sd_counter_e is
-    generic(
-      max : positive := 511);
-    port(
-      clock  : in  std_logic;
-      reset  : in  std_logic;
-      enable : in  std_logic;
-    
-      top  : in  natural range 1 to 511;
-      done : out std_logic);
-  end component;
-  signal count_top_s  : natural range 1 to 511;
-  signal count_done_s : std_logic;
-  
   type state_t is(
     idle_state_c,
     load_state_c,
     send_state_c,
-    busy_state_c,
-    shft_state_c);
+    shft_state_c,
+    next_state_c);
   signal state_s : state_t;
-  signal next_state_s : state_t;
 
-  signal spi_start_s : std_logic;
-  signal spi_busy_s  : std_logic;
-  
   signal frame_s : std_logic_frame_t;
-
-  --signal counter_s : 
+  signal done_s  : std_logic;
 begin
-  shifting <= '0' when state_s = idle_state_c else '1';
+  busy      <= '0' when state_s = idle_state_c else '1';
+  shift     <= '1' when state_s = next_state_c else '0';
+  data      <= spi_rxd;
   
-  spi_busy_s <= spi_busy;
-  spi_start <= spi_start_s;
-  spi_start_s <= '1' when state_s = send_state_c else '0';
-  spi_txd <= get_frame_head(frame_s);
+  spi_txd   <= get_frame_head(frame_s) when state_s = send_state_c
+          else unaffected;
+  spi_start <= '1' when state_s = send_state_c else '0';
+  
+  cnt_tick  <= '1' when state_s = send_state_c else '0';
+  done_s    <= '0' when state_s = load_state_c
+          else '1' when state_s = shft_state_c and cnt_done = '1'
+          else unaffected;
 
   sequence : process(clock, reset)
   begin
@@ -87,73 +73,35 @@ begin
     elsif rising_edge(clock) then
       case state_s is
         when idle_state_c =>
-          if trigger = '1' then
+          if start = '1' then
             state_s <= load_state_c;
           end if;
         when load_state_c =>
           state_s <= send_state_c;
         when send_state_c =>
           state_s <= shft_state_c;
-        when busy_state_c =>
+        when shft_state_c =>
           if spi_busy = '0' then
-            state_s <= shft_state_c;
+            state_s <= next_state_c;
+          end if;
+        when next_state_c =>
+          if done_s = '1' then
+            state_s <= idle_state_c;
+          else
+            state_s <= send_state_c;
           end if;
-        when shft_state_c =>
-          null;
       end case;
     end if;
   end process;
   
-  
-  
-  -- translate : process(clock, reset)
-  -- begin
-    -- if reset = '1' then
-      -- spi_start_s <= '0';
-      -- frame_s     <= (others => '0');
-    -- elsif rising_edge(clock) then
-    
-      -- spi_start_s <= '0';
-      
-      -- frame_s <= create_frame(command, argument);
-    
-      -- case command is
-        -- when cmd_do_reset_c =>
-          -- spi_txd <= (others => '1');
-          
-        -- when cmd_do_start_c =>
-          -- null;
-        -- when cmd_set_blocklen_c =>
-          -- null;
-        -- when cmd_read_single_block_c =>
-          
-        -- when others =>
-          -- null;
-      -- end case;
-    -- end if;
-  -- end process;
-  
   framer : process(clock)
   begin
     if rising_edge(clock) then
       case state_s is
-        when load_state_c => frame_s <= create_frame(command, argument);
-        when shft_state_c => frame_s <= frame_s(std_logic_frame_t'high - 8 downto 0) & pad_c;
+        when load_state_c => frame_s <= frame;
+        when next_state_c => frame_s <= frame_s(std_logic_frame_t'high - 8 downto 0) & pad_c;
         when others => null;
       end case;
     end if;
   end process;
-  
-  -- counter_prepare : process(clock)
-  -- begin
-    -- count_top_s <= to_integer(argument(8 downto 0))
-    
-    
-  -- end;
-  counter : sd_counter_e port map(
-    clock => clock,
-    reset => reset,
-    enable => spi_start_s,
-    top    => count_top_s,
-    done   => count_done_s);
 end rtl;
index 931b47f..6b172e4 100644 (file)
@@ -133,10 +133,6 @@ begin
   ready   <= '1' when curr_state_s = wait_state_c else '0';
   busy    <= '0' when curr_state_s = wait_state_c else '1'; -- TODO?
   trigger <= '1' when curr_state_s = send_state_c else '0';
-  error   <= '0' when reset = '1'
-        else error_s when curr_state_s = rset_state_c
-        else '0'     when curr_state_s = vrfy_state_c
-        else unaffected;
   
   branch : process(clock)
   begin
@@ -178,5 +174,18 @@ begin
       end case;
     end if;
   end process;
+  
+  err : process(clock, reset)
+  begin
+    if reset = '1' then
+      error <= '0';
+    elsif rising_edge(clock) then
+      if curr_state_s = vrfy_state_c then
+        error <= '0';
+      elsif curr_state_s = rset_state_c and error_s = '1' then
+        error <= '1';
+      end if;
+    end if;
+  end process;
  
 end rtl;
diff --git a/fhw_sd/sd_parser_e.vhd b/fhw_sd/sd_parser_e.vhd
new file mode 100644 (file)
index 0000000..5775bd0
--- /dev/null
@@ -0,0 +1,91 @@
+-----------------------------------------------------------------------
+-- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
+--
+-- TODO: description
+
+-----------------------------------------------------------------------
+-- This entity is part of the following library:
+-- pragma library fhw_sd
+library fhw_sd;
+use fhw_sd.sd_globals_p.all;
+use fhw_sd.sd_commands_p.all;
+
+library fhw_spi;
+use fhw_spi.spi_master;
+
+library fhw_tools;
+use fhw_tools.types.all;
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity sd_parser_e is
+  generic(
+    counter_max : positive);
+  port(
+    clock : in std_logic;
+    reset : in std_logic;
+    
+    command  : in  std_logic_cmd_t;
+    argument : in  std_logic_arg_t;
+    trigger  : in  std_logic;
+    response : out std_logic_rsp_t;
+    shifting : out std_logic;
+    
+    pipe     : out std_logic;
+      
+    io_frame : out std_logic_frame_t;
+    io_start : out std_logic;
+    io_busy  : in  std_logic;
+    io_data  : in  std_logic_byte_t;
+    io_shift : in  std_logic;
+      
+    cnt_top  : out natural range 1 to counter_max);
+end sd_parser_e;
+
+-----------------------------------------------------------------------
+
+architecture rtl of sd_parser_e is
+
+begin
+  
+  
+  -- translate : process(clock, reset)
+  -- begin
+    -- if reset = '1' then
+      -- spi_start_s <= '0';
+      -- frame_s     <= (others => '0');
+    -- elsif rising_edge(clock) then
+    
+      -- spi_start_s <= '0';
+      
+      -- frame_s <= create_frame(command, argument);
+    
+      -- case command is
+        -- when cmd_do_reset_c =>
+          -- spi_txd <= (others => '1');
+          
+        -- when cmd_do_start_c =>
+          -- null;
+        -- when cmd_set_blocklen_c =>
+          -- null;
+        -- when cmd_read_single_block_c =>
+          
+        -- when others =>
+          -- null;
+      -- end case;
+    -- end if;
+  -- end process;
+  
+  -- framer : process(clock)
+  -- begin
+    -- if rising_edge(clock) then
+      -- case state_s is
+        -- when load_state_c => frame_s <= create_frame(command, argument);
+        -- when shft_state_c => frame_s <= frame_s(std_logic_frame_t'high - 8 downto 0) & pad_c;
+        -- when others => null;
+      -- end case;
+    -- end if;
+  -- end process;
+end rtl;