直流电机控制器VHDL源程序
时间:12-03 09:34 阅读:1038次
*温馨提示:点击图片可以放大观看高清大图
简介:本文为大家提供一个直流电机控制器VHDL的源程序。
LIBRARY IEEE;
USE IEEE.Std_logic_1164.ALL;
USE IEEE.Std_logic_unsigned.All;
USE IEEE.Std_logic_arith.All;
ENTITY Dccount IS
Port (
Clk : IN STD_LOGIC;
AI : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CO : Out STD_LOGIC_VECTOR(3 DOWNTO 0);
Pulse: IN STD_LOGIC;
DriverA,DriverB: OUT STD_LOGIC;
S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
P : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
Sp : Out STD_LOGIC);
END Dccount;
ARCHITECTURE A OF Dccount IS
SIGNAL F: STD_LOGIC_VECTOR(5 Downto 0);
SIGNAL F_hz: STD_LOGIC;
SIGNAL OSC: STD_LOGIC;
SIGNAL OSC1: STD_LOGIC;
SIGNAL C: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL A: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL CODE: STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL Bcd:STD_LOGIC_VECTOR(23 Downto 0);
SIGNAL COUNT:STD_LOGIC_VECTOR(23 Downto 0);
SIGNAL SUM: STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL D: STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL Ind_coil: STD_LOGIC_VECTOR(3 Downto 0) := "0001";
SIGNAL Hz:STD_LOGIC;
SIGNAL Spo: STD_LOGIC;
SIGNAL SW:STD_LOGIC;
SIGNAL KEY:STD_LOGIC;
SIGNAL DRA,DRB:STD_LOGIC;
BEGIN
DRIVERA<=DRA;
DRIVERB<=DRB;
P(5 Downto 0) <= F(5 Downto 0);
CO(3 DOWNTO 0) <=C(3 DOWNTO 0);
A (3 DOWNTO 0)<=AI(3 DOWNTO 0);
SP<=SPO;
-----------------Div------------------------
PROCESS(OSC)
VARIABLE D_ff: STD_LOGIC_VECTOR(20 Downto 0);
VARIABLE DELAY: STD_LOGIC_VECTOR(23 DOWNTO 0);
BEGIN
WAIT UNTIL Clk = ''1'';
IF D_ff(20 Downto 0) >= 2E6 THEN
D_ff(20 Downto 0) := "000000000000000000000";
ELSE
D_ff(20 Downto 0) := D_ff + 1;
END IF;
F_hz <= Not D_ff(6);
OSC <= Not D_ff(10);
OSC1 <= Not D_ff(17);
IF DELAY>=500000 THEN
DELAY:="000000000000000000000000";HZ<=NOT Hz;
ELSE DELAY:=DELAY+1;
END IF;
END PROCESS ;
----------------------------------------------
PROCESS (F_HZ,OSC,OSC1,HZ,PULSE)
VARIABLE B: STD_LOGIC;
VARIABLE INT: STD_LOGIC;
VARIABLE Data: STD_LOGIC_VECTOR(3 DOWNTO 0);
VARIABLE UP: STD_LOGIC_VECTOR(2 DOWNTO 0);
VARIABLE ST:STD_LOGIC_VECTOR(2 DOWNTO 0);
VARIABLE Seq: STD_LOGIC_VECTOR(1 DOWNTO 0);
VARIABLE Sound: STD_LOGIC_VECTOR(1 DOWNTO 0);
VARIABLE STOP: STD_LOGIC;
VARIABLE Direction: STD_LOGIC;
BEGIN
---------------7seg Scan-------------------------------
IF (F_HZ=''1'' AND F_HZ''EVENT) THEN
IF ST(2 DOWNTO 0)= "101" THEN
ST(2 DOWNTO 0):="000" ;
ELSE ST(2 DOWNTO 0):=ST(2 DOWNTO 0)+1;
END IF;
END IF;
-----------------------------------------------
IF (OSC = ''1'' And OSC''EVENT) THEN
If A="1111" Then
IF Seq="11" Then Seq:="00" ;
Else Seq:=Seq+1;
End If;
Else Seq:=Seq;
End If;
IF Seq="00" Then C(3 DOWNTO 0)<="1110" ;
Elsif Seq="01" Then C(3 DOWNTO 0)<="1101" ;
Elsif Seq="10" Then C(3 DOWNTO 0)<="1011" ;
Elsif Seq="11" Then C(3 DOWNTO 0)<="0111" ;
End If;
End If;
IF A="1111" THEN INT:=''0'';
ELSE INT:=''1'';
END IF;
IF (HZ''EVENT AND HZ=''1'') THEN
IF STOP=''1'' THEN UP:=UP+1;
ELSE UP:="000";
END IF;
END IF;
IF KEY=''1'' AND COUNT/=0 THEN
IF DIRECTION=''0'' THEN DRA<=''1'';DRB<=''0'';STOP:=''0'';
ELSE DRA<=''0'';DRB<=''1'';STOP:=''0'';
END IF;
ELSIF KEY=''1'' AND COUNT=0 THEN STOP:=''1'';
ELSIF STOP=''1'' AND UP<"110" THEN DRA<=NOT DRA ;DRB<=NOT DRB;
ELSE DRA<=''0'';DRB<=''0'';STOP:=''0'';
END IF;
IF (OSC1''EVENT AND OSC1=''1'') THEN B:=(INT And (B And INT) );
----------------Direction Choice-----------------------
IF SW=''0'' AND B=''1'' AND Data(3 DOWNTO 0)="1010" THEN
BCD(23 DOWNTO 0)<=BCD(23 DOWNTO 0);B:=''0'';Direction:=''1'';
ELSIF SW=''0'' AND B=''1'' AND Data(3 DOWNTO 0)="1011" THEN
BCD(23 DOWNTO 0)<=BCD(23 DOWNTO 0);B:=''0'';Direction:=''0'';
------------------KEY LOCK ON/OFF------------------------------------
ELSIF B=''1'' AND Data(3 DOWNTO 0)="1100" THEN
BCD<=BCD;B:=''0'';SW<=NOT SW;
-------------------BACK-------------------------------
ELSIF SW=''0'' AND B=''1'' AND Data(3 DOWNTO 0)="1101" THEN
BCD(23 DOWNTO 0)<=("0000" & Bcd(23 Downto 4) );B:=''0'';
-------------------CLEAR---------------------------------
ELSIF B=''1'' AND Data(3 DOWNTO 0)="1110" THEN
BCD<="000000000000000000000000" ;B:=''0'';SW<=''0'';
------------------DOWNCOUNT 0 ------------------------------------
ELSIF BCD=0 AND KEY=''1'' THEN SW<=''0'';KEY<=''0'';BCD<=BCD;
------------------------------------------------------------------
ELSIF SW=''1'' AND KEY=''1'' AND DATA(3 DOWNTO 0)/="1110" THEN BCD<=COUNT;
ELSIF SW=''1'' AND DATA(3 DOWNTO 0)="1110" THEN SW<=''0'';
BCD<="000000000000000000000000";KEY<=''0'';
-------------------ENTER------------------------------
ELSIF SW=''0'' AND B=''1'' AND Data(3 DOWNTO 0)="1111" AND BCD/=0 THEN
B:=''0'';SW<=''1'';KEY<=''1'';
ELSIF SW=''0'' AND B=''1'' AND Data(3 DOWNTO 0)="1111" AND BCD=0 THEN
BCD<=BCD;B:=''0'';SW<=''0'';KEY<=''0'';
----------------------NUMBER SHIFT---------------------------
ELSIF SW=''0'' AND B=''1'' THEN Bcd(23 Downto 0)<= Bcd(19 Downto 0) & DATA(3 DOWNTO 0);B:=''0'';
Elsif INT=''0'' Then Bcd<=Bcd;
B:=''1'';
END IF;
END IF;
------------------------------------------------------
SUM(1 DOWNTO 0)<= Seq;
Sum(4 Downto 2)<=Code;
---------------------SOUND-----------------------------
If (Osc''Event And Osc=''1'') Then
If INT=''1'' AND SW=''0'' Then Sound:=Sound+1;Spo<=Sound(1) ;
Else Spo<=''0'';
End If;
End If;
-------------------------------------------------------
---------------------------DOWNCOUNT--------------------
IF SW=''0'' THEN COUNT<=BCD;
ELSE
If (PULSE = ''1'' And PULSE''EVENT) THEN
IF KEY=''1'' AND COUNT/=0 THEN
----------------------------1---------------------------------------------------
IF COUNT(3 DOWNTO 0)= 0 AND COUNT(23 DOWNTO 4)>=1 THEN
COUNT(3 DOWNTO 0) <="1001" ;
ELSE COUNT(3 DOWNTO 0) <= COUNT(3 DOWNTO 0)-1;
END IF;
----------------------------2---------------------------------------------------------
IF COUNT(7 DOWNTO 4)= 0 AND COUNT(23 DOWNTO 8)>=1 AND COUNT(3 DOWNTO 0)=0 THEN
COUNT(7 DOWNTO 4) <= "1001" ;
ELSIF COUNT(3 DOWNTO 0)=0 AND COUNT(23 DOWNTO 4)>=1 THEN
COUNT(7 DOWNTO 4) <=COUNT(7 DOWNTO 4 )-1;
END IF;
----------------------------3-------------------------------------------------------
IF COUNT(11 DOWNTO 8)= 0 AND COUNT(23 DOWNTO 12)>=1 AND COUNT(7 DOWNTO 0)=0 THEN
COUNT(11 DOWNTO 8) <="1001";
ELSIF COUNT(7 DOWNTO 0)=0 AND COUNT(23 DOWNTO 8)>=1 THEN
COUNT(11 DOWNTO 8) <=COUNT(11 DOWNTO 8 )-1;
END IF;
---------------------------4--------------------------------------------------------------
IF COUNT(15 DOWNTO 12)= 0 AND COUNT(23 DOWNTO 16)>=1 AND COUNT(11 DOWNTO 0)=0 THEN
COUNT(15 DOWNTO 12) <="1001";
ELSIF COUNT(11 DOWNTO 8)=0 AND COUNT(23 DOWNTO 12)>=1 AND COUNT(7 DOWNTO 0)=0 THEN
COUNT(15 DOWNTO 12) <=COUNT(15 DOWNTO 12 )-1;
END IF;
-------------------------5------------------------------------------------------------
IF COUNT(19 DOWNTO 16)= 0 AND COUNT(23 DOWNTO 20)>=1 AND COUNT(15 DOWNTO 0)=0 THEN
COUNT(19 DOWNTO 16) <="1001";
ELSIF COUNT(15 DOWNTO 12)=0 AND COUNT(23 DOWNTO 16)>=1 AND COUNT(11 DOWNTO 0)=0 THEN
COUNT(19 DOWNTO 16) <=COUNT(19 DOWNTO 16 )-1;
END IF;
-------------------------6-------------------------------------------------
IF COUNT(23 DOWNTO 20)= 0 THEN
COUNT(23 DOWNTO 20) <="0000";
ELSIF COUNT(19 DOWNTO 16)=0 AND COUNT(23 DOWNTO 20 )>=1 AND COUNT(15 DOWNTO 0)=0 THEN
COUNT(23 DOWNTO 20) <=COUNT(23 DOWNTO 20 )-1;
END IF;
END IF;
END IF;
END IF;
------------------7seg Scan---------------------------
CASE ST IS --?@潮
WHEN "000"=> D(3 DOWNTO 0) <= Bcd(3 DOWNTO 0) ; F(5 Downto 0)<="111110";
WHEN "001"=> D(3 DOWNTO 0) <= Bcd(7 DOWNTO 4) ; F(5 Downto 0)<="111101";
WHEN "010"=> D(3 DOWNTO 0) <= Bcd(11 DOWNTO 8) ; F(5 Downto 0)<="111011";
WHEN "011"=> D(3 DOWNTO 0) <= Bcd(15 DOWNTO 12) ; F(5 Downto 0)<="110111";
WHEN "100"=> D(3 DOWNTO 0) <= Bcd(19 DOWNTO 16) ; F(5 Downto 0)<="101111";
WHEN "101"=> D(3 DOWNTO 0) <= Bcd(23 DOWNTO 20) ; F(5 Downto 0)<="011111";
WHEN OTHERS => D(3 DOWNTO 0) <= "1100" ; F(5 Downto 0)<="111111";
END CASE;
------------------Key Scan-------------------------
CASE A(3 DOWNTO 0) IS
WHEN"1110" => CODE<="100";
WHEN"1101" => CODE<="101";
WHEN"1011" => CODE<="110";
WHEN"0111" => CODE<="111";
WHEN OTHERS => CODE<="000";
End Case;
---------------------Key Table------------------------
CASE SUM(4 DOWNTO 0) IS
WHEN"10000"=> Data:="0001";--0
WHEN"10001"=> Data:="0101";--1
WHEN"10010"=> Data:="1001";--2
WHEN"10011"=> Data:="1100";--3