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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在课程中添加一个作业是一个很重要的步骤。作业可以帮助学生巩固他们所学到的知识,并帮助教师评估学生的学习进度和掌握程度。 首先,一个好的作业应该与课堂教学内容相结合。教师可以设计作业来帮助学生将课堂上学到的概念应用到实际问中,或者进一步发掘和探索学生的思考能力。作业应该涵盖课程中的关键点和重要概念,以帮助学生加深对这些知识的理解。 其次,作业应该有明确的目标和要求。教师应该清楚地告诉学生他们需要完成什么,并给出明确的评估标准。这样一来,学生可以知道他们需要达到什么样的水平,并能有针对性地完成任务。 此外,作业应该适当地安排时间。教师需要考虑学生在完成作业时所需的时间,并在布置作业时给出合理的截止日期。这样一来,学生可以有足够的时间来完成作业,并且可以避免时间紧张导致的学习压力。 最后,作业的评估和反馈也是很重要的。教师可以通过评估学生的作业来了解学生的掌握程度,并根据作业的质量给出相应的反馈和建议。这样一来,学生可以知道他们的学习状况,并可以及时地调整学习策略。 总之,将作业添加到课程中是一个促进学生学习和教学效果的重要步骤。一个好的作业可以帮助学生加深对知识的理解,提高他们的学习效果。同时,教师通过评估和反馈也可以更好地了解学生的学习情况,并为他们提供相应的指导和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值