26.计数器

📅 发布时间:2026/7/16 7:55:02 👁️ 浏览次数:
26.计数器
FPGA 设计与处理器程序设计核心差异在于处理器是指令顺序执行而 FPGA 以晶振产生的周期性时钟为核心驱动通过匹配不同时钟周期完成计数再依据计数值执行各类动作最终实现特定功能计数器是 FPGA 时序设计中最基础、最核心的模块其设计核心围绕时钟周期计算、条件优先级划分、标准时序逻辑编写展开具体使用方法总结如下一、先做时钟周期精准计算确定计数阈值由晶振频率算出单个时钟周期周期 1 / 频率如 100MHz 时钟的单周期为 10ns根据实际需求如定时 1 秒、分频到 1Hz计算所需总时钟周期数总周期数 目标时间 / 单时钟周期确定计数阈值因计数器从 0 开始累加最终计数阈值为总周期数 - 1如 100MHz 时钟定时 1 秒需 100,000,000 个周期计数阈值则为 99,999,999。二、拆解计数器三大核心条件明确优先级排序计数器设计需拆解为 3 类核心条件且按 “高优先级到低优先级” 依次处理优先级排序为复位条件最高→ 清零条件次之→ 累加条件最低复位条件上电初始化或异常恢复时触发用于将计数值置初始值通常为 0保证计数器上电状态可知分为异步复位无需时钟沿复位信号有效立即执行、同步复位需时钟沿触发才执行工程中异步复位为常用方案清零条件计数值达到预设阈值后触发将计数器置 0 以实现循环计数若不优先处理清零计数值会溢出超出预设范围导致清零条件失效累加条件计数器的正常工作条件由时钟沿驱动在无复位、无清零的情况下每个时钟沿计数值加 1是计数器实现周期计数的基础。三、编写标准时序逻辑代码遵循 FPGA 编码规范以最常用的异步复位计数器为例采用单一时序 always 块实现一个时钟域 一组关联时序动作符合 FPGA 最佳编码实践核心逻辑严格遵循 “优先级从高到低”代码框架与规范如下触发列表异步复位需包含时钟上升沿 复位下降沿posedge 时钟名 or negedge 复位名同步复位仅需时钟上升沿赋值规则时序逻辑必须使用非阻塞赋值模拟硬件寄存器的并行更新特性代码结构按 “复位→清零→累加” 的优先级依次编写无冗余分支保证综合器可生成高效、正确的硬件电路。标准代码模板以 100MHz 时钟、1 秒定时为例verilog// 定义计数器寄存器根据计数阈值确定位宽32位可满足绝大多数低频定时需求 reg [31:0] cnt; // 1秒定时计数器 // 异步复位计数器核心时序逻辑 always (posedge SYS_CLK or negedge RST_N) begin // SYS_CLK系统时钟RST_N低有效异步复位 if(!RST_N) begin // 1. 最高优先级复位条件计数值置0 cnt 32d0; end else if(cnt 32d99_999_999) begin // 2. 次之清零条件计满1秒置0 cnt 32d0; end else begin // 3. 最低优先级累加条件每个时钟沿计数值1 cnt cnt 1d1; end end四、核心设计要点区分软硬件设计思维无需像处理器程序那样考虑执行顺序只需明确硬件条件的优先级先处理特殊情况复位、清零再处理正常工作情况累加这是 FPGA 计数器设计的核心思路禁止优先级写反若将 “累加” 写在 “清零” 前计数器计满后会先累加再清零导致计数值溢出清零条件永久失效计数器无法循环工作寄存器必做复位所有计数器寄存器必须设置复位值避免 FPGA 上电后计数器状态未知导致整个时序逻辑功能异常单 always 块设计同一时钟域、同一复位方式的计数器需在单个 always 块内完成所有逻辑编写无需按信号拆分既简化代码又利于综合器优化硬件电路。