1. 分频器基础与FPGA时钟管理
刚接触FPGA开发时,我最头疼的就是时钟信号的处理。板载晶振提供的时钟频率往往无法满足所有外设需求,这时候分频器就成了救命稻草。记得第一次做LED流水灯实验时,直接用50MHz时钟驱动,结果LED闪烁快得根本看不见,这才意识到分频的重要性。
分频器本质上是将输入时钟频率降低的电路,就像给高速运转的引擎加了个减速器。在FPGA中实现分频主要有两种方式:使用硬核PLL(锁相环)或通过Verilog编写分频电路。PLL虽然精度高但资源有限,而Verilog分频器则更灵活,适合对精度要求不高的场景。
实际工程中,我们常遇到三种分频需求:
- 偶数分频:如2分频、4分频等整数倍分频
- 奇数分频:如3分频、5分频等非整数倍分频
- 小数分频:如1.5分频等非整数关系分频(本文暂不讨论)
初学者最容易犯的错误是混淆分频概念。有次我误将占空比调整当作分频,结果导致整个I2C通信失败。要记住:分频改变的是信号频率,而占空比调整改变的是高低电平持续时间比例。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 偶数分频的Verilog实现
2.1 偶数分频的核心原理
偶数分频之所以简单,是因为它的触发沿始终与基准时钟对齐。以最常见的2分频为例,每个时钟上升沿触发一次状态翻转,自然就得到50%占空比的二分频信号。这就像玩跳绳游戏,每次绳子转到最高点时跳一下,节奏自然减半。
对于N分频(N为偶数)的一般实现方法:
- 设计一个计数器,计数范围0到(N/2-1)
- 当计数器达到最大值时:
- 翻转输出时钟信号
- 复位计数器
- 重复上述过程
这里有个容易忽略的细节:计数器的位宽选择。比如8分频需要计数到3(因为8/2-1=3),理论上2位计数器就够了。但实际工程中我习惯多留1位余量,防止后续修改分频系数时溢出。
2.2 可配置的偶数分频模块
下面这个增强版8分频模块增加了参数化设计,方便复用:
verilog复制module even_divider #(
parameter DIV_RATIO = 8 // 默认8分频
)(
input wire sys_clk,
input wire sys_rst_n,
output reg clk_out
);
loc
