📄 userinterface.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 + -