0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA的分频器设计

CHANBAEK 来源:小小研究生 作者:xxyjs2020 2023-06-23 16:52 次阅读

数电基础

板载晶振提供的时钟信号频率是固定的,不一定满足需求,因此需要对基准时钟进行分频。要得到更慢的时钟频率可以 分频 ,要得到更快的时钟频率可以 倍频 。我们有两种方式可以改变频率,一种是 锁相环 (PLL,后面章节会讲解),另一种是用 Verilog代码描述。

用Verilog代码描述的往往是分频电路,即 分频器 。分频就是输出信号的频率是输入信号的1/n。原理是,输入信号为计数脉冲,每n个脉冲输出就翻转一次。就可以看作是对输入信号的“分频”。十进制的计数器对应十分频,如果是二进制的计数器那就是二分频,还有四进制、八进制、十六进制等等以此类推。

设计规划

实现6分频,第一种方法是仅实现分频,第二种方法是降频:

图片

图片

时钟信号周期为1格,输出信号周期为6格,因此频率为原来的1/6,也就是6分频。

方法一:只需要让计数器从0计数到2,就让clk_out输出信号取反。

方法二:方法一得到的新时钟信号和真正的时钟信号有区别,在高速系统中 不稳定 。因为在FPGA中凡是时钟信号都要连接到全局时钟网络上,它能够使时钟信号到达每个寄存器的时间都尽可能相同,以保证更低的时钟偏斜(Skew)和抖动(Jitter)。用分频的方式产生的clk_out信号并没有连接到全局时钟网络上,但sys_clk则是由外部晶振直接通过管脚连接到了FPGA的专用时钟管脚上,自然就会连接到全局时钟网络上。因此我们可以产生一个clk_flag标志信号,从0计数到5,就变高电平,下一个时钟电平变为低电平并维持5个时钟间隔。和方法1对比,相当于把clk_out的上升沿信号变成了clk_flag的脉冲电平信号。虽然需要多使用一些寄存器资源但是能使系统更加稳定。

编写代码

module divider_six
(
input wire sys_clk , //系统时钟50MHz
input wire sys_rst_n , 
output reg clk_out 
)
;


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


 //clk_out:6分频50%占空比输出
 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;


 endmodule

我们观察cnt和clk_out的变化条件:计数器发生改变的条件有两个,一个是时钟上升沿,一个是复位有效(复位下降沿)。计数器发生的改变有两个,要么+1要么清零。清零条件有两个:复位和溢出。因此第一个always块中有三个判断条件:复位和溢出时清零,其他的时候+1。

clk_out的变化条件:时钟上升沿和复位有效(复位下降沿)。复位时clk_out为低电平,溢出时取反。

图片

module divider_six
(
input wire sys_clk , //系统时钟50MHz
input wire sys_rst_n , 
output reg clk_flag
);


 reg [2:0] cnt; 
 //cnt:计数器从0到5循环计数
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt <= 3'b0;
 else if(cnt == 3'd5)
 cnt <= 3'b0;
 else
 cnt <= cnt + 1'b1;


 //clk_flag:脉冲信号指示6分频
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 clk_flag <= 1'b0;
 else if(cnt == 3'd4)
 clk_flag <= 1'b1;
 else
 clk_flag <= 1'b0;


 endmodule

和方法1相似,区别在于输出的变化不同,从0计数到4输出变为1,否则为0。cnt溢出的条件是计数到5,输出的变化是计数到4。

图片

编写testbench

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


//初始化系统时钟、全局复位
 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end


 //sys_clk:模拟系统时钟,每10ns电平翻转一次,周期为20ns,频率为50MHz
 always #10 sys_clk = ~sys_clk;
 //--------------------divider_sixht_inst--------------------
 divider_six divider_six_inst
 (
 .sys_clk (sys_clk ), //input sys_clk
 .sys_rst_n (sys_rst_n ), //input sys_rst_n
 .clk_out (clk_out ) //output clk_out
 );
 endmodule

两种方法的testbench代码一样,除了输出是clk_out还是clk_flag。

对比波形

如果波形没有出来,可以在modelsim通过view的transcript查看错误。

方法1得到的波形

图片

方法2得到的波形

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21331

    浏览量

    593303
  • 晶振
    +关注

    关注

    32

    文章

    2483

    浏览量

    66861
  • 分频器
    +关注

    关注

    43

    文章

    433

    浏览量

    49321
  • Verilog
    +关注

    关注

    28

    文章

    1327

    浏览量

    109313
  • 时钟信号
    +关注

    关注

    4

    文章

    375

    浏览量

    28087
收藏 人收藏

    评论

    相关推荐

    基于FPGA的通用数控分频器设计方案

    本文首先介绍了各种分频器的实现原理,并在FPGA开发平台上通过VHDL文本输入和原理图输入相结合的方式,编程给出了仿真结果。最后通过对各种分频的分析,利用层次化设计思想,综合设计出了一种基于F
    发表于 05-07 09:43 4709次阅读
    基于<b class='flag-5'>FPGA</b>的通用数控<b class='flag-5'>分频器</b>设计方案

    基于FPGA的任意数值分频器的设计

    【摘要】:介绍了基于FPGA的任意分频系数的分频器的设计,该分频器能实现分频系数和占空比均可以调节的3类
    发表于 04-26 16:09

    红色飓风E9开发板实验资料(pdf实验说明+源码)

    VGA输出乒乓球实验11、实验十一 Ps2输入LCD显示实验 12、实验十二 ps2键盘控制串口13、实验十三 ps2鼠标控制LED灯 14、实验十四 FPGA分频器实验15、实验十五 正弦函数
    发表于 12-03 16:47

    FPGA分频器设计

    谁帮忙设计一下模数转换芯片ADC0809以及串行通信部分均需要有相应的时钟驱动。而此次选择的Altera CycloneⅡ系列FPGA中的EP2C5T144C8的系统时钟为20MHz,因此根据需要
    发表于 05-09 11:53

    基于FPGA的任意分频器设计

    本帖最后由 weihu_lu 于 2014-6-19 16:25 编辑 作者:卢威虎1、前言 分频器FPGA设计中使用频率非常高的基本单元之一。尽管目前在大部分设计中还广泛使用集成锁相环(如
    发表于 06-19 16:15

    ISE serdes Aurora,init_clk频率是多少?

    ; reference_clk_1_p_r,GTXQ0_N => reference_clk_1_n_r, 我应该使用哪种方式,根据参考设计将其连接到250 Mhz,或者使用低至50 Mhz的fpga分频器
    发表于 07-27 12:10

    基于FPGA 的等占空比任意整数分频器的设计

    基于FPGA 的等占空比任意整数分频器的设计 给出了一种基于FPGA 的等占空比任意整数分频电路的设计方法。首先简要介绍了FPGA 器件的
    发表于 02-22 14:22 39次下载

    基于CPLD/FPGA的多功能分频器的设计与实现

    基于CPLD/FPGA的多功能分频器的设计与实现 引言   分频器在CPLD/FPGA设计中使用频率比较高,尽管目前大部分设计中采用芯片厂家集成的锁相环资源 ,但是对于要求
    发表于 11-23 10:39 1177次阅读
    基于CPLD/<b class='flag-5'>FPGA</b>的多功能<b class='flag-5'>分频器</b>的设计与实现

    应用于倍频电路的预置可逆分频器设计

    分析了应用于倍频电路的预置可逆分频器的工作原理,推导了触发器的驱动函数。并建立了基于simulink 和FPGA分频器模型,实验结果表明分频器可以实现预置模和可逆
    发表于 08-17 16:50 1913次阅读
    应用于倍频电路的预置可逆<b class='flag-5'>分频器</b>设计

    FPGA实现小数分频器

    介绍了一种基于FPGA的双模前置小数分频器分频原理及电路设计,并用VHDL编程实现分频器的仿真.
    发表于 11-29 16:43 48次下载
    <b class='flag-5'>FPGA</b>实现小数<b class='flag-5'>分频器</b>

    fpga分频器程序参考程序

    发表于 09-09 14:14 11次下载

    用Verilog实现基于FPGA的通用分频器的设计

    用 Verilog实现基于FPGA 的通用分频器的设计时钟分频包括奇数和偶数分频
    发表于 07-14 11:32 45次下载

    一种基于FPGA分频器的实现

    一种基于FPGA分频器的实现说明。
    发表于 05-25 16:57 16次下载

    FPGA分频器的设计方法

    FPGA分频器是一种常用于数字信号处理、通信系统、雷达系统等领域的电路,其作用是将信号分成多个频段。
    发表于 05-22 14:29 1212次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>分频器</b>的设计方法

    FPGA学习-分频器设计

    分频器设计 一:分频器概念 板载时钟往往 是 有限个( 50MHZ/100MHZ/24MHZ/60MHZ… ),如果在设计中需要其他时钟时,板载时钟不满足时,需要对板载时钟进行分频 / 倍频,目的
    的头像 发表于 11-03 15:55 581次阅读
    <b class='flag-5'>FPGA</b>学习-<b class='flag-5'>分频器</b>设计