实验4 数控分频器设计
• • • • • • • • • • • •
begin clk<=inclk xor div2; fout<=cout;
--inclk与divide2异或后作为模3计数器的时钟
p0:process(clk) begin if clk'event and clk='1' then if cnt="10" then cout<='1';cnt<="00"; else cout<='0';cnt<=cnt+1; end if; end if; end process;
(2)分频系数2.5的小数分频器设计方案 设有一个5MHz的时钟源,电路中需要产生 一个2MHz的时钟信号,则分频比是2.5。 设计中,先设计一个模3的计数器(上升沿 计数),然后通过在时钟下降沿处产生分频 信号的上升沿,以实现半整数分频。
inclk 异或门 clk 模N计数器 二分频 fin/(2N-1)
if clk'event and clk='1' then if cnt8="11111111" then cnt8:=d; full<='1'; --如果cnt8记满全1,预置数d被同步置入计数器cnt8, 准备开始下次加法计数。记满时进位信号输出高电平1 else cnt8:=cnt8+1;full<='0'; --否则继续作加1计数,full输出低电平0 end if; end if; end process; p1:process(full) --进程p1,以full信号为敏感岑书 variable cnt2 :std_logic; --定义内部变量cnt2 begin if full'event and full='1' then cnt2:=not cnt2; --变量cnt2是信号full的2分频 end if; if cnt2='1' then fout<='1'; --分频最终结果fout else fout<='0'; end if; end process; end;
实验四 数控分频器的设计
1.实验目的 (1)学习时序电路VHDL语言设计。 (2)学习多进程设计,掌握变量的用法与信号 的区别。 (3)掌握整数数控分频器的原理及设计方法。 (4)掌握半整数数控分频器的原理及设计方法
2. 背景知识
分频器在时序逻辑电路中应用广泛.数控分频 器的功能就是当在输入端给定不同的输入数据时 ,将对输入的时钟信号有不同的分频比。 整数分频器采用计数初值可并行预置的加法 (或者减法)计数器构成。时钟源与所需频率不 成整数倍关系,需要采用小数分频器进行分频。
3.实验内容与要求
(1)、设计一个整数数控分频器,根据预置数的不 同实现不同的分频比。 (2)、设计一个分频系数是2.5的小数分频器。 实验要求:波形仿真+硬件验证
4. 实验方案 (1)、整数分频器设计方案
假设计数器计数时钟是clock,数据位宽为4,进行加 法计数,计数初值为“1011”,计数器记满“1111”, 需要计数5次(1011→1100→1101→1110→1111),每5个 clock脉冲,count输出一个脉冲,这样count的频率就是 clock频率的1/5,称为5分频。假设预置数是d[3..0],这样 分频比R= "1111"-d[3..0]+1。也就是如果d[3..0]=11(二进 制1011),则R=5;如果是减法计数器,则分频比R=12(从 11减法计数到0,共12次),则分频比公式为R=d[3..0]+1 。
cnt8从零开始计 数,记到全1时才 进行第一次初值置 入,然后才开始分 频
计 数 寄 存 器
思考:采用此方法能够设计的分频器的特点? 偶次分频?奇次分频?占空比? 思考: 1、分频波形从12.8us开始的原因? 2、clk时钟频率为20MHz,预置数d=252,则信号full的频率? 信号fout的频率? 3、如果预置数是238呢?
library ieee; --设计库的打开和程序包的允许使用 use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity pulse is --定义实体pulse port(clk : in std_logic; --初始时钟clk,即分频前时钟 d : in std_logic_vector(7 downto 0); --8位预置数d fout : out std_logic); --分频后输出信号 end; architecture one of pulse1 is --定义结构体 signal full : std_logic; --定义信号full begin p0:process(clk) --进程p0,以clk为敏感参数 variable cnt8 :std_logic_vector(7 downto 0); --定义内部变量cnt8 begin
fin/(N-0.5)
• • • • • • • • • • • • • •
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity half_integer is port( inclk :in std_logic; --初始时钟inclk,需要分频的信号 fout : out std_logic; --分频后输出时钟 clk :buffer std_logic); --模3计数时钟 end; architecture one of half_integer is signal div2,cout:std_logic; signal cnt :std_logic_vector(1 downto 0);
• inclk是分频前的初始时钟,在计数到2时,信号cout是低 电平0,div2也是0,此时inclk与div2相异或,得到的结果 clk等于inclk,因此在这一段时间内,相当于以inclk为脉冲 进行计数。第3个inclk计数脉冲上升沿到来后,根据程序 判断此时cnt=“10”,所以cnt赋值0,cout赋值高电平1 ,即cout产生上升沿,将会触发进程p1,导致信号div2反 转,变为高电平1。当div2变为高电平1后,div2与inclk相 异或,使得信号clk变为inclk取反,即在第3个inclk下降沿 处会产生clk信号的上升沿,导致cnt计数从0到1,即0的持 续时间只有半个周期(第3个inclk信号上升沿到下降沿) ,因而是一个2.5分频的结果。
分频器设计的基础——计数器
4位二进制加法计数器
计满全1后,产生进位信号cout,cout的频率是计数时钟 频率的16分之一,称cout是clk的十六分频。 如果有一个预置数d[3..0],从d开始计数计到全1,这时进 位信号cout与clk的频率关系是什么呢? 分频比R=“1111”-d[3..0]+1
关于fout频率的计算 full信号的分频比F="11111111"- d[7..0]+1,而fout信号的频率是full频率的一 半,产生的分频信号fout的分频比应是R= ("11111111"-d[7..0]+1)×2。通过公式 根据需要的分频比,计算预置初值d。假设 需要进行8分频,预置数d是252(步骤(略) 注:(A)把SW5改造成普通I/O口(P51); (B)学会调出内部寄存器的方法(P50) (2) 实验结果(略)
6.实验扩展:
(1)、在例2-4-1的基础上,添加异步复位信号 reset。当reset=0时,计数器赋初值;reset=1时 ,计数器在时钟clk的作用下计数。 (2)、设计一个任意半整数的分频器。可以通过更 改计数模值N实现如7.5分频、10.5分频。
• • • • • • •
p1:process(cout) begin if cout'event and cout='1' then --信号cout上升沿时,div2取反 div2<=not div2; --即div2是cout的二分频 end if; end process; end;
设计的关键点在于一个信号与0异或,得到的是信号本身;与1异或, 得到的是信号的取反。。