首页 > 其他分享 >12-分频器 -偶分频

12-分频器 -偶分频

时间:2023-05-25 22:24:08浏览次数:44  
标签:分频 分频器 12 clk sys 信号 rst 时钟

1.分频器

计数器是对于时钟信号进行计数,板载晶振的时钟频率是固定的,有时候需要进行分频和倍频才能满足需要
开发板上只有一种晶振,只有一种频率的时钟,想要通过对与固定时钟进行分频或者是倍频的方式得到各个模块所需的时钟频率,得到比固定时钟快的时钟通过倍频,得到比固定时钟慢的时钟通过分频

  • 分频和倍频都有两种方式:第一种是通过锁相环(PLL),另外一种是编写verilog代码
  • 分频器是数字系统设计中最常见的基本电路之一,所谓分频就是把输入信号的频率变成成倍数地低于输入频率的输出信号
  • 分频器原理是将输入的信号做为计数脉冲,计数器的输出端口的脉冲是按一定频率输出的,就可以看作是输出端口的分频
  • 分频器分为偶数分频器和奇数分频器,分频器和计数器非常类似,有时可以认为是同一种东西

2.FPGA实现

  • 实现对于固定时钟6分频的电路

2.1 模块框图和波形图


2.2 RTL

module divider_six(
  input wire sys_clk,
  input wire sys_rst_n,
  
  output reg clk_out
);


  reg [1:0] cnt;
  
  // cnt变量
  always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
      cnt <= 2'd0;
    else if(cnt == 2'd2)
      cnt <= 2'd0;
    else
      cnt <= cnt + 2'd1;


  always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
      clk_out <= 1'b0;
    else if(cnt == 2'd2)
      clk_out <= ~clk_out;
    else 
      clk_out <= clk_out;

endmodule
  • 创建项目,编译代码

2.3 Testbench

`timescale 1ns/1ns
module tb_divider_six();
  reg sys_clk;
  reg sys_rst_n;  

  wire [1:0] clk_out;

  // 初始化时钟和复位信号
  initial begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    #20;
    sys_rst_n = 1'b1;
  end
    
  // 模拟时钟信号
  always #10 sys_clk = ~sys_clk;
  
  // 模块的实例化
  divider_six divider_six_inst(
    .sys_clk (sys_clk),
    .sys_rst_n (sys_rst_n),
    .clk_out (clk_out)
  );
endmodule
  • 加载仿真代码,进行仿真设置之后进行仿真

2.4 上板验证

  • 将信号输出到扩展IO口,通过示波器进行观察波形
  • 重新进行编译,连接板卡(下载器和电源)
  • 添加sof文件,进行程序下载
  • 连接示波器

2.5 优化

  • 这种做法是不严谨的,在低速系统中不易察觉,在高速系统中就容易出现问题,通过这种分频的方式表面上是对系统时钟进行了分频产生了新的低频时钟,上述得到的分频时钟,实际上与真正的分频时钟是有不同的;
  • 在FPGA当中凡是时钟信号都要连接到全局时钟网络,全局时钟网络也叫做全局时钟树,是FPGA厂商专门针对时钟路径进行设计的,能够使时钟信号到达各个寄存器的时间尽可能相同,减少时序问题的产生,上面产生的分频信号没有连接到全局时钟网络上,但是外部晶振产生的时钟信号,通过管脚连接到了专用时钟引脚上,自然连接到了FPGA全局时钟网络中
  • 在系统时钟工作下的信号比在上述分频信号工作下的信号更能在高速工作下保持稳定,如何对上述代码进行改进?使用时钟标志信号cnt_flag
module divider_six(
  input wire sys_clk,
  input wire sys_rst_n,
  
  // output reg clk_out
  output reg clk_flag;
);


  reg [2:0] cnt;
  
  // cnt变量
  always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
      cnt <= 2'd0;
    else if(cnt == 3'd5)
      cnt <= 3'd0;
    else
      cnt <= cnt + 3'd1;


  always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
      clk_flag <= 1'b0;
    else if(cnt == 3'd4)    // flag信号是在计数最大值减一的时候产生一个周期脉冲
      clk_flag <= 1'b1;
    else 
      clk_flag <= 1'b0;

  // 按照之前产生的分频时钟给变量a赋值
   reg a ;
  always @(posedge clk_out or negedge sys_rst_n) // 使用产生的分频时钟clk_out
    if(sys_rst_n == 1'b0)
      a <= 1'b0;  
    else 
      a <= a + 1'b1;

  // 时钟标志位产生的分频时钟对于变量进行赋值
  always@(posedge sys_clk or sys_rst_n)     // 仍然使用系统时钟,更加稳定
    if(sys_rst_n == 1'b0) 
      a <= 1'b0;
    else if(cnt_flag == 1'b1)
      a <= 1'b1;
  

endmodule

`timescale 1ns/1ns
module tb_divider_six();
  reg sys_clk;
  reg sys_rst_n;  

  wire [2:0] clk_flag;

  // 初始化时钟和复位信号
  initial begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    #20;
    sys_rst_n = 1'b1;
  end
    
  // 模拟时钟信号
  always #10 sys_clk = ~sys_clk;
  
  // 模块的实例化
  divider_six divider_six_inst(
    .sys_clk (sys_clk),
    .sys_rst_n (sys_rst_n),
    .clk_flag (clk_flag)
  );
endmodule

产生一个用于标记 6 分频的 clk_flag 标志信号,这样每两 clk_flag 脉
冲之间的频率就是对 sys_clk 时钟信号的 6 分频,但是计数器计数的个数我们需增加一些,
如图 18-4 所示需要从 0~5 共 6 个数,否则不能实现 6 分频的功能。和方法 1 对比可以发
现,相当于把 clk_out 的上升沿信号变成了 clk_flag 的脉冲电平信号cnt_flag 是一样的道理),为后级模块实现相同的降频效果。**虽然这样会多使用一些寄存器资源,不过不用担心我们的系统是完全可以承担的起的,而得到的好处却远远大于这点资源的使用,能让系统更加稳定。
在后级模块中需要使用低频时钟的情况,我们就可以不用 clk_out 这种信号作为时
钟了,而是继续使用 sys_clk 系统时钟来作为时钟,但让其执行语句的条件以 clk_flag 信号
为高电平的时候有效。


标签:分频,分频器,12,clk,sys,信号,rst,时钟
From: https://www.cnblogs.com/Icer-newer/p/17432862.html

相关文章

  • P8081 [COCI2011-2012#4] ZIMA 题解
    题意给定一个长度为\(n\)的序列。当连续\(T\)天温度都小于\(0\)时,则称这\(T\)天为一个冰期,冰期来临之前的\(2T\)天都被标记为警示状态.特殊地,如果一个冰期最长,那么它的前\(3T\)天会被标记为警示状态。如果有多个冰期最长,选一个。思路模拟预处理出每个冰期的长......
  • 20201226马瑞婕Exp-8 Web综合
    目录一、基础问题回答1.1.什么是表单1.2浏览器可以解析运行什么语言1.3WebServer支持哪些动态语言二、Web前端HTML2.1启动apache服务2.2新建html文件2.2.1编写一个简单的含有表单的HTML2.2.2测试三、Web前端javascipt3.1注册登录3.1.1登陆界面3.1.2登录成功界面3.2尝试......
  • 60.Oracle 12c RAC DBCA无法识别ASM磁盘组故障处理
    安装oracle12crac时,在做dbca安装实例的时候,asm存储位置选项为空,但是命令集群中的磁盘组已经被mount了,asm实例也被起来了,经过排查,发现是grid用户下,su-grid cd$GRID_HOME/bin 这个目录下的oracle的权限不对,不是6751,因此,遂改,然后重启集群,再dbca创建实例,发现上面的存储位置......
  • [NOIP2012]Vigenère 密码
    题目链接https://ac.nowcoder.com/acm/contest/19306/1052题目分析根据题目给的图发现,密文的会因为密钥的起始位置去偏移,形成了一个环。所以只要我们知道密钥的起始位置,密钥与密钥的距离(密文-密钥),就可以求出明文的位置。AC代码#include<iostream>usingnamespacestd;......
  • Delphi 12 最新消息
    1.新版本将集成Skia4Delphi。这绝对是有史以来最重要的更新,官方通过深度集成Skia4Delphi,将实现更高质量的界面,更有效率的界面,从此,毛刺现象将成为历史!2.C++将集成Visual Assist。这结于C++用户来说,绝对的福音!3.RTL,IDE,Compiler,Platform等质量优化与改进新版将在这几个方面,继续......
  • MT8395处理器性能参数_Genio 1200芯片规格介绍资料
    联发科技(MediaTek)推出了他们的最新通用型AIoT芯片,MT8395(Genio1200)这款芯片专为高性能物联网应用和人工智能应用而设计,是一款集成了8核CPU和集成了五核图形处理器的高性能芯片。它是使用6纳米工艺制造而成的,内置了独立的双核AI处理器单元(APU),适用于用于智能家电、中控设备......
  • 3192. 出现次数最多的数 13年12月CSP
    3192.出现次数最多的数-AcWing题库13年12月CCF计算机软件能力认证,第1题 第一次提交,数据范围写错了,wa,日常迷糊,太久不写题了。第二次提交,试图在一次循环内解决,但忘了判断答案是否为最小的数,wa。 真没必要在螺蛳壳里做道场。在简单题里降低时间复杂度,没有什么实际意义,反而......
  • 中美在AI领域差距12个月
    看到一个新闻:《马斯克再谈AI:中美差距12个月》   其实想想这个评价也还中肯,尽管这些年国内AI大有弯道超车之势,但是不可否认的是由于欧美的历史领先优势和强大的科研及商业上的独立创新能力,导致在新的突破点上依旧是欧美领先,而我国更擅长的是在欧美科研基础上进一步的延展和......
  • GE控制器WES5123-1200,WES5123-2600
    W;① ⑧ 0  ③  0 ①  7  ⑦ 7 5 ⑨  GE控制器WES5123-1200,WES5123-2600,WES5162-9101,IC695CPU320-HS,DS200DCFBG1BLC,IS420ESWBH3A,IC695CRU320-EJ,IS420ESWBH2A,DS200TCPDG2BECIC695CPU315-CD,fdevelopmentinthesensorindustry.当电力系统中的电力......
  • mysql is neither service nor target!?(suse12 sp5)
    今天想在自己的Suse虚拟机上安装mysql,安装好了并且初始化之后,一直无法启动mysql.cp/data/mysql/support-files/mysql.server/etc/init.d/mysqldchmod+x/etc/init.d/mysqldchkconfig--level35mysqldonchkconfig--addmysqldchkconfig--list1.servicemysqlstart;......