Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 10th, 2012  |  syntax: VHDL  |  size: 8.10 KB  |  hits: 19  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. entity sculpture is
  2.     Port ( clk : in  STD_LOGIC;
  3.            res : in  STD_LOGIC;
  4.            touch_sens : in  STD_LOGIC_VECTOR (3 downto 0);
  5.            motion_sens : in  STD_LOGIC;
  6.            state_out : out  STD_LOGIC_VECTOR (1 downto 0);
  7.            count_out : out  STD_LOGIC_VECTOR (6 downto 0);
  8.            panes : out  STD_LOGIC_VECTOR (2 downto 0));
  9. end sculpture;
  10.  
  11. architecture sculpture_a of sculpture is
  12.  
  13. component delay_counter is
  14.     Port ( clk : in  STD_LOGIC;
  15.            res : in  STD_LOGIC;
  16.            start_count : in  STD_LOGIC;
  17.            count_done : out  STD_LOGIC);
  18. end component;
  19.  
  20. signal start_timer : std_logic;
  21. signal end_timer : std_logic;
  22. signal reset_cnt : std_logic;
  23. signal state : std_logic_vector(1 downto 0);
  24. signal next_state : std_logic_vector(1 downto 0);
  25. signal inc_cnt : std_logic;
  26. signal idle_cnt : std_logic_vector(6 downto 0);
  27. signal idle_cnt_done : std_logic;
  28. signal next_frame : std_logic_vector (2 downto 0);
  29. signal frame : std_logic_vector (2 downto 0);
  30. signal next_toggles : std_logic_vector (2 downto 0);
  31. signal toggles : std_logic_vector (2 downto 0);
  32. signal frame_cnt : std_logic_vector (3 downto 0);
  33. signal touch : std_logic_vector (2 downto 0);
  34. signal reset_frame_cnt : std_logic;
  35. signal reset_frame : std_logic;
  36. signal reset_toggle : std_logic;
  37. signal frame_on : std_logic;
  38. signal frame_done : std_logic;
  39.  
  40. type frame_rom is array(0 to 15) of std_logic_vector(2 downto 0);
  41.  
  42. constant RAND_ROM : frame_rom := ("111", "110", "101", "100", "011", "010", "001", "010", "100", "101", "110", "111", "000", "010", "101", "100");
  43.  
  44. constant ANIM_ROM : frame_rom := ("100", "011", "010", "011", "100", "100", "100", "011", "011", "011", "100", "110", "110", "100", "011", "010");
  45.  
  46. constant ANIM_COND : std_logic_vector(2 downto 0) := "111";
  47.  
  48. -- State 0 : RESET_S "00"
  49. -- State 1 : BORED      "01"
  50. -- State 2 : PLAY       "10"
  51. -- State 3 : ANIMATE    "11"
  52.  
  53. begin
  54.  
  55. delay: delay_counter port map (
  56.                                                                                         clk => clk,
  57.                                                                                         res => res,
  58.                                                                                         start_count => start_timer,
  59.                                                                                         count_done => end_timer
  60.                                                                                 );
  61.  
  62. --State Register                                                                               
  63. process(clk, res)
  64.         begin
  65.                 if (rising_edge(clk)) then
  66.                         if (res = '1') then
  67.                                 state <= "00";
  68.                         else
  69.                                 state <= next_state;
  70.                         end if;
  71.                 end if;
  72. end process;
  73.  
  74. --Next State Logic
  75. process(state,motion_sens,idle_cnt_done,end_timer,frame,toggles,touch_sens,frame_done,idle_cnt)
  76.         begin
  77.                 case state is
  78.                         when "00" =>
  79.                                 inc_cnt <= '0';
  80.                                 reset_frame_cnt <= '1';
  81.                                 reset_frame <= '1';
  82.                                 reset_cnt <= '1';
  83.                                 reset_toggle <= '1';
  84.                                 start_timer <= '1';
  85.                                 frame_on <= '0';
  86.                                 next_state <= "01";
  87.                         when "01" =>
  88.                                 if(motion_sens = '1') then
  89.                                         inc_cnt <= '0';
  90.                                         reset_frame_cnt <= '0';
  91.                                         reset_frame <= '0';
  92.                                         reset_cnt <= '1';
  93.                                         reset_toggle <= '0';
  94.                                         start_timer <= '0';
  95.                                         frame_on <= '0';
  96.                                         next_state <= "10";
  97.                                 elsif(idle_cnt_done = '1') then
  98.                                         inc_cnt <= '0';
  99.                                         reset_toggle <= '0';
  100.                                         reset_frame <= '0';
  101.                                         start_timer <= '0';
  102.                                         frame_on <= '1';
  103.                                         reset_cnt <= '1';
  104.                                         next_state <= "01";
  105.                                 elsif(end_timer = '1') then
  106.                                         inc_cnt <= '1';
  107.                                         reset_toggle <= '0';
  108.                                         reset_frame <= '0';
  109.                                         reset_cnt <= '0';
  110.                                         start_timer <= '1';
  111.                                         frame_on <= '0';
  112.                                         next_state <= "01";
  113.                                 else
  114.                                         inc_cnt <= inc_cnt;
  115.                                         reset_toggle <= reset_toggle;
  116.                                         reset_frame <= reset_frame;
  117.                                         start_timer <= start_timer;
  118.                                         frame_on <= frame_on;
  119.                                         reset_cnt <= reset_cnt;                        
  120.                                         next_state <= next_state;
  121.                                        
  122.                                 end if;
  123.                         when "10" =>
  124.                                 if((frame xor toggles) = "111") then
  125.                                         inc_cnt <= '0';
  126.                                         reset_toggle <= '1';
  127.                                         reset_frame <= '0';
  128.                                         start_timer <= '0';
  129.                                         frame_on <= '0';
  130.                                         reset_cnt <= '1';
  131.                                         next_state <= "11";
  132.                                 elsif(touch_sens(0) = '1') then
  133.                                         inc_cnt <= '0';
  134.                                         reset_toggle <= '0';
  135.                                         reset_frame <= '0';
  136.                                         start_timer <= '0';
  137.                                         frame_on <= '0';
  138.                                         touch(0) <= '1';
  139.                                         reset_cnt <= '1';
  140.                                         next_state <= "10";
  141.                                 elsif(touch_sens(1) = '1') then
  142.                                         inc_cnt <= '0';
  143.                                         reset_toggle <= '0';
  144.                                         reset_frame <= '0';
  145.                                         start_timer <= '0';
  146.                                         frame_on <= '0';
  147.                                         touch(1) <= '1';
  148.                                         reset_cnt <= '1';
  149.                                         next_state <= "10";
  150.                                 elsif(touch_sens(2) = '1') then
  151.                                         inc_cnt <= '0';
  152.                                         reset_toggle <= '0';
  153.                                         reset_frame <= '0';
  154.                                         start_timer <= '0';
  155.                                         frame_on <= '0';
  156.                                         touch(2) <= '1';
  157.                                         reset_cnt <= '1';
  158.                                         next_state <= "10";
  159.                                 elsif(idle_cnt_done = '1') then
  160.                                         inc_cnt <= '0';
  161.                                         reset_toggle <= '0';
  162.                                         reset_frame <= '0';
  163.                                         start_timer <= '0';
  164.                                         frame_on <= '0';
  165.                                         reset_cnt <= '1';
  166.                                         next_state <= "01";
  167.                                 elsif(end_timer = '1') then
  168.                                         inc_cnt <= '1';
  169.                                         reset_toggle <= '0';
  170.                                         reset_frame <= '0';
  171.                                         reset_cnt <= '0';      
  172.                                         frame_on <= '0';
  173.                                         start_timer <= '1';
  174.                                         next_state <= "10";
  175.                                        
  176.                                 else
  177.                                         inc_cnt <= inc_cnt;
  178.                                         reset_toggle <= reset_toggle;
  179.                                         reset_frame <= reset_frame;
  180.                                         start_timer <= start_timer;
  181.                                         frame_on <= frame_on;
  182.                                         reset_cnt <= reset_cnt;                        
  183.                                         next_state <= next_state;
  184.                                        
  185.                                 end if;
  186.                         when "11" =>
  187.                                 if(frame_done = '1') then
  188.                                         inc_cnt <= '0';
  189.                                         reset_toggle <= '0';
  190.                                         reset_frame <= '0';
  191.                                         start_timer <= '0';
  192.                                         frame_on <= '0';
  193.                                         reset_cnt <= '0';
  194.                                         next_state <= "10";
  195.                                 elsif(idle_cnt = "0000001") then
  196.                                         inc_cnt <= '0';
  197.                                         reset_toggle <= '0';
  198.                                         reset_frame <= '0';
  199.                                         start_timer <= '0';
  200.                                         reset_cnt <= '1';
  201.                                         frame_on <= '1';
  202.                                         next_state <= "11";
  203.                                 elsif(end_timer = '1') then
  204.                                         inc_cnt <= '1';
  205.                                         reset_toggle <= '0';
  206.                                         reset_frame <= '0';
  207.                                         reset_cnt <= '0';
  208.                                         frame_on <= '0';
  209.                                         start_timer <= '1';
  210.                                         next_state <= "11";
  211.                                 else
  212.                                         inc_cnt <= inc_cnt;
  213.                                         reset_toggle <= reset_toggle;
  214.                                         reset_frame <= reset_frame;
  215.                                         start_timer <= start_timer;
  216.                                         frame_on <= frame_on;
  217.                                         reset_cnt <= reset_cnt;                        
  218.                                         next_state <= next_state;
  219.                                 end if;
  220.                         when others =>
  221.                                 inc_cnt <= inc_cnt;
  222.                                 reset_toggle <= reset_toggle;
  223.                                 reset_frame <= reset_frame;
  224.                                 start_timer <= start_timer;
  225.                                 frame_on <= frame_on;
  226.                                 reset_cnt <= reset_cnt;                        
  227.                                 next_state <= next_state;
  228.                 end case;              
  229. end process;
  230.  
  231. -- Array Register
  232. process(clk, res, reset_frame_cnt, frame_on)
  233.         begin
  234.                 if(rising_edge(clk)) then
  235.                         if(res = '1') then
  236.                                 frame_cnt <= X"0";
  237.                         elsif(reset_frame_cnt = '1') then
  238.                                 frame_cnt <= X"0";
  239.                         elsif(frame_on = '1') then
  240.                                 frame_cnt <= frame_cnt + '1';
  241.                         else
  242.                                 frame_cnt <= frame_cnt;
  243.                         end if;
  244.                 end if;
  245. end process;
  246.  
  247. frame_done <= '1' when (frame_cnt = X"F") else '0';
  248.  
  249. -- Frame Register
  250. process(clk, res, reset_frame, state)
  251.         begin
  252.                 if(rising_edge(clk)) then
  253.                         if(res = '1') then
  254.                                 next_frame <= "000";
  255.                         elsif(reset_frame = '1') then
  256.                                 next_frame <= "000";
  257.                         elsif(state = "01") then
  258.                                 next_frame <= RAND_ROM(conv_integer(frame_cnt));
  259.                         elsif(state = "11") then
  260.                                 next_frame <= ANIM_ROM(conv_integer(frame_cnt));
  261.                         else
  262.                                 next_frame <= next_frame;
  263.                         end if;
  264.                 end if;
  265. end process;
  266.  
  267. -- Idle counter
  268. process(clk, res, reset_cnt, inc_cnt)
  269.         begin
  270.                 if(rising_edge(clk)) then
  271.                         if (res = '1') then
  272.                                 idle_cnt <= "0000000";
  273.                         elsif (reset_cnt = '1') then
  274.                                 idle_cnt <= "0000000";
  275.                         elsif (inc_cnt = '1') then
  276.                                 idle_cnt <= idle_cnt + '1';
  277.                         else
  278.                                 idle_cnt <= idle_cnt;
  279.                         end if;
  280.                 end if;
  281. end process;
  282.  
  283. idle_cnt_done <= '1' when (idle_cnt = "1111111") else '0';
  284.  
  285. -- Toggles Register
  286. process(clk, res, reset_toggle, touch)
  287.         begin
  288.                 if(rising_edge(clk)) then
  289.                         if(res = '1') then
  290.                                 next_toggles <= "000";
  291.                         elsif(reset_toggle = '1') then
  292.                                 next_toggles <= "000";
  293.                         elsif(touch(0) = '1') then
  294.                                 next_toggles <= NOT(toggles xor "001");
  295.                         elsif(touch(1) = '1') then
  296.                                 next_toggles <= NOT(toggles xor "010");
  297.                         elsif(touch(2) = '1') then
  298.                                 next_toggles <= NOT(toggles xor "100");
  299.                         else
  300.                                 next_toggles <= next_toggles;
  301.                         end if;
  302.                 end if;
  303. end process;
  304.  
  305. frame <= next_frame;
  306. toggles <= next_toggles;
  307. panes <= frame xor toggles;
  308. state_out <= state;
  309. count_out <= idle_cnt;
  310.  
  311. end sculpture_a;