做脉冲发生器,本质上是在FPGA里搭一个"可精准定时的开关"。给定周期和脉宽,输出周期性方波——看着简单,但参数怎么算、计数器怎么设计、约束怎么加,每一步都有坑。
参数怎么定
三个核心参数:周期 T(决定输出频率 f=1/T)、脉宽 t_w(高电平持续时间)、占空比 duty=t_w/T。
假设系统时钟 f_clk=100 MHz,周期设 1 ms,一个周期内的时钟数 N=f_clk×T=100 000。脉宽 200 μs 对应 M=f_clk×t_w=20 000,占空比 20%。把 N 和 M 做成 parameter,后续调频率只改参数,不用重写逻辑。
计数器怎么搭
一个自由运行的 counter 从 0 数到 N-1 归零,counter < M 时输出高,否则输出低。注意三点:
计数器位宽取 log₂(N) 向上取整,N=100 000 需要 17 bit
复位用异步复位同步释放,防止亚稳态传播
输出寄存后加一层同步,避免跨时钟域采到毛刺
时序约束别漏
管脚约束分配输出 pin,时钟约束加 f_clk 周期。如果脉冲要喂给后面的 ADC 采样或 DAC 驱动,给输出路径加 false_path 或 max_delay 约束,别让 STA 报错干扰你判断实际功能。
### FPGA脉冲发生器的频率精度由什么决定?
由系统时钟 f_clk 决定。f_clk 越高,可整除的周期数越多,量化误差越小。100 MHz 时钟下最小时间分辨率 10 ns,若目标脉宽 15 ns,实际只能取 10 ns 或 20 ns,误差 33%~50%。想提高精度,换更高频时钟或用 PLL 做小数分频。
两个硬指标:一是时钟分辨率 1/f_clk,二是输出管脚的 setup/hold 时间。脉宽窄到 1~2 个时钟周期时,FPGA 内部路径延迟会让实际输出和仿真对不上,需检查输出寄存器到 pin 的延迟,必要时加 max_delay 约束。
总结: 脉冲发生器核心就三件事——参数算对、计数器搭对、约束写全。N 和 M 做成 parameter,时序加到位,功能就通了。
思考题: 如果把脉宽从固定值改成上位机串口实时下发,计数器架构要改哪些地方?串口解包和计数器更新之间的时序冲突怎么处理?想清楚了可以聊两句。
CTA: 如果你正从零搭脉冲发生器,或者卡在参数化设计、跨时钟域、时序约束这些细节上,点击页面右下角客服窗口,跟宸极教育的课程顾问聊两句。我们的FPGA实战课程覆盖从分频器到高速接口的完整链路,21个上板项目逐个带你跑通验证,不闷头看视频,每个实验都有板级波形截图对照。
未经许可,禁止转载!