FPGA学习——分频计数器

本文介绍了如何在FPGA中使用分频技术,如对100MHz时钟进行100分频以得到1MHz低频时钟,通过Verilog代码实现了一个计数器模块。同时提供了Testbench测试代码,展示了如何使用25MHz时钟产生400KHz时钟的实践案例。
摘要由CSDN通过智能技术生成

1.分频时钟的应用

  • 对FPGA系统时钟(频率较高)进行分频,产生分频时钟(频率较低)
  • 分频时钟可作为FPGA外设的同步时钟:1.I2C总线的时钟(<=400KHz)2.低速SPI总线的时钟(<=1MHz)
  • 对于频率较高的分频时钟,不能直接作为外设时钟或FPGA内部时钟使用,这类时钟应该由FPGA内部的PLL等时钟管理单元产生

2.实例

输入时钟100MHz,产生一个1MHz的低频时钟:
分析:100MHz/1MHz=100,即需要对100MHz时钟做100分频,计数器循环计数周期为0~99

3.Verilog代码

//输入100MHz,产生1MHz的低频时钟
module cnt (
    input clk,
    input rst,
    output reg clk_1mhz
);
    localparam  cnt_max = 8'd100;
    localparam  cnt_max_div2 = 8'd50;

    reg [7:0] cnt;
 //计数器
    always @(posedge clk ) begin
        if(!rst)
          cnt <= 8'd0;
        else if(cnt < (cnt_max-1))
          cnt <= cnt + 1'b1;
        else cnt <= 8'd0;
    end
//分频时钟
   always @(posedge clk ) begin
       if(!rst)
         clk_1mhz <= 1'b0;
        else if (cnt < cnt_max_div2)
         clk_1mhz <= 1'b1;
        else
        clk_1mhz <= 1'b0;
   end

endmodule

4.Testbench代码

`timescale 1ns/100ps

module cnt_tb;

`define clk_per  10 
 
 reg clk;
 reg rst;
 wire clk_1mhz;

 initial begin
    clk <= 0;
    rst <= 0;
    #1000
    rst <= 1;
 end

 always #(`clk_per/2) clk <= ~clk;

initial begin
   @(posedge rst);
   @(posedge clk);
   repeat(10) begin
     @(posedge clk);
   end
   #10_000;
   $stop;
end

 cnt cnt_tb_inst(
    .clk(clk),
    .rst(rst),
    .clk_1mhz(clk_1mhz)
 );
endmodule

5.结果

在这里插入图片描述
练习:对于一个25MHz的时钟,分频产生一个400KHz的时钟

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值