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的时钟