1. 项目背景与核心目标
这个FPGA项目基于DE2-115开发板,使用IS42S16320D-7 SDRAM芯片实现串口数据环回功能,并整合FIFO缓冲机制。DE2-115是Altera(现Intel)旗下的一款经典FPGA教学开发板,搭载Cyclone IV EP4CE115F29C7 FPGA芯片,板载资源丰富,特别适合数字逻辑设计和嵌入式系统开发。
IS42S16320D-7是ISSI公司生产的16Mbit同步动态随机存取存储器(SDRAM),采用54引脚TSOP-II封装,工作电压3.3V,最高时钟频率143MHz。在FPGA系统中,SDRAM常用于需要大容量存储的应用场景,如图像处理、数据采集等。
注意:SDRAM与SRAM不同,需要定时刷新操作来保持数据,且访问时序较为复杂,这是本项目需要重点处理的技术点。
2. 硬件系统架构设计
2.1 DE2-115开发板资源分配
DE2-115开发板的硬件资源需要合理分配以实现本项目功能:
- FPGA芯片:Cyclone IV EP4CE115F29C7
- 时钟源:50MHz晶振(通过PLL可生成所需频率)
- SDRAM芯片:IS42S16320D-7(16Mbit,4个Bank,每Bank 2K行×256列×16位)
- 串口:使用板载USB-Blaster或外接UART模块
- GPIO:用于状态指示和调试
2.2 SDRAM控制器设计要点
SDRAM控制器是项目的核心模块,需要处理以下关键时序:
- 初始化序列:上电后需要200μs等待时间,然后执行预充电、自动刷新和模式寄存器设置
- 刷新管理:每64ms需要完成8192次自动刷新(约7.8μs一次)
- 命令时序:包括激活(ACTIVE)、读/写(READ/WRITE)、预充电(PRECHARGE)等命令的时序要求
- 行地址到列地址的转换时间(tRCD)
- 预充电到激活的延迟时间(tRP)
verilog复制// SDRAM控制器状态机示例
parameter [3:0]
INIT_WAIT = 4'd0,
INIT_PRE = 4'd1,
INIT_REF1 = 4'd2,
INIT_REF2 = 4'd3,
INIT_MRS = 4'd4,
IDLE = 4'd5,
ACTIVE = 4'd6,
READ = 4'd7,
WRITE = 4'd8,
PRECHARGE = 4'd9,
REFRESH = 4'd10;
2.3 数据流架构
系统数据流采用分层设计:
- 串口接收层:处理UART协议,将串行数据转换为并行
- FIFO缓冲层:使用双时钟FIFO解决跨时钟域问题
- SDRAM控制层:管理SDRAM的读写操作
- 数据处理层:实现环回逻辑和简单数据处理
3. FIFO设计与实现
3.1 异步FIFO结构
由于串口和SDRAM通常工作在不同时钟域,需要使用异步FIFO进行数据缓冲。关键设计考虑:
- 读写指针采用格雷码编码,避免亚稳态
- 空/满标志生成逻辑
- 深度选择:根据数据吞吐量计算,通常选择2^n深度
verilog复制// 异步FIFO的格雷码转换示例
always @(posedge wclk or posedge wrst) begin
if(wrst) begin
wptr <= 0;
wptr_gray <= 0;
end else if(winc && !wfull) begin
wptr <= wptr + 1;
wptr_gray <= (wptr + 1) ^ ((wptr + 1) >> 1);
end
end
3.2 FIFO深度计算
FIFO深度需要根据系统需求精确计算:
- 串口波特率:假设使用115200bps,8N1格式
- 每个字符时间:1/115200 * 10 ≈ 86.8μs
- SDRAM写入时间:考虑tRCD、CL等参数,约需5-7个时钟周期(100MHz时为50-70ns)
- 安全深度:至少能缓冲10个字符以上,建议32或64深度
4. 串口数据环回实现
4.1 UART接收模块
UART接收需要处理以下关键点:
- 起始位检测:采用过采样技术(通常16倍)
- 数据位采样:在数据位中间点采样
- 校验位处理:可选奇偶校验
- 停止位检测:验证帧结束
verilog复制// UART接收状态机
parameter [2:0]
IDLE = 3'b000,
START = 3'b001,
DATA = 3'b010,
PARITY = 3'b011,
STOP = 3'b100;
always @(posedge clk) begin
case(state)
IDLE: if(!rxd) state <= START;
START: if(sample_cnt == 7) state <= DATA;
DATA: if(bit_cnt == 7 && sample_cnt == 15)
state <= has_parity ? PARITY : STOP;
// 其他状态转换...
endcase
end
4.2 环回逻辑设计
数据环回可以采用多种模式:
- 直接环回:接收后立即发送,不经过SDRAM
- 缓冲环回:数据先写入SDRAM,再读出发送
- 处理环回:对数据进行简单处理(如反转、计数)后再发送
本项目采用缓冲环回模式,实现流程:
- 串口接收数据存入FIFO
- FIFO非空时,将数据写入SDRAM指定地址
- 从相同地址读取数据到发送FIFO
- 发送FIFO非空时,通过串口发送数据
5. 时序约束与调试
5.1 跨时钟域处理
系统涉及多个时钟域:
- 串口时钟(通常较低频率)
- SDRAM控制器时钟(100MHz+)
- FPGA内部逻辑时钟
关键同步技术:
- 两级触发器同步器:用于单比特信号跨时钟域
- 异步FIFO:用于数据总线跨时钟域
- 握手协议:用于控制信号跨时钟域
5.2 SDRAM时序约束
在Quartus中需要设置正确的时序约束:
tcl复制# 时钟约束示例
create_clock -name sdram_clk -period 10 [get_ports sdram_clk]
set_input_delay -clock sdram_clk 2 [get_ports sdram_dq[*]]
set_output_delay -clock sdram_clk 1 [get_ports sdram_dq[*]]
5.3 常见问题与调试技巧
-
SDRAM初始化失败:
- 检查电源稳定时间
- 验证初始化序列是否正确
- 测量时钟信号质量
-
数据不一致:
- 检查地址线连接
- 验证时序约束是否合理
- 使用SignalTap II抓取关键信号
-
FIFO溢出:
- 检查读写使能信号
- 增加FIFO深度
- 优化数据流控制
6. 性能优化与扩展
6.1 带宽优化技术
- 突发传输:利用SDRAM的突发模式提高吞吐量
- 命令流水线:重叠执行激活和读写操作
- Bank交错访问:并行操作不同Bank
6.2 功能扩展方向
- 增加DMA控制器:减轻CPU负担
- 实现协议栈:如TCP/IP over SDRAM
- 添加错误检测:CRC校验或ECC
- 支持多串口:构建通信网关
verilog复制// 突发读操作示例
always @(posedge clk) begin
if(burst_cnt > 0) begin
sdram_dq_out <= data_burst[burst_cnt];
burst_cnt <= burst_cnt - 1;
end
end
在实际项目中,我发现在SDRAM控制器设计中,时序的严格满足是关键。特别是在温度变化较大的环境中,需要留出足够的时序余量。建议在完成基本功能后,进行高低温测试验证系统稳定性。
