1. 盘古PGX-Nano开发板硬件架构解析
PGX-Nano开发板作为紫光同创推出的FPGA教学与开发平台,其核心采用Logos2系列PG2L50H_MBG324芯片,基于28nm工艺制程。这块FPGA芯片具有50K逻辑单元容量,324引脚MBGA封装,在国产FPGA中属于中端性能产品。开发板在设计上充分考虑了教学实验需求,板载资源丰富且布局合理。
开发板右上角区域配置了2MB容量的IS61WV102416BLL-10TLI SRAM芯片,这是本次实验的核心外设。该SRAM采用10ns访问速度,3.3V工作电压,16位数据总线宽度,通过FPGA的通用IO口进行连接。在硬件连接上,地址线A0-A19共20根,可寻址1M地址空间(实际芯片使用A0-A17共18根地址线);数据线D0-D15共16根;控制信号包括片选CE#、输出使能OE#、写使能WE#,这些信号的电平转换电路都已在板上完成设计。
注意:SRAM的电压域与FPGA Bank电压必须匹配。PGX-Nano开发板已将所有SRAM接口信号连接至FPGA Bank2,该Bank默认配置为3.3V LVCMOS电平标准,与SRAM完全兼容。
开发板左下角集成了CH552G USB下载器芯片,支持JTAG和SPI两种配置模式。通过Type-C接口连接电脑后,既可用于FPGA配置文件的下载,也可作为UART串口通信使用。这种一体化设计避免了外接下载器的麻烦,特别适合教学场景。
其他值得注意的板载资源包括:
- 50MHz有源晶振,为FPGA提供全局时钟
- 4个用户LED和4个拨码开关
- 24LC02B I2C EEPROM
- ESP32-C3 WiFi/蓝牙模组(需跳线启用)
- 40Pin扩展接口,包含16个FPGA通用IO和电源引脚
2. SRAM接口的Verilog实现要点
2.1 SRAM控制器状态机设计
SRAM接口时序相对简单,但需要严格满足建立保持时间要求。我们采用三段式状态机实现读写控制:
localparam IDLE = 2'b00; localparam WRITE = 2'b01; localparam READ = 2'b10; reg [1:0] current_state, next_state; reg [17:0] sram_addr; reg [15:0] sram_dout; wire [15:0] sram_din; reg sram_ce_n, sram_oe_n, sram_we_n; // 状态转移逻辑 always @(*) begin case(current_state) IDLE: next_state = (wr_req) ? WRITE : (rd_req) ? READ : IDLE; WRITE: next_state = IDLE; READ: next_state = IDLE; default: next_state = IDLE; endcase end // 输出控制逻辑 always @(*) begin case(current_state) IDLE: begin sram_ce_n = 1'b1; sram_oe_n = 1'b1; sram_we_n = 1'b1; end WRITE: begin sram_ce_n = 1'b0; sram_oe_n = 1'b1; sram_we_n = 1'b0; end READ: begin sram_ce_n = 1'b0; sram_oe_n = 1'b0; sram_we_n = 1'b1; end endcase end2.2 时序约束关键点
为确保SRAM接口稳定工作,必须添加正确的时序约束。在PDS(紫光同创开发工具)中需要设置:
- 输入延迟约束:对SRAM返回的读取数据sram_din设置set_input_delay
- 输出延迟约束:对地址线和控制信号设置set_output_delay
- 时钟约束:定义50MHz系统时钟的周期、占空比等参数
典型的约束命令如下:
create_clock -name clk -period 20 [get_ports clk] set_input_delay -clock clk -max 5 [get_ports sram_din[*]] set_output_delay -clock clk -max 3 [get_ports {sram_addr[*] sram_ce_n sram_oe_n sram_we_n}]实测经验:在PG2L50H芯片上,SRAM接口最高可稳定工作在40MHz。超过此频率可能出现读写错误,建议实际应用时保留20%余量。
3. 完整实验流程详解
3.1 工程创建与引脚分配
打开Pangu PDS开发工具,新建工程:
- 器件选择:PG2L50H_MBG324
- 顶层模块名:sram_test
- 添加Verilog源文件和约束文件
根据开发板原理图分配引脚:
- SRAM地址线:分配到Bank2的IO_0至IO_17
- SRAM数据线:分配到Bank2的IO_18至IO_33
- 控制信号:CE#→IO_34,OE#→IO_35,WE#→IO_36
- 系统时钟:50MHz晶振连接到IO_37
配置Bank电压:
- 在工程设置中将Bank2的IO Standard设为LVCMOS33
- 驱动强度设置为8mA(满足SRAM驱动需求)
3.2 测试程序设计
我们设计一个简单的SRAM测试模式:向SRAM的连续地址写入递增值,然后回读验证。为直观显示测试结果,使用LED指示状态:
reg [3:0] led_status; reg [15:0] test_data; reg [17:0] test_addr; reg test_fail; always @(posedge clk or posedge rst) begin if(rst) begin test_addr <= 18'd0; test_data <= 16'd0; test_fail <= 1'b0; end else if(test_addr < 18'h3FFFF) begin // 写入阶段 if(!wr_done) begin sram_write(test_addr, test_data); test_data <= test_data + 1; test_addr <= test_addr + 1; end // 回读验证阶段 else if(!rd_done) begin sram_read(test_addr); if(rd_data != test_data) test_fail <= 1'b1; test_data <= test_data + 1; test_addr <= test_addr + 1; end end end // LED状态指示 assign leds = (test_fail) ? 4'b1010 : // 交替闪烁表示错误 (rd_done) ? 4'b1111 : // 全亮表示测试完成 4'b0001; // 单灯亮表示测试中3.3 调试技巧与常见问题
读写数据不一致:
- 检查SRAM供电电压是否稳定(应为3.3V±5%)
- 用示波器观察控制信号时序,确保WE#脉冲宽度>10ns
- 确认FPGA Bank电压设置正确(3.3V LVCMOS)
随机位错误:
- 在PCB布线中,SRAM数据线应等长走线,长度差<100mil
- 添加IO延迟约束,调整set_input_delay/set_output_delay值
- 在SRAM电源引脚附近放置0.1uF去耦电容
下载配置失败:
- 检查CH552G驱动是否安装(设备管理器应显示USB Serial Device)
- 确认开发板跳线设置正确(JTAG模式需短接J5)
- 尝试降低配置时钟频率(在PDS中设置JTAG频率为1MHz)
4. SRAM性能优化进阶
4.1 突发传输实现
标准SRAM每次访问需要完整地址周期,效率较低。通过设计突发传输模式,可提升连续地址访问效率:
reg [3:0] burst_cnt; reg burst_mode; // 突发写控制 always @(posedge clk) begin if(burst_mode) begin if(burst_cnt < 4'd7) begin sram_addr <= sram_addr + 1; sram_dout <= next_data; burst_cnt <= burst_cnt + 1; end else begin burst_mode <= 1'b0; sram_we_n <= 1'b1; end end else if(wr_req) begin burst_mode <= 1'b1; burst_cnt <= 4'd0; sram_addr <= wr_addr; sram_dout <= wr_data; sram_we_n <= 1'b0; end end实测表明,突发模式可使连续读写带宽提升3-4倍,从约40MB/s提升至120MB/s(@50MHz系统时钟)。
4.2 异步时钟域处理
当SRAM接口与用户逻辑处于不同时钟域时,需要添加异步FIFO进行数据缓冲:
写路径:
- 用户逻辑时钟域→同步FIFO→SRAM时钟域
- 使用格雷码实现跨时钟域指针传递
读路径:
- SRAM时钟域→同步FIFO→用户逻辑时钟域
- 添加足够深的FIFO(≥16 entries)避免溢出
4.3 错误检测与纠正
为提高系统可靠性,可添加EDAC(Error Detection And Correction)功能:
汉明码编码:
- 对16位数据添加5位校验位(可纠正1位错误,检测2位错误)
- 校验位存储在SRAM的高位地址空间
读写流程:
- 写入时计算并存储校验位
- 读取时校验并纠正错误
- 统计错误计数,超过阈值触发系统报警
在辐射环境或工业场景中,EDAC可显著降低SRAM软错误率。实测显示,采用汉明码后,MTBF(平均无故障时间)可提升2个数量级。