⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 car.vhd

📁 用VHDL编程的智能寻迹小车.驱动电机沿黑线运动,转弯的时候有灯显示.可以综合,实际硬件调试通过.是学习VHDL的很好实例
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY car IS
   PORT(
      iSensorState:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
      CLRn,clkin:IN STD_LOGIC;
      Dclkout,Cclkout:OUT STD_LOGIC;
      RWC,LWC:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
      R_RUN:OUT STD_LOGIC;
      L_RUN:OUT STD_LOGIC);
     
END car;

ARCHITECTURE beha OF car IS
SIGNAL WCCount:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL Sensorstate:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL WC1:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL WC2:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL clk:STD_LOGIC;
SIGNAL clk1:STD_LOGIC;
SIGNAL Dclk:STD_LOGIC;
BEGIN

PROCESS (clkin, CLRn)
VARIABLE count1  : INTEGER RANGE 0 TO 9;
BEGIN
    IF CLRn='0' THEN
        count1 := 0;
      ELSIF clkin'EVENT AND clkin='1' THEN
        IF count1=9 THEN
            count1 := 0;
            clk<=NOT clk;
        ELSE
            count1 := count1 + 1;
        END IF;
    END IF;
END PROCESS;




Cclkout <=clk; 


PROCESS (clk, CLRn)
BEGIN
    IF CLRn='0' THEN
        clk1<='0';
        WCCount <= "000";
    ELSIF clk'EVENT AND clk='1' THEN
     IF WCCount="111"THEN
       clk1<=NOT clk1;
       WCCount<="000";
     ELSE
        WCCount <= WCCount + 1;
     END IF;
    END IF;
END PROCESS;

PROCESS(clk1,CLRn)
VARIABLE count2: INTEGER RANGE 0 TO 7;
BEGIN
  IF CLRn='0' THEN
     Dclk<='0';
     Count2:=0;
    ELSIF clk1'EVENT AND clk1='1' THEN
      IF count2=7 THEN
         Dclk<=NOT Dclk;
         Count2:=0;
      ELSE 
        Count2:=Count2+1;
      END IF;
  END IF;
END PROCESS;

Dclkout<=Dclk;


PROCESS (Dclk, CLRn)
BEGIN
    IF CLRn='0' THEN
        SensorState     <= "000";
    ELSIF Dclk'EVENT AND Dclk='1' THEN
        SensorState     <= iSensorState;
    END IF;
END PROCESS;


PROCESS (WCCount)
BEGIN
    CASE WCCount IS
        WHEN "000" => WC1 <= "0110"; --6
        WHEN "001" => WC1 <= "0111"; --7
        WHEN "010" => WC1 <= "0011"; --3
        WHEN "011" => WC1 <= "1011"; --B
        WHEN "100" => WC1 <= "1001"; --9
        WHEN "101" => WC1 <= "1101"; --D
        WHEN "110" => WC1 <= "1100"; --C
        WHEN "111" => WC1 <= "1110"; --E
        WHEN OTHERS=> WC1 <= "1111";
    END CASE;
END PROCESS;

PROCESS (WCCount)
BEGIN
    CASE WCCount IS
        WHEN "000" => WC2 <= "1110"; --E
        WHEN "001" => WC2 <= "1100"; --C
        WHEN "010" => WC2 <= "1101"; --D
        WHEN "011" => WC2 <= "1001"; --9
        WHEN "100" => WC2 <= "1011"; --B
        WHEN "101" => WC2 <= "0011"; --3
        WHEN "110" => WC2 <= "0111"; --7
        WHEN "111" => WC2 <= "0110"; --6
        WHEN OTHERS=> WC2 <= "1111";
    END CASE;
END PROCESS;


PROCESS(SensorState,WC1,WC2)--左中右,白色为低电平
BEGIN
  IF SensorState="110" OR SensorState="100"  THEN
     RWC<=WC2;
     LWC<="1111";
     R_RUN<='1';
     L_RUN <='0';
           ELSIF SensorState="011" OR SensorState="001"OR SensorState="000" THEN
       LWC<=WC1;
       RWC<="1111";
       L_RUN<='1';
       R_RUN<='0';
  	   
       ELSE 
         RWC<=WC2;
         LWC<=WC1;
         R_RUN<='1';
         L_RUN<='1';

  END IF;
END PROCESS;

END beha;







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -