数码管数字左移,移到左边蜂鸣器响,并归零
数码管数字从1到6向左移动,当1移到最左边时,蜂鸣器响1s。与此同时,数码管数字归零。然后循环重复上述操作。
源代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use IEEE.numeric_std.all;
entity move_number is
Port (
rst:out std_logic;
sel:inout std_logic_vector(5 downto 0);
buzzer:out std_logic;
selSegmet2:out std_logic_vector(5 downto 0);
clk:in std_logic;
seg_dataSegment2: out STD_LOGIC_vector(7 downto 0);
seg_data: out STD_LOGIC_vector(6 downto 0));
end move_number;
architecture Behavioral of move_number is
signal count:std_logic_vector(16 downto 0);
signal countDemo:std_logic_vector(3 downto 0);
signal count1Demo:std_logic_vector(3 downto 0); --秒的个位
signal count2Demo:std_logic_vector(3 downto 0); --秒的十位
signal count3Demo:std_logic_vector(3 downto 0); --分的个位
signal count4Demo:std_logic_vector(3 downto 0); --分的十位
signal count5Demo:std_logic_vector(3 downto 0); --时的个位
signal count6Demo:std_logic_vector(3 downto 0); --时的十位
signal count1:std_logic_vector(28 downto 0);
signal count2:std_logic_vector(28 downto 0);
signal count3:std_logic_vector(31 downto 0);
signal count4:std_logic_vector(34 downto 0);
signal count5:std_logic_vector(37 downto 0);
signal count6:std_logic_vector(40 downto 0);
signal countSecond1,countSecond2:std_logic_vector(6 downto 0);--秒的数码管对应二进制数
signal countMinute1,countMinute2:std_logic_vector(6 downto 0);--分的数码管对应二进制数
signal countHour1,countHour2:std_logic_vector(6 downto 0); --时的数码管对应二进制数
signal selDemo:std_logic_vector(5 downto 0); --充当sel的中间变量
signal countsegment1,countsegment2,countsegment3,countsegment4,countsegment5,countsegment6:std_logic_vector(3 downto 0);
begin
timeCount:process(clk)
begin
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
if (clk' event and clk = '1') then --晶振频率为50MHZ,一个周期就增加一次,以此来计数,一共有50 000 000次。
count<=count+'1'; --用于数码管快速切换
count1<=count1+'1'; --segment1,秒的个位
--count2<=count2+'1'; --segment2,秒的十位
--count3<=count3+'1'; --segment3,分的个位
--count4<=count4+'1'; --segment4,分的十位
--count5<=count5+'1'; --segment5,时的个位
--count6<=count6+'1'; --segment6,时的十位
-----------------------------------------------------------------------------------------
--------------------------------------显示数字-------------------------------------------------
----------------------------------------------------------------------------------------------
if(count1 = "00010111110101111000010000000") then --1秒计数一次
count1Demo <= count1Demo + "0001";
count1<=count1-"00010111110101111000010000000";
-- 对应着六个数码管
-- 0 0 0 0 0 0 蜂鸣器不响
-- 1 0 0 0 0 0 蜂鸣器不响
-- 2 1 0 0 0 0 蜂鸣器不响
-- 3 2 1 0 0 0 蜂鸣器不响
-- 4 3 2 1 0 0 蜂鸣器不响
-- 5 4 3 2 1 0 蜂鸣器不响
-- 6 5 4 3 2 1 蜂鸣器响
if(count1Demo = "0000") then countSecond1 <= "1000000";countSecond2<="1000000" ;countMinute1<="1000000";countMinute2<="1000000";countHour1<="1000000";countHour2<="1000000";buzzer<='1';
elsif (count1Demo = "0001") then countSecond1 <= "1111001";countSecond2<="1000000" ;countMinute1<="1000000";countMinute2<="1000000";countHour1<="1000000";countHour2<="1000000";buzzer<='1';
elsif (count1Demo = "0010") then countSecond1 <= "0100100";countSecond2<="1111001" ;countMinute1<="1000000";countMinute2<="1000000";countHour1<="1000000";countHour2<="1000000";buzzer<='1';
elsif (count1Demo = "0011") then countSecond1 <= "0110000";countSecond2<="0100100" ;countMinute1<="1111001";countMinute2<="1000000";countHour1<="1000000";countHour2<="1000000";buzzer<='1';
elsif (count1Demo = "0100") then countSecond1 <= "0011001";countSecond2<="0110000" ;countMinute1<="0100100";countMinute2<="1111001";countHour1<="1000000";countHour2<="1000000";buzzer<='1';
elsif (count1Demo = "0101") then countSecond1 <= "0010010";countSecond2<="0011001" ;countMinute1<="0110000";countMinute2<="0100100";countHour1<="1111001";countHour2<="1000000";buzzer<='1';
elsif (count1Demo = "0110") then countSecond1 <= "0000010";countSecond2<="0010010" ;countMinute1<="0011001";countMinute2<="0110000";countHour1<="0100100";countHour2<="1111001";buzzer<='0';
end if;
if(count1Demo = "0110") then
count1Demo<="0000";
end if;
end if;
----------------------------------------------------------------------------------------------
-- 1 000 000为一个计数单位
if(count = "11000011010100000") then --1 00 000计数一次,用于6个数码管快速切换
countDemo<=countDemo + "0001"; --每秒计数一次,用于显示数字。
count<=count - "11000011010100000";
case countDemo is
when "0000" => sel<= "111110";seg_data<= countSecond1;--显示秒的个位。
when "0001" => sel<= "111101";seg_data<= countSecond2;--显示秒的十位。
when "0010" => sel<= "111011";seg_data<= countMinute1;--显示分的个位。
when "0011" => sel<= "110111";seg_data<= countMinute2;--显示分的十位。
when "0100" => sel<= "101111";seg_data<= countHour1; --显示时的个位。
when "0101" => sel<= "011111";seg_data<= countHour2 ; --显示时的十位。
when others =>sel<= "111111";seg_data<= countSecond1;
end case;
if(countDemo = "0101") then
countDemo<="0000";
end if;
end if;
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
end if;
end process timeCount;
--Second1Show:process()
end Behavioral;
效果图:
FPGA型号:ALTERA ALINX FPGA黑金开发板 CYCLONE IV EP4CE6
使用的软件为quartus