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

📄 reset.vhd

📁 基于FPGA液晶控制器设计与实现(VHDL语言)
💻 VHD
字号:
-- -----------------------------------------------------------------------------
--
-- 文件名 : reset.vhd
--
-- 功能   : 产生 复位 信号.
--
-- 端口   : CLK        : in   PIN_28,  外部 50MHz 晶振.
--          CLK_Z      : in   25MHz , 50% 占空比的时钟信号.
--          pulse1K    : in   1KHz 的 脉冲信号, 占空比很小.
--
--          CLK_EN     : in   上电复位 的信号.
--          nRESET     : in   PIN_124, 外部 复位按键.
--
--          RESET      : out  产生到其他模块 大于671.08864ms 的 复位 信号.
--
-- 笔记   : 1.CLK_EN 只是在上电复位时,有一段时间的低电平.(详见:altpll的帮助文档)
--          2. nRESET 是外部输入的 复位按键信号, 所以 对其进行了 2ms 至 3ms 的 延时.
--
-- Total logic elements:  63/12,060 ( <1%)
-- -----------------------------------------------------------------------------
-- 建立日期 : 2007/4/15
-- -----------------------------------------------------------------------------
-- 修改日期 :
-- 修改内容 :
-- -----------------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity reset is
	PORT
	(
		CLK         : in std_logic  := '0';
		CLK_Z       : in std_logic  := '0';
		pulse1K     : in std_logic;

		CLK_EN      : in std_logic;
		nRESET      : in  std_logic;

		RESET       : out std_logic
	);
end reset;

architecture rtl of reset is

	signal resrt_en                             :       std_logic;
	signal resrtTemp1, resrtTemp2, resrtTemp3   :       std_logic;

	signal counter, tempCounter : std_logic_vector(28 downto 0) := "00000000000000000000000000000";

	alias tempDelay           is     counter(28 downto 25);
begin

	RESET    <= '1' when (tempDelay = "0000") else '0';

	resrt_en <= CLK_EN and (resrtTemp1 or resrtTemp2 or resrtTemp3);--nRESET 延时 (2 - 3)ms.

	------------------- 产生 671.08864ms 延时 的 复位信号 --------------------------------------
	tempCounter <= "00000000000000000000000000000" when (resrt_en = '0') else (counter + '1');
	counter_pro : process(CLK, tempDelay, tempCounter)
	begin
		if (CLK'event and CLK = '1') then  --上升沿
			counter(24 downto 0) <= tempCounter(24 downto 0);

			if (tempDelay = "1110") then
				tempDelay      <= "1010";
			else
				tempDelay      <= tempCounter(28 downto 25);
			end if;
		end if;
	end process;

	--------------------- 为了 nRESET 的延时 ---------------------------
	nRESET_pro : process(CLK_Z, pulse1K, nRESET, resrtTemp1, resrtTemp2)
	begin
		if (CLK_Z'event and CLK_Z = '1' and pulse1K = '1')then  --上升沿
			resrtTemp1      <=  nRESET;
			resrtTemp2      <=  resrtTemp1;
			resrtTemp3      <=  resrtTemp2;
		end if;
	end process;

end rtl;

⌨️ 快捷键说明

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