⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key_led.vhd

📁 很多vhdl例程代码
💻 VHD
字号:
LIBRARY	IEEE;
USE		IEEE.STD_LOGIC_1164.ALL;
USE		IEEE.STD_LOGIC_UNSIGNED.ALL;
USE 	IEEE.STD_LOGIC_ARITH.ALL;

ENTITY key_led IS 
PORT(
	clk_48M:	IN	STD_LOGIC;	--系统时钟(48MHz)
	key:		IN	STD_LOGIC_VECTOR(7 	DOWNTO 0);--按键输入(KEY1~KEY8)
	ledin:		IN	STD_LOGIC_VECTOR(3 	DOWNTO 0);--LED显示输入(在LED5~LED8显示)
	data:		IN	STD_LOGIC_VECTOR(15 DOWNTO 0);--数码管显示输出(在数码管5~8显示)
	led:		OUT	STD_LOGIC_VECTOR(7 	DOWNTO 0);--LED输出(LED1~LED8)
	seg:		OUT	STD_LOGIC_VECTOR(7 	DOWNTO 0);--数码管段码输出
	hex:		OUT	STD_LOGIC_VECTOR(15 DOWNTO 0);--4位16进制数输出(在数码管1~4显示)
	bin:		OUT STD_LOGIC_VECTOR(3 	DOWNTO 0);--4位2进制数输出(在LED1~LED4显示)
	dig:		OUT STD_LOGIC_VECTOR(7 	DOWNTO 0) --数码管位码输出
);
END ;

ARCHITECTURE one of key_led IS
SIGNAL 	hex_r:	STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL	bin_r:	STD_LOGIC_VECTOR(3 	DOWNTO 0);
SIGNAL	seg_r:	STD_LOGIC_VECTOR(7  DOWNTO 0);
SIGNAL	dig_r:	STD_LOGIC_VECTOR(7	DOWNTO 0);

SIGNAL 	count:	STD_LOGIC_VECTOR(16 DOWNTO 0);--时钟分频计数器
SIGNAL	dout1,dout2,dout3,buff:STD_LOGIC_VECTOR(7 DOWNTO 0);--消抖寄存器
SIGNAL	cnt3:	STD_LOGIC_VECTOR(2 	DOWNTO 0);--数码管扫描计数器
SIGNAL	disp_dat:STD_LOGIC_VECTOR(3 DOWNTO 0);--数码管扫描显存

SIGNAL	div_clk:		STD_LOGIC;	
SIGNAL 	key_edge:	STD_LOGIC_VECTOR(7 DOWNTO 0);	--按键消抖输出
BEGIN
	
	hex<=hex_r;
	bin<=bin_r;
	seg<=seg_r;
	dig<=dig_r;
	led<=not (ledin & bin_r);
	
	PROCESS(clk_48M)		--时钟分频部分
	BEGIN
		IF	RISING_EDGE(clk_48M)THEN
			IF count<120000 THEN
				count<=count+1;
				div_clk<='0';
			ELSE
				count<=B"0_0000_0000_0000_0000";
				div_clk<='1';
			END IF;
		END IF;
	END PROCESS;
	
	PROCESS(clk_48M)
	BEGIN
		IF	RISING_EDGE(clk_48M)THEN
			IF div_clk='1' THEN
				dout1<=key;
				dout2<=dout1;
				dout3<=dout2;
			END IF;
		END IF;
	END PROCESS;
	
	PROCESS (clk_48M)--按键边沿检测部分
	BEGIN
		IF	RISING_EDGE(clk_48M)THEN
			buff<=dout1 OR dout2 OR dout3;
		END IF;
	END PROCESS;
	
	key_edge<= not(dout1 OR dout2 OR dout3) AND buff;--按键消抖输出
	
	PROCESS(clk_48M)--------按键1-----------------------------<<4位16进制数输出部分
	BEGIN
		IF	RISING_EDGE(clk_48M)THEN
			IF	(key_edge(0)='1')THEN
				hex_r(15 DOWNTO 12)<=hex_r(15 DOWNTO 12) + 1;
			END IF;
		END IF;
	END PROCESS;
	
	PROCESS(clk_48M)--------按键2
	BEGIN
		IF	RISING_EDGE(clk_48M)THEN
			IF	(key_edge(1)='1')THEN
				hex_r(11 DOWNTO 8)<=hex_r(11 DOWNTO 8)	+ 1;
			END IF;
		END IF;
	END PROCESS;
	
	PROCESS(clk_48M)--------按键3
	BEGIN
		IF	RISING_EDGE(clk_48M)THEN
			IF	(key_edge(2)='1')THEN
				hex_r(7 DOWNTO 4)<=hex_r(7  DOWNTO 4)+1;
			END IF;
		END IF;
	END PROCESS;
	
	PROCESS(clk_48M)--------按键4
	BEGIN
		IF	RISING_EDGE(clk_48M)	THEN
			IF	(key_edge(3)='1')	THEN
				hex_r(3 DOWNTO 0)<=hex_r(3 DOWNTO 0)+1;
			END IF;
		END IF;
	END PROCESS;
	
	PROCESS(clk_48M)--------按键5
	BEGIN
		IF	RISING_EDGE(clk_48M)	THEN
			IF	(key_edge(4)='1')	THEN
				bin_r(0) <= NOT bin_r(0);
			END IF;
		END IF;
	END PROCESS;
	
	PROCESS(clk_48M)--------按键6
	BEGIN
		IF	RISING_EDGE(clk_48M)	THEN
			IF	(key_edge(5)='1')	THEN
				bin_r(1) <= NOT bin_r(1);	
			END IF;
		END IF;
	END PROCESS;	
	
	PROCESS(clk_48M)--------按键7
	BEGIN
		IF	RISING_EDGE(clk_48M)	THEN
			IF	(key_edge(6)='1')	THEN
				bin_r(2) <= NOT bin_r(2);
			END IF;
		END IF;
	END PROCESS;
	
	PROCESS(clk_48M)--------按键8
	BEGIN
		IF	RISING_EDGE(clk_48M)	THEN
			IF	(key_edge(7)='1')	THEN
				bin_r(3) <= NOT bin_r(3);
			END IF;
		END IF;
	END PROCESS;
	
-------------------------------------------------<<数码管扫描显示部分	
	PROCESS(clk_48M)
	BEGIN
		IF	RISING_EDGE(clk_48M)THEN
			IF div_clk='1' THEN
				cnt3 <= cnt3 + 1;
			END IF;
		END IF;	
	END PROCESS;
	
	PROCESS(clk_48M)
	BEGIN
		IF	RISING_EDGE(clk_48M) THEN
			IF div_clk='1' THEN
				CASE(cnt3) 	IS							  	--<<选择扫描显示数据
					WHEN "000"=>	disp_dat<=	hex_r(15 DOWNTO 12);
					WHEN "001"=>	disp_dat<=	hex_r(11 DOWNTO 8);
					WHEN "010"=> 	disp_dat<=  hex_r(7  DOWNTO 4);
					WHEN "011"=> 	disp_dat<=	hex_r(3	 DOWNTO 0);
					WHEN "100"=> 	disp_dat<=  data(15	 DOWNTO 12);
					WHEN "101"=> 	disp_dat<=  data(11	 DOWNTO 8);
					WHEN "110"=> 	disp_dat<=  data(7	 DOWNTO 4);
					WHEN "111"=> 	disp_dat<=  data(3	 DOWNTO 0);
				END CASE;
				CASE (cnt3)	IS								--<<选择数码管显示位
					WHEN "000"=>	dig_r<="01111111";
					WHEN "001"=>	dig_r<="10111111";
					WHEN "010"=>	dig_r<="11011111";
					WHEN "011"=>	dig_r<="11101111";
					WHEN "100"=>	dig_r<="11110111";
					WHEN "101"=>	dig_r<="11111011";
					WHEN "110"=>	dig_r<="11111101";
					WHEN "111"=>	dig_r<="11111110";	
				END CASE;
			END IF;
		END IF;
	END PROCESS;		
	
	PROCESS(disp_dat)--------------------------------<<七段译码
	BEGIN
		CASE(disp_dat)	IS
			WHEN x"0"=> seg_r<=X"c0";
			WHEN x"1"=> seg_r<=X"f9";
			WHEN x"2"=> seg_r<=X"a4";
			WHEN X"3"=> seg_r<=X"b0";
			WHEN X"4"=> seg_r<=X"99";
			WHEN X"5"=> seg_r<=X"92";
			WHEN X"6"=> seg_r<=X"82";
			WHEN X"7"=> seg_r<=X"f8";
			WHEN X"8"=> seg_r<=X"80";
			WHEN X"9"=> seg_r<=X"90";
			WHEN X"A"=> seg_r<=X"88";
			WHEN X"B"=> seg_r<=X"83";
			WHEN X"C"=> seg_r<=X"c6";
			WHEN X"D"=> seg_r<=X"a1";
			WHEN X"E"=> seg_r<=X"86";
			WHEN X"F"=> seg_r<=X"8e";
			WHEN OTHERS=> NULL;
		END CASE;
	END PROCESS;		
END;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -