提示:源码+仿真代码
提示:以下是本篇文章正文内容,下面案例可供参考
一、“模十计数器”是什么?
对时钟 CLK 上升沿信号进行计数,输出是位宽 为 4 位的信号,每当计数到 10 时,便立即回复到初始状态,重新计数。
二、VHDL代码
代码原理:
要进行分频操作,因为FPGA板子的时钟频率过大,不易看到最终实验效果。
分频操作:我认为简单一点可以理解为原来1个上升沿计数+1,经过分频后变为每100000000个上升沿计数+1,计数值到达9后清0,周而复始。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT(CLK:IN STD_LOGIC;
DATA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END CNT10;
ARCHITECTURE CNT10_BEHAVIOR OF CNT10 IS
SIGNAL CNT:STD_LOGIC_VECTOR(3 DOWNTO 0);
CONSTANT N : INTEGER :=100000000;
SIGNAL COUNTER : INTEGER RANGE 0 TO N;
BEGIN
PROCESS(CLK)
BEGIN
IF clk'EVENT AND clk='1' THEN --上升沿
IF COUNTER = N THEN
COUNTER <= 0; --每100000000个上升沿,COUNTER就清零,实现分频
IF CNT="1001" THEN
CNT<="0000";
ELSE
CNT<=CNT+1;
END IF;
ELSE
COUNTER <= COUNTER + 1;
END IF;
END IF;
END PROCESS;
DATA<=CNT;
END CNT10_BEHAVIOR;
三、仿真代码
提示:仿真时我将上面源码中的常量 N赋值改为7,如下所示:
CONSTANT N : INTEGER :=7;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY TEST IS
-- PORT ( );
END TEST;
ARCHITECTURE BEHAVIORAL OF TEST IS
COMPONENT CNT10
PORT(CLK:IN STD_LOGIC;
DATA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END COMPONENT;
--INPUTS
SIGNAL CLK: STD_LOGIC := '0';
--OUTPUTS
SIGNAL DATA :STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
CONSTANT PERIOD : TIME := 10 NS;
BEGIN
UUT: CNT10 PORT MAP (
CLK =>CLK,
DATA=>DATA
);
A_PROCESS :PROCESS
BEGIN
CLK <= '0';
WAIT FOR PERIOD/4;
CLK <= '1';
WAIT FOR PERIOD/4;
END PROCESS;
END BEHAVIORAL;
四、RTL图
五、仿真图
总结
不同FPGA板子的时钟频率是不同的,可以修改代码改变计数周期。