[mw_shl_code=c,true]LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY huxideng2 IS
PORT(
RESET :IN STD_LOGIC;
CLK :IN STD_LOGIC;
led :OUT STD_LOGIC);
END huxideng2;
ARCHITECTURE PWM OF huxideng2 IS
SIGNAL Period_us,Period1uS, Period1mS, Period1S: STD_LOGIC;--the period of the calculater
signal counter:integer range 0 to 300;
signal pwm:integer range 0 to 64;
BEGIN
-- Clock
PROCESS( RESET, CLK, Period_us, Period1uS, Period1mS )
VARIABLE Count : STD_LOGIC_VECTOR(5 DOWNTO 0);
VARIABLE Count1 : STD_LOGIC_VECTOR(9 DOWNTO 0);
VARIABLE Count2 : STD_LOGIC_VECTOR(9 DOWNTO 0);
VARIABLE Count3 : STD_LOGIC_VECTOR(2 DOWNTO 0);
VARIABLE pwm: STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
--Period: 1uS
IF( RESET = '1' ) THEN
Count := "000000";
ELSIF( CLK'EVENT AND CLK='1' ) THEN
IF( Count>"110000" ) THEN Count := "000000"; -- 110000:48 50/50M = 1us count from 0 to 48
ELSE Count := Count + 1;
END IF;
Period1uS <= Count(5);
END IF;
--Period:0.1us
IF(CLK'EVENT AND CLK='1') THEN
IF(Count3>"101") THEN Count3 :="000";
ELSE Count3 :=Count3+1;
END IF;
Period_us <=Count(2);
END IF;
--Period: 1mS
IF( Period1uS'EVENT AND Period1uS='1' ) THEN
IF( Count1>"1111100110" ) THEN Count1 := "0000000000"; -- 1111100110:998 1000*1us = 1ms count from 0 to 998
ELSE Count1 := Count1 + 1;
END IF;
Period1mS <= Count1(9);
END IF;
--Period: 1S
IF( Period1mS'EVENT AND Period1mS='1' ) THEN
IF( Count2>"1111100110" ) THEN Count2 := "0000000000"; --like above
ELSE Count2 := Count2 + 1;
END IF;
Period1S <= Count2(9);
END IF;
END PROCESS;
PROCESS(Period_us) --The Period of the pwm
BEGIN
if rising_edge(Period_us) then
if counter=300 then
counter<=0;
pwm<=pwm+1;
if pwm=64 then
pwm<=0;
end if;
else
counter<=counter+1;
end if;
end if;
END PROCESS;
process(Counter,pwm)
begin
if counter<pwm then
led<='1';
else
led<='0';
end if;
end process;
END PWM;[/mw_shl_code]
为什么我运行最后就卡在了led<=0那里啊,求高手指点指点 |