
1. 盘古1K开发板与LED流水灯实验概述盘古1K开发板是紫光同创推出的一款国产FPGA学习套件采用PGC1K/2K系列芯片作为核心处理器。这款开发板特别适合Verilog HDL的入门学习板载资源包括数码管、按键、LED灯等基础外设为初学者提供了丰富的实践机会。本次实验将实现经典的LED流水灯效果这是FPGA学习中最基础的入门实验之一。相比简单的LED闪烁流水灯需要控制多个LED按照特定顺序依次点亮涉及到状态控制和时序设计的基本概念。通过这个实验初学者可以掌握FPGA开发的基本流程包括开发环境搭建PDS软件使用Verilog代码编写与仿真管脚约束文件配置程序下载与调试提示对于完全没有FPGA基础的初学者建议先了解数字电路基础知识特别是组合逻辑和时序逻辑的区别这对理解Verilog编程至关重要。2. 实验环境准备与工具链配置2.1 硬件准备清单盘古1K开发板核心芯片PGC1K/2KMicro USB数据线用于供电和程序下载电脑Windows系统2.2 软件工具安装紫光PDSPanGu Design Suite是官方推荐的开发环境安装步骤如下从紫光同创官网下载最新版PDS软件运行安装程序选择默认安装路径安装USB驱动确保开发板能被电脑识别安装完成后建议重启电脑安装完成后首次打开PDS可能会提示选择许可证文件。对于学习用途可以使用免费的评估版许可证。2.3 新建工程流程启动PDS选择File→New Project设置工程名称和存储路径建议使用英文路径选择器件型号PGC1K/2K根据实际开发板型号选择添加新文件时选择Verilog HDL File完成工程创建后建议立即进行保存3. Verilog代码实现详解3.1 基础模块定义LED流水灯的Verilog代码主要包含三个部分时钟分频、计数器逻辑和LED输出控制。以下是完整的代码框架module led_water( input clk, // 系统时钟输入 input rst_n, // 复位信号低电平有效 output reg [7:0] led // 8位LED输出 ); // 参数定义 parameter CNT_MAX 24d10_000_000; // 1秒计时假设系统时钟50MHz // 内部信号定义 reg [23:0] cnt; // 计数器 reg [2:0] state; // 状态寄存器 // 时钟分频与计数器逻辑 always (posedge clk or negedge rst_n) begin if(!rst_n) begin cnt 24d0; state 3d0; end else if(cnt CNT_MAX - 1b1) begin cnt 24d0; state state 1b1; end else begin cnt cnt 1b1; end end // LED输出控制 always (posedge clk or negedge rst_n) begin if(!rst_n) begin led 8b0000_0001; end else begin case(state) 3d0: led 8b0000_0001; 3d1: led 8b0000_0010; 3d2: led 8b0000_0100; 3d3: led 8b0000_1000; 3d4: led 8b0001_0000; 3d5: led 8b0010_0000; 3d6: led 8b0100_0000; 3d7: led 8b1000_0000; default: led 8b0000_0001; endcase end end endmodule3.2 代码关键点解析时钟分频通过计数器实现简单的分频将高频系统时钟转换为适合人眼观察的低频信号。CNT_MAX参数需要根据实际系统时钟频率调整。状态机设计使用3位状态寄存器state控制8个LED的亮灭顺序。状态机是FPGA设计中非常重要的概念这个简单的流水灯实际上就是一个环形状态机。非阻塞赋值注意代码中使用的是非阻塞赋值这是时序逻辑的标准写法与组合逻辑中使用的阻塞赋值有本质区别。注意实际开发板上LED的连接方式可能不同有些开发板是低电平点亮LED这种情况下需要将输出信号取反。4. 管脚约束与下载配置4.1 管脚约束文件编写在PDS中管脚约束通常通过编写.adc文件实现。以下是典型的约束文件内容# 系统时钟 set_pin_assignment { clk } { LOCATION P23; IOSTANDARD LVCMOS33; } # 复位信号 set_pin_assignment { rst_n } { LOCATION P15; IOSTANDARD LVCMOS33; PULLTYPE PULLUP; } # LED输出 set_pin_assignment { led[0] } { LOCATION P101; IOSTANDARD LVCMOS33; } set_pin_assignment { led[1] } { LOCATION P102; IOSTANDARD LVCMOS33; } set_pin_assignment { led[2] } { LOCATION P103; IOSTANDARD LVCMOS33; } set_pin_assignment { led[3] } { LOCATION P104; IOSTANDARD LVCMOS33; } set_pin_assignment { led[4] } { LOCATION P105; IOSTANDARD LVCMOS33; } set_pin_assignment { led[5] } { LOCATION P106; IOSTANDARD LVCMOS33; } set_pin_assignment { led[6] } { LOCATION P107; IOSTANDARD LVCMOS33; } set_pin_assignment { led[7] } { LOCATION P108; IOSTANDARD LVCMOS33; }4.2 下载配置步骤确保开发板通过USB线正确连接电脑在PDS中选择Tools→Programmer点击Add File添加生成的.bit文件选择正确的下载接口通常是USB点击Program开始下载观察开发板上的LED是否按预期流动5. 常见问题与调试技巧5.1 LED不亮可能原因排查电源问题首先检查开发板电源指示灯是否正常下载失败确认.bit文件是否成功下载到FPGA管脚分配错误核对约束文件中的管脚号是否与原理图一致代码问题使用PDS内置的逻辑分析仪抓取信号波形5.2 流水灯速度异常如果LED流动速度过快或过慢主要调整代码中的CNT_MAX参数。计算公式为CNT_MAX 期望延时(秒) × 系统时钟频率(Hz)例如对于50MHz系统时钟要实现1秒间隔CNT_MAX 1 × 50,000,000 50,000,0005.3 进阶调试技巧添加仿真测试编写简单的testbench验证代码逻辑使用SignalTapPDS内置的逻辑分析仪工具可以实时观察内部信号分段调试先实现单个LED闪烁再扩展为流水灯6. 实验扩展与进阶学习完成基础流水灯后可以尝试以下扩展练习双向流水灯LED先从左向右流动再从右向左返回呼吸灯效果通过PWM控制LED亮度渐变按键控制使用开发板上的按键改变流水灯方向或速度多模式切换设计多种流水灯模式通过按键循环切换对于想深入学习FPGA的同学建议后续研究状态机设计方法Mealy型与Moore型时序约束与静态时序分析FPGA内部资源Block RAM、DSP、PLL等的使用常见接口协议UART、SPI、I2C的实现我在实际教学中发现很多初学者容易混淆Verilog与软件编程的思维差异。记住Verilog描述的是硬件电路代码中的每个always块最终都会对应到实际的硬件结构。理解这一点对后续的FPGA学习至关重要。