tab -> 4 spaces
authorMalte S. Stretz <mss@apache.org>
Sat, 16 May 2009 15:12:15 +0000 (17:12 +0200)
committerMalte S. Stretz <mss@apache.org>
Sat, 16 May 2009 15:12:15 +0000 (17:12 +0200)
bos2k9.vhd
fhw_spi/spi_counter_e.vhd
fhw_spi/spi_engine_e.vhd
fhw_spi/spi_master.vhd
fhw_spi/spi_shifter_e.vhd
fhw_spi/spi_starter_e.vhd
fhw_spi_t/spi_engine_t.vhd
fhw_spi_t/spi_master_t.vhd [new file with mode: 0644]
fhw_spi_t/spi_shifter_t.vhd
fhw_spi_t/spi_starter_t.vhd

index 0937bdd..5469a5e 100644 (file)
@@ -9,14 +9,14 @@ use fhw_spi.all;
 entity bos2k9 is
   generic(
     clock_interval : time :=  20 ns;
-       data_width : positive := 8);
+    data_width : positive := 8);
   port(
     clk : in  std_logic; --pin:N2
-       rst : in  std_logic; --pin:G25
-       
+    rst : in  std_logic; --pin:G25
+    
     miso : in  std_logic;
-       mosi : out std_logic;
-       sck  : out std_logic);
+    mosi : out std_logic;
+    sck  : out std_logic);
 end bos2k9;
 
 -----------------------------------------------------------------------
@@ -26,21 +26,21 @@ architecture board of bos2k9 is
   component spi_master 
     generic(
       clk_div    : positive := 100;
-         data_width : positive := data_width;
-         spi_mode   : integer range 0 to 3 := 0);
+      data_width : positive := data_width;
+      spi_mode   : integer range 0 to 3 := 0);
     port(
       clk : in  std_logic;
-         rst : in  std_logic;
-       
-         start : in  std_logic;
-         busy  : out std_logic;
-       
-         txd   : in  std_logic_vector(data_width - 1 downto 0);
-         rxd   : out std_logic_vector(data_width - 1 downto 0);
-       
-         miso  : in  std_logic;
-         mosi  : out std_logic;
-         sck   : out std_logic);
+      rst : in  std_logic;
+    
+      start : in  std_logic;
+      busy  : out std_logic;
+    
+      txd   : in  std_logic_vector(data_width - 1 downto 0);
+      rxd   : out std_logic_vector(data_width - 1 downto 0);
+    
+      miso  : in  std_logic;
+      mosi  : out std_logic;
+      sck   : out std_logic);
   end component;
 
   signal start_s : std_logic;
@@ -55,17 +55,17 @@ begin
   
   spi_io : spi_master port map(
     clk => clk,
-       rst => rst,
-       
-       start => start_s,
-       busy  => busy_s,
-       
-       txd   => obuf_s,
-       rxd   => ibuf_s,
-       
-       miso  => miso,
-       mosi  => mosi,
-       sck   => sck);
+    rst => rst,
+    
+    start => start_s,
+    busy  => busy_s,
+    
+    txd   => obuf_s,
+    rxd   => ibuf_s,
+    
+    miso  => miso,
+    mosi  => mosi,
+    sck   => sck);
 
   
 
index e20f20c..0d4421b 100644 (file)
@@ -8,12 +8,12 @@ entity spi_counter_e is
     count : positive);
   port(
     clock  : in  std_logic;
-       reset  : in  std_logic;
-       enable : in  std_logic;
+    reset  : in  std_logic;
+    enable : in  std_logic;
     
     override : in std_logic;
-       
-       done : out std_logic);
+    
+    done : out std_logic);
 end spi_counter_e;
 
 -----------------------------------------------------------------------
@@ -26,17 +26,17 @@ begin
   begin
     if reset = '1' then
       count_s <= 0;
-         done    <= '0';
+      done    <= '0';
     elsif rising_edge(clock) then
       done <= '0';
-         if (enable or override) = '1' then
+      if (enable or override) = '1' then
         if (count_s = count_t'high) or (override = '1') then
           count_s <= count_t'low;
-                 done <= '1';
-           else
+          done <= '1';
+        else
           count_s <= count_s + 1;
-               end if;
-         end if;
-       end if;
+        end if;
+      end if;
+    end if;
   end process;
 end rtl;
index e9928d9..493852d 100644 (file)
@@ -7,21 +7,21 @@ use ieee.numeric_std.all;
 entity spi_engine_e is
   generic(
     data_width : positive;
-       spi_cpol : std_ulogic;
-       spi_cpha : std_ulogic);
+    spi_cpol : std_ulogic;
+    spi_cpha : std_ulogic);
   port(
     clock : in  std_logic;
-       reset : in  std_ulogic;
-       
-       trigger : in  std_logic;
-       done    : out std_logic;
-       
-       data_in  : in  std_logic_vector(data_width - 1 downto 0);
-       data_out : out std_logic_vector(data_width - 1 downto 0);
-       
-       spi_in    : in  std_logic;
-       spi_out   : out std_logic;
-       spi_clock : out std_logic);
+    reset : in  std_ulogic;
+    
+    trigger : in  std_logic;
+    done    : out std_logic;
+    
+    data_in  : in  std_logic_vector(data_width - 1 downto 0);
+    data_out : out std_logic_vector(data_width - 1 downto 0);
+    
+    spi_in    : in  std_logic;
+    spi_out   : out std_logic;
+    spi_clock : out std_logic);
 end spi_engine_e;
 
 -----------------------------------------------------------------------
@@ -29,15 +29,15 @@ end spi_engine_e;
 architecture rtl of spi_engine_e is
   component spi_counter_e
     generic(
-         count : positive := data_width * 2);
+      count : positive := data_width * 2 + 1);
     port(
       clock  : in  std_logic;
-         reset  : in  std_ulogic;
-         enable : in  std_logic;
+      reset  : in  std_ulogic;
+      enable : in  std_logic;
       
       override : in std_logic;
-       
-         done : out std_logic);
+    
+      done : out std_logic);
   end component;
   
   component spi_shifter_e
@@ -45,22 +45,16 @@ architecture rtl of spi_engine_e is
       data_width : positive := data_width);
     port(
       clock  : in  std_logic;
-         enable : in  std_logic;
-       
-         preload : in  std_logic_vector(data_width - 1 downto 0);
-         load    : in  std_logic;
-         data    : out std_logic_vector(data_width - 1 downto 0);
-       
-         input  : in  std_logic;
-         output : out std_logic);
+      enable : in  std_logic;
+    
+      preload : in  std_logic_vector(data_width - 1 downto 0);
+      load    : in  std_logic;
+      data    : out std_logic_vector(data_width - 1 downto 0);
+    
+      input  : in  std_logic;
+      output : out std_logic);
   end component;
 
-  -- type state_t is (
-    -- start_state_c,
-       -- latch_state_c,
-       -- shift_state_c,
-       -- finis_state_c);
-  -- signal state_s : state_t;
   constant state_count_c : positive := 4;
   subtype state_t is std_logic_vector(state_count_c - 1 downto 0);
   signal state_s : state_t;
@@ -86,75 +80,75 @@ begin
   sequence : process(clock, reset, trigger, state_s)
   begin
     if reset = '1' then
-         state_s <= (start_state_c => '1', others => '0');
-       elsif rising_edge(clock) then
-         if (state_s(start_state_c) and trigger) = '1' then
+      state_s <= (start_state_c => '1', others => '0');
+    elsif rising_edge(clock) then
+      if (state_s(start_state_c) and trigger) = '1' then
         state_s(start_state_c) <= '0';
-               state_s(latch_state_c) <= '1';
-         end if;
-         if (state_s(latch_state_c) and trigger) = '1' then
+        state_s(latch_state_c) <= '1';
+      end if;
+      if (state_s(latch_state_c) and trigger) = '1' then
         state_s(latch_state_c) <= '0';
-               state_s(shift_state_c) <= '1';
-         end if;
+        state_s(shift_state_c) <= '1';
+      end if;
       if (state_s(shift_state_c) and trigger) = '1' then
-           state_s(shift_state_c) <= '0';
-               state_s(finis_state_c) <= '1';
-         end if;
+        state_s(shift_state_c) <= '0';
+        state_s(finis_state_c) <= '1';
+      end if;
       if (state_s(finis_state_c)) = '1' then
-           state_s(finis_state_c) <= '0';
+        state_s(finis_state_c) <= '0';
         if done_s = '0' then
-                 state_s(latch_state_c) <= '1';
-               else
-                 state_s(start_state_c) <= '1';
-               end if;
-         end if;
-       end if;
+          state_s(latch_state_c) <= '1';
+        else
+          state_s(start_state_c) <= '1';
+        end if;
+      end if;
+    end if;
   end process;
   
   clocker : process(clock, reset, trigger, state_s)
   begin
     if reset = '1' then
-         spi_clock_s <= spi_cpol;
-       elsif rising_edge(clock) then
-         if trigger = '1' then
-           if state_s(start_state_c) = '1' then
-                 if spi_cpha = '1' then
-                   spi_clock_s <= not spi_clock_s;
-                 end if;
-               else
-                 spi_clock_s <= not spi_clock_s;
-               end if;
-         end if;
-       end if;
+      spi_clock_s <= spi_cpol;
+    elsif rising_edge(clock) then
+      if trigger = '1' then
+        if state_s(start_state_c) = '1' then
+          if spi_cpha = '1' then
+            spi_clock_s <= not spi_clock_s;
+          end if;
+        else
+          spi_clock_s <= not spi_clock_s;
+        end if;
+      end if;
+    end if;
   end process;
   
   latcher : process(trigger, state_s)
   begin
     if (state_s(latch_state_c) and trigger) = '1' then
-         buffer_s <= spi_in;
-       end if;
+      buffer_s <= spi_in;
+    end if;
   end process;
   
   shifter_load_s <= state_s(start_state_c) and trigger;
   shifter_trig_s <= state_s(shift_state_c) and trigger;
   shifter : spi_shifter_e port map(
     clock  => clock,
-       enable => shifter_trig_s,
-       
-       preload => data_in,
-       load    => shifter_load_s,
-       data    => data_s,
-       
-       input  => buffer_s,
-       output => spi_out);
+    enable => shifter_trig_s,
+    
+    preload => data_in,
+    load    => shifter_load_s,
+    data    => data_s,
+    
+    input  => buffer_s,
+    output => spi_out);
   
   counter : spi_counter_e port map(
     clock  => clock,
-       reset  => reset,
-       enable => trigger,
+    reset  => reset,
+    enable => trigger,
     
     override => '0',
-       
-       done => done_s);
+    
+    done => done_s);
 
 end rtl;
index 50fac6e..629bc32 100644 (file)
@@ -7,21 +7,21 @@ use ieee.numeric_std.all;
 entity spi_master is
   generic(
     clk_div    : positive := 10;
-       data_width : positive :=  8;
-       spi_mode   : integer range 0 to 3 := 0);
+    data_width : positive :=  8;
+    spi_mode   : integer range 0 to 3 := 0);
   port(
     clk : in  std_logic;
-       rst : in  std_logic;
-       
-       start : in  std_logic;
-       busy  : out std_logic;
-       
-       txd   : in  std_logic_vector(data_width - 1 downto 0);
-       rxd   : out std_logic_vector(data_width - 1 downto 0);
-       
-       miso  : in  std_logic;
-       mosi  : out std_logic;
-       sck   : out std_logic);
+    rst : in  std_logic;
+    
+    start : in  std_logic;
+    busy  : out std_logic;
+    
+    txd   : in  std_logic_vector(data_width - 1 downto 0);
+    rxd   : out std_logic_vector(data_width - 1 downto 0);
+    
+    miso  : in  std_logic;
+    mosi  : out std_logic;
+    sck   : out std_logic);
 end spi_master;
 
 -----------------------------------------------------------------------
@@ -33,24 +33,24 @@ architecture rtl of spi_master is
   
   component spi_counter_e
     generic(
-         count : positive := clk_div / 2);
+      count : positive := clk_div / 2); -- TODO: odd clk_div? TODO: min: 6
     port(
       clock  : in  std_logic;
-         reset  : in  std_ulogic;
-         enable : in  std_logic;
+      reset  : in  std_ulogic;
+      enable : in  std_logic;
       
       override : in std_logic;
-       
-         done : out std_logic);
+    
+      done : out std_logic);
   end component;
   
   component spi_starter_e
     port(
       clock   : in  std_logic;
       reset   : in  std_logic;
-       
-         start   : in  std_logic;
-         stop    : in  std_logic;
+    
+      start   : in  std_logic;
+      stop    : in  std_logic;
     
       status  : out std_logic);
   end component;
@@ -58,20 +58,21 @@ architecture rtl of spi_master is
   component spi_engine_e
     generic(
       data_width : positive := data_width;
-         spi_cpol   : std_logic := spi_cpol_c;
-         spi_cpha   : std_logic := spi_cpha_c);
+      spi_cpol   : std_logic := spi_cpol_c;
+      spi_cpha   : std_logic := spi_cpha_c);
     port(
       clock : in  std_logic;
-         reset : in  std_ulogic;
-       
-         trigger : in  std_logic;
-         done    : out std_logic;
-       
-         data_in  : in  std_logic_vector(data_width - 1 downto 0);
-         data_out : out std_logic_vector(data_width - 1 downto 0);
-       
-         spi_in   : in  std_logic;
-         spi_out  : out std_logic);
+      reset : in  std_ulogic;
+    
+      trigger : in  std_logic;
+      done    : out std_logic;
+    
+      data_in  : in  std_logic_vector(data_width - 1 downto 0);
+      data_out : out std_logic_vector(data_width - 1 downto 0);
+    
+      spi_in    : in  std_logic;
+      spi_out   : out std_logic;
+      spi_clock : out std_logic);
   end component;
 
   signal clock_s : std_logic;
@@ -106,33 +107,34 @@ begin
   
   starter : spi_starter_e port map(
     clock  => clock_s,
-       reset  => reset_s,
-       
-       start   => start_s,
-       stop    => stop_s,
-       
-       status  => running_s);
-       
+    reset  => reset_s,
+    
+    start   => start_s,
+    stop    => stop_s,
+    
+    status  => running_s);
+    
   trigger : spi_counter_e port map(
     clock  => clock_s,
-       reset  => reset_s,
-       enable => running_s,
+    reset  => reset_s,
+    enable => running_s,
     
     override => start_s,
-       
-       done   => trigger_s);
-       
+    
+    done   => trigger_s);
+    
   engine : spi_engine_e port map(
     clock => clock_s,
-       reset => reset_s,
-       
-       trigger => trigger_s,
-       done    => stop_s,
-       
-       data_in  => data_in_s,
-       data_out => data_out_s,
-       
-       spi_in   => spi_in_s,
-       spi_out  => spi_out_s);
+    reset => reset_s,
+    
+    trigger => trigger_s,
+    done    => stop_s,
+    
+    data_in  => data_in_s,
+    data_out => data_out_s,
+    
+    spi_in    => spi_in_s,
+    spi_out   => spi_out_s,
+    spi_clock => spi_clock_s);
   
 end rtl;
index bf68729..7ecc9ae 100644 (file)
@@ -8,14 +8,14 @@ entity spi_shifter_e is
     data_width : positive);
   port(
     clock  : in  std_logic;
-       enable : in  std_logic;
-       
-       preload : in  std_logic_vector(data_width - 1 downto 0);
-       load    : in  std_logic;
-       data    : out std_logic_vector(data_width - 1 downto 0);
-       
-       input  : in  std_logic;
-       output : out std_logic);
+    enable : in  std_logic;
+    
+    preload : in  std_logic_vector(data_width - 1 downto 0);
+    load    : in  std_logic;
+    data    : out std_logic_vector(data_width - 1 downto 0);
+    
+    input  : in  std_logic;
+    output : out std_logic);
 end spi_shifter_e;
 
 -----------------------------------------------------------------------
@@ -29,13 +29,13 @@ begin
   process(clock, enable)
   begin
     if rising_edge(clock) then
-         if (enable or load) = '1' then
-           if load = '1' then
-                 data_s <= preload;
-           else
-                 data_s <= data_s(data_s'high - 1 downto data_s'low) & input;
-               end if;
-         end if;
-       end if;
+      if (enable or load) = '1' then
+        if load = '1' then
+          data_s <= preload;
+        else
+          data_s <= data_s(data_s'high - 1 downto data_s'low) & input;
+        end if;
+      end if;
+    end if;
   end process;
 end rtl;
index b941b08..83173d3 100644 (file)
@@ -7,9 +7,9 @@ entity spi_starter_e is
   port(
     clock   : in  std_logic;
     reset   : in  std_logic;
-       
-       start   : in  std_logic;
-       stop    : in  std_logic;
+    
+    start   : in  std_logic;
+    stop    : in  std_logic;
     
     status  : out std_logic);
 end spi_starter_e;
@@ -23,13 +23,13 @@ begin
   
   runner : process(clock, reset, stop)
   begin
-       if reset = '1' then
-         running_s <= '0';
-       elsif rising_edge(clock) then
-         if (start or stop) = '1' then
-           running_s <= start and not stop;
-         end if;
-       end if;
+    if reset = '1' then
+      running_s <= '0';
+    elsif rising_edge(clock) then
+      if (start or stop) = '1' then
+        running_s <= start and not stop;
+      end if;
+    end if;
   end process;
 
 end rtl;
index 1610c15..cceb96c 100644 (file)
@@ -98,11 +98,11 @@ begin
   input : process
   begin
     spi_in_a_s  <= 'L';
-    wait until falling_edge(trigger_s);
-    wait until falling_edge(trigger_s);
+    wait until rising_edge(trigger_s);
+    wait until rising_edge(trigger_s);
     spi_in_a_s  <= 'H';
-    wait until falling_edge(trigger_s);
-    wait until falling_edge(trigger_s);
+    wait until rising_edge(trigger_s);
+    wait until rising_edge(trigger_s);
   end process;
   
   reset : process
diff --git a/fhw_spi_t/spi_master_t.vhd b/fhw_spi_t/spi_master_t.vhd
new file mode 100644 (file)
index 0000000..428bb5a
--- /dev/null
@@ -0,0 +1,98 @@
+library ieee;
+use ieee.std_logic_1164.all;
+
+library fhw_spi;
+use fhw_spi.all;
+
+-----------------------------------------------------------------------
+
+entity spi_master_t is
+  generic(
+    clock_interval : time := 20 us;
+    clock_divider  : positive := 6;
+    data_width : positive := 8;
+    spi_mode : natural := 0);
+end spi_master_t;
+
+-----------------------------------------------------------------------
+
+architecture test of spi_master_t is
+  component spi_master is
+    generic(
+      clk_div    : positive;
+      data_width : positive;
+      spi_mode   : integer range 0 to 3);
+    port(
+      clk : in  std_logic;
+      rst : in  std_logic;
+    
+      start : in  std_logic;
+      busy  : out std_logic;
+    
+      txd   : in  std_logic_vector(data_width - 1 downto 0);
+      rxd   : out std_logic_vector(data_width - 1 downto 0);
+    
+      miso  : in  std_logic;
+      mosi  : out std_logic;
+      sck   : out std_logic);
+  end component;
+  
+  constant pattern_c : std_logic_vector(data_width - 1 downto 0) := ('1', '0', '0', '1', '0', '1', '1', '0', others => '0');
+
+  signal test_s : integer;
+  
+  signal clock_s  : std_logic;
+  signal reset_s  : std_logic;
+  
+  signal start_s : std_logic;
+  signal busy_s  : std_logic;
+  signal txd_s   : std_logic_vector(data_width - 1 downto 0);
+  signal rxd_s   : std_logic_vector(data_width - 1 downto 0);
+  signal miso_s  : std_logic;
+  signal mosi_s  : std_logic;
+  signal sck_s   : std_logic;
+begin
+  dut : spi_master generic map(clock_divider, data_width, spi_mode) port map(clock_s, reset_s, start_s, busy_s, txd_s, rxd_s, miso_s, mosi_s, sck_s);
+  
+  stimulus : process
+  begin
+    test_s <= -3;
+    start_s <= '0';
+    txd_s   <= (others => 'U');
+    miso_s  <= 'Z';
+    wait until falling_edge(reset_s); test_s <= test_s + 1;
+    
+    wait until rising_edge(clock_s); test_s <= test_s + 1;
+    txd_s  <= pattern_c;
+    miso_s <= '1';
+    
+    wait until rising_edge(clock_s); test_s <= test_s + 1;
+    start_s <= '1';
+    
+    wait until rising_edge(clock_s); test_s <= test_s + 1;
+    start_s <= '0';
+    
+    wait until falling_edge(busy_s); test_s <= test_s + 1;
+    txd_s  <= (others => 'U');
+    miso_s <= 'Z';
+    
+    wait;
+  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;
+    clock_s <= '1';
+    wait for clock_interval;
+  end process;
+  
+end test;
index 10da1b7..8794ae6 100644 (file)
@@ -25,7 +25,7 @@ architecture test of spi_shifter_t is
       preload : in  std_logic_vector(data_width - 1 downto 0);
       load    : in  std_logic;
       data    : out std_logic_vector(data_width - 1 downto 0);
-       
+    
       input  : in  std_logic;
       output : out std_logic);
   end component;
index fb2d5ec..f8779c9 100644 (file)
@@ -18,9 +18,9 @@ architecture test of spi_starter_t is
     port(
       clock   : in  std_logic;
       reset   : in  std_logic;
-       
-         start   : in  std_logic;
-         stop    : in  std_logic;
+    
+      start   : in  std_logic;
+      stop    : in  std_logic;
     
       status  : out std_logic);
   end component;