Prepare for postsynthesis and timing analysis.
authorMalte S. Stretz <mss@apache.org>
Mon, 22 Jun 2009 08:39:53 +0000 (10:39 +0200)
committerMalte S. Stretz <mss@apache.org>
Mon, 22 Jun 2009 08:39:53 +0000 (10:39 +0200)
bos2k9.qsf
bos2k9.vhd
bos2k9_globals.vhd
bos2k9_t.vhd [new file with mode: 0644]
fhw_tools/button.vhd [new file with mode: 0644]

index 18ce902..a17d2cb 100644 (file)
@@ -48,10 +48,44 @@ set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
 set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region"
 set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region"
 set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
+set_global_assignment -name FMAX_REQUIREMENT "50 MHz" -section_id clock50m
+set_instance_assignment -name CLOCK_SETTINGS clock50m -to clk
+set_global_assignment -name USE_CONFIGURATION_DEVICE ON
+set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
+set_global_assignment -name OUTPUT_PIN_LOAD 1 -section_id "3.3-V LVTTL"
+set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL"
+set_location_assignment PIN_N2 -to clk
+set_location_assignment PIN_G25 -to rst
+set_global_assignment -name MISC_FILE "E:/vhdl/bos2k9/bos2k9.dpf"
 set_global_assignment -name VHDL_FILE fhw_spi/spi_shifter_e.vhd -library fhw_spi
 set_global_assignment -name VHDL_FILE fhw_spi/spi_counter_e.vhd -library fhw_spi
 set_global_assignment -name VHDL_FILE fhw_spi/spi_engine_e.vhd -library fhw_spi
 set_global_assignment -name VHDL_FILE fhw_spi/spi_starter_e.vhd -library fhw_spi
 set_global_assignment -name VHDL_FILE fhw_spi/spi_master.vhd -library fhw_spi
+set_global_assignment -name VHDL_FILE fhw_tools/button.vhd -library fhw_tools
 set_global_assignment -name VHDL_FILE bos2k9_globals.vhd
-set_global_assignment -name VHDL_FILE bos2k9.vhd
\ No newline at end of file
+set_global_assignment -name VHDL_FILE bos2k9.vhd
+set_location_assignment PIN_Y21 -to spi_mosi
+set_location_assignment PIN_AD24 -to spi_miso
+set_location_assignment PIN_AD25 -to spi_sck
+set_location_assignment PIN_AC23 -to spi_cs
+set_location_assignment PIN_AE23 -to busy_led
+set_location_assignment PIN_G26 -to start_btn
+set_location_assignment PIN_AE22 -to byte_led[0]
+set_location_assignment PIN_AF22 -to byte_led[1]
+set_location_assignment PIN_W19 -to byte_led[2]
+set_location_assignment PIN_V18 -to byte_led[3]
+set_location_assignment PIN_U18 -to byte_led[4]
+set_location_assignment PIN_U17 -to byte_led[5]
+set_location_assignment PIN_Y18 -to byte_led[6]
+set_location_assignment PIN_Y12 -to byte_led[7]
+set_location_assignment PIN_N25 -to byte_swc[0]
+set_location_assignment PIN_N26 -to byte_swc[1]
+set_location_assignment PIN_P25 -to byte_swc[2]
+set_location_assignment PIN_AE14 -to byte_swc[3]
+set_location_assignment PIN_AF14 -to byte_swc[4]
+set_location_assignment PIN_AD13 -to byte_swc[5]
+set_location_assignment PIN_AC13 -to byte_swc[6]
+set_location_assignment PIN_C13 -to byte_swc[7]
+set_global_assignment -name RESERVE_ASDO_AFTER_CONFIGURATION "AS INPUT TRI-STATED"
+set_global_assignment -name RESERVE_ALL_UNUSED_PINS_NO_OUTPUT_GND "AS INPUT TRI-STATED"
\ No newline at end of file
index 66bcf86..8871667 100644 (file)
@@ -4,19 +4,28 @@ use ieee.std_logic_1164.all;
 library fhw_spi;
 use fhw_spi.all;
 
+library fhw_tools;
+use fhw_tools.all;
+
+use work.bos2k9_globals.all;
+
 -----------------------------------------------------------------------
 
 entity bos2k9 is
-  generic(
-    clock_interval : time :=  20 ns;
-    data_width : positive := 8);
   port(
-    clk : in  std_logic; --pin:N2
-    rst : in  std_logic; --pin:G25
+    clk : in  std_logic; --PIN_N2
+    rst : in  std_logic; --PIN_G25
+    
+    start_btn : in  std_logic;
+    busy_led  : out std_logic;
     
-    miso : in  std_logic;
-    mosi : out std_logic;
-    sck  : out std_logic);
+    byte_swc : in  std_logic_byte_t;
+    byte_led : out std_logic_byte_t;
+    
+    spi_miso : in  std_logic;  --PIN_AD24
+    spi_mosi : out std_logic;  --PIN_Y21
+    spi_sck  : out std_logic;  --PIN_AD25
+    spi_cs   : out std_logic); --PIN_AC23
 end bos2k9;
 
 -----------------------------------------------------------------------
@@ -25,9 +34,8 @@ architecture board of bos2k9 is
 
   component spi_master 
     generic(
-      clk_div    : positive := 8;
-      data_width : positive := data_width;
-      spi_mode   : integer range 0 to 3 := 0);
+      clk_div    : positive := clock_div_c;
+      data_width : positive := std_logic_byte_t'length);
     port(
       clk : in  std_logic;
       rst : in  std_logic;
@@ -35,23 +43,32 @@ architecture board of bos2k9 is
       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);
+      txd   : in  std_logic_byte_t;
+      rxd   : out std_logic_byte_t;
     
       miso  : in  std_logic;
       mosi  : out std_logic;
       sck   : out std_logic);
   end component;
+  
+  component button
+    port(
+      input  : in  std_ulogic;
+      output : out std_ulogic);
+  end component;
 
   signal start_s : std_logic;
   signal busy_s  : std_logic;
   
-  signal ibuf_s  : std_logic_vector(data_width - 1 downto 0);
-  signal obuf_s  : std_logic_vector(data_width - 1 downto 0);
+  signal ibuf_s  : std_logic_byte_t;
+  signal obuf_s  : std_logic_byte_t;
   
 begin
+  spi_cs <= not busy_s;
+  busy_led <= busy_s;
   
-  start_s <= '0';
+  obuf_s <= byte_swc;
+  byte_led <= ibuf_s;
   
   spi_io : spi_master port map(
     clk => clk,
@@ -63,10 +80,11 @@ begin
     txd   => obuf_s,
     rxd   => ibuf_s,
     
-    miso  => miso,
-    mosi  => mosi,
-    sck   => sck);
-
+    miso  => spi_miso,
+    mosi  => spi_mosi,
+    sck   => spi_sck);
   
-
+  start_button : button port map(
+    input  => start_btn,
+    output => start_s);
 end board;
index e541ca7..8e2f12d 100644 (file)
@@ -3,7 +3,7 @@ use ieee.std_logic_1164.all;
 
 package bos2k9_globals is
 
-  constant clock_interval_c : time := 20 ns;
+  constant clock_interval_c : time := 20 us;
   constant clock_div_c : positive  :=  8; -- TODO?
 
   subtype std_logic_byte_t is std_logic_vector(7 downto 0);
diff --git a/bos2k9_t.vhd b/bos2k9_t.vhd
new file mode 100644 (file)
index 0000000..11c0e98
--- /dev/null
@@ -0,0 +1,174 @@
+-----------------------------------------------------------------------
+-- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
+--
+-- Testing the top level entity.
+-----------------------------------------------------------------------
+
+use work.bos2k9_globals.all;
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+-----------------------------------------------------------------------
+
+entity bos2k9_t is
+  generic(
+    clock_divider  : positive := 6;
+    txd_pattern : std_logic_byte_t := "10010110";
+    rxd_pattern : std_logic_byte_t := "LHLHLHLH";
+    repeat : natural := 1);
+end bos2k9_t;
+
+-----------------------------------------------------------------------
+
+architecture test of bos2k9_t is
+
+  component bos2k9 is
+    port(
+      clk : in  std_logic;
+      rst : in  std_logic;
+    
+      start_btn : in  std_logic;
+      busy_led  : out std_logic;
+    
+      byte_swc : in  std_logic_byte_t;
+      byte_led : out std_logic_byte_t;
+    
+      spi_miso : in  std_logic;
+      spi_mosi : out std_logic;
+      spi_sck  : out std_logic;
+      spi_cs   : out std_logic);
+  end component;
+
+  signal test_s : integer;
+  
+  signal clock_s  : std_logic;
+  signal reset_s  : std_logic;
+  
+  signal start_n : std_logic;
+  signal busy_s  : std_logic;
+  signal txd_s   : std_logic_byte_t;
+  signal rxd_s   : std_logic_byte_t;
+  signal miso_s  : std_logic;
+  signal mosi_s  : std_logic;
+  signal sck_s   : std_logic;
+  signal cs_s    : std_logic;
+  
+  signal ss_n    : std_logic;
+  
+  signal simo_s  : std_logic_byte_t;
+begin
+  dut : bos2k9 port map(
+    clk => clock_s,
+    rst => reset_s,
+    start_btn => start_n,
+    busy_led => busy_s,
+    byte_swc => txd_s,
+    byte_led => rxd_s,
+    spi_miso => miso_s,
+    spi_mosi => mosi_s,
+    spi_sck  => sck_s,
+    spi_cs   => cs_s);
+  
+  stimulus : process
+    variable repeat_v : natural;
+  begin
+    repeat_v := repeat;
+    test_s <= -3;
+    start_n <= '1';
+    txd_s   <= (others => 'U');
+    wait until falling_edge(reset_s); test_s <= test_s + 1;
+    
+    wait until rising_edge(clock_s); test_s <= test_s + 1;
+    txd_s  <= txd_pattern;
+    
+    wait until rising_edge(clock_s); test_s <= test_s + 1;
+    start_n <= '0';
+    
+    wait until rising_edge(clock_s); test_s <= test_s + 1;
+    
+    wait until rising_edge(clock_s); test_s <= test_s + 1;
+    txd_s  <= (others => 'U');
+    
+    while repeat_v > 0 loop
+      repeat_v := repeat_v - 1;
+    
+      wait until rising_edge(clock_s); test_s <= test_s + 1;
+      txd_s  <= (others => '1');
+    
+      wait until rising_edge(clock_s); test_s <= test_s + 1;
+      txd_s  <= txd_s xor txd_pattern;
+      
+      wait until falling_edge(busy_s); test_s <= test_s + 1;
+    
+      -- while busy_s = '1' loop
+        -- wait until rising_edge(clock_s);
+      -- end loop;
+      -- test_s <= test_s + 1;
+      -- start_n <= '0';
+    
+      wait until rising_edge(clock_s); test_s <= test_s + 1;
+      start_n <= '1';
+    
+      wait until rising_edge(clock_s); test_s <= test_s + 1;
+      txd_s  <= (others => 'U');
+    end loop;
+    
+    start_n <= '1';
+    wait;
+  end process;
+  
+  ss_n <= cs_s;
+  
+  slave : process
+    variable count_v : integer;
+    variable index_v : integer;
+    variable data_v  : std_logic_byte_t;
+  begin
+    simo_s  <= (others => 'U');
+    miso_s  <= 'Z';
+    index_v := 7;
+    count_v := 0;
+    wait until falling_edge(ss_n);
+    data_v := txd_s;
+    
+    miso_s  <= rxd_pattern(index_v);
+    
+    while ss_n = '0' loop
+      wait until sck_s'event or ss_n'event;
+      if not (index_v = -1) then
+        count_v := count_v + 1;
+        -- Latch on odd edges, shift on even
+        if (count_v mod 2) = 1 then
+          simo_s(0) <= mosi_s;
+          index_v := index_v - 1;
+        else
+          simo_s  <= simo_s(6 downto 0) & simo_s(7);
+          miso_s  <= rxd_pattern(index_v);
+        end if;
+      end if;
+    end loop;
+    
+    assert simo_s = data_v      report "neq:txd";
+    assert rxd_s  = rxd_pattern report "neq:rxd";
+    wait until falling_edge(clock_s);
+  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_c / 2;
+    clock_s <= '1';
+    wait for clock_interval_c / 2;
+  end process;
+  
+end test;
diff --git a/fhw_tools/button.vhd b/fhw_tools/button.vhd
new file mode 100644 (file)
index 0000000..880767e
--- /dev/null
@@ -0,0 +1,25 @@
+-----------------------------------------------------------------------
+-- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
+--
+-- TODO: description
+
+-----------------------------------------------------------------------
+-- This entity is part of the following library:
+-- pragma library fhw_tools
+library fhw_tools;
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity button is
+  port(
+    input  : in  std_ulogic;
+    output : out std_ulogic);
+end button;
+
+-----------------------------------------------------------------------
+
+architecture inverted of button is
+begin
+  output <= not input;
+end inverted;