A load of changes to fix a brainfart and get rid of an entity.
authorMalte S. Stretz <mss@apache.org>
Mon, 29 Jun 2009 18:59:15 +0000 (20:59 +0200)
committerMalte S. Stretz <mss@apache.org>
Mon, 29 Jun 2009 19:13:16 +0000 (21:13 +0200)
doc/2_sd/sd_io_e.fsm [deleted file]
doc/2_sd/sd_parser_e.fsm
fhw_sd/sd_commands_p.vhd
fhw_sd/sd_globals_p.vhd
fhw_sd/sd_host.vhd
fhw_sd/sd_io_e.vhd [deleted file]
fhw_sd/sd_manager_e.vhd
fhw_sd/sd_parser_e.vhd
fhw_sd_t/sd_io_t.vhd [deleted file]
fhw_sd_t/sd_parser_t.vhd

diff --git a/doc/2_sd/sd_io_e.fsm b/doc/2_sd/sd_io_e.fsm
deleted file mode 100644 (file)
index 2d8e744..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE qfsmproject SYSTEM 'qfsm.dtd'>
-<qfsmproject version="0.51" author="Qfsm" >
-  <machine nummooreout="0" transfontitalic="0" draw_it="1" statefontsize="8" transfont="Helvetica" statefontitalic="0" author="Malte S. Stretz" description="" version="1" name="sd_io_e" arrowtype="1" numbits="3" statefontweight="50" statefont="Helvetica" numin="1" transfontsize="8" transfontweight="50" type="2" numout="0" initialstate="0" >
-    <outputnames_moore></outputnames_moore>
-    <inputnames>i_0</inputnames>
-    <outputnames></outputnames>
-    <itransition ypos="133" endx="94.57428275285471" xpos="63" endy="194.0337089551385" />
-    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="229" code="0" xpos="114" linewidth="1" >idle</state>
-    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="63" code="1" xpos="253" linewidth="1" >load</state>
-    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="62" code="5" xpos="462" linewidth="1" >send</state>
-    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="334" code="3" xpos="338" linewidth="1" >next</state>
-    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="213" code="4" xpos="598" linewidth="1" >shft</state>
-    <transition c1x="184.0429612257021" c2y="261.4934114487061" c1y="131.5629250093436" description="" straight="1" type="2" ypos="203.6704883897095" endx="153.996923753148" xpos="144.9582919681328" endy="229.4960748782841" c2x="229.5170039969229" >
-      <from>0</from>
-      <to>0</to>
-      <inputs default="0" any="0" invert="0" ></inputs>
-      <outputs></outputs>
-    </transition>
-    <transition c1x="117.3899821984797" c2y="101.6709907897917" c1y="137.7645411315346" description="" straight="0" type="2" ypos="189" endx="214.7459371579465" xpos="114.0000011428571" endy="74.68874142396081" c2x="152.480961605656" >
-      <from>0</from>
-      <to>1</to>
-      <inputs default="0" any="0" invert="0" >start</inputs>
-      <outputs></outputs>
-    </transition>
-    <transition c1x="351.2892978351844" c2y="19.32786702493546" c1y="12.74115474533105" description="" straight="0" type="2" ypos="43.15444246572665" endx="427.4084421355964" xpos="287.7297256849783" endy="41.91457930453987" c2x="377.8488699853904" >
-      <from>1</from>
-      <to>5</to>
-      <inputs default="0" any="0" invert="0" ></inputs>
-      <outputs></outputs>
-    </transition>
-    <transition c1x="543.3903062914003" c2y="103.7472502191205" c1y="80.23084932184105" description="" straight="0" type="2" ypos="68.75855260443383" endx="596.6674067906945" xpos="501.4248901925307" endy="173.0222037208338" c2x="598.816411444782" >
-      <from>5</from>
-      <to>4</to>
-      <inputs default="0" any="0" invert="0" ></inputs>
-      <outputs></outputs>
-    </transition>
-    <transition c1x="358.2952050307406" c2y="231.0052625975223" c1y="197.0288780292294" description="" straight="0" type="2" ypos="294.0524934609365" endx="460.7884349343692" xpos="340.0485900789263" endy="101.9816471658153" c2x="444.5418199825549" >
-      <from>3</from>
-      <to>5</to>
-      <inputs default="0" any="0" invert="0" ></inputs>
-      <outputs></outputs>
-    </transition>
-    <transition c1x="173.0573942695272" c2y="338.876962281861" c1y="339.9808228048798" description="" straight="0" type="2" ypos="335.0522672835293" endx="117.7336283477223" xpos="298.0138432258861" endy="268.8253690423715" c2x="100.8885896956817" >
-      <from>3</from>
-      <to>0</to>
-      <inputs default="0" any="0" invert="0" >done</inputs>
-      <outputs></outputs>
-    </transition>
-    <transition c1x="497.0764246687896" c2y="140.366349147089" c1y="277.9186563505861" description="" straight="1" type="2" ypos="225.1952211275097" endx="560.978121751773" xpos="559.9043758201661" endy="197.8546861711798" c2x="502.4785219765868" >
-      <from>4</from>
-      <to>4</to>
-      <inputs default="0" any="0" invert="0" >spi_busy</inputs>
-      <outputs></outputs>
-    </transition>
-    <transition c1x="598.3918306967262" c2y="336.9644727665509" c1y="325.9740781124893" description="" straight="0" type="2" ypos="252.9836834584278" endx="377.8907101782684" xpos="599.1423909559551" endy="336.9548674206125" c2x="493.6412704374973" >
-      <from>4</from>
-      <to>3</to>
-      <inputs default="0" any="0" invert="0" ></inputs>
-      <outputs></outputs>
-    </transition>
-  </machine>
-</qfsmproject>
index 8f2ac5c..93c51fc 100644 (file)
@@ -1,55 +1,69 @@
 <?xml version='1.0'?>
 <!DOCTYPE qfsmproject SYSTEM 'qfsm.dtd'>
 <qfsmproject version="0.51" author="Qfsm" >
-  <machine nummooreout="0" transfontitalic="0" draw_it="1" statefontsize="8" transfont="Helvetica" statefontitalic="0" author="Malte S. Stretz" description="" version="1" name="sd_parser_e" arrowtype="1" numbits="2" statefontweight="50" statefont="Helvetica" numin="1" transfontsize="8" transfontweight="50" type="2" numout="0" initialstate="0" >
+  <machine nummooreout="0" transfontitalic="0" draw_it="1" statefontsize="8" transfont="Helvetica" statefontitalic="0" author="Malte S. Stretz" description="" version="1" name="sd_io_e" arrowtype="1" numbits="3" statefontweight="50" statefont="Helvetica" numin="1" transfontsize="8" transfontweight="50" type="2" numout="0" initialstate="0" >
     <outputnames_moore></outputnames_moore>
     <inputnames>i_0</inputnames>
     <outputnames></outputnames>
-    <itransition ypos="39" endx="95.44176624346683" xpos="68" endy="59.0498456925727" />
-    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="86" code="0" xpos="125" linewidth="1" >idle</state>
-    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="87" code="1" xpos="312" linewidth="1" >send</state>
-    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="249" code="2" xpos="319" linewidth="1" >loop</state>
-    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="253" code="3" xpos="127" linewidth="1" >next</state>
-    <transition c1x="200.761423749154" c2y="19.38239541920476" c1y="19.04906208587143" description="" straight="0" type="2" ypos="57.7157287525381" endx="283.7157287525381" xpos="153.2842712474619" endy="58.7157287525381" c2x="241.2385762508461" >
+    <itransition ypos="133" endx="94.57428275285471" xpos="63" endy="194.0337089551385" />
+    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="229" code="0" xpos="114" linewidth="1" >idle</state>
+    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="63" code="1" xpos="253" linewidth="1" >load</state>
+    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="62" code="5" xpos="462" linewidth="1" >send</state>
+    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="331" code="3" xpos="284" linewidth="1" >loop</state>
+    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="213" code="4" xpos="598" linewidth="1" >shft</state>
+    <state pencolor="0" endstate="0" radius="40" description="" moore_outputs="" ypos="331" code="2" xpos="449" linewidth="1" >vrfy</state>
+    <transition c1x="184.0429612257021" c2y="261.4934114487061" c1y="131.5629250093436" description="" straight="1" type="2" ypos="203.6704883897095" endx="153.996923753148" xpos="144.9582919681328" endy="229.4960748782841" c2x="229.5170039969229" >
       <from>0</from>
-      <to>1</to>
-      <inputs default="0" any="0" invert="0" >trigger</inputs>
+      <to>0</to>
+      <inputs default="0" any="0" invert="0" ></inputs>
       <outputs></outputs>
     </transition>
-    <transition c1x="244.8834388225472" c2y="200.4621255726788" c1y="91.28782526948157" description="" straight="1" type="2" ypos="98.0452547174839" endx="146.4769275792302" xpos="163.1433066053657" endy="119.7452453207337" c2x="161.0336205422702" >
+    <transition c1x="117.3899821984797" c2y="101.6709907897917" c1y="137.7645411315346" description="" straight="0" type="2" ypos="189" endx="214.7459371579465" xpos="114.0000011428571" endy="74.68874142396081" c2x="152.480961605656" >
       <from>0</from>
-      <to>0</to>
-      <inputs default="0" any="0" invert="0" ></inputs>
+      <to>1</to>
+      <inputs default="0" any="0" invert="0" >start</inputs>
       <outputs></outputs>
     </transition>
-    <transition c1x="368.9166355107799" c2y="181.9602714367159" c1y="142.6448915235032" description="" straight="0" type="2" ypos="112.3295116102905" endx="347.8333225960743" xpos="342.9582919681328" endy="221.2756513499286" c2x="380.8749790534271" >
+    <transition c1x="351.2892978351844" c2y="19.32786702493546" c1y="12.74115474533105" description="" straight="0" type="2" ypos="43.15444246572665" endx="427.4084421355964" xpos="287.7297256849783" endy="41.91457930453987" c2x="377.8488699853904" >
       <from>1</from>
-      <to>2</to>
+      <to>5</to>
       <inputs default="0" any="0" invert="0" ></inputs>
       <outputs></outputs>
     </transition>
-    <transition c1x="219.9848483255274" c2y="132.7693463724632" c1y="181.2061968991179" description="" straight="1" type="2" ypos="218.6297359053881" endx="318.5802248523867" xpos="292.9683450617613" endy="209.0022027003305" c2x="348.8401601422572" >
-      <from>2</from>
-      <to>2</to>
+    <transition c1x="543.3903062914003" c2y="103.7472502191205" c1y="80.23084932184105" description="" straight="0" type="2" ypos="68.75855260443383" endx="596.6674067906945" xpos="501.4248901925307" endy="173.0222037208338" c2x="598.816411444782" >
+      <from>5</from>
+      <to>4</to>
       <inputs default="0" any="0" invert="0" ></inputs>
       <outputs></outputs>
     </transition>
-    <transition c1x="243.1254255748477" c2y="311.7802814274336" c1y="321.6026986115573" description="" straight="0" type="2" ypos="275.425115795681" endx="157.4333580783634" xpos="288.9714593230898" endy="278.95786424331" c2x="196.2793918266056" >
-      <from>2</from>
-      <to>3</to>
-      <inputs default="0" any="0" invert="0" >shift</inputs>
+    <transition c1x="304.2952050307406" c2y="231.0052625975223" c1y="194.0288780292294" description="" straight="0" type="2" ypos="291.0524934609364" endx="460.7884349343692" xpos="286.0485900789263" endy="101.9816471658153" c2x="444.5418199825549" >
+      <from>3</from>
+      <to>5</to>
+      <inputs default="0" any="0" invert="0" ></inputs>
       <outputs></outputs>
     </transition>
-    <transition c1x="59.23927659480255" c2y="147.574066989665" c1y="194.3016462144058" description="" straight="0" type="2" ypos="226.0292254391467" endx="100.7966692986577" xpos="97.46058024287497" endy="117.8464877649241" c2x="70.01797294673011" >
+    <transition c1x="159.0573942695272" c2y="355.876962281861" c1y="327.9808228048798" description="" straight="0" type="2" ypos="332.0522672835293" endx="117.7336283477223" xpos="244.0138432258861" endy="268.8253690423715" c2x="135.8885896956817" >
       <from>3</from>
       <to>0</to>
-      <inputs default="0" any="0" invert="0" ></inputs>
+      <inputs default="0" any="0" invert="0" >done</inputs>
       <outputs></outputs>
     </transition>
-    <transition c1x="211.922156048658" c2y="215.7520855329918" c1y="215.3239306857769" description="" straight="0" type="2" ypos="244.8957758385619" endx="279.4256345854059" xpos="166.1704167802841" endy="243.1802403802068" c2x="232.673895317032" >
-      <from>3</from>
+    <transition c1x="497.0764246687896" c2y="140.366349147089" c1y="277.9186563505862" description="" straight="1" type="2" ypos="225.1952211275097" endx="560.978121751773" xpos="559.9043758201661" endy="197.8546861711799" c2x="502.4785219765868" >
+      <from>4</from>
+      <to>4</to>
+      <inputs default="0" any="0" invert="0" >spi_busy</inputs>
+      <outputs></outputs>
+    </transition>
+    <transition c1x="596.3918306967262" c2y="340.5063364129801" c1y="288.9740781124893" description="" straight="0" type="2" ypos="252.9836834584278" endx="488.7413069062562" xpos="599.1423909559551" endy="335.5418636464292" c2x="589.3825773437535" >
+      <from>4</from>
       <to>2</to>
-      <inputs default="0" any="0" invert="0" >io_busy</inputs>
+      <inputs default="0" any="0" invert="0" ></inputs>
+      <outputs></outputs>
+    </transition>
+    <transition c1x="380.6666666666667" c2y="331" c1y="331" description="" straight="1" type="2" ypos="331" endx="324" xpos="409" endy="331" c2x="352.3333333333333" >
+      <from>2</from>
+      <to>3</to>
+      <inputs default="0" any="0" invert="0" ></inputs>
       <outputs></outputs>
     </transition>
   </machine>
index bed3dfc..cd3d9a5 100644 (file)
@@ -13,30 +13,30 @@ library ieee;
 use ieee.std_logic_1164.all;
 
 package sd_commands_p is
-  constant cmd_go_idle_state_c : std_logic_cmd_t := to_std_cmd(0);
+  constant cmd_go_idle_state_c : std_logic_cmd_t := to_cmd(cmd_type_std_c, 0);
   constant arg_go_idle_state_c : std_logic_arg_t := arg_null_c;
   
-  constant cmd_send_op_cond_c : std_logic_cmd_t := to_std_cmd(1);
+  constant cmd_send_op_cond_c : std_logic_cmd_t := to_cmd(cmd_type_std_c, 1);
   constant arg_send_op_cond_c : std_logic_arg_t := arg_null_c;
   
-  constant cmd_set_blocklen_c : std_logic_cmd_t := to_std_cmd(16);
+  constant cmd_set_blocklen_c : std_logic_cmd_t := to_cmd(cmd_type_std_c, 16);
   constant arg_set_blocklen_c : std_logic_arg_t := to_arg(512);
   
-  constant cmd_read_single_block_c : std_logic_cmd_t := to_std_cmd(17);
+  constant cmd_read_single_block_c : std_logic_cmd_t := to_cmd(cmd_type_std_c, 17);
   constant pad_read_single_block_c : std_logic_vector(31 - block_address_width_c downto 0) := (others => '0');
   
-  constant cmd_do_reset_c : std_logic_cmd_t := to_int_cmd(0, '0');
+  constant cmd_do_reset_c : std_logic_cmd_t := to_cmd(cmd_type_int_c, 0);
   constant arg_do_reset_c : std_logic_arg_t := to_arg(50); -- 1+ ms: 8 SCK (1 byte) @ 400 kHz = 2.5 us * 8 = 20 us
   
-  constant cmd_do_start_c : std_logic_cmd_t := to_int_cmd(1, '0');
+  constant cmd_do_start_c : std_logic_cmd_t := to_cmd(cmd_type_int_c, 1);
   constant arg_do_start_c : std_logic_arg_t := to_arg(10); -- 75+ SCKs (10 byte)
   
-  constant cmd_do_seek_c : std_logic_cmd_t := to_int_cmd(2, '0');
+  constant cmd_do_seek_c : std_logic_cmd_t := to_cmd(cmd_type_int_c, 2);
   constant arg_do_seek_c : std_logic_arg_t := to_arg(50); -- TODO: How many SCKs timeout?
   
-  constant cmd_do_pipe_c : std_logic_cmd_t := to_int_cmd(15, '1');
+  constant cmd_do_pipe_c : std_logic_cmd_t := to_cmd(cmd_type_int_c, 3);
   constant arg_do_pipe_c : std_logic_arg_t := to_arg(512);
   
-  constant cmd_do_skip_c : std_logic_cmd_t := to_int_cmd(3, '0');
+  constant cmd_do_skip_c : std_logic_cmd_t := to_cmd(cmd_type_int_c, 4);
   constant arg_do_skip_c : std_logic_arg_t := to_arg(2); -- CRC16
 end sd_commands_p;
index a91dbcf..18b6317 100644 (file)
@@ -27,13 +27,15 @@ package sd_globals_p is
   
   constant cmd_type_std_c : std_logic := '0';
   constant cmd_type_int_c : std_logic := '1';
-  function to_std_cmd(
+  function to_cmd(
+    typ : std_logic;
     idx : integer range 0 to 31) return std_logic_cmd_t;
-  function to_int_cmd(
-    idx : integer range 0 to 15;
-    shd : std_logic) return std_logic_cmd_t;
   function get_cmd_type(
     cmd : std_logic_cmd_t) return std_logic;
+  function is_std_cmd(
+    cmd : std_logic_cmd_t) return std_logic;
+  function is_int_cmd(
+    cmd : std_logic_cmd_t) return std_logic;
   
   function to_arg(
     val : integer range 0 to 65535) return std_logic_arg_t;
@@ -64,31 +66,36 @@ end sd_globals_p;
 
 package body sd_globals_p is
 
-  function to_std_cmd(
+  function to_cmd(
+    typ : std_logic;
     idx : integer range 0 to 31) return std_logic_cmd_t is
-  begin
-    return std_logic_vector(to_unsigned(idx, std_logic_cmd_t'length));
-  end to_std_cmd;
-  function to_int_cmd(
-    idx : integer range 0 to 15;
-    shd : std_logic) return std_logic_cmd_t is
     variable cmd : std_logic_cmd_t;
   begin
-    cmd := "1" & shd & std_logic_vector(to_unsigned(idx, std_logic_cmd_t'length - 2));
+    cmd := typ & std_logic_vector(to_unsigned(idx, std_logic_cmd_t'length - 1));
     return cmd;
-  end to_int_cmd;
-  
-  function to_arg(
-    val : integer range 0 to 65535) return std_logic_arg_t is
-  begin
-    return std_logic_vector(to_unsigned(val, std_logic_arg_t'length));
-  end to_arg;
+  end to_cmd;
   
   function get_cmd_type(
     cmd : std_logic_cmd_t) return std_logic is
   begin
     return cmd(std_logic_cmd_t'high);
   end get_cmd_type;
+  function is_std_cmd(
+    cmd : std_logic_cmd_t) return std_logic is
+  begin
+    return not get_cmd_type(cmd);
+  end is_std_cmd;
+  function is_int_cmd(
+    cmd : std_logic_cmd_t) return std_logic is
+  begin
+    return get_cmd_type(cmd);
+  end is_int_cmd;
+  
+  function to_arg(
+    val : integer range 0 to 65535) return std_logic_arg_t is
+  begin
+    return std_logic_vector(to_unsigned(val, std_logic_arg_t'length));
+  end to_arg;
   
   function create_frame(
     cmd : std_logic_cmd_t;
index 05266b0..6ca1248 100644 (file)
@@ -57,13 +57,13 @@ architecture rtl of sd_host is
       
       ready : out std_logic;
       busy  : out std_logic;
-      error : out std_logic;
     
       command  : out std_logic_cmd_t;
       argument : out std_logic_arg_t;
       trigger  : out std_logic;
-      response : in  std_logic_rsp_t;
-      shifting : in  std_logic);
+      shifting : in  std_logic;
+      error    : in  std_logic;
+      idled    : in  std_logic);
   end component;
   
   component sd_parser_e is
@@ -74,38 +74,21 @@ architecture rtl of sd_host is
       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;
+      error    : out std_logic;
+      idled    : 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_top  : out counter_top_t;
       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);
+      spi_rxd   : in  std_logic_byte_t;
+      spi_cs    : out std_logic);
   end component;
 
   component sd_counter_e is
@@ -143,14 +126,9 @@ architecture rtl of sd_host is
   signal sd_command_s  : std_logic_cmd_t;
   signal sd_argument_s : std_logic_arg_t;
   signal sd_trigger_s  : std_logic;
-  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 sd_error_s    : std_logic;
+  signal sd_idled_s    : std_logic;
   
   signal cnt_top_s  : counter_top_t;
   signal cnt_tick_s : std_logic;
@@ -160,11 +138,13 @@ architecture rtl of sd_host is
   signal spi_busy_s  : std_logic;
   signal spi_txd_s   : std_logic_byte_t;
   signal spi_rxd_s   : std_logic_byte_t;
-  signal spi_cs_n    : std_logic;
+  signal spi_cs_s    : std_logic;
   
 begin
   rxd <= spi_rxd_s;
   
+  error <= sd_error_s;
+  
   driver : sd_manager_e port map(
     clock => clk,
     reset => rst,
@@ -174,13 +154,13 @@ begin
     
     ready => ready,
     busy  => busy,
-    error => error,
     
     command  => sd_command_s,
     argument => sd_argument_s,
     trigger  => sd_trigger_s,
-    response => sd_response_s,
-    shifting => sd_shifting_s);
+    shifting => sd_shifting_s,
+    error    => sd_error_s,
+    idled    => sd_idled_s);
   
   parser : sd_parser_e port map(
     clock => clk,
@@ -189,47 +169,32 @@ begin
     command  => sd_command_s,
     argument => sd_argument_s,
     trigger  => sd_trigger_s,
-    response => sd_response_s,
     shifting => sd_shifting_s,
+    error    => sd_error_s,
+    idled    => sd_idled_s,
     
     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_top  => cnt_top_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);
+    spi_rxd   => spi_rxd_s,
+    spi_cs    => spi_cs_s);
   
   counter : sd_counter_e port map(
     clock => clk,
     enable => cnt_tick_s,
     
-    rewind => io_start_s,
+    rewind => sd_trigger_s,
     
     top  => cnt_top_s,
     done => cnt_done_s);
   
-  cs <= not spi_busy_s;
+  cs <= not spi_cs_s;
   spi : spi_master port map(
     clk => clk,
     rst => rst,
diff --git a/fhw_sd/sd_io_e.vhd b/fhw_sd/sd_io_e.vhd
deleted file mode 100644 (file)
index 48e175c..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
------------------------------------------------------------------------
--- 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;
-
-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_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 sd_io_e;
-
------------------------------------------------------------------------
-
-architecture rtl of sd_io_e is
-  type state_t is(
-    idle_state_c,
-    load_state_c,
-    send_state_c,
-    shft_state_c,
-    next_state_c);
-  signal state_s : state_t;
-
-  signal frame_s : std_logic_frame_t;
-  signal done_s  : std_logic;
-begin
-  busy      <= '0' when state_s = idle_state_c else '1';
-  shift     <= '1' when state_s = next_state_c else '0';
-  data      <= spi_rxd;
-  
-  spi_txd   <= get_frame_head(frame_s);
-  spi_start <= '1' when state_s = send_state_c else '0';
-  
-  cnt_tick  <= '1' when state_s = send_state_c
-          else '1' when state_s = load_state_c
-          else '0';
-
-  status : process(clock)
-  begin
-    if rising_edge(clock) then
-      if state_s = idle_state_c then
-        done_s <= '0';
-      elsif cnt_done = '1' then
-        done_s <= '1';
-      end if;
-    end if;
-  end process;
-          
-  sequence : process(clock, reset)
-  begin
-    if reset = '1' then
-      state_s <= idle_state_c;
-    elsif rising_edge(clock) then
-      case state_s is
-        when idle_state_c =>
-          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 shft_state_c =>
-          if spi_busy = '0' then
-            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;
-      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 <= frame;
-        when next_state_c => frame_s <= shift_frame(frame_s);
-        when others => null;
-      end case;
-    end if;
-  end process;
-end rtl;
index a51ec02..0f64a78 100644 (file)
@@ -30,13 +30,13 @@ entity sd_manager_e is
     
     ready : out std_logic;
     busy  : out std_logic;
-    error : out std_logic;
     
     command  : out std_logic_cmd_t;
     argument : out std_logic_arg_t;
     trigger  : out std_logic;
     shifting : in  std_logic;
-    response : in  std_logic_rsp_t);
+    error    : in  std_logic;
+    idled    : in  std_logic);
 end sd_manager_e;
 
 -----------------------------------------------------------------------
@@ -62,9 +62,6 @@ architecture rtl of sd_manager_e is
   signal curr_state_s : state_t;
   signal prev_state_s : state_t;
   signal next_state_s : state_t;
-  
-  signal error_s   : std_logic;
-  signal idle_s    : std_logic;
 
 begin
   
@@ -132,14 +129,6 @@ begin
     end if;
   end process;
   
-  error_s <= response(6)
-          or response(5)
-          or response(4)
-          or response(3)
-          or response(2)
-          or response(1);
-  idle_s  <= response(0);
-  
   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';
@@ -155,9 +144,7 @@ begin
             next_state_s <= vrfy_state_c;
           end if;
         when vrfy_state_c =>
-          if error_s = '1' then
-            next_state_s <= rset_state_c;
-          else
+          if error = '0' then
             case prev_state_s is
               when rset_state_c => next_state_s <= strt_state_c;
               when strt_state_c => next_state_s <= idle_state_c;
@@ -170,9 +157,11 @@ begin
               when skip_state_c => next_state_s <= wait_state_c;
               when others => null;
             end case;
+          else
+            next_state_s <= rset_state_c;
           end if;
         when init_state_c =>
-          if idle_s = '1' then
+          if idled = '1' then
             next_state_s <= send_state_c;
           else
             next_state_s <= bsiz_state_c;
@@ -186,18 +175,5 @@ 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;
index f470067..51a4a9f 100644 (file)
@@ -28,18 +28,21 @@ entity sd_parser_e is
     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;
+    error    : out std_logic;
+    idled    : 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);
+    
+    cnt_top  : out counter_top_t;
+    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;
+    spi_cs    : out std_logic);
 end sd_parser_e;
 
 -----------------------------------------------------------------------
@@ -47,18 +50,106 @@ end sd_parser_e;
 architecture rtl of sd_parser_e is
   type state_t is(
     idle_state_c,
+    load_state_c,
     send_state_c,
-    loop_state_c,
-    next_state_c);
+    shft_state_c,
+    vrfy_state_c,
+    loop_state_c);
   signal state_s : state_t;
   
   signal frame_s : std_logic_frame_t;
+  
+  signal done_s  : std_logic;
+  signal break_s : std_logic;
+  signal error_s : std_logic;
 begin
-  shifting <= '0' when state_s = idle_state_c else '1';
+  shifting <= '0' when state_s = idle_state_c
+         else '1';
+  idled    <= is_std_cmd(command)
+          and spi_rxd(0);
+  pipe     <= '1' when command = cmd_do_pipe_c
+                   and state_s = loop_state_c
+         else '0';
   
-  io_start <= '1' when state_s = send_state_c else '0';
-  io_frame <= create_frame(command, argument);
   cnt_top  <= create_counter_top(command, argument);
+  cnt_tick <= '1' when state_s = load_state_c
+         else '1' when state_s = send_state_c
+         else '0';
+  
+  spi_txd   <= get_frame_head(frame_s);
+  spi_start <= '1' when state_s = send_state_c
+          else '0';
+  
+  break_s <= spi_rxd(7) when get_cmd_type(command) = cmd_type_std_c
+        else spi_rxd(0) when command = cmd_do_seek_c
+        else '0';
+  
+  status : process(clock)
+  begin
+    if rising_edge(clock) then
+      case state_s is
+        when idle_state_c => done_s <= '0';
+        when shft_state_c => done_s <= done_s or cnt_done;
+        when vrfy_state_c => done_s <= done_s or break_s;
+        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 loop_state_c => frame_s <= shift_frame(frame_s);
+        when others => null;
+      end case;
+    end if;
+  end process;
+  
+  parser : process(clock, reset)
+  begin
+    if reset = '1' then
+      error_s <= '0';
+    elsif rising_edge(clock) then
+      if state_s = loop_state_c and done_s = '1' then
+        if break_s = '1' then
+          if get_cmd_type(command) = cmd_type_std_c then
+            error_s <= spi_rxd(6)
+                    or spi_rxd(5)
+                    or spi_rxd(4)
+                    or spi_rxd(3)
+                    or spi_rxd(2)
+                    or spi_rxd(1);
+          elsif command = cmd_do_seek_c then
+            error_s <= spi_rxd(7);
+          else
+            error_s <= '0';
+          end if;
+        else
+          error_s <= '1';
+        end if;
+      end if;
+    end if;
+  end process;
+  
+  selector : process(clock, reset)
+  begin
+    if reset = '1' then
+      spi_cs <= '0';
+    elsif rising_edge(clock) then
+      case state_s is
+        when idle_state_c =>
+          spi_cs <= not error_s;
+        when load_state_c =>
+          if not command = cmd_do_reset_c then
+            spi_cs <= '1';
+          end if;
+        when others =>
+          null;
+      end case;
+    end if;
+  end process;
   
   sequence : process(clock, reset)
   begin
@@ -68,43 +159,25 @@ begin
       case state_s is
         when idle_state_c =>
           if trigger = '1' then
-            state_s <= send_state_c;
+            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 shft_state_c =>
+          if spi_busy = '0' then
+            state_s <= vrfy_state_c;
+          end if;
+        when vrfy_state_c =>
           state_s <= loop_state_c;
         when loop_state_c =>
-          if io_shift = '1' then
-            state_s <= next_state_c;
-          end if;
-        when next_state_c =>
-          if io_busy = '1' then
-            state_s <= loop_state_c;
-          else
+          if done_s = '1' then
             state_s <= idle_state_c;
+          else
+            state_s <= send_state_c;
           end if;
       end case;
     end if;
   end process;
-  
-  pipe <= io_shift when command = cmd_do_pipe_c
-     else '0';
-  responder : process(clock)
-  begin
-    if rising_edge(clock) then
-      if get_cmd_type(command) = cmd_type_std_c then
-        case state_s is
-          when send_state_c =>
-            response <= (others => '1');
-          when next_state_c =>
-            if io_data(7) = '0' then
-              response <= io_data(6 downto 0);
-            end if;
-          when others =>
-            null;
-        end case;
-      else
-        response <= (others => '0');
-      end if;
-    end if;
-  end process;
 end rtl;
diff --git a/fhw_sd_t/sd_io_t.vhd b/fhw_sd_t/sd_io_t.vhd
deleted file mode 100644 (file)
index 5ce9aaf..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
------------------------------------------------------------------------
--- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
---
--- Testing the sd_io.
------------------------------------------------------------------------
--- This entity is part of the following library:
--- pragma library fhw_sd_t
-library fhw_sd_t;
-library fhw_sd;
-use fhw_sd.all;
-use fhw_sd.sd_globals_p.all;
-
-library fhw_tools;
-use fhw_tools.types.all;
-
-library ieee;
-use ieee.std_logic_1164.all;
-use ieee.numeric_std.all;
-
------------------------------------------------------------------------
-
-entity sd_io_t is
-  generic(
-    clock_interval : time := 20 us);
-end sd_io_t;
-
------------------------------------------------------------------------
-
-architecture test of sd_io_t is
-  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 := 32);
-    port(
-      clock  : in  std_logic;
-      enable : in  std_logic;
-    
-      rewind : in  std_logic;
-    
-      top  : in  integer range 1 to 32;
-      done : out std_logic);
-  end component;
-
-  signal test_s : integer;
-  
-  signal clock_s  : std_logic;
-  signal reset_s  : std_logic;
-  
-  signal frame_i_s     : std_logic_frame_t;
-  signal start_i_s     : std_logic;
-  signal busy_o_s      : std_logic;
-  signal data_o_s      : std_logic_byte_t;
-  signal shift_o_s     : std_logic;
-  signal cnt_tick_o_s  : std_logic;
-  signal cnt_done_i_s  : std_logic;
-  signal spi_start_o_s : std_logic;
-  signal spi_busy_i_s  : std_logic;
-  signal spi_txd_o_s   : std_logic_byte_t;
-  signal spi_rxd_i_s   : std_logic_byte_t;
-  
-  signal cnt_top_s : positive;
-  signal cnt_res_s : std_logic;
-  
-  signal txd_s : std_logic_byte_t;
-  signal rxd_s : std_logic_byte_t;
-begin
-  dut : sd_io_e port map(clock_s, reset_s,
-    frame_i_s,
-    start_i_s,
-    busy_o_s,
-    data_o_s,
-    shift_o_s,
-    cnt_tick_o_s,
-    cnt_done_i_s,
-    spi_start_o_s,
-    spi_busy_i_s,
-    spi_txd_o_s,
-    spi_rxd_i_s);
-  cnt : sd_counter_e port map(clock_s,
-    cnt_tick_o_s,
-    cnt_res_s,
-    cnt_top_s,
-    cnt_done_i_s);
-  cnt_res_s <= start_i_s;
-  
-  stimulus : process
-  begin
-    wait for clock_interval / 4;
-    
-    frame_i_s <= (others => 'U');
-    start_i_s <= '0';
-    cnt_top_s <= 6 + (8 - 6) + 1;
-    wait until falling_edge(reset_s);
-    
-    while true loop
-      wait until rising_edge(clock_s);
-      frame_i_s <= "10110101"
-                 & "00000000"
-                 & "11111111"
-                 & "01001010"
-                 & "11111111"
-                 & "00000000";
-      start_i_s <= '1';
-      wait until rising_edge(clock_s);
-      start_i_s <= '0';
-      wait until falling_edge(busy_o_s);
-    end loop;
-  end process;
-  
-  rxd : process
-  begin
-    rxd_s <= "00000001";
-    while true loop
-      wait until rising_edge(spi_busy_i_s);
-      rxd_s <= std_logic_vector(unsigned(rxd_s) + 1);
-    end loop;
-  end process;
-  
-  spi : process
-  begin
-    txd_s <= spi_txd_o_s;
-    wait until rising_edge(spi_start_o_s);
-    spi_rxd_i_s  <= (others => 'U');
-    spi_busy_i_s <= '1';
-    wait until rising_edge(clock_s);
-    wait until rising_edge(clock_s);
-    wait until rising_edge(clock_s);
-    wait until rising_edge(clock_s);
-    wait until rising_edge(clock_s);
-    wait until rising_edge(clock_s);
-    wait until rising_edge(clock_s);
-    spi_rxd_i_s  <= rxd_s;
-    wait until rising_edge(clock_s);
-    spi_busy_i_s <= '0';
-  end process;
-  
-  reset : process
-  begin
-    reset_s <= '1';
-    wait until rising_edge(clock_s);
-    reset_s <= '0';
-    wait;
-  end process;
-  
-  clock : process
-  begin
-    clock_s <= '0';
-    wait for clock_interval / 2;
-    clock_s <= '1';
-    wait for clock_interval / 2;
-  end process;
-  
-end test;
index 80eb4a2..3be2285 100644 (file)
@@ -36,18 +36,21 @@ architecture test of sd_parser_t is
       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;
+      error    : out std_logic;
+      idled    : 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);
+      cnt_top  : out counter_top_t;
+      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;
+      spi_cs    : out std_logic);
   end component;
 
   signal test_s : integer;
@@ -58,42 +61,51 @@ architecture test of sd_parser_t is
   signal command_i_s  : std_logic_cmd_t;
   signal argument_i_s : std_logic_arg_t;
   signal trigger_i_s  : std_logic;
-  signal response_o_s : std_logic_rsp_t;
   signal shifting_o_s : std_logic;
+  signal error_o_s    : std_logic;
+  signal idled_o_s    : std_logic;
   signal pipe_o_s     : std_logic;
-  signal frame_o_s    : std_logic_frame_t;
+  signal top_o_s      : counter_top_t;
+  signal tick_o_s     : std_logic;
+  signal done_i_s     : std_logic;
   signal start_o_s    : std_logic;
   signal busy_i_s     : std_logic;
-  signal data_i_s     : std_logic_byte_t;
-  signal shift_i_s    : std_logic;
-  signal cnt_top_o_s  : counter_top_t;
+  signal txd_o_s      : std_logic_byte_t;
+  signal rxd_i_s      : std_logic_byte_t;
+  signal cs_o_s       : std_logic;
   
   constant address_c  : std_logic_block_address_t := "10101010101010101010101";
   
   signal counter_s : natural;
   signal delay_s   : natural;
+  signal data_s    : std_logic_byte_t;
 begin
   dut : sd_parser_e port map(clock_s, reset_s,
     command_i_s,
     argument_i_s,
     trigger_i_s,
-    response_o_s,
     shifting_o_s,
+    error_o_s,
+    idled_o_s,
     pipe_o_s,
-    frame_o_s,
+    top_o_s,
+    tick_o_s,
+    done_i_s,
     start_o_s,
     busy_i_s,
-    data_i_s,
-    shift_i_s,
-    cnt_top_o_s);
+    txd_o_s,
+    rxd_i_s,
+    cs_o_s);
   
   stimulus : process
     procedure send(
       cmd : std_logic_cmd_t;
       arg : std_logic_arg_t;
-      cnt : natural) is
+      cnt : natural;
+      dat : std_logic_byte_t) is
     begin
       delay_s <= cnt;
+      data_s  <= dat;
       command_i_s  <= cmd;
       argument_i_s <= arg;
       trigger_i_s  <= '1';
@@ -112,32 +124,32 @@ begin
     -- Test internal command with argument shorter than frame size.
     send(cmd_do_skip_c,
       arg_do_skip_c,
-      1);
+      1, x"00");
 
     -- Test standard command with argument.
     send(cmd_read_single_block_c,
       address_c & pad_read_single_block_c,
-      6 + 2);
+      6 + 2, x"00");
     
     -- Test internal command with long argument and piping.
     send(cmd_do_pipe_c,
       arg_do_pipe_c,
-      1);
+      1, x"00");
     
     wait;
   end process;
   
   io_data : process
   begin
-    data_i_s <= (others => 'U');
+    rxd_i_s <= (others => 'U');
     
     wait until rising_edge(start_o_s);
     
     while shifting_o_s = '1' loop
       if counter_s = delay_s then
-        data_i_s <= (others => '0');
+        rxd_i_s <= data_s;
       else
-        data_i_s <= (others => '1');
+        rxd_i_s <= (others => '1');
       end if;
       wait until rising_edge(clock_s);
     end loop;
@@ -146,13 +158,11 @@ begin
   io_flow : process
   begin
     busy_i_s  <= '0';
-    shift_i_s <= 'U';
     counter_s <= 0;
     
     wait until rising_edge(start_o_s);
     busy_i_s  <= '1';
-    while counter_s <= (cnt_top_o_s + 1) loop
-      shift_i_s <= '0';
+    while counter_s <= (top_o_s + 1) loop
       wait until rising_edge(clock_s);
       wait until rising_edge(clock_s);
       wait until rising_edge(clock_s);
@@ -162,7 +172,6 @@ begin
       wait until rising_edge(clock_s);
       wait until rising_edge(clock_s);
       wait until rising_edge(clock_s);
-      shift_i_s <= '1';
       counter_s <= counter_s + 1;
       wait until rising_edge(clock_s);
     end loop;