lesson2:分频计数器设计
1:分频时钟工程应用
**概念:**对FPGA频率较高的系统时钟进行分频可以产生频率较低的分频时钟。
应用:分频时钟可以作为FPGA低速外设的同步时钟,比如
IIC总线时钟(<= 400KHz)
低速SPI总线时钟(<=1MHz)
**注:**对于频率较高的分频时钟,不能直接作为外设时钟或者FPGA内部时钟使用,这类时钟应该由FPGA内部的PLL等时钟管理单元产生。不过PLL输出时钟范围为5.65MHz-800MHz,所以对于kHz的时钟频率一般分频产生。
2:分频计数器功能需求
需求:输入100MHz,产生1MHz低频时钟
分析:
1:计数范围确定:100MHz/1MHz = 100
2:即需要对100MHz做100分频
3:计数器循环计数周期为0-99。
3:实例设计与仿真
3.1:接口说明
接口 | 位宽 | 方向 | 描述 |
---|---|---|---|
clk | 1 | I | 系统时钟27MHz |
rst_n | 1 | I | 系统复位 |
clk_out | 1 | O | 输出时钟1MHz |
3.2:主要时序
3.3:实现
reg [6:0] cnt;
reg clk_out_reg;
`define CNT_MAX 100 //使用define定义,使用时加`
`define CNT_MAX_DIV2 50 //使用define定义,使用时加`
//localparam CNT_MAX = 7'd99;
//localparam CNT_MAX_DIV2 = 7'd50;
//cnt计数
always @(posedge clk)begin
if(!rst_n)begin
cnt <= 7'b0;
end
else if(cnt == `CNT_MAX)begin
cnt <= 7'b0;
end
else begin
cnt <= cnt + 1'b1;
end
end
//输出 clk_out
always @(posedge clk)begin
if(!rst_n)begin
clk_out_reg <= 1'b0;
end
else if(cnt < `CNT_MAX_DIV2)begin
clk_out_reg <= 1'b0;
end
else begin
clk_out_reg <= 1'b1;
end
end
assign clk_out = clk_out_reg;
3.4:仿真分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C4DuhN5A-1633965457910)(file:///C:\Users\Lenovo\AppData\Local\Temp\msohtmlclip1\01\clip_image003.jpg)]
assign clk_out = clk_out_reg;
3.4:仿真分析
![在这里插入图片描述](https://img-blog.csdnimg.cn/26036c09039440968a518b786c74a560.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/87c5370817914fbba291f157e87c867c.png#pic_center)