1. 紫光MES1/2KG开发板硬件概览
紫光同创MES1/2KG开发套件是国内FPGA开发者入门国产芯片的首选平台之一。我最近刚拿到这块板子,第一印象是其布局比常见的Xilinx/Altera开发板更紧凑,但接口资源毫不缩水。板载PGC1KG-LPG100芯片(对应1K逻辑单元)或PGC2KG-LPG100芯片(2K逻辑单元),采用Lattice风格的LPG100封装,这种封装在国产FPGA中比较常见,手工焊接难度适中。
开发板的核心配置包括:
- 主芯片:紫光同创Logos系列FPGA(1K/2K LUTs可选)
- 存储资源:板载32Mb SPI Flash用于配置存储
- 时钟源:50MHz有源晶振+预留的时钟扩展接口
- 基础外设:4个独立按键、8位拨码开关、8个LED灯、4位数码管
- 扩展接口:40Pin GPIO排针(兼容树莓派布局)、16Pin PMOD接口
- 调试接口:标准JTAG下载口(需搭配紫光专用下载器)
特别注意:紫光FPGA的JTAG接口电压为3.3V,与Xilinx/Altera的下载器不兼容,必须使用紫光官方编程器。
2. 开发环境搭建实战
2.1 软件工具链安装
紫光提供名为"Pango Design Suite"的IDE(基于Eclipse定制),最新版本为2023.1。安装时有几个坑需要注意:
- 路径不能有中文或空格,否则综合器会报莫名错误
- 安装完成后需要手动添加设备库文件(从官网下载PGCxKG-LPG100的器件支持包)
- 首次运行建议以管理员身份启动,避免权限问题导致license加载失败
# Linux用户需要额外配置udev规则才能识别下载器 SUBSYSTEM=="usb", ATTR{idVendor}=="1eab", MODE="0666"2.2 第一个LED工程
新建工程时关键配置项:
- 器件型号选择"PGC1KG-LPG100"或"PGC2KG-LPG100"
- 综合策略建议选"Area Optimized"(面积优化)
- 约束文件格式为专用的.pdc文件(类似Lattice的格式)
一个简单的LED流水灯Verilog示例:
module led_demo( input clk, output reg [7:0] leds ); reg [23:0] counter; always @(posedge clk) begin counter <= counter + 1; if(counter == 24'd5_000_000) begin leds <= {leds[6:0], leds[7]}; counter <= 0; end end endmodule对应的约束文件写法:
create_clock -name clk -period 20 [get_ports clk] set_pin_assignment { leds[0] } { LOCATION = P34; } set_pin_assignment { leds[1] } { LOCATION = P33; } ...3. 外设接口开发详解
3.1 数码管驱动设计
板载的4位共阳数码管采用动态扫描方式,需要设计扫描逻辑。实测发现紫光FPGA的IO翻转速度比进口芯片略慢,扫描频率建议控制在500Hz-1kHz之间。一个实用的驱动模块应包含:
- 分频计数器生成扫描时钟
- BCD码到7段码的译码器
- 位选通信号生成器
// 数码管扫描示例 always @(posedge scan_clk) begin case(sel) 2'b00: begin seg <= data0; an <= 4'b1110; end 2'b01: begin seg <= data1; an <= 4'b1101; end ... endcase sel <= sel + 1; end3.2 PMOD扩展接口应用
16Pin的PMOD接口支持标准外设模块连接,但需要注意:
- 紫光IO默认电平为3.3V LVCMOS
- 驱动能力需在约束文件中设置(默认4mA)
- 高速信号建议使用SSTL电平标准
我成功驱动过这些PMOD设备:
- 加速度传感器ADXL345
- OLED显示屏SSD1306
- 蓝牙模块HC-05
4. 进阶开发技巧
4.1 时序约束实战
紫光的时序约束语法与主流工具差异较大,关键命令包括:
create_clock -period 20 -name clk [get_ports clk] set_input_delay -clock clk 5 [get_ports {data_in[*]}] set_output_delay -clock clk 3 [get_ports {data_out[*]}]遇到时序违例时,可以尝试:
- 降低时钟频率(初期验证建议用10-20MHz)
- 添加pipeline寄存器
- 使用register_duplication约束复制高负载寄存器
4.2 片上资源优化
PGC1KG芯片的资源非常有限(约1K LUTs),优化建议:
- 多用case语句替代if-else
- 共享算术运算单元
- 使用Block RAM替代分布式RAM
- 避免使用异步复位
资源占用查看方法:
Tools -> Utilization Viewer5. 常见问题排查
5.1 下载失败处理
当JTAG报"configuration failed"错误时,按以下步骤排查:
- 检查下载器驱动是否安装(设备管理器应出现"USB-JTAG-Cable")
- 测量板载3.3V电源是否稳定(要求>3.2V)
- 尝试降低下载速率(在Programmer界面调整)
- 检查JTAG连接线是否过长(建议<15cm)
5.2 综合警告处理
常见的警告及解决方法:
- "Clock net has no clock constraint" → 添加create_clock约束
- "Unused block RAM" → 检查是否误例化了未使用的RAM
- "High fanout net" → 使用CLK_BUFG驱动全局时钟网络
6. 项目实战案例
6.1 温控风扇系统
利用板载资源实现:
- PWM输出控制风扇转速
- DS18B20温度传感器(接PMOD接口)
- 数码管显示当前温度
- 按键设置温度阈值
关键实现技巧:
// 1-Wire总线时序生成 always @(posedge clk) begin case(state) RESET: begin dq <= 1'b0; cnt <= 0; end PRESENCE: begin dq <= 1'bz; if(!dq) state <= WRITE; end ... endcase end6.2 简易逻辑分析仪
利用剩余Block RAM实现:
- 8通道信号采集(最大100Msps)
- 触发条件设置(边沿/电平触发)
- 通过UART上传数据到PC
这个项目充分考验了紫光FPGA的时序控制能力,建议:
- 使用IDDR原语采集高速信号
- 采用双缓冲RAM设计避免数据丢失
- 添加时序例外约束放宽采集路径时序要求
经过两周的实测,这块开发板虽然工具链还不够完善,但基本功能稳定,特别适合想了解国产FPGA的开发者。建议初学者从LED、按键这些基础外设入手,逐步过渡到UART、SPI等通信协议,最后再挑战图像处理等复杂应用。紫光的Pango IDE虽然不如Vivado/Quartus强大,但对1-2K规模的设计完全够用。