IF CLK'EVENT AND CLK='1' THEN IF CNTER=29999 THEN CNTER<=0; ELSE CNTER<=CNTER+1; END IF;
END IF;
END PROCESS;
PROCESS(CNTER) IS BEGIN
IF CNTER=29999 THEN NEWCLK<='1'; 计数到三万次了,就给出一个脉冲
ELSE NEWCLK<='0'; END IF;
END PROCESS; END;模块符号:
(图1)
2.2模块2——十进制计数器
十进制计数器就是输入一个时钟脉冲计一个数,计数当前值通过4位输出端口输出,输出为BCD码。当计到九且再来一个脉冲时计数输出清零,且进位端给出高电平。再来脉冲继续计数,进位端清零。计数只有在使能端为1时有效,否则保持。当复位端为1时,则计数器清零。
部分源程序及说明:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT10 IS
PORT (CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT10;
ARCHITECTURE behav OF CNT10 IS BEGIN
PROCESS(CLK, RST, EN)
VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
3
IF RST = '1' THEN CQI := (OTHERS =>'0') ; --计数器异步复位
ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF EN = '1' THEN --检测是否允许计数(同步使能)
IF CQI < 9 THEN CQI := CQI + 1; COUT <= '0'; --允许计数, 检测是否小于9 ,设置输出为0
ELSE CQI := (OTHERS =>'0'); COUT <= '1'; --大于9,计数值清零,设置输出为1
END IF; END IF; END IF; CQ<=CQI;
END PROCESS; END;模块图:
(图2)
2.3模块3——六进制计数器。
当使能端是1时,对秒和分的十位进行计数,当计数到5,再来一个脉冲时就变为零。当遇到复位为高电平时,则清零。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT6 IS
PORT (CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT6;
ARCHITECTURE behav OF CNT6 IS BEGIN
PROCESS(CLK, RST, EN)
VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
IF RST = '1' THEN CQI := (OTHERS =>'0') ; ELSIF CLK'EVENT AND CLK='1' THEN IF EN = '1' THEN
IF CQI < 5 THEN CQI := CQI + 1; COUT <= '0';
ELSE CQI := (OTHERS =>'0'); COUT <= '1';
4
END IF; END IF; END IF; CQ<=CQI;
END PROCESS; END;
图3
2.4模块4——与门。
利用与门把几个进位输出进行相与,得出一分钟的高电平和十秒钟的高电平。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ANDT IS
PORT (A,B:IN STD_LOGIC; Y:OUT STD_LOGIC); END ENTITY ANDT;
ARCHITECTURE ART OF ANDT IS BEGIN
Y<=A AND B;
END ARCHITECTURE ART;
(图4)
2.5顶层设计模块
5
顶层文件是一个原理图文件(图9)
33.1 时序仿真
分频器时序仿真结果:
系统仿真
(图5)仿真时间是100ms,输入脉冲是上面一排,下面是输出脉冲,100ms内有10个脉冲,即输出是一个100Hz时钟信号。
6
相关推荐: