fpga数码管数字从左到右逐个显示,按下按键数码管逐渐输出5

fpga数码管数字从左到右移动,按下按键数码管逐渐输出5

fpga数码管数字1~6从左到右移动(如123456–>234561->234561),按下按键数码管逐渐输出5,松开按键,继续从上一次停止移动的数字开始。打个比方,上一次数码管显示345612,按下按键显示456125–>561255–>612555–>125555,松开按键时,显示255553,然后是555534,以此类推。

fpga源代码:

--------------------------------------------------------------------
--------------------------------------------------------------------
------------------按下button,显示5。松开,继续循环播放--------
--------------------------------------------------------------------
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;
			  button:in 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 count_button_on: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 button_on_count:std_logic_vector(3 downto 0);
signal five_gradually_disappear:std_logic_vector(3 downto 0):="0110";  --5逐渐消失

signal var_temporary:std_logic_vector(3 downto 0);  --中间变量,暂存数据

signal over_six_5:std_logic_vector(3 downto 0);--统计超出65的次数

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
buzzer<='1';
timeCount:process(clk)
	begin
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
	if (clk' event and clk = '1') then   --晶振频率为50MHZ,一个周期就增加一次,以此来计数,一共有50 000 000次。
		count<=count+'1';  --用于数码管快速切换
		count1<=count1+'1'; 
		
---------------------------------------------------------------------------------------------
--------------------------------------开始没有按button循环播放数字------------------------------
----------------------------------------------------------------------------------------------
	if(count1 = "00010111110101111000010000000") then  --1秒计数一次
	count1Demo <= count1Demo + "0001" - over_six_5;  over_six_5<="0000";
		count1<=count1-"00010111110101111000010000000";
		if(count1Demo = "0000")  		 then  countSecond1 <= "1000000";countSecond2<="1000000"	;countMinute1<="1000000";countMinute2<="1000000";countHour1<="1000000";countHour2<="1000000";				
			elsif (count1Demo = "0001")  then  countSecond1 <= "1111001";countSecond2<="1000000"	;countMinute1<="1000000";countMinute2<="1000000";countHour1<="1000000";countHour2<="1000000";
			elsif (count1Demo = "0010")  then  countSecond1 <= "0100100";countSecond2<="1111001"	;countMinute1<="1000000";countMinute2<="1000000";countHour1<="1000000";countHour2<="1000000";
			elsif (count1Demo = "0011")  then  countSecond1 <= "0110000";countSecond2<="0100100"	;countMinute1<="1111001";countMinute2<="1000000";countHour1<="1000000";countHour2<="1000000";	
			elsif (count1Demo = "0100")  then  countSecond1 <= "0011001";countSecond2<="0110000"	;countMinute1<="0100100";countMinute2<="1111001";countHour1<="1000000";countHour2<="1000000";	
			elsif (count1Demo = "0101")  then  countSecond1 <= "0010010";countSecond2<="0011001"	;countMinute1<="0110000";countMinute2<="0100100";countHour1<="1111001";countHour2<="1000000";
			
			elsif (count1Demo = "0110")  then  countSecond1 <= "0000010";countSecond2<="0010010"	;countMinute1<="0011001";countMinute2<="0110000";countHour1<="0100100";countHour2<="1111001"; 
			
			elsif (count1Demo = "0111")  then  countSecond1 <= "1111001";countSecond2<="0000010"	;countMinute1<="0010010";countMinute2<="0011001";countHour1<="0110000";countHour2<="0100100";
			elsif (count1Demo = "1000")  then  countSecond1 <= "0100100";countSecond2<="1111001"	;countMinute1<="0000010";countMinute2<="0010010";countHour1<="0011001";countHour2<="0110000";
			elsif (count1Demo = "1001")  then  countSecond1 <= "0110000";countSecond2<="0100100"	;countMinute1<="1111001";countMinute2<="0000010";countHour1<="0010010";countHour2<="0011001";	
			elsif (count1Demo = "1010")  then  countSecond1 <= "0011001";countSecond2<="0110000"	;countMinute1<="0100100";countMinute2<="1111001";countHour1<="0000010";countHour2<="0010010";	
			elsif (count1Demo = "1011")  then  countSecond1 <= "0010010";countSecond2<="0011001"	;countMinute1<="0110000";countMinute2<="0100100";countHour1<="1111001";countHour2<="0000010";
		end if;		
		if(count1Demo = "1011") then count1Demo<="0110"; end if;
		
		--------按键按下,数码管逐渐变成5-------------------
		if(button = '0') then 
			button_on_count <= button_on_count + "0001"; --统计button按下的时间
			var_temporary<=button_on_count;   --中间变量
			if(button_on_count = "0000") then countSecond1 <= "0010010" ; --1s输出一个5
				elsif (button_on_count = "0001") then countSecond1 <= "0010010";countSecond2<="0010010"; --2s输出两个5
				elsif (button_on_count = "0010") then countSecond1 <= "0010010";countSecond2<="0010010"; countMinute1<="0010010";--3s输出三个5
				elsif (button_on_count = "0011") then countSecond1 <= "0010010";countSecond2<="0010010"; countMinute1<="0010010";countMinute2<="0010010";--4s输出三个5
				elsif (button_on_count = "0100") then countSecond1 <= "0010010";countSecond2<="0010010"; countMinute1<="0010010";countMinute2<="0010010";countHour1<="0010010";--5s输出三个5
				elsif (button_on_count = "0101") then countSecond1 <= "0010010";countSecond2<="0010010"; countMinute1<="0010010";countMinute2<="0010010";countHour1<="0010010";countHour2<="0010010";--6s输出三个5
				else  countSecond1 <= "0010010";countSecond2<="0010010"; countMinute1<="0010010";countMinute2<="0010010";countHour1<="0010010";countHour2<="0010010";over_six_5 <= over_six_5 + "0001";five_gradually_disappear <= "0110";
			end if;
		end if;
		--------按键松开,数码管5逐渐消失--------------------
		if(button = '1') and (var_temporary > "0001") then   --按键没按下时,判断之前是否有按下过
			five_gradually_disappear <= five_gradually_disappear - "0001";
			if(five_gradually_disappear = "0110")        then countSecond2<="0010010"; countMinute1<="0010010";countMinute2<="0010010";countHour1<="0010010";countHour2<="0010010";--松开输出五个5
				elsif (five_gradually_disappear = "0101") then countMinute1<="0010010";countMinute2<="0010010";countHour1<="0010010";countHour2<="0010010";--松开输出四个5
				elsif (five_gradually_disappear = "0100") then countMinute2<="0010010";countHour1<="0010010";countHour2<="0010010";--松开输出三个5
				elsif (five_gradually_disappear = "0011") then countHour1<="0010010";countHour2<="0010010";--松开输出两个5
				elsif (five_gradually_disappear = "0010") then countHour2<="0010010";
				else button_on_count<="0000" ;  ----统计button按下的时间归零
			end if;
		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;
end Behavioral;

效果图:
在这里插入图片描述
特别说明:写的源程序还有些问题,所以仅供参考,不要盲目引用源代码

FPGA型号:ALTERA ALINX FPGA黑金开发板 CYCLONE IV EP4CE6
使用的软件为quartus

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值