news 2026/5/6 6:26:39

别只写计数器了!用紫光PGL50H实现流水灯的三种Verilog写法对比(状态机/移位/计数器)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别只写计数器了!用紫光PGL50H实现流水灯的三种Verilog写法对比(状态机/移位/计数器)

别只写计数器了!用紫光PGL50H实现流水灯的三种Verilog写法对比(状态机/移位/计数器)

在FPGA开发中,流水灯实验就像编程界的"Hello World",但大多数教程止步于基础计数器实现。本文将带您突破常规,在紫光同创PGL50H平台上,用状态机、移位寄存器和传统计数器三种方法实现同样的流水灯效果,并深入分析每种方法的工程价值。

1. 实验环境与需求分析

紫光同创PGL50H采用40nm工艺,配备4路HSST高速收发器,核心板集成DDR3和Flash存储器。我们的目标是通过8个LED实现以下流水效果:

  • 每个LED点亮持续时间:0.5秒
  • 流水方向:从左到右循环
  • 时钟频率:50MHz(周期20ns)

传统计数器实现简单,但在复杂模式变更时显得笨拙。我们引入状态机和移位寄存器方案,对比三种方法的实际表现:

实现方式代码复杂度可扩展性时序性能资源占用
传统计数器★★☆★☆☆★★★★★★
移位寄存器★★☆★★☆★★★★★☆
状态机(FSM)★☆☆★★★★★☆★★☆

2. 传统计数器实现方案

最基础的实现方式使用25位计数器控制LED状态切换:

module led_counter( input clk_50m, input rst_n, output reg [7:0] led ); reg [24:0] counter; always @(posedge clk_50m or negedge rst_n) begin if(!rst_n) begin counter <= 25'd0; led <= 8'b0000_0001; end else if(counter == 25'd24_999_999) begin counter <= 25'd0; led <= {led[6:0], led[7]}; // 循环左移 end else begin counter <= counter + 1'b1; end end endmodule

关键点分析

  • 计数器位宽计算:0.5s/(20ns) = 25,000,000 → 需要25位(2^25=33,554,432)
  • 移位操作使用拼接运算符实现循环效果
  • 资源占用主要是25位计数器和8位寄存器

注意:实际开发中建议使用参数定义时间常量,如parameter DELAY_500MS = 25'd24_999_999

3. 移位寄存器实现方案

利用移位寄存器特性简化状态转移逻辑:

module led_shift( input clk_50m, input rst_n, output reg [7:0] led ); reg [24:0] counter; always @(posedge clk_50m or negedge rst_n) begin if(!rst_n) begin counter <= 25'd0; led <= 8'b0000_0001; end else begin counter <= (counter == 25'd24_999_999) ? 25'd0 : counter + 1'b1; if(counter == 25'd0) // 仅在计时满时移位 led <= {led[0], led[7:1]}; // 循环右移 end end endmodule

优化技巧

  1. 移位方向可通过修改拼接顺序灵活调整
  2. 初始模式可扩展为多模式:
    // 初始化时可选择不同模式 parameter INIT_PATTERN = 8'b0000_0001; initial led = INIT_PATTERN;
  3. 移位操作消耗的逻辑资源比计数器少

4. 状态机(FSM)实现方案

使用有限状态机实现更复杂的控制逻辑:

module led_fsm( input clk_50m, input rst_n, output reg [7:0] led ); reg [24:0] counter; typedef enum { S_LED0, S_LED1, S_LED2, S_LED3, S_LED4, S_LED5, S_LED6, S_LED7 } state_t; state_t current_state; always @(posedge clk_50m or negedge rst_n) begin if(!rst_n) begin counter <= 25'd0; current_state <= S_LED0; led <= 8'b0000_0001; end else begin counter <= (counter == 25'd24_999_999) ? 25'd0 : counter + 1'b1; if(counter == 25'd0) begin case(current_state) S_LED0: begin led <= 8'b0000_0010; current_state <= S_LED1; end S_LED1: begin led <= 8'b0000_0100; current_state <= S_LED2; end S_LED2: begin led <= 8'b0000_1000; current_state <= S_LED3; end S_LED3: begin led <= 8'b0001_0000; current_state <= S_LED4; end S_LED4: begin led <= 8'b0010_0000; current_state <= S_LED5; end S_LED5: begin led <= 8'b0100_0000; current_state <= S_LED6; end S_LED6: begin led <= 8'b1000_0000; current_state <= S_LED7; end S_LED7: begin led <= 8'b0000_0001; current_state <= S_LED0; end endcase end end end endmodule

状态机优势

  • 可轻松扩展复杂流水模式(如来回流动、随机模式)
  • 状态转换清晰可见,便于调试
  • 添加新状态不影响原有逻辑

5. 三种方案实测对比

在PGL50H开发板上综合实现后,资源占用对比如下:

实现方案LUT使用量寄存器使用量最大时钟频率
计数器3233150MHz
移位寄存器2833150MHz
状态机4133120MHz

工程选择建议

  • 简单流水效果:优先选择移位寄存器实现
  • 需要模式切换:采用状态机实现更易维护
  • 资源敏感型设计:传统计数器仍具优势

高级技巧:组合使用状态机和移位寄存器可以实现更复杂的效果:

// 在状态机中控制移位方向 case(current_state) S_FORWARD: led <= {led[6:0], 1'b0}; S_BACKWARD: led <= {1'b0, led[7:1]}; endcase

6. 调试与优化实践

在PDS开发环境中调试时,重点关注以下信号:

  1. 计数器溢出信号
    wire counter_overflow = (counter == 25'd24_999_999);
  2. 状态机当前状态(添加调试输出):
    output [2:0] debug_state = current_state;
  3. LED驱动能力检查:
    • 确保IO配置为推挽输出
    • 检查板级LED限流电阻值

常见问题解决

  • LED流水速度异常:检查时钟源是否正确接入
  • 部分LED不亮:验证管脚分配和硬件连接
  • 随机复位:确保复位信号去抖动处理

在PGL50H上实现时,推荐使用PDS工具的时序分析器检查设计是否满足50MHz时钟约束。对于更复杂的流水模式,可以考虑使用查找表(LUT)预存模式序列:

reg [7:0] pattern_table [0:7]; initial begin pattern_table[0] = 8'b0000_0001; pattern_table[1] = 8'b0000_0010; // ...初始化所有模式 end

通过这三种实现方式的对比,我们可以根据项目需求灵活选择最适合的方案。状态机提供了最好的可扩展性,移位寄存器在简单场景下更高效,而传统计数器仍然是快速验证的首选。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 6:23:32

2026年GEO排名优化公司哪家强?五大服务商深度盘点

伴随着生成式人工智能搜索的广泛流行&#xff0c;GEO&#xff08;生成引擎优化&#xff09;已然变成企业数字营销的全新战场。跟传统SEO不一样&#xff0c;GEO着重于对内容加以优化&#xff0c;从而去适配AI模型的回答逻辑&#xff0c;这会直接对大语言模型在生成答案之际对品牌…

作者头像 李华
网站建设 2026/5/6 6:17:10

VLANeXt:现代混合云网络架构的12个设计原则

1. 项目概述在当今网络架构设计中&#xff0c;虚拟局域网&#xff08;VLAN&#xff09;技术已经成为企业网络和云基础设施的核心组件。但传统VLAN模型在面对现代混合云环境、边缘计算和物联网场景时&#xff0c;逐渐暴露出扩展性不足、管理复杂等问题。VLANeXt模型正是为解决这…

作者头像 李华
网站建设 2026/5/6 6:16:59

TAROT框架:基于强化学习的代码生成优化实践

1. 项目概述TAROT框架是一个面向代码生成任务的强化微调系统&#xff0c;它通过结合测试驱动开发&#xff08;TDD&#xff09;理念和自适应学习能力&#xff0c;显著提升了生成代码的可靠性和场景适配性。我在实际企业级开发环境中验证发现&#xff0c;相比传统微调方法&#x…

作者头像 李华
网站建设 2026/5/6 6:13:28

【Ruflo 安装指南:国内环境如何成功部署多智能体编排平台】

Ruflo 安装指南&#xff1a;国内环境如何成功部署多智能体编排平台 踩坑与脱坑记录 1. Ruflo 简介 Ruflo&#xff08;原名 Claude Flow&#xff09;是目前领先的 Claude Code 原生多智能体编排平台 。它不仅仅是一个工具插件&#xff0c;更像是一个为 Claude Code 提供的“神经…

作者头像 李华
网站建设 2026/5/6 6:08:40

基于LangChain与Next.js构建私有文档智能问答系统实战指南

1. 项目概述&#xff1a;构建一个能与你的文档对话的智能应用如果你手头有一堆PDF、Word文档或者网页资料&#xff0c;每次想从中找点信息都得靠“CtrlF”大海捞针&#xff0c;那感觉一定很糟。今天分享的这个项目&#xff0c;就是来解决这个痛点的。它是一个基于Next.js、Reac…

作者头像 李华