集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 3520|回复: 8

整数(1~255)模值占空比50%分频VHDL

[复制链接]
2007301686 发表于 2010-6-4 19:44:40 | 显示全部楼层 |阅读模式
代码内有详细注释

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
deepautumn 发表于 2010-6-9 18:54:00 | 显示全部楼层
学习中!support !
 楼主| 2007301686 发表于 2010-7-3 21:06:50 | 显示全部楼层
终于有人回帖了,O(∩_∩)O哈哈~
 楼主| 2007301686 发表于 2010-7-7 22:06:23 | 显示全部楼层
代码有点小问题,更改版为:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
--整数分频器
entity DIVN is
        port(
                Clk,Rst        :in  std_logic;--输入时钟和复位信号
                Data        :in  std_logic_vector(7 downto 0);--分频倍数输入
                ClkOut        ut std_logic--分频时钟输出
                );
end DIVN;

architecture Behavior of DIVN is
        signal Mid        : std_logic_vector(7 downto 0);--分频倍数的一半,即偶数为N/2,奇数为(N-1)/2
        signal ClkUp,ClkDown : std_logic;--上升沿和下降沿分频信号
begin
        Mid<= '0'&Data(7 downto 1);--分频倍数的一半,相当于除2
        process(Clk,Rst)--上升沿分频进程
                variable Cnt1 : std_logic_vector(7 downto 0);--内部计数变量
        begin
                if(Rst='1')then--复位
                        Cnt1:=(others=>'0');
                        ClkUp<='0';
                elsif(Clk'event and Clk='1')then--上升沿
                        if(Cnt1<Mid)then--前半个分频周期
                                ClkUp<='1';
                        else
                                ClkUp<='0';--后半个
                        end if;

                        if(Cnt1=conv_integer(Data)-1)then
                                Cnt1:=(others=>'0');--计满清0
                        else
                                Cnt1:=Cnt1+1;--未计满加1
                        end if;
                end if;
        end process;
       
        process(Clk,Rst)--下降沿分频进程
                variable Cnt2 : std_logic_vector(7 downto 0);--内部计数变量
        begin
                if(Rst='1')then--复位
                        Cnt2:=(others=>'0');
                        ClkDown<='0';
                elsif(Clk'event and Clk='0')then--下降沿
                        if(Cnt2<Mid)then--前半个分频周期
                                ClkDown<='1';
                        else
                                ClkDown<='0';--后半个
                        end if;

                        if(Cnt2=conv_integer(Data)-1)then
                                Cnt2:=(others=>'0');--计满清0
                        else
                                Cnt2:=Cnt2+1;--未计满加1
                        end if;
                end if;
        end process;
       
        ClkOut <= ClkUp when Data(0)='0' else--偶数时直接输出上升沿分频信号
                          clk        when Data=1                 else--分频系数为1时直接输出时钟信号
                          ClkUp or ClkDown;--计数分频时为保证50%占空比需上升下降沿分频信号进行或运算
end Behavior;
zhangyukun 发表于 2019-11-27 09:55:14 | 显示全部楼层
整数(1~255)模值占空比50%分频VHDL
嘿哈嘿哈哈 发表于 2022-11-30 13:34:19 | 显示全部楼层
整数(1~255)模值占空比50%分频VHDL
雷1314521景 发表于 2022-11-30 22:58:14 | 显示全部楼层
整数(1~255)模值占空比50%分频VHDL
http://www.fpgaw.com/forum.php?m ... 9&fromuid=59831
(出处: fpga论坛|fpga设计论坛)
508482294 发表于 2022-12-5 15:24:32 | 显示全部楼层
整数(1~255)模值占空比50%分频VHDL
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-16 11:47 , Processed in 0.070508 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表