VHDL实现数码管30s倒计时

VHDL实现数码管30s倒计时

一、设计要求

当设计文件加载到目标器件后,将数字信号源模块的时钟选择为1KHZ,数码管实现30秒倒计时,当倒计时结束后重新开始倒计时。

二、设计原理

七段数码管是电子开发过程中常用的输出显示设备。在实验系统中使用的是两个四位一体、共阴极型七段数码管。其单个静态数码管如下图3-1所示。
VHDL实现数码管30s倒计时_第1张图片
由于七段数码管公共端连接到GND,当数码管的中的另一个端被输入高电平,则相应的这一段被点亮,反之则不亮。四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。八个数码管的a、b、c、d、e、f、g、dp都连接在了一起,八个数码管分别由各自的位选信号来控制被选通的数码管显示数据,其余关闭。

三、代码实现

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TEST4 IS
	PORT(clk:IN STD_LOGIC;
		leds7:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
		  sel:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END TEST4;
ARCHITECTURE behave OF TEST4 IS
BEGIN
	PROCESS(clk)
	VARIABLE d:STD_LOGIC_VECTOR(2 DOWNTO 0);	--存放借位次数
	VARIABLE c:STD_LOGIC_VECTOR(1 DOWNTO 0);	--存放数码管扫描状态
	VARIABLE b:STD_LOGIC_VECTOR(1 DOWNTO 0);	--存放十位
	VARIABLE a:STD_LOGIC_VECTOR(3 DOWNTO 0);	--存放个位
	VARIABLE count:STD_LOGIC_VECTOR(9 DOWNTO 0);	--计数变量
	BEGIN
	IF clk'EVENT AND clk='1' THEN				--时钟上升沿检测
	count:=count+1;								--每次时钟上升沿计数+1
			c:=c+1;
			IF count = "1111101000"THEN		--当计数计到“1111101000”时,即1秒时
				a:=a-1;								--个位-1
			END IF;	
			IF a = "1111"THEN						--当个位为0不够-1时,向十位借1
				a:="1001";							--个位变成1001,即9
				b:=b-1;								--十位减去1
				d := d+1;							--记录借位的次数
			END IF;
			IF d >= "100" THEN					--当借位次数达到4此时,即个位和十位皆为0
			a := "0000";							--个位、十位和借位次数皆复位
				b := "00";
				d := "000";
			END IF;
			CASE c IS								--数码管位选在000001之间循环,达到动态显示
				WHEN "00"=>sel<="000";			
				WHEN "01"=>sel<="001";
				WHEN "10"=>sel<="000";
				WHEN "11"=>sel<="001";
				WHEN OTHERS =>NULL;
			END CASE;
			--显示个位的数码管译码
			IF (c = "00" OR c = "10")THEN		
				CASE a IS
					WHEN "0000"=> leds7 <="00111111";		--0
					WHEN "0001"=> leds7 <="00000110";		--1
					WHEN "0010"=> leds7 <="01011011";		--2
					WHEN "0011"=> leds7 <="01001111";		--3
					WHEN "0100"=> leds7 <="01100110";		--4
					WHEN "0101"=> leds7 <="01101101";		--5
					WHEN "0110"=> leds7 <="01111101";		--6
					WHEN "0111"=> leds7 <="00000111";		--7
					WHEN "1000"=> leds7 <="01111111";		--8
					WHEN "1001"=> leds7 <="01101111";		--9
					WHEN OTHERS => NULL;
				END CASE;
			ELSE
			--显示十位的数码管译码
				CASE b IS							
					WHEN "01"=> leds7 <="00111111";		--0
					WHEN "10"=> leds7 <="00000110";		--1
					WHEN "11"=> leds7 <="01011011";		--2
					WHEN "00"=> leds7 <="01001111";		--3
					WHEN OTHERS => NULL;
				END CASE;
			END IF;
		END IF;
	END PROCESS;
END behave;

你可能感兴趣的:(VHDL,算法,硬件工程)