【VHDL】VHDL设计一个分频器

1. 实验任务

  • 尝试用两种或以上方式设计并实现一个分频器

2. 如何实现

  1. 二进制分频器的设计

    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    use ieee.std_logic_unsigned.all;
    ENTITY DIV IS 
    generic (N:integer :=2);--进行2的N次幂分频
    PORT (fin:in std_logic;
    fout:out std_logic);
    end entity DIV;
    
    architecture behav of DIV is
    signal count :std_logic_vector(N-1 downto 0);
    begin
    process (fin) begin 
    if(fin'event and fin='1') then 
        count<=count+1;--计数值加一
        end if;
    end process;
    fout<=count(N-1);
    end ;
  2. 偶分频器(占空比为50%)

    Library ieee;
    Use ieee.std_logic_1164.all;
    Use ieee.std_logic_unsigned.all;
    Use ieee.std_logic_arith.all;
    
    Entity fdiv is
      generic(N: integer:=6);      --rate=N,N是偶数
      port(
            clkin: IN std_logic;
            clkout: OUT std_logic
            );
    End fdiv;
    Architecture a of fdiv is
      signal cnt: integer range 0 to n-1;
    Begin
      process(clkin)  --计数
      begin
          if(clkin'event and clkin='1') then
              if(cnt<n-1) then
                  cnt <= cnt+1;
              else
                  cnt <= 0;
              end if;
          end if;
      end process;
    
      process(cnt)  --根据计数值,控制输出时钟脉冲的高、低电平
      begin
          if(cnt<n/2) then
              clkout <= '1';
          else
              clkout <= '0';
          end if;
      end process;
    
    End a;
  3. 奇分频器(占空比为50%)

    Library ieee;
    Use ieee.std_logic_1164.all;
    Use ieee.std_logic_unsigned.all;
    Use ieee.std_logic_arith.all;
    
    Entity fdiv is
      generic(N: integer:=5);        --rate=N,N是奇数
      port(
            clkin: IN std_logic;
            clkout: OUT std_logic
            );
    End fdiv;
    architecture a of fdiv is
      signal cnt1, cnt2: integer range 0 to N-1;
    begin
      process(clkin)
      begin
          if(clkin‘event and clkin=’1‘) then  --上升沿计数
              if(cnt1<N-1) then
                  cnt1 <= cnt1+1;
              else
               cnt1 <= 0;
           end if;
          end if;
      end process;
      process(clkin)
      begin
        if(clkin‘event and clkin=’0‘) then  --下降沿计数
            if(cnt2<N-1) then
                cnt2 <= cnt2+1;
            else
             cnt2 <= 0;
            end if;
        end if;
      end process;
    
      clkout <= '1' when cnt1<(N-1)/2 or cnt2<(N-1)/2 else
                      '0';
    
    end a;
    
  4. 使用LPM 和绘图方式来实际N分频器
      选择Tools中的MegaWizard Plug-In Manager命令,选择Creat a new custom megafunction variation,定制一个新的模版,在左侧栏中选择算术项Arthmetic下的LPM_COUNTER,进而一步步配置,得到一定位数,预制功能可定制的LPM计数器。
      
      
      二进制分频器可视作一个n位的计数器和一个D触发器相连接,当计数器溢出时,D触发器翻转,从而构成分频器。
      LPM_COUNTER配置好之后,可以编写D触发器,或者使用系统提供的D触发器。
      最后通过原件例化语句或者画图的方式将两者连接在一起。

    • D触发器
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    
    ENTITY DDFF IS
    PORT (CLK_D,D:IN STD_LOGIC;
              Q:OUT STD_LOGIC);
    END;
    
    ARCHITECTURE bhv OF DDFF IS
    SIGNAL Q1:STD_LOGIC;
    BEGIN 
    PROCESS (CLK_D,Q1) BEGIN
            IF CLK_D'EVENT AND CLK_D='1' THEN Q1<=D;
            END IF;
    END PROCESS;
    Q<=Q1;
    END bhv;
    • LPM_COUNTER(具有同步加载、异步清零、加减控制)N进制计数器
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    use ieee.std_logic_unsigned.all;
    ENTITY CNT4BIT IS 
    generic (N:integer :=4);--进行2的N次幂分频
    PORT (
    CLK,RST,ENA,SLD,UD:IN STD_LOGIC;
    DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    COUT:OUT STD_LOGIC;
    DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
    END ENTITY CNT4BIT;
    
    ARCHITECTURE behav OF CNT4BIT IS
    SIGNAL TRANS :STD_LOGIC;
    
    component LPM_MD 
    port(
    aclr,clk_en,clock,sload,updown:in std_logic;
    data:in std_logic_vector(3 downto 0);
    cout:out std_logic;
    q:out std_logic_vector(3 downto 0));
    end component;
    
    component DDFF
    PORT (CLK_D,D:IN STD_LOGIC;
              Q:OUT STD_LOGIC);
    END component ;
    
    begin 
    U1:LPM_MD PORT MAP(sload=>SLD,
    clk_en=>ENA,
    aclr=>RST,
    cout=>TRANS,
    clock=>CLK,
    data=>DIN,
    updown=>UD,
    q=>DOUT);
    
    U2:DDFF port map(
    CLK_D=>CLK,
    D=>TRANS,
    Q=>COUT
    );
    
    END ARCHITECTURE behav;

3. 实验结果

  • 仿真波形图

  • LPM_DIV(16分频分频器)
  • 23
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值