FPGA学习日记——verilog实现分频器

这篇具有很好参考价值的文章主要介绍了FPGA学习日记——verilog实现分频器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主要思想是利用计数器实现分频器功能,其中按原理不同可分为分频和降频

一、先说分频。

1、第一种实现方式

verilog时钟分频代码,FPGA学习日记,fpga开发,学习

输入信号为系统时钟50MHz,本例子先以偶数倍六分频为例实现分频的第一种方式:计数器对系统时钟的上升沿进行计数,最大计数M=5,即count取值范围为0~5,当计数器值在0~2时,clk_out输出为0;当计数器值在3~5时,clk_out输出为1。这样即可完成对于sys-clk的六分频,且占空比为50%。

以下为模块实现代码:

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

reg     [2:0]   count;

always@(posedge sys_clk or negedge  sys_rst_n)
    if(sys_rst_n == 1'b0)
        count <= 3'd0;
    else    if(count == 3'd5)
        count <= 3'd0;
    else    
        count <= count + 3'd1;
        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        clk_out <= 1'b0;
    else    if(count == 3'd2)
        clk_out <= 1'b1;
    else    if(count == 3'd5)
        clk_out <= 1'b0;
    else
        clk_out <= clk_out;

endmodule

以下为测试代码:

`timescale  1ns/1ns

module  tb_divider_six();
reg     sys_clk;
reg     sys_rst_n;

wire    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

以下为仿真波形:

verilog时钟分频代码,FPGA学习日记,fpga开发,学习

从下方频率显示为8.333MHZ能看出,已完成六分频的功能。

2、第一种实现方式的改进(适用于偶数倍分频)

在计数器的计数过程中,可以发现,不必将计数器最大值设为6-1=5,将计数器的计数值设为6/2 -1 = 2,即计数范围为0~2,每次达到计数值之后,可将clk_out信号取反,这样做的目的是节省计数器表示位数,只需要两位即可表示范围为0~2的计数器,节约了系统资源。

verilog时钟分频代码,FPGA学习日记,fpga开发,学习

以下为模块实现代码:

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

reg     [1:0]   count;

always@(posedge sys_clk or negedge  sys_rst_n)
    if(sys_rst_n == 1'b0)
        count <= 2'd0;
    else    if(count == 2'd2)
        count <= 2'd0;
    else    
        count <= count + 3'd1;
        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        clk_out <= 1'b0;
    else    if(count == 2'd2)
        clk_out <= ~clk_out;
    else
        clk_out <= clk_out;

endmodule

以下为测试代码:

`timescale  1ns/1ns

module  tb_divider_six2();
reg     sys_clk;
reg     sys_rst_n;

wire    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_six2    divider_six2_inst
(
    .sys_clk    (sys_clk),
    .sys_rst_n  (sys_rst_n),
                
    .clk_out    (clk_out)
);


endmodule

以下为仿真波形:

verilog时钟分频代码,FPGA学习日记,fpga开发,学习

3、奇数倍分频

对于奇数倍分频,实现起来要稍微麻烦一些,需要两个中间变量clk1和clk2

        其中clk1是计数器对系统时钟的上升沿进行计数,在计数器值为0~2时clk1为0;在计数器值为3~4时clk1为1。其本质为一个占空比为40%的五分频输出。

        其中clk2是计数器对系统时钟的下降沿进行计数,在计数器值为0~2时clk2为0;在计数器值为3~4时clk1为1。

verilog时钟分频代码,FPGA学习日记,fpga开发,学习

最终的clk_out只需要对clk1和clk2取或运算,即可完成占空比为50%的五分频输出。

以下为模块实现代码:

module divider_five
(
    input   wire    sys_clk,
    input   wire    sys_rst_n,
    
    output  wire     clk_out
);

reg     [2:0]   count;
reg             clk1;
reg             clk2;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        count <= 3'd0;
    else    if(count == 3'd4)
        count <= 3'd0;
    else
        count <= count + 3'd1;
    
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        clk1 <= 1'b0;
    else    if(count == 3'd2)
        clk1 <= 1'b1;
    else    if(count == 3'd4)
        clk1 <= 1'b0;
    else
        clk1 <= clk1;
        
always@(negedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        clk2 <= 1'b0;
    else    if(count == 3'd2)
        clk2 <= 1'b1;
    else    if(count == 3'd4)
        clk2 <= 1'b0;
    else
        clk2 <= clk2;

assign  clk_out = (clk1 | clk2);

endmodule

以下为测试代码:

`timescale  1ns/1ns

module  tb_divider_five();

reg     sys_clk;
reg     sys_rst_n;

wire     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_five    tb_divider_five_inst
(
    .sys_clk    (sys_clk),
    .sys_rst_n  (sys_rst_n),

    .clk_out    (clk_out)
);

endmodule

以下为仿真波形:

verilog时钟分频代码,FPGA学习日记,fpga开发,学习

二、降频器

        见下一篇文章。

参考资料:野火Verilog实战开发指南文章来源地址https://www.toymoban.com/news/detail-760009.html

到了这里,关于FPGA学习日记——verilog实现分频器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用

    2024年02月02日
    浏览(58)
  • 时钟分频器

    8倍时钟分频器是一种电路或设备,用于将输入时钟信号的频率分成原来的1/8。它可以在数字电子系统中用于将高频时钟信号降低到较低的频率,以满足特定的系统需求。 在这个电路中,CLK是输入的时钟信号,CLK_OUT是输出的时钟信号。通过适当的电路设计,8倍时钟分频器将输

    2024年02月16日
    浏览(42)
  • verilog---分频器设计

    //设计分频器 将50MHZ信号分频产生1HZ的秒脉冲,输出信号占空比为50%。 //设计思路:用计数器设计,N分频:当计数到(N/2)-1个数时,输出时钟翻转一次 //50*10^6次分频:计数到24 999 999(需要25bit)时,输出信号翻转。 //无法用vmf仿真,因为endtime最大为10us,实际最少需要1000000u

    2024年02月04日
    浏览(34)
  • Verilog手撕代码(6)分频器

    分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。 再简单来说,让你手撕一个四分频电路,就是写代码生成一个周期是原来四倍的时钟,如果手撕一个三分频电路,就是写代码生成一个周期是原来三倍的时钟。 如图为

    2024年02月08日
    浏览(38)
  • 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    数字IC经典电路设计 经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字I

    2024年02月08日
    浏览(43)
  • 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    目录 一、前言 二、偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三、奇数分频 3.1 占空比非50%奇数分频 3.2 占空比50%奇数分频 3.3 Verilog代码 3.4 Testbench 3.5 仿真结果 四、小数分频 4.1 双模前置分频法 4.2 Verilog代码 4.3 Testbench 4.4 仿真结果 五、半整

    2024年02月04日
    浏览(45)
  • FPGA——分频器

    野火学习备忘录——FPAG分频 时钟对于 FPGA 是非常重要的,但板载晶振提供的时钟信号频率是固定的,不一定满 足工程需求,所以分频和倍频还是很有必要的。这里通过计数的方式来实现分频。 1.通过计数器来实现6分频。两种方式。第一种直接通过计数方式直接获取获取。输

    2024年02月10日
    浏览(41)
  • FPGA 多路分频器实验

    1 概述         在 FPGA 中,时钟分频是经常用到的。本节课讲解 2 分频、3 分频、4 分频和 8 分频的 Verilog 实现并且学习 generate 语法功能的应。 2 程序设计思路         1)整数倍分频,为 2、4、8,这种 2^n 次方倍数倍数关系的分频最容易实现,所以我们可以把这 3 种分

    2024年01月19日
    浏览(37)
  • FPGA设计开发(基础课题):分频器设计

    一、设计目的 1、掌握分频器的设计原理; 2、用HDL语言设计分频器。 二、设计原理 分频器与计数器类似,也是要对时钟脉冲进行计数,但其输出的不是对时钟脉冲个数的计数值,而是其频率与时钟的频率成固定比例关系的脉冲信号。整数分频是所有分频器中最简单,最容易

    2024年02月13日
    浏览(51)
  • FPGA基础设计(二):任意分频器(奇数,偶数,小数)

    FPGA开发板上一般只有一个晶振,即一种时钟频率。数字系统设计中,时间的计算都要以时钟作为基本单元,对基准时钟进行不同倍数的分频而得到各模块所需时钟频率,可通过Verilog代码实现;倍频可通过锁相环【PLL】实现。 把输入信号的频率变成成倍的低于输入频率的输出

    2024年02月01日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包