首页 > 其他分享 >使用Verilog设计分频模块(2Hz)

使用Verilog设计分频模块(2Hz)

时间:2024-10-21 21:21:34浏览次数:3  
标签:分频 2Hz clk Verilog 信号 rst 时钟

       在数字电路设计中,分频器是一种常见的电路,用于将一个高频的时钟信号分频到一个较低频率的时钟信号。本次将通过一个实际的例子,讲解如何使用Verilog语言设计一个分频器,将系统时钟信号分频到2Hz。

        在数字电路系统的设计中, 分频器是一种应用十分广泛的电路, 其功能就是对高频率的信号进行分频。本质上, 分频电路是加法计数器的变种, 其计数值由分频系数N=Fin/Fout决定,其输出不是一般计数器的计数结果, 而是根据分频常数对输出信号的高、低电平进行控制。通常来说, 分频器常用于对数字电路中的时钟信号进行分频, 从而得到较低频率的时钟信号、选通信号、中断信号等。

一、电路符号
二、代码设计
module div_clk( sclk, s_rst_n, clk_2Hz );
    // 输入信号
    input wire sclk,          // 系统时钟信号
            s_rst_n;          // 复位信号,低电平有效

    // 输出信号
    output reg clk_2Hz;       // 输出的2Hz时钟信号

    // 参数定义
    parameter CNT_END = 50000000; // 分频计数器的结束值,用于生成2Hz时钟

    // 内部信号定义
    reg [25:0] div_cnt;       // 分频计数器,26位宽,足以容纳CNT_END值

    // 分频计数器的时钟上升沿或复位信号下降沿触发
    always @(posedge sclk or negedge s_rst_n) begin
        if (s_rst_n == 1'b0) begin
            div_cnt <= 25'd0;  // 如果复位信号为低,则计数器清零
        end else if (div_cnt == CNT_END - 1'b1) begin
            div_cnt <= 25'd0;  // 如果计数器达到CNT_END,则计数器清零
        end else begin
            div_cnt <= div_cnt + 1'b1;  // 否则,计数器加一
        end
    end

    // 输出时钟信号的生成
    always @(posedge sclk or negedge s_rst_n) begin
        if (s_rst_n == 1'b0) begin
            clk_2Hz <= 1'b0;  // 如果复位信号为低,则输出时钟信号清零
        end else if (div_cnt == (CNT_END >> 1'b1) - 1'b1) begin
            clk_2Hz <= 1'b0;  // 当计数器达到CNT_END的一半时,输出时钟信号为低
        end else if (div_cnt == CNT_END - 1'b1) begin
            clk_2Hz <= 1'b1;  // 当计数器达到CNT_END时,输出时钟信号为高
        end
    end
endmodule

代码分析

  • 模块定义div_clk模块有三个端口:sclk(系统时钟),s_rst_n(复位信号),和clk_2Hz(输出的2Hz时钟信号)。

  • 参数定义CNT_END定义了分频计数器的结束值,这个值决定了输出时钟的频率。

  • 内部信号div_cnt是一个26位的计数器,用于计数输入时钟周期。

  • 计数器逻辑:第一个always块定义了计数器的行为。当复位信号为低时,计数器清零。否则,如果计数器达到CNT_END,则清零;否则,计数器加一。

  • 输出时钟信号生成:第二个always块定义了输出时钟信号的行为。当计数器达到CNT_END的一半时,输出时钟信号为低;当计数器达到CNT_END时,输出时钟信号为高。

 

三、仿真结果

(1)仿真代码

`timescale 1ns/1ns

module div_clk_tb;

    // 输入信号
    reg sclk;          // 系统时钟信号
    reg s_rst_n;       // 复位信号,低电平有效

    // 输出信号
    wire clk_2Hz;      // 输出的2Hz时钟信号

    // 实例化被测模块
    div_clk uut (
        .sclk(sclk),
        .s_rst_n(s_rst_n),
        .clk_2Hz(clk_2Hz)
    );
 initial begin
        sclk = 0;
        forever #10 sclk = ~sclk; 
  end

    // 测试序列
    initial begin
        // 初始化
        s_rst_n=1;
	    #100
	    s_rst_n = 0; // 复位
        #100;        // 保持复位100ns
        s_rst_n = 1; // 释放复位
        #50000000;   // 等待一段时间,观察输出
        $finish;
    end

    // 观察输出波形
    initial begin
       $monitor("Time = %t,s_rst_n = %b, clk_2Hz = %b", 
                  $time,  s_rst_n, clk_2Hz);
    end

endmodule 

(2)仿真结果

标签:分频,2Hz,clk,Verilog,信号,rst,时钟
From: https://blog.csdn.net/2201_75415349/article/details/143130371

相关文章

  • Verilog——控制信号的书写规范
    目录前言控制信号的书写规范前言这个专栏会专门讲一些Verilog的知识,后续会慢慢更新,欢迎关注Verilog专栏控制信号的书写规范//不推荐//Example1:if(A&&(B|C))//推荐//Example2:assignD=A&&(B|C);if(D)......
  • Verilog代码规范
    历史修改信息版本更改描述更改人批准人修订日期/生效日期A01发布首版ldy一、目的作为我司verilog开发过程中的输入文件,用于统一FPGA开发人员的代码风格。从而在满足功能和性能目标的前提下,能够规范代码和优化电路,增强代码的整洁度、可读性、......
  • 理解 Verilog HDL 的抽象层次
    VerilogHDL组合逻辑的编码可以从三个不同抽象层实现,这些抽象层是描述同一种硬件的不同方式。从具体到抽象的程度,可以分为gate、dataflow、behavior三种,其中gate级描述了硬件实际搭建的过程,dataflow级描述实际的逻辑门控数据的流动方式,behavior描述的是电路实际行为方式。可......
  • FPGA Verilog HDL代码如何debug?
    Q:Verilog代码如何debug?最近学习fpga,写了不少verilog,开始思考如何debug的问题!c语言是顺序执行,而verilog是并行执行,想请教如何debug自己的verilog代码,我以前一直都是对照着modelsim上的方针波形来看看哪里有逻辑错误!A:以下是一些常见的Verilog代码调试方法:1.仿真工具:正如......
  • 怎么样提高verilog代码编写水平?
    Q:怎么样提高verilog代码编写水平?Cpu从事DFT工作。目前仅限于写一些简单模块。自学的话如何提高verilog编写水平?A:以下是一些提高Verilog代码编写水平的自学方法:1.深入学习基础知识:重新巩固数字电路的基本概念,如逻辑门、组合逻辑、时序逻辑、状态机等,这是编写高质量Veri......
  • 写 Verilog HDL 如何做到心中有电路?
    Q:写Verilog如何做到心中有电路?老师说没电路就不要写代码,但我写个乘法器在综合前都想不出它电路啥样,全加器还行。A:要在写Verilog代码时做到心中有电路,可以尝试以下方法:1.深入学习数字电路基础知识:包括各种逻辑门、组合逻辑电路、时序逻辑电路的原理和结构,理解它们的工......
  • verilog文件到tb的简单python脚本
    使用python3verilog_to_tb.pytest.v需要注意的是,例化时并没有去掉最后的逗号,手动去除下。verilog_to_tb.pyimportsysimportredefread_file(file):withopen(file,'r')asf:lines=f.readlines()returnlinesdefmain():lines=read_file('......
  • 关于QEI(增量编码器)的verilog程序
    关于QEI的Verilog程序其实比较简单的,但是opencores上没有现成的程序,FPGA4FUN上有一个4倍频计数程序[1],但是没有一个详细原理分析过程,[2]描述了一个编码器的VHDL代码,但是觉得很复杂,为此我分析了一下增量编码器的旋转过程和AB相的电平变化规律,在这个基础上开发了QEI的Verilog程序,首......
  • Bluespec SystemVerilog(BSV) 及 MIT 体系结构公开课 笔记
    前言早年MIT有三门用bsv作为硬件描述语言的体系结构课程,代号分别为6.004,6.175和6.375.根据MITCScourselist,现在这三门课分别改名为了6.1910、6.1920和6.5900.本文是自学这三门课所需的bsv时记录的笔记,内容主要来源于这三门课目前公开的资料(6.17516fall,6.375......
  • systemverilog笔记
    变量类型变量名状态数是否带符号比特数logic4无1bit2无1byte2有8shortint2有16int2有32longint2有64integer4有32time4无64$isunknown(表达式):在表达式任意位出现X或者Z时返回1。数组数组初始化使用单引号加大括......