tag 标签: 分频器

相关帖子
相关博文
  • 热度 24
    2014-4-1 18:03
    1147 次阅读|
    0 个评论
    1.引言 分频器是数字系统中非常重要的模块之一,被广泛应用于各种控制电路中。在实际中,设计人员往往需要将一个标准的频率源通过分频技术以满足不同的需求。常见的分频形式主要有:偶数分频、奇数分频、半整数分频、小数分频、分数分频。在某些严格的情况下,还有占空比的要求。其中非等占空比的偶数分频器和奇数分频器其实现比较容易,但对于半整数分频器和占空比为50%的奇数分频器实现比较困难。 本文首先介绍了各种分频器的实现原理,并结合VHDL硬件描述语言对其进行了仿真,最后提出一个可控的通用分频器的设计方法,该方法可实现任意分频,资源消耗低,具有可编程等优点。 2.偶数分频器 偶数分频器比较简单,即利用计数器对需要分频的原始时钟信号进行计数翻转。 例如:要进行M=2N(N为自然数)分频,当计数值为0~k-1时,输出高电平,当计数值为k-1~2N-1时输出低电平,同时计数值复位,如此循环可实现任意占空比的偶数分频,其中M和k为预置数,可根据分频倍数和占空比的要求进行置数。如图1所示,当k=N时,即可实现占空比为50%的偶数分频。 【分页导航】 第1页: 偶数分频器 第2页: 奇数分频器 第3页: 半整数分频器 第4页: 数控通用分频器的实现 3.奇数分频器 任意占空比的奇数分频器的实现,其原理与偶数分频器类似。但对于占空比为50%的任意奇数次分频却无法用上述相同的方法实现。 下面介绍一种常用的实现方法。 实现原理:采用两个不同的边沿触发器(一个在上升沿和一个在下降沿)来实现,其细节在于实现1/2个原始时钟周期的时间差。 如图2所示,进行M=2N+1分频时,k1是在clk上升沿且计数周期为M变化的信号。当计数器值为0~N时,k1保持低电平,计数值为N+1~2N时,k1保持高电平。 k2与k1一样,唯一不同的是:k2是在clk的下降沿变化。最后将k2与k1进行或运算即可得到占空比50%的任意奇数分频器。 【分页导航】 第1页: 偶数分频器 第2页: 奇数分频器 第3页: 半整数分频器 第4页: 数控通用分频器的实现 4.半整数分频器 半整数分频器原理如图3所示 .主要包括模M计数器,异或模块和2分频模块三个部分。其设计思想是:通过异或门和2分频模块组成一个改变输入频率的脉冲添加电路,即在M-0.5个输入信号周期内产生M个计数脉冲,并将其中的一个计数脉冲的周期变为含有两个脉冲的周期。而这种改变的具体实现是将原始时钟信号与2分频模块的输出进行异或。 另外,不难发现此原理图还可以实现占空比为50%的2M-1倍的奇数分频。当M=3时,其仿真结果如图4所示。原理图的输出端口q即为占空比为50%的5分频,输出端口C为2.5分频。 【分页导航】 第1页: 偶数分频器 第2页: 奇数分频器 第3页: 半整数分频器 第4页: 数控通用分频器的实现 5.数控通用分频器的实现 综上,利用模N计数器、脉冲添加电路,以及控制模块即可实现占空比可调的通用分频器。在具体设计过程中可采用层次化的设计方法。首先,设计通用分频器中各组成电路元件,然后通过元件例化的方法,调用各元件,实现通用分频器。 其中: 模N计数器的实现可以采用两种方式: 一是调用LPM库中的参数化的计数器模块LPM_COUNTER,根据向导对参数进行设置,QuartusII会生成相应的。vdh计数文本。为了能够调用计数文本,最后还需要利用VHDL语言对该计数文本设计一个例化程序,并将其设置为顶层文件。二是利用VHDL描述语言实现。 二分模块是利用D触发器来实现的,即将D触发器的输出信号Q反馈回来作为输入信号,将模N计数器输出信号的最高位作为D触发器的时钟信号。 其顶层原理图如图5所示。其中a为分频模式选择,当a=00时进行偶数分频;当a=01时进行占空比为非50%奇数分频;当a=10时进行占空比为50%的奇数分屏;当a=11时进行半整数分频 .端口M的作用是控制分频数。端口K的作用是进行偶数(M=2N)和奇数(M=2N+1)分频时,调节占空比,当k=N时,占空比为50%. 6.结论 本设计的最终目的是实现分频器的通用性和实用性,本设计中控制端口M、K、以及计数器N的位宽均采用参数化设计思想,用户根据需要对其稍加修改就可满足不同的分频需求,在一定程度上实现了通用性。 【分页导航】 第1页: 偶数分频器 第2页: 奇数分频器 第3页: 半整数分频器 第4页: 数控通用分频器的实现
  • 热度 18
    2014-3-10 08:44
    5281 次阅读|
    1 个评论
      matlab , simulink 驱动程序篇之分频器设计   以下设计基于博文 http://www.cnblogs.com/tongjirailway/archive/2010/11/18/1880789.html , 并在其基础上进行修改、设计。 1、 以下设计用到最主要的模型是 Subsystem , 分频器顶层设计面板如图1所示:     图1 分频器顶层设计面板 面板设计具体步骤: a) 点击右键     b) 出现以下 Mask Editor 窗口。如表1进行设计。 表1 Mask Editor 窗口设计   图标和端口设计 参数设计     c) 以上设计,得到图2设计面板:   图2 subsystem 设计面板 2、 分频器设计采用自上而下的设计思路。 a) Subsystem 结构:这里用到了 Triggerd Subsystem ,上升沿、下降沿同时触发( either )。   图3 Subsystem 结构 b) Triggered Subsystem 结构:这里用到了 Unit Delay ,用于采集上升沿、下降沿信号,并通过 add 加1。   图4 Triggered Subsystem 结构 c) Triggered Subsystem\Subsystem 结构:   图5 Triggered Subsystem\Subsystem 结构 原理: 1) u1 记录上升沿和下降沿的个数,最大到 N =2* num ; 2) 第 N 个时钟上升沿到来时, u1=N ,输出应翻转为0,并令u1=0; 3) Merge 负责选择、确定最新的 u1 。即依次加1的阶梯波形,如图6:   图6 u1 的波形 4) 采用 Deal Function 模块对 u1 信号进行处理。 Deal Function 结构:   图7 Deal Function 结构   3、 以上设计,如图2输入参数值后得到图8波形:   图8 分频器输出波形
  • 热度 20
    2013-8-27 14:57
    8799 次阅读|
    1 个评论
    (ps 本文代码皆搜集于网络) 第一部分计数器以及实现 第二部分 分频器以及实现 计数器的功能就是对脉冲CP进行计数 常用在分频,定时,产生节拍脉冲和脉冲序列,进行数字运算等 计数器其实在设计中经常遇到的 计数的场合有很多  比如流水线产品数量统计   定时固定长时间比如1s 10ms等 计数器一般有三个功能 1,计数不断加1    2,清零功能  3,进位 当然在mcu内部设计时还会有一些状态标识来供查看     常用的74系列计数芯片有 74LS161 4位十进制同步计数器(异步清除) 74LS190 4位十进制加/减同步计数器 74LS163 4位二进制同步计数器(异步清除)  74LS191 4位二进制加/减同步计数器 74LS160 4位十进制同步计数器(同步清除) 74LS192 4位十进制加/减同步计数器(双时钟)  74LS162 4位二进制同步计数器(同步清除) 74LS193 4位二进制加/减同步计数器(双时钟)    下面用verilog实现一个最基本的4位计数器   verilog语言 : 计数器代码 module count4 ( out , reset , clk ); output out ; input reset , clk ; reg out ; always @( posedge clk ) begin if ( reset )   out = 0 ; else         out = out + 1 ; end endmodule       verilog语言 : 测试代码 `timescale 1 ns / 1 ns `include "count4.v" module coun4_tp ; reg clk , reset ; wire out ; parameter DELY = 100 ; count4 mycount ( out , reset , clk ); always #( DELY / 2 ) clk = ~ clk ; initial begin clk = 0 ; reset = 0 ; # DELY   reset = 1 ; # DELY   reset = 0 ; #( DELY * 20 ) $finish ; end initial $monitor ( $time ,,, "clk=%d reset=%d out=%d" , clk , reset , out ); endmodule   带置数和清零功能的四位计数器 verilog语言 : 高亮代码由发芽网提供 module count ( out , data , load , reset , clk ); output out ; input data ; input load , clk , reset ; reg out ; always @( posedge clk ) begin if ( ! reset )     out = 8'h00 ; else if ( load )   out = data ; else         out = out + 1 ; end endmodule 计数到10 verilog语言 : 高亮代码由发芽网提供 module count10 ( out , cout , en , clr , clk ); output out ; output cout ; input en , clr , clk ; reg out ; always @( posedge clk or posedge clr )   begin     if ( clr )   out = 0 ;     else   if ( en )     begin     if ( out == 9 )   out = 0 ;     else         out = out + 1 ;     end   end assign   cout = (( out == 9 ) en ) ? 1 : 0 ; endmodule   第二部分:分频 器 系统的输入频率只有一个如果我们在应用中需要不同的频率那怎么办呢 一般的mcu内部有锁相环可通过设置倍频和分频 这里我们看看最基本的分频方法 1,偶分频比较简单,假设为N分频,只需计数到N/2-1,然后时钟翻转、计数清零,如此循环就可以得到N(偶)分频。     2 ,奇分频  实现奇数(N)分频,分别用上升沿计数到(N-1)/2,再计数到N-1;用下降沿计数到(N-1)/2,再计数到N-1,得到两个波形,然后把它们相或即可得到N分频。 任意N分频 N为偶数   原文地址 http://www.eefocus.com/alvin1130/blog/12-01/236724_76b10.html   verilog语言 : 偶数分频 N倍 module fp_even ( clk_out , clk_in , rst ); output clk_out ; input clk_in ; input rst ; reg cnt ; reg clk_out ; parameter N = 6 ; always @ ( posedge clk_in or negedge rst ) begin if ( ! rst )       begin               cnt = 0 ;               clk_out = 0 ;       end else begin         if ( cnt == N / 2 - 1 )               begin clk_out = ! clk_out ; cnt = 0 ; end         else               cnt = cnt + 1 ;         end end endmodule   三分频 通过对输入时钟计数 然后适当的时候产生翻转即可 verilog语言 : 3分频 module div_3 ( q , clk , reset );     output q ;     input reset ;     input clk ;     reg q ;     reg count ;   // 设了一个2位的计数器可以从00计数到11;     always @ ( posedge clk or posedge reset )   // 同步复位,上升沿有效     if ( reset )                           // 复位     begin       q = 1'b0 ;       count = 2'b00 ; end       else if ( count == 0 )                 // 第一个CLK上升沿来的时候q翻转一次计数器加一;         begin         q =~ q ;         count = count + 1'b1 ;         end         else if ( count == 2 )               //第3个CLK上升沿来的时候输出q翻转一次计数器归零;         begin             q =~ q ;             count = 2'b00 ;         end         else                                 //   第二个CLK上升沿来的时候q不动作,计数器加一。           begin         count = count + 1'b1 ;         end       endmodule 其他分频实例和方法可参考 可实现任意倍分频 http://www.cnblogs.com/FPGA_DSP/archive/2010/07/16/1778835.html http://www.eefocus.com/alvin1130/blog/12-01/236724_76b10.html http://blog.163.com/cl2006ky@126/blog/static/87195173200947115921562/  
  • 热度 23
    2012-3-19 19:44
    1627 次阅读|
    0 个评论
           彩灯循环可通过计数器来实现:如当计数值为1时,out(out为8位寄存器)为00000001,为计数值为2时,out为00000010,……等等,通过对out的控制可实现多种彩灯循环方案的设计。 module div12(clk_in,reset,clk_out); input clk_in,reset; output clk_out; reg clk_temp; assign clk_out = (clk_temp=11)?1:0; always@(posedge clk_in) if(~reset) begin clk_temp=0;end else if(clk_temp=11) clk_temp=0; else begin   clk_temp = clk_temp + 1; end endmodule   二分频 module div_fre(clk_in,clk_out); input clk_in; output clk_out; reg clk_out; always @(posedge clk_in) begin clk_out = ~clk_out; end endmodule   module div2(clk_in,clk_out); input clk_in; output clk_out; reg clk_temp; assign clk_out = clk_temp; always@(posedge clk_in) begin   clk_temp = clk_temp + 1; end endmodule
相关资源