六分频加法电路的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
六分频加法电路的设计
1相关原理分析
1.1计数器
计数器是实现分频电路的基础,计数器包括普通计数器和约翰逊计数器两种,这两种电路均可用于分频电路中。
最普通的计数器莫过于加法(减法)计数器。以3位二进制计数器为例,计数脉冲CP 通过计数器时,每输入一个计数脉冲,计数器的最低位(记为Q0,后面的依次记为Q1、Q2、)翻转一次,Q1、Q2、都以前一级的输出信号作为触发信号。分析这个过程,不难得出输出波形。
图1-1 3位二进制计数器时序图
由上很容易看出Q0 的频率是CP的1/2,即实现了2分频,Q1则实现了4分频,同理Q2实现了8分频。这就是加法计数器实现分频的基本原理。
约翰逊计数器是一种移位寄存器,采用的是把输出的最高位取非,然后反馈送到最低位触发器的输入端。约翰逊计数器在每一个时钟下只有一个输出发生变化。同样以3为二进制为例。假设最初值或复位状态是000,则依次是000、001、011、111、110、100、000这样循环。由各位的输出可以看出,约翰逊计数器最起码能实现2分频。
1.2两种计数器的比较
从以上分析可以看出约翰逊计数器没有充分有效地利用寄存器的所有状态,而且如果
由于噪声引入一个无效状态,如010,则无法恢复到有效循环中去,需要加入错误恢复处理。但其较之加法计数器也有它的好处。同一时刻,加法计数器的输出可能有多位发生变化,因此当使用组合逻辑对输出进行译码时,会导致尖峰脉冲信号。而约翰逊计数器可以避免这个问题。
1.3 计数器的选择
本次训练要求设计的是加法分频电路,选择的是加法计数器。加法计数器实现分频较之约翰逊计数器简单,编程也容易理解一些,对于初学者也较容易上手。在前面已经讲过加法计数器实现2n的分频的方法,现在就不在赘述。
1.4 偶数分频器
如前所述,分频器的基础是计数器,设计分频器的关键在于输出电平翻转的时机。偶数分频最易于实现,要实现占空比为50%的偶数N分频,一般来说有两种方案:一是当计数器计数到N/2-1时,将输出电平进行一次翻转,同时给计数器一个复位信号,如此循环下去;二是当计数器输出为0到N/2-1时,时钟输出为0或1,计数器输出为N/2到N-1时,时钟输出为1或0,当计数器计数到N-1时,复位计数器,如此循环下去。可以根据以上两种方案设计电路和程序。
2 六分频加法电路
2.1 电路的结构设计
前面已经讲到过关于2n分频可以直接通过计数器获得。而对于一些非2的整数次幂的分频,如本次课设的6分频,还需要在基本计数器电路描述中加上复位控制电路。
图2-1 加法分频电路的RTL视图
2.2 电路的程序设计
由偶数分频器的设计原理我们可以得到两种设计方案:
1)当计数器计数到2的时候,将输出电平取反,同时给输出电路一个复位信号,如此循环,这就是第一种方案;
2)当计数器输出为0到2时,时钟输出为0(或1),而当计数器输出为3到5时,时钟输出为1(或0),且当计数器输出为5时,复位计数器,如此循环下去,此为第二种方案。
根据以上方案,设计出的程序如下:
--filename clk_div1.vhd
--description: 占空比为50%的6 分频
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all ;
entity clk_div1 is --定义实体clk_div1
port(clk_in: in std_logic; clk_out: out std_logic); --定义输入输出端口
end clk_div1;
--第一种方案
architecture a of clk_div1 is
signal clk_outQ: std_logic : ='0';--赋初始值仅供仿真使用
signal countQ: std_logic_vector (2 downto 0) := "000";
begin
process(clk_in)
begin
if(clk_in'event and clk_in = '1') then --检测信号的上升沿
if(countQ /= 2) then
CountQ <= CountQ + 1; --判断计数器是否计数到2,没有就加1
else
clk_outQ <= not clk_outQ; --计数器计数到2,取反
CountQ <= (others=>'0');
end if;
end if;
end process;
clk_out <= clk_outQ; --计数器没有技术到2,保留原值
end a;
--第二种方案
architecture b of clk_div1 is
signal countQ: std_logic_vector(2 downto 0);
begin
process(clk_in)
begin
if(clk_in'event and clk_in = '1') then --检测时钟信号的上升沿
if (countQ < 5) then
countQ <= countQ + 1; --计数器是否计数到5,没有则加1 else
countQ <='0'; --计数器计数到5,复位end if;
end if;
end process;
process(countQ)
begin
if(countQ < 3) then
clk_out <= '0'; --计数器没有计数到3,则令计数器为0
else
clk_out <= '1';--计数器计数到3以上,则令计数器为1