Lesson02:分频计数器设计(含特权同学课后题答案)

特权同学《Verilog边码边学》,B站教学视频链接:101 组合逻辑与时序逻辑_哔哩哔哩_bilibili

目录

Lesson02:分频计数器设计

一、分频时钟的工程应用

二、Verilog实现分频计数器

三、课后题


一、分频时钟的工程应用

1、对FPGA系统时钟(频率较高)进行分频,产生分频时钟(频率较低)

2、分频时钟可以作为FPGA低速外设的同步时钟

  • IIC总线的时钟(≤400KHz)

  • 低速SPI总线的时钟(≤1MHz)

3、对于频率较高的分频时钟,不能直接作为外设时钟或FPGA内部时钟使用,这类时钟应该由FPGA内部的PLL邓时钟管理单元产生

二、Verilog实现分频计数器

  • 功能需求:输入时钟100MHz,产生一个1MHz的低频时钟

分析:

① 100MHz / 1MHz = 100,翻译一下就是每100个输入时钟周期是1个输出时钟周期

② 需要对100MHz时钟做100分频

③ 计数器循环计数周期为0-99,那么前50个输入时钟就是输出时钟的高电平,后50个时钟是输出时钟的低电平

  • 代码实现:当计数器为0-49时输出高电平,计数器为50-99时输出低电平

​
`timescale 1ns/1ps
​
module vlg_design(
    input clk,
    input rst_n,
    output reg clk_1mhz
    );
    
//`define CNT_MAX 100
//`define CNT_MAX_DIV2 `CNT_MAX/2
    
localparam CNT_MAX = 8'd100;            //时钟为高电平
localparam CNT_MAX_DIV2 = 8'd50;        //时钟为高电平的一半 
​
reg[7:0] cnt;       // 8bit计数器
​
always @(posedge clk)
    //同步复位,当rst_n为低电平时复位
    if(!rst_n) cnt <= 8'd0;
    else if(cnt < (CNT_MAX-1)) cnt <= cnt+1'b1;
    else cnt <= 8'd0;
    
always @(posedge clk)
    if(!rst_n) clk_1mhz <= 8'd0;
    else if(cnt < CNT_MAX_DIV2) clk_1mhz <= 1'b1;
    else clk_1mhz <= 1'b0;
​
endmodule
  • 结果展示

三、课后题

  • 功能需求:输入时钟25MHz,产生一个400KHz的低频时钟

由于25MHz/400KHz=62.5,是小数分频,由于只能在上升沿或下降沿触发,所以只能等效为输入时钟的625个周期是输出时钟的10个周期,需要满足以下公式:

 先做5次62分频,再做5次63分频,得到625个输入时钟周期,之后令分频时钟在625个分频时钟内跳变20次共10个周期。

可以取公约数,最终就是先做1次62分频(前31个输入时钟周期为高电平,后31个输入时钟周期为低电平),再做1次63分频(前31个输入时钟周期为高电平,后32个输入时钟周期为低电平),得到125个输入时钟周期,之后令分频时钟在125个分频时钟内跳变4次共2个周期。

这个方法被称作”双模前置小数分频“,其最重要的核心是M分频(62)和M+1分频(63)这个相近频率。

  • 代码实现


`timescale 1ns/1ps
​
module vlg_design(
    input clk,
    input rst_n,
    output reg clk_400khz
    );
​
//`define CNT_MAX 100
//`define CNT_MAX_DIV2 `CNT_MAX/2
​
localparam div_e = 8'd62;       //62分频周期数,1个输出周期
localparam div_o = 8'd63;       //63分频周期数,1个输出周期
localparam change = 8'd62;      //电平转换
​
reg[8:0] cnt;       // 8bit计数器
reg[8:0] cnt62;     // 8bit计数器
reg[8:0] cnt63;     // 8bit计数器
​
always @(posedge clk) begin
    //同步复位,当rst_n为低电平时复位
    if(!rst_n) begin
        cnt <= 8'd0;
        cnt62 <= 8'd0;
        cnt63 <= 8'd0;
    end 
    else begin
        if(cnt < change) begin
            cnt62 <= cnt62 + 1'b1;          //当cnt<62时,cnt62从0增加至61
            cnt <= cnt + 1'b1;
        end
        else begin
            if(cnt63 == div_o - 1)  cnt63 <= 8'd0;
            else cnt63 <= cnt63 + 1'b1;     //当cnt≥62时,cnt63从0增加至62
        end
    end
end
    
always @(posedge clk) begin
    if(!rst_n) begin
        clk_400khz <= 1'b0;
    end
    else begin
        if(cnt < change) begin
            if(cnt62 < 8'd31)
                clk_400khz <= 1'b1;
            else
                clk_400khz <= 1'b0;
        end
        else begin
            if(cnt63 < 8'd31)
                clk_400khz <= 1'b1;
            else
                clk_400khz <= 1'b0;
        end
    end
end
​
endmodule
  • 结果展示

 这里取了两个周期,2T=5us,400KHz的分频时钟周期为2.5us,可以得到仿真结果是正确的。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Verilog分计数器是一种用于对系统时钟进行分处理的电路。根据引用\[1\]和引用\[2\]的描述,分器可以分为偶数分和奇数分两种方式。 对于偶数分,最简单的二分可以通过在原时钟的上升沿进行输出信号翻转来实现。而对于更高的偶数分比如4分,可以使用计数器,在计数器计到2个上升沿的时候进行输出信号翻转。具体来说,计数器的范围为0-(N-1),其中N为偶数,选择一个值K,当计数器在0~K范围内时,输出信号为低电平;在(K+1)-(N-1)范围内为高电平,从而实现了分。这样的偶数分器可以通过参数化设计来灵活地改变分比例\[1\]。 对于奇数分,最简单的三分无法直接使用计数器进行实现。根据引用\[2\]的描述,正确的思路是取两路上升沿和下降沿信号,然后对这两路信号取或。具体来说,可以使用计数器在0-2之间循环计数,控制输出1个高电平,2个低电平的信号1,然后将信号1延迟半个周期得到信号2,最后将信号1与信号2相与得到50%占空比的3分信号。对于其他奇数分,可以使用类似的方法进行设计\[2\]。 根据引用\[3\]的例子,如果系统时钟为50MHz,要产生1MHz的时钟,则可以进行50分。可以使用计数器进行实现,当计数器计到49次时清零,否则进行+1计数。同时,根据计数器的值,可以控制输出信号的翻转,从而得到1MHz的时钟率。 综上所述,Verilog分计数器可以根据需要选择偶数分或奇数分的方式,并通过计数器和组合逻辑来实现所需的分比例。 #### 引用[.reference_title] - *1* *3* [Verilog基础知识-——计数器设计以及任意分设计与modelsim仿真](https://blog.csdn.net/H19981118/article/details/115353714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Verilog分器](https://blog.csdn.net/qq_39586852/article/details/125836784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值