📄 cpld源程序注释.txt
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARY lpm;
USE lpm.lpm_components.all;
ENTITY GDB IS
PORT
(
clk : IN STD_LOGIC;
INT0 : OUT STD_LOGIC;
INT1 : OUT STD_LOGIC;
GATE : IN STD_LOGIC;
FORTH : IN STD_LOGIC;
GATEV : IN STD_LOGIC;
READY0 : OUT STD_LOGIC;
BD : IN STD_LOGIC_VECTOR (7 downto 0);
ADDR : IN STD_LOGIC_VECTOR (15 downto 0);
AB : IN STD_LOGIC_VECTOR (1 downto 0);
DJA : OUT STD_LOGIC;
DJB : OUT STD_LOGIC;
DJC : OUT STD_LOGIC;
GATEDJ : OUT STD_LOGIC;
VIODE_A : OUT STD_LOGIC;
VIODE_B : OUT STD_LOGIC;
WR : IN STD_LOGIC;
RD : OUT STD_LOGIC;
RESET : IN STD_LOGIC
);
END GDB;
ARCHITECTURE deal OF GDB IS
SIGNAL CS0 : STD_LOGIC;
SIGNAL TIMECOUNT600 : STD_LOGIC_VECTOR (10 downto 0);
SIGNAL DJCOUNT0 : STD_LOGIC_VECTOR (7 downto 0);
SIGNAL DJCOUNT1 : STD_LOGIC_VECTOR (9 downto 0);
SIGNAL DJCOUNT2 : STD_LOGIC_VECTOR (9 downto 0);
SIGNAL DJCOUNT3 : STD_LOGIC_VECTOR (11 downto 0);
SIGNAL TIMECOUNTDJ0 : STD_LOGIC;
SIGNAL TIMECOUNTDJ1 : STD_LOGIC;
SIGNAL DD : STD_LOGIC_VECTOR (7 downto 0);
SIGNAL VIODE : STD_LOGIC;
SIGNAL COUNT : STD_LOGIC_VECTOR (4 downto 0);
SIGNAL ABCOUNT : STD_LOGIC_VECTOR (1 downto 0);
SIGNAL ABDATA : STD_LOGIC_VECTOR (1 downto 0);
SIGNAL AOUT,BOUT : STD_LOGIC;
SIGNAL JSQ0,JSQ1 ,JSQ2 :INTEGER RANGE 0 TO 10;
SIGNAL DJA1,DJB1,DJC1,GATEDJ1 : STD_LOGIC;
SIGNAL DA1,DA2,DA3,DA4,QA2,QA4,AR,AS,AQR,AQS :STD_LOGIC;
BEGIN
------------------WARN 600HZ方波-----------------
PROCESS (clk,TIMECOUNT600)
BEGIN
IF (clk'EVENT AND clk = '1') THEN
IF (TIMECOUNT600 = "11010000010")THEN --1666
TIMECOUNT600 <= "00000000000";
ELSE
TIMECOUNT600 <= TIMECOUNT600 + 1;
END IF;
END IF;
END PROCESS;
PROCESS(TIMECOUNT600,CLK)
BEGIN
IF(CLK'EVENT AND CLK = '1')THEN
IF(TIMECOUNT600 <= "1101000001")THEN --833
VIODE <= '1';
ELSE
VIODE <= '0';
END IF;
END IF;
END PROCESS;
PROCESS(VIODE,GATEV)
BEGIN
IF (GATEV = '0')THEN
IF( VIODE = '1')THEN
VIODE_A <= '0';
VIODE_B <= 'Z';
ELSIF( VIODE = '0')THEN
VIODE_A <= 'Z';
VIODE_B <= '0';
END IF;
ELSE
VIODE_A <= 'Z';
VIODE_B <= 'Z';
END IF;
END PROCESS;
----------------------------------------------------------------------------
电机三相六步,TIMECOUNTDJ0同步其他三相的脉冲,
可调占空比改变电机静态电流的大小,同时电机停止能抱死.
PROCESS(CLK)
BEGIN
IF(CLK'EVENT AND CLK = '1')THEN
IF(DJCOUNT0 = "11001000")THEN --200
DJCOUNT0 <= "00000000";
ELSE
DJCOUNT0 <= DJCOUNT0 +1;
END IF;
END IF;
END PROCESS;
PROCESS(CLK,DJCOUNT0)
BEGIN
IF(CLK'EVENT AND CLK ='1')THEN
IF(DJCOUNT0 <="1011010")THEN --90
TIMECOUNTDJ0 <= '0';
ELSE
TIMECOUNTDJ0 <= '1';
END IF;
END IF;
END PROCESS;
PROCESS(CLK,TIMECOUNTDJ0,RESET)
BEGIN
IF(CLK'EVENT AND CLK = '1')THEN
IF(GATE = '1')THEN
IF(RESET = '0' AND TIMECOUNTDJ0 = '1')THEN
GATEDJ1 <= '0';
ELSE
GATEDJ1 <= 'Z';
END IF;
ELSE
IF(RESET = '0' AND TIMECOUNTDJ0 = '1')THEN
GATEDJ1 <= 'Z';
ELSE
GATEDJ1 <= '0';
END IF;
END IF;
END IF;
END PROCESS;
----------------------- 3 XIANG 6 BU --------------------
PROCESS(ADDR,WR)
BEGIN
IF(ADDR(15 DOWNTO 0) = X"e000")THEN
IF (WR 'event and WR = '1') THEN
DD <= BD;
END IF;
END IF;
END PROCESS;
这里设置了三种速度,由单片机发送数据来切换
PROCESS(CLK,DD,DJCOUNT1,DJCOUNT2,DJCOUNT3)
BEGIN
IF(CLK'EVENT AND CLK = '1')THEN
IF(DD = "00000110")THEN --6
IF(DJCOUNT2 = "1001011000")THEN --600 最快,1秒钟转7圈
DJCOUNT2 <= "0000000000";
ELSE
DJCOUNT2 <= DJCOUNT2 +1;
END IF;
ELSIF(DD = "00000001")THEN --1
IF(DJCOUNT3 = "1000100110000")THEN --4400 最慢,1秒钟转1圈
DJCOUNT3 <= "0000000000000";
ELSE
DJCOUNT3 <= DJCOUNT3 +1;
END IF;
ELSE --3
IF(DJCOUNT1 = "1111101000")THEN --1000
DJCOUNT1 <= "0000000000";
ELSE
DJCOUNT1 <= DJCOUNT1 +1;
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(CLK,DJCOUNT1,DJCOUNT2,DD,DJCOUNT3)
BEGIN
IF(CLK'EVENT AND CLK ='1')THEN
IF(DD = "00000110")THEN
IF(DJCOUNT2 <="100101100")THEN --300
TIMECOUNTDJ1 <= '0';
ELSE
TIMECOUNTDJ1 <= '1';
END IF;
ELSIF(DD = "00000001")THEN
IF(DJCOUNT3 <="100010011000")THEN --2200
TIMECOUNTDJ1 <= '0';
ELSE
TIMECOUNTDJ1 <= '1';
END IF;
ELSE
IF(DJCOUNT1 <="111110100")THEN --500
TIMECOUNTDJ1 <= '0';
ELSE
TIMECOUNTDJ1 <= '1';
END IF;
END IF;
END IF;
END PROCESS;
------------------------------------------------------------------
当电机停止时三相中只有一相导通
PROCESS(COUNT,TIMECOUNTDJ1,GATE,FORTH)
BEGIN
IF(TIMECOUNTDJ1'EVENT AND TIMECOUNTDJ1 = '1')THEN
IF(GATE = '1')THEN
IF(FORTH = '1')THEN
IF(COUNT = "01011")THEN
COUNT <= "00000";
ELSE
COUNT <= COUNT + 1;
END IF;
ELSE
IF(COUNT = "00000")THEN
COUNT <= "01011";
ELSE
COUNT <= COUNT - 1;
END IF;
END IF;
ELSE
CASE COUNT IS
WHEN "00001" => COUNT <= COUNT - 1; --1
WHEN "00010" => COUNT <= COUNT - 1; --2
WHEN "00011" => COUNT <= COUNT + 1; --3
WHEN "00101" => COUNT <= COUNT - 1; --5
WHEN "00110" => COUNT <= COUNT - 1; --6
WHEN "00111" => COUNT <= COUNT + 1; --7
WHEN "01001" => COUNT <= COUNT - 1; --9
WHEN "01010" => COUNT <= COUNT - 1; --10
WHEN "01011" => COUNT <= "00000"; --11
WHEN OTHERS => COUNT <= COUNT ;
END CASE;
END IF;
END IF;
END PROCESS;
PROCESS(COUNT,TIMECOUNTDJ1,GATE,RESET,FORTH)
BEGIN
IF(TIMECOUNTDJ1'EVENT AND TIMECOUNTDJ1 = '1')THEN
IF(GATE = '1' AND RESET = '0' )THEN
CASE COUNT IS
WHEN "00000" => DJA1 <= '0';DJB1 <= 'Z';DJC1 <= 'Z'; --0
WHEN "00010" => DJA1 <= '0';DJB1 <= '0';DJC1 <= 'Z'; --2
WHEN "00100" => DJA1 <= 'Z';DJB1 <= '0';DJC1 <= 'Z'; --4
WHEN "00110" => DJA1 <= 'Z';DJB1 <= '0';DJC1 <= '0'; --6
WHEN "01000" => DJA1 <= 'Z';DJB1 <= 'Z';DJC1 <= '0'; --8
WHEN "01010" => DJA1 <= '0';DJB1 <= 'Z';DJC1 <= '0'; --10
WHEN OTHERS => DJB1 <= DJB1;DJA1 <= DJA1;DJC1 <= DJC1;
-- WHEN OTHERS => DJB1 <= 'Z';DJA1 <= 'Z';DJC1 <= 'Z';
END CASE;
ELSIF(RESET = '1')THEN
DJB1 <= 'Z';
DJA1 <= '0';
DJC1 <= 'Z';
ELSIF(GATE ='0')THEN
CASE COUNT IS
WHEN "00000" => DJA1 <= '0';DJB1 <= 'Z';DJC1 <= 'Z';
WHEN "00010" => DJA1 <= '0';DJB1 <= '0';DJC1 <= 'Z';
WHEN "00100" => DJA1 <= 'Z';DJB1 <= '0';DJC1 <= 'Z';
WHEN "00110" => DJA1 <= 'Z';DJB1 <= '0';DJC1 <= '0';
WHEN "01000" => DJA1 <= 'Z';DJB1 <= 'Z';DJC1 <= '0';
WHEN "01010" => DJA1 <= '0';DJB1 <= 'Z';DJC1 <= '0';
WHEN OTHERS => DJB1 <= DJB1;DJA1 <= DJA1;DJC1 <= DJC1;
END CASE;
END IF;
END IF;
END PROCESS;
DJA <= DJA1;
DJB <= DJB1;
DJC <= DJC1;
GATEDJ <= GATEDJ1;
------------------ Encoder -------------------
编码器有AB两个脉冲,A脉冲进单片机中断,B脉冲来表示方向
对B脉冲滤波延时滤波
PROCESS(VIODE,AB)
BEGIN
IF(VIODE'EVENT AND VIODE= '1')THEN
IF(AB(1) = '1')THEN
JSQ2 <= 0;
IF(JSQ1 = 10)THEN
JSQ1 <= JSQ1;
ELSE
JSQ1<= JSQ1 +1;
END IF;
IF(JSQ1 >3)THEN
BOUT <= '1';
ELSE
BOUT <= '0';
END IF;
ELSE
JSQ1 <= 0;
IF(JSQ2 = 10)THEN
JSQ1 <= JSQ1;
ELSE
JSQ2<= JSQ2 +1;
END IF;
IF(JSQ2 >3)THEN
BOUT <= '0';
ELSE
BOUT <= '1';
END IF;
END IF;
END IF;
END PROCESS;
------------------------------------------------------
对A脉冲用RS锁存器滤波
PROCESS(VIODE,QA2,DA2,AR,AS,AQR,DA4,QA4,AQS)
BEGIN
IF(VIODE'EVENT AND VIODE = '1')THEN
DA1 <= AB(0);
DA2 <= DA1;
QA2 <= DA2;
DA3 <= AQR;
DA4 <= DA3;
QA4 <= DA4;
END IF;
AR <= (NOT DA2) AND (NOT QA2);
AS <= DA2 AND QA2;
AQR <= AR NOR AQS;
AQS <= AS NOR AQR;
AOUT <= DA4 AND (NOT QA4) ;
END PROCESS;
INT0 <= AOUT;
INT1 <= BOUT;
----------------------------------------------------
READY0 <= 'Z';
RD <= 'Z';
END deal;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -