利用计数器实现任意分频,占空比为60%(任意占空比)电路 [VHDL]

本次实验为利用计数器实现分频常数为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;

三、仿真波形 :

利用计数器实现任意分频,占空比为60%(任意占空比)电路 [VHDL]_第1张图片 四、代码分析:

利用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%   满足要求。利用计数器实现任意分频,占空比为60%(任意占空比)电路 [VHDL]_第2张图片

对比设置不同占空比的波形输出也是我们常见的PWM波 

你可能感兴趣的:(VHDL,fpga开发,算法)