library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity controller is
port(
clk_50 : in std_logic;
input : in std_logic_vector(7 downto 0);
l : out std_logic_vector(1 downto 0);
r : out std_logic_vector(1 downto 0);
ref_L : out integer range 0 to 20 + 1 ;
ref_R : out integer range 0 to 20 + 1 );
end controller;
architecture beh of controller is
type state is (START,MARCH_LEFT,MARCH_RIGHT,FORWARD,STOP,TURN_LEFT,TURN_RIGHT);
signal PresentState: state;
signal NextState: state;
begin
SwitchToNextState : process (clk_50,input) -- PresentState -> NextState
variable tmp0,tmp1 :integer range 0 to 50;
begin
if clk_50'event and clk_50 = '1' then
case input is
when "11111111" =>
tmp0 := 15;
tmp1 := 0;
when "00000000" =>
tmp1 := tmp1 + 1;
when others =>
if tmp0 >= 1 then
tmp0 := tmp0 - 1;
end if;
tmp1 := 0;
end case;
if tmp0 >= 1 then
PresentState <= FORWARD;
elsif tmp1 >= 40 then
PresentState <= START;
else
PresentState <= NextState;
end if;
end if;
end process SwitchToNextState;
StateMode : process (input,PresentState)
begin
case PresentState is
when START =>
case input is
when "11100000" =>
NextState <= TURN_RIGHT;
when "11000000" =>
NextState <= TURN_RIGHT;
when "10000000" =>
NextState <= TURN_RIGHT;
when "00000111" =>
NextState <= TURN_LEFT;
when "00000011" =>
NextState <= TURN_LEFT;
when "00000001" =>
NextState <= TURN_LEFT;
when others =>
case input(4 downto 3) is
when "11" =>
NextState <= STOP;
when "10" =>
NextState <= STOP;
when "01" =>
NextState <= STOP;
when others =>
Nextstate <= START;
end case;
end case;
l <= "10" ;
r <= "10" ;
ref_L <= 11 ;
ref_R <= 11 ;
when MARCH_LEFT =>
case input is
when "11100000" =>
NextState <= TURN_RIGHT;
when "11000000" =>
NextState <= TURN_RIGHT;
when "10000000" =>
NextState <= TURN_RIGHT;
when "00000111" =>
NextState <= TURN_LEFT;
when "00000011" =>
NextState <= TURN_LEFT;
when "00000001" =>
NextState <= TURN_LEFT;
when others =>
case input(4 downto 3) is
when "11" =>
NextState <= STOP;
when "10" =>
NextState <= STOP;
when "01" =>
NextState <= STOP;
when others =>
Nextstate <= START;
end case;
end case;
l <= "01" ;
r <= "10" ;
ref_L <= 17 ;
ref_R <= 14 ;
when MARCH_RIGHT =>
case input is
when "11100000" =>
NextState <= TURN_RIGHT;
when "11000000" =>
NextState <= TURN_RIGHT;
when "10000000" =>
NextState <= TURN_RIGHT;
when "00000111" =>
NextState <= TURN_LEFT;
when "00000011" =>
NextState <= TURN_LEFT;
when "00000001" =>
NextState <= TURN_LEFT;
when others =>
case input(4 downto 3) is
when "11" =>
NextState <= STOP;
when "10" =>
NextState <= STOP;
when "01" =>
NextState <= STOP;
when others =>
Nextstate <= START;
end case;
end case;
l <= "10" ;
r <= "01" ;
ref_L <= 14 ;
ref_R <= 17 ;
when STOP =>
case input is
when "11110000" =>
NextState <= TURN_LEFT;
when "11100000" =>
NextState <= TURN_LEFT;
when "11000000" =>
NextState <= TURN_LEFT;
when "10000000" =>
NextState <= TURN_LEFT;
when "00001111" =>
NextState <= TURN_RIGHT;
when "00000111" =>
NextState <= TURN_RIGHT;
when "00000011" =>
NextState <= TURN_RIGHT;
when "00000001" =>
NextState <= TURN_RIGHT;
when "10110000" =>
NextState <= TURN_LEFT;
when "00001101" =>
NextState <= TURN_RIGHT;
when "11111000" =>
NextState <= TURN_LEFT;
when "11111100" =>
NextState <= TURN_LEFT;
when "00011111" =>
NextState <= TURN_RIGHT;
when "00111111" =>
NextState <= TURN_RIGHT;
when "00001001" =>
NextState <= TURN_RIGHT;
when "10010000" =>
NextState <= TURN_LEFT;
when "00010001" =>
NextState <= TURN_RIGHT;
when "10001000" =>
NextState <= TURN_LEFT;
when others =>
NextState <= FORWARD;
end case;
l <= "00" ;
r <= "00" ;
ref_L <= 0 ;
ref_R <= 0 ;
when FORWARD => --speed
case input is
when "11110000" =>
NextState <= STOP;
when "11100000" =>
NextState <= STOP;
when "11000000" =>
NextState <= STOP;
when "10000000" =>
NextState <= STOP;
when "00001111" =>
NextState <= STOP;
when "00000111" =>
NextState <= STOP;
when "00000011" =>
NextState <= STOP;
when "00000001" =>
NextState <= STOP;
when "10110000" =>
NextState <= STOP;
when "00001101" =>
NextState <= STOP;
when "11111000" =>
NextState <= STOP;
when "11111100" =>
NextState <= STOP;
when "00011111" =>
NextState <= STOP;
when "00111111" =>
NextState <= STOP;
when "00001001" =>
NextState <= STOP;
when "10010000" =>
NextState <= STOP;
when "00010001" =>
NextState <= STOP;
when "10001000" =>
NextState <= STOP;
when others =>
NextState <= FORWARD;
end case;
l <= "10" ;
r <= "10" ;
ref_L <= 11 ;
ref_R <= 11 ;
when TURN_LEFT => --turn left stay
case input is
when "11110000" =>
NextState <= TURN_LEFT;
when "11100000" =>
NextState <= TURN_LEFT;
when "11000000" =>
NextState <= TURN_LEFT;
when "10000000" =>
NextState <= TURN_LEFT;
when "00001111" =>
NextState <= STOP;
when "00000111" =>
NextState <= STOP;
when "00000011" =>
NextState <= STOP;
when "00000001" =>
NextState <= STOP;
when "10110000" =>
NextState <= TURN_LEFT;
when "00001101" =>
NextState <= STOP;
when "11111000" =>
NextState <= TURN_LEFT;
when "11111100" =>
NextState <= TURN_LEFT;
when "00011111" =>
NextState <= STOP;
when "00111111" =>
NextState <= STOP;
when "10001000" =>
NextState <= TURN_LEFT;
when "11001000" =>
NextState <= TURN_LEFT;
when "10001100" =>
NextState <= TURN_LEFT;
when "11001100" =>
NextState <= TURN_LEFT;
红外循迹小车VHDL程序
5星 · 超过95%的资源 需积分: 34 68 浏览量
2009-09-13
11:18:39
上传
评论 17
收藏 565KB RAR 举报
heyun07
- 粉丝: 2
- 资源: 5
最新资源
- 《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第1章docker基础(1.1-1.4)
- 基于python实现的水下压缩空气储能互补系统建模仿真与经济效益分析+源代码+论文
- 华中科技大学-自然语言处理实验,Bi-LSTM+CRF的中文分词框架,并且利用基于深度学习的方法进行中文命名实体识别++源码报告
- 基于动态罚函数的铁路车流分配与径路优化模型python源码
- 鱼群算法求解组环问题python源码+文档说明
- 基于决策优化的多波束测深测线规划模型MATLAB代码
- 课程设计-基于python实现的多目标优化算法求解带时间窗的车辆路径规划问题+源代码+文档说明+界面截图+pptx
- 基于通信信号与通信系统的MATLAB仿真源码-课程设计
- 嵌入式-信号机制(概念,发送,定时,捕捉,SIGCHLD 信号实现回收子进程)
- c语言管理系统大一大二笔记
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈