带有正弦信号发生器的MCU设计
-
- 一、设计目的
- 二、设计过程
-
- [2.1 系统级设计(含顶层管脚定义、软硬件划分等)](#2.1 系统级设计(含顶层管脚定义、软硬件划分等))
-
- [2.1.1 MCU8051 顶层管脚定义](#2.1.1 MCU8051 顶层管脚定义)
- [2.1.2 软硬件功能划分](#2.1.2 软硬件功能划分)
- [2.1.3 FPGA 器件选型](#2.1.3 FPGA 器件选型)
- [2.2 RTL 级设计与仿真](#2.2 RTL 级设计与仿真)
-
- [2.2.1 RTL 代码文件](#2.2.1 RTL 代码文件)
- [2.2.2 方法一:RTL 通过增加相位寄存器,由 C 代码控制偏移](#2.2.2 方法一:RTL 通过增加相位寄存器,由 C 代码控制偏移)
-
- [2.2.2.1 正弦波生成模块(SinWave.v)](#2.2.2.1 正弦波生成模块(SinWave.v))
- [2.2.2.2 SFR 模块(MCU8051_sfr.v)](#2.2.2.2 SFR 模块(MCU8051_sfr.v))
- [2.2.2.3 顶层模块(MCU8051_top.v)](#2.2.2.3 顶层模块(MCU8051_top.v))
- [2.2.3 方法二:硬件 RTL 代码实现相位偏移的调整](#2.2.3 方法二:硬件 RTL 代码实现相位偏移的调整)
-
- [2.2.3.1 正弦波生成模块(SinWave.v)](#2.2.3.1 正弦波生成模块(SinWave.v))
- [2.2.3.2 SFR 模块(MCU8051_sfr.v)](#2.2.3.2 SFR 模块(MCU8051_sfr.v))
- [2.2.3.3 顶层模块(MCU8051_top.v)](#2.2.3.3 顶层模块(MCU8051_top.v))
- [2.2.4 实现相位调节方法总结](#2.2.4 实现相位调节方法总结)
- [2.2.5 功能仿真](#2.2.5 功能仿真)
- [2.3 综合与静态时序分析](#2.3 综合与静态时序分析)
-
- [2.3.1 特殊提要](#2.3.1 特殊提要)
- [2.3.2 约束文件(input delay / output delay 均为 2 ns)](#2.3.2 约束文件(input delay / output delay 均为 2 ns))
- [2.3.3 含 ILA 的使用面积分析](#2.3.3 含 ILA 的使用面积分析)
- [2.3.4 含 ILA 的最大路径 Slack](#2.3.4 含 ILA 的最大路径 Slack)
- [2.3.5 去除 ILA 之后的时序分析](#2.3.5 去除 ILA 之后的时序分析)
- [2.3.6 对比总结](#2.3.6 对比总结)
- [2.4 布局布线后的仿真波形(毛刺分析)](#2.4 布局布线后的仿真波形(毛刺分析))
- [2.5 使用逻辑分析仪验证设计正确性](#2.5 使用逻辑分析仪验证设计正确性)
- 三、结论
- 四、心得体会
- 参考文献
福州大学物理与信息工程学院 · 集成电路系统设计基础报告
一、设计目的
采用 DW8051 IP 核设计一个 MCU,输出两路同频率、相位差可调的正弦波。
二、设计过程
2.1 系统级设计(含顶层管脚定义、软硬件划分等)
2.1.1 MCU8051 顶层管脚定义
系统硬件实现基于 ZynQ-7020 开发板,具体型号为 xc7z020clg400-2。顶层管脚定义整体包含五个输入输出信号:

clk:系统时钟(50 MHz)key[1:0]:两路按键输入,实现相位步进变化rst_n:全局异步低电平复位sin_data[7:0]:第一路正弦波 8 位数据输出sin_data_delay[7:0]:第二路正弦波 8 位数据输出
2.1.2 软硬件功能划分
实验目标功能:在同一时钟域下,输出两路频率相同、相位差可编程设置的正弦波数字信号。
方法一:基于 C 语言实现相位偏移
硬件部分(Verilog RTL):
由曾益斌老师提供的 DW8051 IP 核搭建 51 单片机硬件系统,包括 CPU、寄存器、定时器、控制器等组件(通过 .v 文件实现)。通过 lab1 的功能仿真,确定可通过 P1 输出 0x55、0x56 两段信号,验证 51 软核已经搭建成功。
增加四个特殊功能寄存器(32 位),用于设定相位差:相位差参数配置函数将预设的相位偏移值(对应 0~359° 的相位差)拆分后,分别写入 4 个相位控制 SFR 寄存器,拼接成 32 位 PHASE,实现对两路正弦波相位差的精准设置。例如,若需设置 90° 相位差,可向相位寄存器写入 0x40000000(32 位相位偏移字)。
软件部分(Keil C51/Asm):
通过 C 语言赋值语句,向 4 个频率控制 SFR 寄存器写入对应数值,拼接成 32 位 FTW,实现对正弦波输出频率的设定。360° 对应 DDS 相位累加器的全量程(32 位寄存器全量程为 2³²),细分精度极高(远高于 1°),能精准实现 1° 步进(甚至更小步进)。
c
sfr SIN_FTW1 = 0xA9;
sfr SIN_FTW2 = 0xAA;
sfr SIN_FTW3 = 0xAB;
sfr SIN_FTW4 = 0xAC;
sfr SIN_PHASE1 = 0xAE; // 相位低8位
sfr SIN_PHASE2 = 0xAF;
sfr SIN_PHASE3 = 0xB0;
sfr SIN_PHASE4 = 0xB1; // 相位高8位
sfr SIN_MODE = 0xAD;
void set_phase(unsigned long phase)
{
SIN_PHASE1 = phase;
SIN_PHASE2 = phase >> 8;
SIN_PHASE3 = phase >> 16;
SIN_PHASE4 = phase >> 24;
}
void main()
{
// 设置频率
SIN_FTW1 = 0x10;
SIN_FTW2 = 0x00;
SIN_FTW3 = 0x00;
SIN_FTW4 = 0x00;
// 设置相位 90°
set_phase(0x40000000);
SIN_MODE = 1;
while(1);
}
方法二:基于硬件 RTL 的相位偏移实现
硬件部分(Verilog RTL):
由曾益斌老师提供的 DW8051 IP 核搭建 51 单片机硬件系统,通过 lab1 的功能仿真验证 51 软核已成功搭建。
自行设计采用按键输入的方式控制相移方向和相移量,输出一路相位可调的延迟正弦波,采用 DDS 相位偏移技术实现 0°~359° 连续可调、1° 步进精度。通过两个按键实现相位增减控制,所有调节逻辑在 FPGA 硬件层完成,不影响 MCU 程序运行。
软件部分(Keil C51/Asm):
由 Keil 软件以 C 语言编程 51 单片机实现功能,hex2bin 转换,再转换为固定格式的代码,贴入 51 内核文件 irom.v 中,替换软件程序代码。
c
#include<reg51.h>
sfr SIN_MODE = 0xAD;
sfr SIN_FTW_1 = 0xAC;
sfr SIN_FTW_2 = 0xAB;
sfr SIN_FTW_3 = 0xAA;
sfr SIN_FTW_4 = 0xA9;
void set_sinwave()
{
SIN_MODE = 0x00; // rst_n = 0
SIN_FTW_1 = 0x10;
SIN_FTW_2 = 0x00;
SIN_FTW_3 = 0x00;
SIN_FTW_4 = 0x00;
SIN_MODE = 0x01; // rst_n = 1
}
void main()
{
set_sinwave();
while(1);
}
2.1.3 FPGA 器件选型
本设计采用 Xilinx xc7z020clg400-2,野火开发板(ZynQ-7020)进行设计。

2.2 RTL 级设计与仿真
2.2.1 RTL 代码文件

以上 RTL 代码文件均为 DW8051 IP 核所提供,各个模块的功能可以通过文件名识别。接下来仅介绍本次实验设计中所修改的 RTL 代码文件。
2.2.2 方法一:RTL 通过增加相位寄存器,由 C 代码控制偏移
2.2.2.1 正弦波生成模块(SinWave.v)
verilog
module SinWave(clk, rst_n, FTW, PHASE_OFFSET, SinWaveData);
input clk;
input rst_n;
input [31:0] FTW;
input [31:0] PHASE_OFFSET;
output [7:0] SinWaveData;
reg [31:0] FACCResult;
always@(posedge clk or negedge rst_n)
if(~rst_n)
FACCResult <= 0;
else
FACCResult <= FACCResult + FTW;
wire [31:0] phase_final = FACCResult + PHASE_OFFSET;
RAM RAM_inst(
.clk(clk),
.rst_n(rst_n),
.addr(phase_final[31:23]),
.data_out(SinWaveData)
);
endmodule
- 接收 SFR 控制模块传递的 32 位 FTW(频率控制字),通过 32 位相位累加器进行相位累加,生成原始相位信号;
- 接收 32 位 PHASE(相位偏移字),将其与原始相位累加结果叠加,得到最终的相位控制信号;
- 通过正弦波查找表(RAM),将最终相位信号转换为 8 位正弦波幅值信号,输出稳定的正弦波。
2.2.2.2 SFR 模块(MCU8051_sfr.v)
verilog
// 仅展示新增的修改部分
module MCU8051_sfr(
input clk,
input rst_n,
input [7:0] sfr_addr,
input [7:0] sfr_data_out,
input sfr_wr,
output [7:0] sin_data,
output [7:0] sin_data_delay // 相位延迟波
);
reg [31:0] PHASE; // 32位相位偏移寄存器
// 相位寄存器 AE AF B0 B1
assign sfr_cs[5] = (sfr_addr == 8'hAE) ? 1 : 0;
assign sfr_cs[6] = (sfr_addr == 8'hAF) ? 1 : 0;
assign sfr_cs[7] = (sfr_addr == 8'hB0) ? 1 : 0;
assign sfr_cs[8] = (sfr_addr == 8'hB1) ? 1 : 0;
// ========= 相位 PHASE 写操作 =========
always@(posedge clk or negedge rst_n)
if(~rst_n) PHASE[7:0] <= 8'h00;
else if(sfr_cs[5] & sfr_wr) PHASE[7:0] <= sfr_data_out;
always@(posedge clk or negedge rst_n)
if(~rst_n) PHASE[15:8] <= 8'h00;
else if(sfr_cs[6] & sfr_wr) PHASE[15:8] <= sfr_data_out;
always@(posedge clk or negedge rst_n)
if(~rst_n) PHASE[23:16] <= 8'h00;
else if(sfr_cs[7] & sfr_wr) PHASE[23:16] <= sfr_data_out;
always@(posedge clk or negedge rst_n)
if(~rst_n) PHASE[31:24] <= 8'h00;
else if(sfr_cs[8] & sfr_wr) PHASE[31:24] <= sfr_data_out;
always@(posedge clk or negedge rst_n)
if(~rst_n) SinControl <= 8'h00;
else if(sfr_cs[4] & sfr_wr) SinControl <= sfr_data_out;
assign sin_rst_n = SinControl[0];
// 相位可调波(相位来自51写的PHASE)
SinWave SinWave_delay(
.clk(clk),
.rst_n(sin_rst_n),
.FTW(FTW),
.PHASE_OFFSET(PHASE), // 51 控制相位
.SinWaveData(sin_data_delay)
);
- 接收 8051 内核发送的 SFR 地址、数据及写使能信号,解析并存储频率控制字(FTW)与相位偏移字(PHASE);
- 例化两个正弦波生成模块(SinWave),分别用于生成原始正弦波与相位可调正弦波;
- 将软件配置的 32 位 PHASE 相位偏移字传递至相位可调正弦波模块,实现原始相位与偏移相位的叠加,完成相位差控制。
2.2.2.3 顶层模块(MCU8051_top.v)
顶层模块作为硬件系统的枢纽,承担模块例化、信号分发与调试功能,具体职责:
- 例化 8051 内核(DW8051_core)、SFR 控制模块(MCU8051_sfr)、RAM/ROM 模块及在线调试模块(ILA),实现各模块的协同工作;
- 传递系统时钟、复位信号及各模块间的交互信号,确保软件指令(SFR 地址、数据)准确传递至 SFR 控制模块;
- 引出原始正弦波(sin_data)与相位可调正弦波(sin_data_delay)输出端口,同时通过 ILA 模块观测两路波形,便于调试与验证相位差效果。
2.2.3 方法二:硬件 RTL 代码实现相位偏移的调整
2.2.3.1 正弦波生成模块(SinWave.v)
SinWave.v 模块是正弦波生成的底层模块,负责根据频率控制字(FTW)生成原始正弦波信号。本次修改主要新增相位偏移字输入接口,适配相移正弦波的生成需求,不改变原有正弦波生成逻辑。

注: 布局布线后产生了一个 DSP48E1 模块,意味着 Vivado 综合器在代码中识别出了乘法、乘加等运算,并自动将其映射到了 FPGA 芯片内部专用的 DSP48E1 硬核资源(Digital Signal Processor Slice)上。
- 接口适配 :新增 32 位相位偏移字输入端口
PHASE_OFFSET;保持原有FTW、clk、rst_n端口不变;输出端口SinWaveData保持 8 位宽度。 - 相位累加与波形生成 :32 位相位累加器根据 FTW 累加,再将累加结果与
PHASE_OFFSET叠加,得到最终相位;通过正弦波查找表(RAM)将最终相位转换为 8 位幅值信号。 - 信号稳定性保障:优化相位叠加后的信号处理逻辑,确保叠加后的相位信号无失真,波形平滑、稳定。
2.2.3.2 SFR 模块(MCU8051_sfr.v)

MCU8051_sfr 模块是正弦波生成的核心控制模块,本次修改主要新增相移正弦波的相位偏移逻辑。
- 新增端口定义 :新增 32 位输入端口
phase_offset,用于接收顶层模块传递的精准相位偏移字;新增输出端口sin_data_2,用于输出相移正弦波信号。 - 相位偏移实现逻辑 :将原始正弦波生成模块(SinWave.v)输出的 32 位相位累加结果,与顶层传递的
phase_offset进行叠加,核心逻辑为:最终相位 = 原始相位 + 相位偏移字。 - 双路正弦波生成 :例化两个 SinWave 模块,一路生成原始正弦波(输出
sin_data),另一路生成相移正弦波(输出sin_data_2),两路同频率、同幅值,仅相位存在精准偏移。 - 信号同步保障:相位叠加逻辑采用与系统时钟同步的设计,确保相位偏移调节实时响应,避免信号错位或抖动。
2.2.3.3 顶层模块(MCU8051_top.v)
顶层模块本次修改主要新增按键控制逻辑、相位控制寄存器及相位延迟波形的信号传递。
- 新增输入输出端口 :新增两个按键输入端口(
key_inc、key_dec),分别用于控制相位偏移的增加与减少;新增输出端口sin_data_2。 - 相位控制寄存器设计 :新增 9 位相位控制寄存器
reg [8:0] phase_degree(取值范围 0~359,对应 0°~359° 相位偏移量,实现 1° 步进精准调节)。 - 按键控制逻辑 :设计按键同步消抖电路(两级寄存器同步处理),避免按键抖动导致误判。按下
key_inc时phase_degree + 1(最大 359),按下key_dec时phase_degree - 1(最小 0)。 - 相位偏移量换算 :根据
phase_degree的数值,自动计算标准 32 位 DDS 相位偏移字,换算公式为:
相位偏移字 = phase_degree × 2 32 360 \text{相位偏移字} = \text{phase\_degree} \times \frac{2^{32}}{360} 相位偏移字=phase_degree×360232
- 模块信号 :修改 MCU8051_sfr 模块的例化参数,新增
sin_data_2输出端口的连接,将换算后的 32 位相位偏移字传递至 MCU8051_sfr 模块。

调试信号配置 :修改 ILA 在线调试模块的探针配置,新增 sin_data_2 信号的观测通道,可实时观测原始正弦波与相移正弦波的波形对比。
2.2.4 实现相位调节方法总结
相位调节采用 DDS 相位偏移法实现,通过在 32 位相位累加器输出结果上叠加一个可配置的相位偏移字,实现 0°~359° 范围内 1° 步进的连续相位调节,调节精度与范围完全满足系统要求。
系统在顶层模块中加入两个物理按键,分别用于相位增加与相位减少。按键信号经 FPGA 内部同步处理后,直接控制相位偏移度数 phase_degree(0~359),系统自动将其转换为标准 32 位 DDS 相位偏移量:
phase_offset = phase_degree × 2 32 360 \text{phase\_offset} = \text{phase\_degree} \times \frac{2^{32}}{360} phase_offset=phase_degree×360232
该值送入延迟波形的 DDS 模块,实现无抖动、高精度、全周期的相位调节。
整体设计不修改 8051 内核程序,仅通过 RTL 硬件逻辑实现两路正弦波的生成与相位控制,结构清晰、控制灵活、相位调节稳定,满足数字波形生成系统的设计要求。
2.2.5 功能仿真


行为仿真结果验证了 90°、180° 相移的正确性,两路正弦波同频率,相位差符合设计预期。
2.3 综合与静态时序分析
2.3.1 特殊提要
在时序分析过程中发现,ILA 的加入会严重影响保持时序。查阅相关论文后确认 ILA 确实存在影响时序收敛的问题。因此以下分析分两类讨论:含 ILA 与去除 ILA 两种情况下的时序分析。
2.3.2 约束文件(input delay / output delay 均为 2 ns)
tcl
# ==============================
# 时序约束
# ==============================
# 1. 时钟约束(50 MHz)
create_clock -name clk -period 20 [get_ports clk]
# 2. 复位是异步的 → 设为虚假路径
set_false_path -from [get_ports rst_n]
# 3. 输入按键约束
set_input_delay -max 2 -clock clk [get_ports key_*]
set_input_delay -min 0.5 -clock clk [get_ports key_*]
# 4. 输出数据约束
set_output_delay -max 2 -clock clk [get_ports sin_data*]
set_output_delay -min 0.5 -clock clk [get_ports sin_data*]
set_output_delay -max 2 -clock clk [get_ports sin_data_delay*]
set_output_delay -min 0.5 -clock clk [get_ports sin_data_delay*]
2.3.3 含 ILA 的使用面积分析


含 ILA 时资源占用显著增加(参见使用面积分析报告图)。
2.3.4 含 ILA 的最大路径 Slack


在 Vivado 的布局布线后时序分析报告中:
- 最差保持时序裕量(WHS) :0.062 ns(来自
ila_0)
ILA 内部的 Hold 裕量吃紧原因分析:
- ILA 核心是环形缓冲区,地址指针寄存器(RADDR)路径为:时钟 → 地址寄存器 → 地址译码 → 地址寄存器,几乎没有组合逻辑,路径延迟极低;
- 工具为实现 ILA 高速捕获,将相关寄存器放置于物理位置极近处,进一步减小布线延迟,导致数据路径延迟刚好卡在 Hold 要求边缘。
解决方法:添加输入流水线寄存器


由图可见,最差 Hold 裕量从之前的 0.062ns 提升到了 0.072ns,说明改 Input Pipe Stages 生效了,路径延迟增加,Hold 裕量有微小提高。
除了 ila_0,现在还出现了 dbg_hub 的路径,这是 ILA IP 依赖的调试集线器,它和 ILA 一样,都是 FPGA 调试基础设施的一部分,不是主设计的路径。这些路径全是 ILA/DBG_HUB 内部的存储地址、数据通路,天生路径极短,Hold 裕量吃紧是正常现象。
这些紧时序路径,改 IP 设置没法直接消除,因为它们来自 ILA/DBG_HUB 的内部控制逻辑,不在能手动配置的参数里。而且,它们是开启 Input Pipe Stages 后,IP 内部逻辑被触发、开始参与时序分析才暴露出来的,不是新增的 "问题",而是之前没被分析到的 "隐藏路径"。
将 ILA 的 Input Pipe Stages 设置为 1,在输入路径里加一级打拍寄存器,增加路径延迟,最差 Hold 裕量从 0.062 ns 提升到 0.072 ns。
此外,修改后还暴露出 dbg_hub 的路径,这是 ILA IP 依赖的调试集线器,是 FPGA 调试基础设施的一部分,这些路径来自 ILA/DBG_HUB 的内部控制逻辑,无法通过手动配置参数消除,属于正常现象。
2.3.5 去除 ILA 之后的时序分析


容易发现,此时的slack裕量已经提升到0.132ns,路径是IP核中Serial串口模块的寄存器路径相关,与个人设计的内容已无关联,故不再进行调整以提升时序裕量。
加粗样式
去除 ILA 后,最差 Hold 裕量提升至 0.132 ns,路径为 IP 核中 Serial 串口模块的寄存器路径相关,与个人设计内容无关,故不再进行调整。
2.3.6 对比总结
| 指标 | 指标名称 | 无 ILA | 有 ILA | 变化说明 |
|---|---|---|---|---|
| Setup | Worst Negative Slack (WNS) | 3.930 ns | 3.292 ns | 裕量下降 0.638 ns,仍远大于 0,完全安全 |
| Setup | Total Negative Slack (TNS) | 0.000 ns | 0.000 ns | 所有建立路径都满足,无变化 |
| Setup | Number of Failing Endpoints | 0 | 0 | 无建立时间违规 |
| Setup | Total Number of Endpoints | 1912 | 5537 | 加入 ILA 后,时序分析路径总数大幅增加 |
| Hold | Worst Hold Slack (WHS) | 0.132 ns | 0.062 ns | 最差保持裕量下降 0.07 ns,但仍为正 |
| Hold | Total Hold Slack (THS) | 0.000 ns | 0.000 ns | 所有保持路径都满足,无变化 |
| Hold | Number of Failing Endpoints | 0 | 0 | 无保持时间违规 |
| Hold | Total Number of Endpoints | 1912 | 5521 | 路径总数因 ILA 的加入增加 |
| Pulse Width | Worst Pulse Width Slack (WPWS) | 9.500 ns | 8.870 ns | 裕量下降 0.63 ns,仍非常充足 |
| Pulse Width | Total Pulse Width Negative Slack (TPWS) | 0.000 ns | 0.000 ns | 无脉冲宽度违规 |
| Pulse Width | Number of Failing Endpoints | 0 | 0 | 无脉冲宽度违规 |
| Pulse Width | Total Number of Endpoints | 699 | 2722 | 路径总数随 ILA 的加入同步增加 |
| 整体结论 | All user specified timing constraints are met. | 满足 | 满足 | 加入 ILA 后,所有时序约束仍全部满足 |
表1 加入 ILA 前后对比
2.4 布局布线后的仿真波形(毛刺分析)

布局布线后的仿真得到的信号波形存在许多毛刺。但是信号上整体符合同频率且sin_data_delay比sin_data相位滞后180°的情况,所以可视作验证成功。
毛刺现象无法避免。这是由于每一组输出信号下的8根线的Arrival Time不同,在本系统(低速系统)中属于正常现象,每一位信号到达该端口时,路径延时、器件延时等都不相同,所以他们到输出的时间都不一样。当输出值改变时,信号不会同时到达,此时输出的数据就会和理论值有差别。
此现象可通过后级滤波器滤除高频分量解决。但在高速系统中,毛刺现象是一个很致命的问题,消除毛刺非常繁琐,需采用数字滤波器结合自适应滤波等方法精确地识别并滤除毛刺。
信号整体符合同频率且 sin_data_delay 比 sin_data 相位滞后 180° 的情况,可视作验证成功。
毛刺现象原因分析:
毛刺现象无法避免。由于每一组输出信号下的 8 根线的 Arrival Time 不同,在本系统(低速系统)中属于正常现象。每一位信号到达端口时,路径延时、器件延时等都不相同,当输出值改变时,信号不会同时到达,此时输出的数据就会和理论值有差别。
此现象可通过后级滤波器滤除高频分量解决。但在高速系统中,毛刺现象非常致命,消除毛刺需要采用数字滤波器结合自适应滤波等方法精确识别并滤除毛刺。
2.5 使用逻辑分析仪验证设计正确性


为减少文章篇幅,此处仅展示两个相移图像,由逻辑分析仪的输出结果可以看出,两路正弦波同频率,相位差90°、180°,并且可以1°为分辨率实现步进,范围1-359° 设计实现了基本要求功能。
逻辑分析仪不会看到毛刺,原因是逻辑分析仪再时钟上升沿进行采集,而时钟上升沿到来时,信号已经稳定,所以不会采集到毛刺。
通过逻辑分析仪抓取的波形(90°、180° 相移)可以看出:
- 两路正弦波同频率;
- 相位差分别为 90°、180°;
- 可以 1° 为分辨率实现步进,范围 1°~359°;
- 设计实现了基本要求功能。
逻辑分析仪不会看到毛刺的原因:逻辑分析仪在时钟上升沿进行采集,而时钟上升沿到来时信号已经稳定,所以不会采集到毛刺。
三、结论
最快速度分析




板上晶振为 50 MHz,调用锁相环(PLL)IP 核并例化可使用更高主频。通过逐渐提升主频并进行静态时序仿真,得到各频率下的时序情况:




| 主频 | 时序状态 | 正弦波输出频率 |
|---|---|---|
| 50 MHz | 通过(Slack > 0) | ~1.422 MHz |
| 80 MHz | 通过(Slack > 0) | ~2.500 MHz |
| 98 MHz | 通过(Slack = 0.074 ns,恰好满足) | ~3.144 MHz |
| 100 MHz | 不通过(Slack < 0) | --- |
本设计的最大工作频率为 98 MHz ,正弦波形的频率最高可达 3.144 MHz。
通过按键可实时调节正弦波频率与相位,第二路波形与第一路保持频率同步,相位差可实时调节,以 1° 为步进连续变化。
四、心得体会
本次实验过程经历了系统级设计、RTL 级设计与仿真、逻辑综合、静态时序分析、布局布线、布局布线后仿真、下载到 FPGA 并通过逻辑分析仪验证等完整流程。
关于时序收敛:
本次实验针对时序收敛的考察尤为深入,关注 Setup、Hold、Pulse width 等关键时序约束的满足:
- Setup 违例:往往表现为信号未能及时到达触发器输入端;
- Hold 违例:多因信号过早变化导致采样不稳定;
- Pulse width 违例:常因时钟信号占空比失衡或门控时钟路径过长引发,需通过调整时钟树结构或插入缓冲器优化。
关于高频极限:
在高频下观察到的时序余量(Slack)虽仍为正值,但随着主频提升,时序余量显著收窄,对布线延迟与工艺偏差的敏感性明显增强,提示在实际工程部署中需预留更充足的时序裕度。
关于 IP 核应用:
通过本次实验,学会了可以通过调用 IP 核来减少设计的时间成本;可以根据设计的需求来增加或裁剪 IP 核的功能;可以通过锁相环逐渐增加系统频率再进行静态时序仿真来找到系统的极限频率,进而提高系统运行速度。
参考文献
-
R. Hale and B. Hutchings, "Distributed-Memory Based FPGA Debug: Design Timing Impact," in 2018 International Conference on Field-Programmable Technology (FPT) , IEEE, Dec. 2018, pp. 350--353. doi: 10.1109/FPT.2018.00071
-
B. L. Hutchings and J. Keeley, "Rapid Post-Map Insertion of Embedded Logic Analyzers for Xilinx FPGAs," 2014 IEEE 22nd Annual International Symposium on Field-Programmable Custom Computing Machines , Boston, MA, USA, 2014, pp. 72--79. doi: 10.1109/FCCM.2014.29