📄 fq_divider.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.P_ALARM.ALL;
ENTITY FQ_DIVIDER IS
PORT( CLK_40Mhz: IN STD_LOGIC;
RESET: IN STD_LOGIC;
--CLK_1Khz: OUT STD_LOGIC;
CLK_1Khz: BUFFER STD_LOGIC;
--CLK_50hz: OUT STD_LOGIC; --20ms
CLK_50hz: BUFFER STD_LOGIC; --20ms
CLK_1hz: OUT STD_LOGIC );--1s
END ENTITY FQ_DIVIDER;
--------------------------------------------------
ARCHITECTURE ART OF FQ_DIVIDER IS
CONSTANT DIVIDE_PERIOD :integer := 40000;
CONSTANT DIVIDE_PERIOD1 :integer := 20;
CONSTANT DIVIDE_PERIOD2 :integer := 50;
BEGIN
----------------------------------------------
DIVIDE_CLK:PROCESS(clk_40Mhz) IS
VARIABLE CNT :integer range 0 to 65535;
BEGIN
IF (RESET = '1') THEN
CNT := 0; CLK_1Khz <= '0';
ELSIF RISING_EDGE(clk_40Mhz) THEN
IF (CNT < (DIVIDE_PERIOD/2)) THEN
clk_1khz <= '1';
CNT := CNT + 1;
ELSIF (CNT < (DIVIDE_PERIOD-1)) THEN
clk_1Khz <= '0';
CNT := CNT + 1;
ELSE
CNT := 0;
END IF;
END IF;
END PROCESS DIVIDE_CLK;
-----------------------------------------------------
DIVIDE_CLK1:PROCESS(clk_1Khz) IS
VARIABLE CNT :integer range 0 to 32;
BEGIN
IF (RESET = '1') THEN
CNT := 0; CLK_50hz <= '0';
ELSIF RISING_EDGE(clk_1Khz) THEN
IF (CNT < (DIVIDE_PERIOD1/2)) THEN
clk_50hz <= '1';
CNT := CNT + 1;
ELSIF (CNT < (DIVIDE_PERIOD1-1)) THEN
clk_50hz <= '0';
CNT := CNT + 1;
ELSE
CNT := 0;
END IF;
END IF;
END PROCESS DIVIDE_CLK1;
-------------------------------------------------
DIVIDE_CLK2:PROCESS(clk_50hz) IS
VARIABLE CNT :integer range 0 to 64;
BEGIN
IF (RESET = '1') THEN
CNT := 0; CLK_1hz <= '0';
ELSIF RISING_EDGE(clk_50hz) THEN
IF (CNT < (DIVIDE_PERIOD2/2)) THEN
clk_1hz <= '1';
CNT := CNT + 1;
ELSIF (CNT < (DIVIDE_PERIOD2-1)) THEN
clk_1hz <= '0';
CNT := CNT + 1;
ELSE
CNT := 0;
END IF;
END IF;
END PROCESS DIVIDE_CLK2;
----------------------------------
END ARCHITECTURE ART;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -