本例子是由VHDL语言编写的60秒计时器,主要是学习编程思想,该例子可以根据自己的需要扩展为时钟程序。具体程序如下所示:
-------------------------------------------------------------------
-- 说明: 1位十进制计数器模块
-- 文件: CNT10.vhd
-- 作者:
-- 日期: 2012/03/09
-- 修改:
-- 软件: Altera QuartusII 9.0
-- 芯片: Altera Cyclone FPGA (EP1C3T144C8)
-------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; --运算符重载的一个头文件
--实体描述部分
ENTITY CNT10 IS
PORT( --端口声明
CLK, CLR, EN : IN STD_LOGIC;
COUT : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 )
);
END CNT10;
--结构体描述部分
ARCHITECTURE bhv OF CNT10 IS
SIGNAL Q1 : STD_LOGIC_VECTOR ( 3 DOWNTO 0 );--定义四位宽的矢量型信号节点
BEGIN
PROCESS(CLR,CLK) --IF语句放在进程中
BEGIN
IF CLR = '0' THEN Q1 <= "0000"; --复位信号,当RESET为1时复位,正常为低电平
ELSIF CLK'EVENT AND CLK = '1' THEN
IF EN='1' THEN
IF Q1<9 THEN Q1 <= Q1+1;COUT <= '0'; --计数器未计满9就继续计数
ELSE Q1 <= "0000";COUT <= '1'; --计数器计满9就清零,产生进位信号
END IF;
END IF;
END IF;
-- IF Q1 = "1001" THEN COUT <= '1'; --当计数器计到9时,产生进位信号
-- ELSE COUT <= '0';
-- END IF;
END PROCESS; --进程结束
Q <= Q1; --端口赋值
END bhv; --结束结构体
-------------------------------------------------------------------
-- 说明: 1位6进制计数器模块
-- 文件: CNT6.vhd
-- 作者:
-- 日期: 2012/03/26
-- 修改:
-- 软件: Altera QuartusII 9.0
-- 芯片: Altera Cyclone FPGA (EP1C3T144C8)
-------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; --运算符重载的一个头文件
--实体描述部分
ENTITY CNT6 IS
PORT( --端口声明
CLK, CLR, EN : IN STD_LOGIC;
COUT : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 )
);
END CNT6;
--结构体描述部分
ARCHITECTURE bhv OF CNT6 IS
SIGNAL Q1 : STD_LOGIC_VECTOR ( 3 DOWNTO 0 );--定义四位宽的矢量型信号节点
BEGIN
PROCESS(CLR,CLK) --IF语句放在进程中
BEGIN
IF CLR = '0' THEN Q1 <= "0000"; --复位信号,当RESET为1时复位,正常为低电平
ELSIF CLK'EVENT AND CLK = '1' THEN
IF EN='1' THEN
IF Q1<5 THEN Q1 <= Q1+1;COUT <= '0'; --计数器未计满5就继续计数
ELSE Q1 <= "0000";COUT <= '1'; --计数器计满5就清零,产生进位信号
END IF;
END IF;
END IF;
-- IF Q1 = "1001" THEN COUT <= '1'; --当计数器计到5时,产生进位信号
-- ELSE COUT <= '0';
-- END IF;
END PROCESS; --进程结束
Q <= Q1; --端口赋值
END bhv; --结束结构体
-------------------------------------------------------------------
-- 说明: 计数器的顶层设计
-- 文件: CNT.vhd
-- 作者:
-- 日期: 2012/03/26
-- 修改:
-- 软件: Altera QuartusII 9.0
-- 芯片: Altera Cyclone FPGA (EP1C3T144C8)
-------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
--实体描述部分
ENTITY CNT IS
PORT( --端口声明
CLK,CLR ,EN : IN STD_LOGIC;
COUT : OUT STD_LOGIC;
QL : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 );
-- QM : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 );
QH : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 )
);
END CNT;
--结构体描述部分
ARCHITECTURE behav OF CNT IS
COMPONENT CNT10 --调用一位十进制计数器
PORT( --端口声明
CLK,CLR,EN : IN STD_LOGIC;
COUT : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 )
);
END COMPONENT; --结束标志
COMPONENT CNT6 --调用一位6进制计数器
PORT( --端口声明
CLK,CLR,EN : IN STD_LOGIC;
COUT : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 )
);
END COMPONENT; --结束标志
SIGNAL cout1 : STD_LOGIC; --定义了3个信号节点,作为内部的连接线使用
BEGIN
u1 : CNT10 PORT MAP (CLK=>CLK,CLR=>CLR,EN=>EN,COUT=>cout1,Q=>QL);
u2 : CNT6 PORT MAP (CLK=>cout1,CLR=>CLR,EN=>EN,COUT=>COUT,Q=>QH);
-- u3 : CNT10 PORT MAP (CLK=>cout2,RESET=>RESET,COUT=>COUT,Q=>QH);
END behav; --结束结构体
东莞元宝代理Microchip长电二三极管 2015-11-25 18:27
用户1523975 2015-11-24 19:47
用户1727656 2015-11-24 08:46
用户593939 2015-11-23 22:54
用户377235 2012-5-23 18:49
非常好……
用户377235 2012-5-5 16:25
好棒啊!!!!!!!!!!!!!!!
用户377235 2012-5-5 12:36
好深啊 看不懂呀!呜呜呜