本次实验为利用计数器实现分频常数为24000,占空比为60%的电路,也可以设置为任意分频,任意占空比的电路
一、设计思路:
设计分析:要将原来的占空比为50%,大频率的信号重新设为60%占空比,频率较小的周期信号,其中频率的思想就是分频器,利用原来的信号的n上升沿为新clk的一次上升沿即可。
其占空比=高电平时间/周期所以重要的设定好高电平在周期内所占的比例尤为重要。
二、代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FJYFP IS
PORT(CLK: IN STD_LOGIC;
RESET: IN STD_LOGIC;
CLK_OUT:OUT STD_LOGIC);
END ENTITY FJYFP;
ARCHITECTURE ART OF FJYFP IS
CONSTANT DIVIDE_PERIOD: INTEGER:=24000; --分频常数为24E3
-- CONSTANT DIVIDE_PERIOD: INTEGER:=10; --分频常数为10
BEGIN
PROCESS (CLK,RESET) IS
VARIABLE CNT: INTEGER RANGE 0 TO 23999;
--VARIABLE CNT: INTEGER RANGE 0 TO 9;
BEGIN
IF(RESET='1') THEN
CNT :=0;
CLK_OUT<='0';
ELSIF RISING_EDGE(CLK) THEN
IF(CNT< 14400) THEN
--IF(CNT< 6) THEN
CLK_OUT<='1';
CNT:=CNT+1;
ELSIF (CNT<(DIVIDE_PERIOD-1)) THEN
CLK_OUT<='0';
CNT:=CNT+1;
ELSE
CNT:=0;
END IF;
END IF;
END PROCESS ;
END ARCHITECTURE ART;
三、仿真波形 :
四、代码分析:
利用CONSTANT将分频常数设定为自己所需的数字即可(大家修改为自己所需的分频常数即可)
-- CONSTANT DIVIDE_PERIOD: INTEGER:=24000; --分频常数为24E3
CONSTANT DIVIDE_PERIOD: INTEGER:=10; --分频常数为10
BEGIN
PROCESS (CLK,RESET) IS
--VARIABLE CNT: INTEGER RANGE 0 TO 23999;
VARIABLE CNT: INTEGER RANGE 0 TO 9;
其中占空比的设定主要看 CNT< 设定数值
例如:我设定的分频常数为10分频,即原clk10个上升沿则newclk才会产生上升沿。
然后设置高电平所占的时间:CNT的10分频即变化数字为0-9,这里我设置当CNT<6时为高电平即数字0-5这六个数字在10个数字中所占的电平都为高电平。那么低电平就是剩下的数字所占的电平为低电平。 符合公式: 占空比=高电平所占时间/周期时间
-- IF(CNT< 14400) THEN
IF(CNT< 6) THEN
CLK_OUT<='1';
CNT:=CNT+1;
ELSIF (CNT<(DIVIDE_PERIOD-1)) THEN
CLK_OUT<='0';
CNT:=CNT+1;
ELSE
CNT:=0;
四、仿真波形分析
为了能够软件仿真,我将分频常数设置较小(这里设定为10),即CLK10个上升沿就会产生CLK--OUT的跳变,若在硬件上需要设定为高分频常数的将小分频常数注释即可。
这里可以清楚的看见其中分频常数10,占空比为60% 满足要求。
对比设置不同占空比的波形输出也是我们常见的PWM波