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

📄 userinterface.vhd

📁 含有各类寄存器
💻 VHD
字号:
-------------------------------------------------------------------------------

-- 文件名: UserInterface.vhd

-- Copyright (c) 2002-2003 SVA-Radar信息产品部

-- 创建人: 马骏

-- 日  期: 3.1

-- 修改人:

-- 日  期:

-- 描  述: 雷达模拟器v1.0用户接口模块

-- 版  本: 1.0

-------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.PackForSim.all;

--  Uncomment the following lines to use the declarations that are
--  provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

entity UserInterface is
    Port ( CLK_IN				:	in std_logic;										--外部时钟输入,使用38.83951MHz晶振
			  RST_IN				:	in std_logic;										--RESET按键输入
	 		  TRIG_KEY_IN		:	in std_logic;										--触发选择按键输入
           AZIP_KEY_IN		:	in std_logic;										--方位选择按键输入
           TRIG_LED			:	out std_logic_vector(6 downto 0);			--触发频率显示数码管输出
           AZIP_LED			:	out std_logic_vector(6 downto 0);			--方位脉冲数显示数码管输出
           AZIP_LED_COMMON		:	buffer std_logic_vector(3 downto 0);		--方位显示数码管公共端
           TRIG_LED_COMMON		:	buffer std_logic_vector(3 downto 0);		--触发显示数码管公共端
           TRIG_SEL_OUT		:	buffer std_logic_vector(2 downto 0);		--触发频率选择输出,到目标产生模块
           AZIP_SEL_OUT		:	buffer std_logic_vector(1 downto 0);			--方位脉冲数选择输出,到目标产生模块
			  trigkeytest		:	out std_logic
			  );
end UserInterface;

architecture Behavioral of UserInterface is


signal	KeyClk	:	std_logic;				--按键去抖动采样信号
signal	DispClk	:	std_logic;				--LED显示循环时钟
signal	TrigKey	:	std_logic;				--消抖后的触发按键
signal	AzipKey	:	std_logic;				--消抖后的方位按键


begin


-------------------------------------------------------------------------------
--按键去抖动

	KEY_CLK_GENERATE:
	process(CLK_IN, RST_IN)
		variable		cnt :	integer range 0 to KeyDelay;
	begin
		if(RST_IN = '1')	then
			cnt		:= 0;
			KeyClk	<= '0';
		elsif rising_edge(CLK_IN)	then
			
			if(cnt = KeyDelay)	then
				cnt	:= 0;
			end if;

			--KeyClk脉宽为1ms
			if(cnt >= 0 and cnt <= 38840)	then						  
				KeyClk	<= '1';
			else
				KeyClk	<= '0';
			end if;

			cnt	:= cnt + 1;

		end if;
	end process;

--	KEY_GENERATE:
	process(KeyClk, RST_IN, TRIG_KEY_IN, AZIP_KEY_IN,	trigkey)
		variable	trig_key1	:	std_logic;
	variable	trig_key2	:	std_logic;
		variable	azip_key1	:	std_logic;
		variable	azip_key2	:	std_logic;
	begin
	
		if(RST_IN = '1')	then
			TrigKey		<= '0';
			AzipKey		<= '0';
			azip_key1	:= '0';
			azip_key2	:= '0';		
		elsif rising_edge(KeyClk)	then
			if	(TRIG_KEY_IN	=	'1'	and	azip_key2	=	'0')	then
				TrigKey	<=	'1';
			else 
				TrigKey	<=	'0';
			end if;
			if	(AZIP_KEY_IN	=	'1'	and	azip_key2	=	'0')	then
				AzipKey	<=	'1';
			else
				AzipKey	<=	'0';
			end if;
			azip_key2	:=	AZIP_KEY_IN;
			trig_key2	:=	TRIG_KEY_IN;
		end if;
	trigkeytest <= TrigKey;
	end process;

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
--触发方位选择信号送出
	
	TRIG_SEL_GENERATE:
	process(RST_IN, TrigKey)
		variable		cnt	:	std_logic_vector(2 downto 0);
	begin
		if(RST_IN = '1')	then
			TRIG_SEL_OUT	<=	(others => '0');
			cnt				:=	(others => '0');
		elsif rising_edge(TrigKey)		then

			case cnt is
				when	"000"|"001"|"010"|"011"=>
					cnt	:= cnt + 1;
					TRIG_SEL_OUT	<= cnt;
				when	"100"		=>
					cnt	:= "000";
					TRIG_SEL_OUT	<= cnt;
				when	others	=>
					TRIG_SEL_OUT	<= "000";
					cnt	:=	"000";
			end case;

		end if;
	end process;

	AZIP_SEL_GENERATE:
	process(RST_IN, AzipKey)
		variable		cnt	:	std_logic_vector(1 downto 0);
	begin
		if(RST_IN = '1')	then
			AZIP_SEL_OUT	<= "00";
			cnt				:= "00";

		elsif rising_edge(AzipKey)	then
			
			case	cnt	is
				when	"00"|"01"|"10"	=>
					cnt	:=	cnt + 1;
					AZIP_SEL_OUT	<= cnt;
				when	"11"	=>
					cnt	:=	"00";
					AZIP_SEL_OUT	<= cnt;
				when others	=>
					cnt	:= "00";
					AZIP_SEL_OUT	<= "00";
			end case;

		end if;
	end process;
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
--触发频率和方位脉冲数的数码管显示

	LED_DISPLAY_CLK_GENERATE:
	process(CLK_IN, RST_IN)
	variable		cnt	:	integer	range 0 to 194198;		 	--DispClk频率为200Hz左右

	begin
		if(RST_IN = '1')	then
			DispClk	<= '0';
			cnt		:= 0;
		elsif rising_edge(CLK_IN)	then
			if(cnt = 194198)	then
				cnt	:= 0;
				DispClk	<= '1';
			else
				cnt	:=	cnt + 1;
				DispClk	<= '0';
			end if;
		end if;
	end process;

	AZIP_LED_COMMON_GENERATE:
	process(DispClk, rst_in)
		variable		cnt	:	std_logic_vector(1 downto 0);
	begin
		if(RST_IN = '1')	then
			cnt	:=	"00";
			AZIP_LED_COMMON	<=	"0000";			
		elsif rising_edge(DispClk)	then
			case	cnt	is
				when	"00"	=>
					AZIP_LED_COMMON	<= "1000";
				when	"01"	=>
					AZIP_LED_COMMON	<= "0100";
				when	"10"	=>
					AZIP_LED_COMMON	<=	"0010";
				when	"11"	=>				 
					AZIP_LED_COMMON	<=	"0001";
				when	others	=>
					null;
			end case;

			cnt := cnt + 1;
		end if;
	end process;

	TRIG_LED_COMMON_GENERATE:
	process(DispClk, rst_in)
		variable		cnt	:	std_logic_vector(1 downto 0);
	begin
		if(RST_IN = '1')	then
			cnt	:=	"00";						
 			TRIG_LED_COMMON	<=	"0000";							
		elsif rising_edge(DispClk)	then

			case	cnt	is
				when	"00"	=>
					TRIG_LED_COMMON	<= "1000";
				when	"01"	=>
					TRIG_LED_COMMON	<= "0100";
				when	"10"	=>
					TRIG_LED_COMMON	<=	"0010";
				when	"11"	=>				 
					TRIG_LED_COMMON	<=	"0001";
				when	others	=>
					null;
			end case;

			cnt := cnt + 1;
		end if;
	end process;



	TRIG_LED_CODE_OUT:
	process(TRIG_SEL_OUT, TRIG_LED_COMMON)
	begin
		case TRIG_SEL_OUT	is
			
			--1300
			when	"000"	=>
			  
				case	TRIG_LED_COMMON	is
					when	"0001"	=>
						TRIG_LED		<=	Code1;
					when	"0010"	=>
						TRIG_LED		<=	Code3;
					when	"0100"	=>
						TRIG_LED		<=	Code0;
					when	"1000"	=>
						TRIG_LED		<=	Code0;
					when	others	=>
						TRIG_LED	<=	CodeNull;
				end case;
							
			--650
			when	"001"	=>
				case	TRIG_LED_COMMON	is
					when	"0001"	=>
						TRIG_LED		<=	CodeNull;
					when	"0010"	=>
						TRIG_LED		<=	Code6;
					when	"0100"	=>
						TRIG_LED		<=	Code5;
					when	"1000"	=>
						TRIG_LED		<=	Code0;
					when	others	=>
						TRIG_LED	<=	CodeNull;
				end case;

			--1800
			when	"010"	=>
				case	TRIG_LED_COMMON	is
					when	"0001"	=>
						TRIG_LED		<=	Code1;
					when	"0010"	=>
						TRIG_LED		<=	Code8;
					when	"0100"	=>
						TRIG_LED		<=	Code0;
					when	"1000"	=>
						TRIG_LED		<=	Code0;
					when	others	=>
						TRIG_LED	<=	CodeNull;
				end case;

			--1200
			when	"011"	=>
				case	TRIG_LED_COMMON	is
					when	"0001"	=>
						TRIG_LED		<=	Code1;
					when	"0010"	=>
						TRIG_LED		<=	Code2;
					when	"0100"	=>
						TRIG_LED		<=	Code0;
					when	"1000"	=>
						TRIG_LED		<=	Code0;
					when	others	=>
						TRIG_LED	<=	CodeNull;
				end case;

			--600
			when	"100"	=>
				case	TRIG_LED_COMMON	is
					when	"0001"	=>
						TRIG_LED		<=	CodeNull;
					when	"0010"	=>
						TRIG_LED		<=	Code6;
					when	"0100"	=>
						TRIG_LED		<=	Code0;
					when	"1000"	=>
						TRIG_LED		<=	Code0;
					when	others	=>
						TRIG_LED	<=	CodeNull;
				end case;

			when	others	=>
				TRIG_LED	<=	CodeNull;

		end case;
	end process;

	AZIP_LED_CODE_OUT:
	process(AZIP_SEL_OUT, AZIP_LED_COMMON)
	begin
		case	AZIP_SEL_OUT	is

			--216
			when	"00"	=>
				case	AZIP_LED_COMMON	is
					when	"0001"	=>
						AZIP_LED		<=	CodeNull;
					when	"0010"	=>
						AZIP_LED		<=	Code2;
					when	"0100"	=>
						AZIP_LED		<=	Code1;
					when	"1000"	=>
						AZIP_LED		<=	Code6;
					when	others	=>
						AZIP_LED	<=	CodeNull;
				end case;

			--360
			when	"01"	=>
         		case	AZIP_LED_COMMON	is
					when	"0001"	=>
						AZIP_LED		<=	CodeNull;
					when	"0010"	=>
						AZIP_LED		<=	Code3;
					when	"0100"	=>
						AZIP_LED		<=	Code6;
					when	"1000"	=>
						AZIP_LED		<=	Code0;
					when	others	=>
						AZIP_LED	<=	CodeNull;
				end case;

			--1080
			when	"10"	=>

				case	AZIP_LED_COMMON	is
					when	"0001"	=>
						AZIP_LED		<=	Code1;
					when	"0010"	=>
						AZIP_LED		<=	Code0;
					when	"0100"	=>
						AZIP_LED		<=	Code8;
					when	"1000"	=>
						AZIP_LED		<=	Code0;
					when	others	=>
						AZIP_LED	<=	CodeNull;
				end case;
			--90
			when "11"	=>
				
				case AZIP_LED_COMMON		is
					when	"0001"	=>
						AZIP_LED		<=	CodeNull;
					when	"0010"	=>
						AZIP_LED		<=	CodeNull;
					when	"0100"	=>
						AZIP_LED		<=	Code9;
					when	"1000"	=>
						AZIP_LED		<=	Code0;
					when	others	=>
						AZIP_LED	<=	CodeNull;
				end case;
					

			when	others	=>
				AZIP_LED	<=	CodeNull;

		end case;
	end process;
	
-------------------------------------------------------------------------------

end Behavioral;


⌨️ 快捷键说明

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