VHDL新手。PROT里面有没用到的输出量会不会影响程序
时间:10-02
整理:3721RD
点击:
我现在在做课程设计,用PWM通过低通滤波产生锯齿波,按键切换频率,并数码管显示频率。
ENTITY sheji IS
PORT(clk:IN STD_LOGIC;
key:IN STD_LOGIC;
led: OUT STD_LOGIC;
output: OUT STD_LOGIC);
-- sel: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
-- display: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
-- sel: OUT STD_LOGIC_vector(3 downto 0);
-- display:OUT STD_LOGIC_vector(6 downto 0));
END ENTITY sheji;
上面这样,按键功能能用。
ENTITY sheji IS
PORT(clk:IN STD_LOGIC;
key:IN STD_LOGIC;
led: OUT STD_LOGIC;
output: OUT STD_LOGIC;
sel: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
display: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
-- sel: OUT STD_LOGIC_vector(3 downto 0);
-- display:OUT STD_LOGIC_vector(6 downto 0));
END ENTITY sheji;
这样就不能。
程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY sheji IS
PORT(clk:IN STD_LOGIC;
key:IN STD_LOGIC;
led: OUT STD_LOGIC;
output: OUT STD_LOGIC);
-- sel: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
-- display: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
-- sel: OUT STD_LOGIC_vector(3 downto 0);
-- display:OUT STD_LOGIC_vector(6 downto 0));
END ENTITY sheji;
ARCHITECTURE bev OF sheji IS
SIGNAL clk_key,clk_pwm,clk_dis:STD_LOGIC:='0';
SIGNAL frequency:INTEGER RANGE 0 TO 1000:=100;
--SIGNAL count_dis:INTEGER RANGE 0 TO 4;
BEGIN
PROCESS(clk)
BEGIN
IF (clk'EVENT AND clk='1') THEN
clk_key<=not clk_key;
clk_pwm<=not clk_pwm;
END IF;
END PROCESS;
PROCESS(clk_key) --anjian xiao dou
VARIABLE count_key:INTEGER RANGE 0 TO 2500000;
variable a : std_logic:='1';
BEGIN
IF (key='1') THEN
count_key:=0;
ELSIF (clk_key'EVENT AND clk_key='1') THEN
IF (count_key=50000) THEN
count_key:=count_key;
ELSE count_key:=count_key+1;
END IF;
END IF;
IF (count_key=49999 )THEN
--a:= not a;
IF(frequency=100) THEN
frequency<=200;a:='1';
ELSE frequency<=100;a:='0';
END IF;
--ELSIF (count_key=49999 AND frequency=100 )THEN
--frequency<=200;a:=not a;
--ELSE frequency<=200;
END IF;
led<=a;
END PROCESS;
PROCESS(clk_pwm)
VARIABLE count_pwm :INTEGER RANGE 0 TO 3000;
VARIABLE duty :INTEGER RANGE 0 TO 3000;
BEGIN
IF(clk_pwm'EVENT AND clk_pwm = '1') THEN
count_pwm:=count_pwm+1;
IF(count_pwm>duty) THEN
output<='0';
ELSE output<='1';
END IF;
IF(count_pwm=frequency)THEN
count_pwm:=0;
duty:=duty+1;
IF(duty=frequency)THEN
duty:=0;
END IF;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE;
ENTITY sheji IS
PORT(clk:IN STD_LOGIC;
key:IN STD_LOGIC;
led: OUT STD_LOGIC;
output: OUT STD_LOGIC);
-- sel: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
-- display: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
-- sel: OUT STD_LOGIC_vector(3 downto 0);
-- display:OUT STD_LOGIC_vector(6 downto 0));
END ENTITY sheji;
上面这样,按键功能能用。
ENTITY sheji IS
PORT(clk:IN STD_LOGIC;
key:IN STD_LOGIC;
led: OUT STD_LOGIC;
output: OUT STD_LOGIC;
sel: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
display: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
-- sel: OUT STD_LOGIC_vector(3 downto 0);
-- display:OUT STD_LOGIC_vector(6 downto 0));
END ENTITY sheji;
这样就不能。
程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY sheji IS
PORT(clk:IN STD_LOGIC;
key:IN STD_LOGIC;
led: OUT STD_LOGIC;
output: OUT STD_LOGIC);
-- sel: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
-- display: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
-- sel: OUT STD_LOGIC_vector(3 downto 0);
-- display:OUT STD_LOGIC_vector(6 downto 0));
END ENTITY sheji;
ARCHITECTURE bev OF sheji IS
SIGNAL clk_key,clk_pwm,clk_dis:STD_LOGIC:='0';
SIGNAL frequency:INTEGER RANGE 0 TO 1000:=100;
--SIGNAL count_dis:INTEGER RANGE 0 TO 4;
BEGIN
PROCESS(clk)
BEGIN
IF (clk'EVENT AND clk='1') THEN
clk_key<=not clk_key;
clk_pwm<=not clk_pwm;
END IF;
END PROCESS;
PROCESS(clk_key) --anjian xiao dou
VARIABLE count_key:INTEGER RANGE 0 TO 2500000;
variable a : std_logic:='1';
BEGIN
IF (key='1') THEN
count_key:=0;
ELSIF (clk_key'EVENT AND clk_key='1') THEN
IF (count_key=50000) THEN
count_key:=count_key;
ELSE count_key:=count_key+1;
END IF;
END IF;
IF (count_key=49999 )THEN
--a:= not a;
IF(frequency=100) THEN
frequency<=200;a:='1';
ELSE frequency<=100;a:='0';
END IF;
--ELSIF (count_key=49999 AND frequency=100 )THEN
--frequency<=200;a:=not a;
--ELSE frequency<=200;
END IF;
led<=a;
END PROCESS;
PROCESS(clk_pwm)
VARIABLE count_pwm :INTEGER RANGE 0 TO 3000;
VARIABLE duty :INTEGER RANGE 0 TO 3000;
BEGIN
IF(clk_pwm'EVENT AND clk_pwm = '1') THEN
count_pwm:=count_pwm+1;
IF(count_pwm>duty) THEN
output<='0';
ELSE output<='1';
END IF;
IF(count_pwm=frequency)THEN
count_pwm:=0;
duty:=duty+1;
IF(duty=frequency)THEN
duty:=0;
END IF;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE;