☰
FPGA数字系统设计实验报告指南:DCM与VGA显示实现
2026/11/2 12:04:53 网站建设 项目流程

简介:这份资源是面向电子信息、计算机等专业学生的FPGA数字系统设计实验报告,对应XDU软工院选课程第二次实验,适合正在学习FPGA开发、需要完成ISE工具实操与实验报告撰写的读者参考。压缩包内共1个docx文档,约219KB,完整记录了数字时钟管理与VGA显示两个实验的原理、步骤、测试结果与总结。内容围绕ISE软件的设计与仿真流程展开,涵盖Clocking Wizard IP核配置、DCM分频倍频与相移设置、Verilog顶层模块例化、综合与RTL电路图查看,以及VGA时序宏定义、扫描原理和Spartan6开发板配置等关键环节,可帮助读者理解同步时序设计与IP核调用方法,并对照完成自己的实验报告与工程搭建。目前已有193人学习,适合作为课程实验的参考范例与排错对照材料。

1. 从一份实验报告说起:FPGA 数字系统设计到底要交什么

很多同学第一次交 FPGA 实验报告,卡住的不是代码,而是“不知道一份合格的报告该长什么样”。带过几轮课程设计之后我发现,真正拉开差距的往往不是谁写的 Verilog 更花哨,而是谁把需求、原理、实现、验证这条链路讲清楚了。这份基于 ISE 的数字系统设计实验,围绕数字时钟管理(DCM)和 VGA 显示两个实验展开,目标很明确:熟悉 ISE 的设计与仿真流程、学会 Xilinx IP 核的生成与调用、掌握 DCM 的配置方法,并借助开发板上的 VGA 接口把设计真正跑起来。它适合正在做 FPGA 课程设计、需要交一份完整实验报告的学生,也适合想快速摸清 ISE 老流程的从业者当作参考模板。下面按“需求怎么立、方案怎么设计、代码怎么落地、坑怎么避、最后怎么验收”的顺序拆开讲。

2. 需求与选型:两个实验各自要解决什么问题

2.1 数字时钟管理实验的需求边界

这个实验的核心诉求不是“生成一个时钟”,而是理解同步时序电路对时钟质量的要求。同步电路基于时钟触发沿工作,对周期、占空比、延时和抖动都有要求,所以大型设计一般用全局时钟资源驱动主时钟,把抖动和延迟压到最低。Xilinx 器件里的 DCM 就是干这件事的专用模块,能完成分频、倍频、去抖动和相移。

落到可验收的指标上,这个实验要交付的是:输入 100MHz,输出 CLK_OUT1 为 50MHz(二分频)、CLK_OUT2 为 200MHz(二倍频)且相位偏移 180 度,并通过仿真波形证明频率关系和相位关系都成立。这里有个容易被忽略的点——200MHz 已经接近甚至超过部分低端器件的 DCM 输出上限,选型阶段就要确认目标器件(本实验是 Spartan-6 系列的 xc6slx16)的 DCM 是否支持这个输出频率,否则后面综合能过、上板却出问题,属于典型的“仿真对、硬件翻车”。

2.2 VGA 显示实验的需求边界

VGA 实验要解决的是“把数字信号变成显示器能认的时序”。开发板上有 15 针 VGA 接口,显示器靠电子束从左到右水平扫描、从上到下垂直扫描逐点成像,扫描足够快时人眼看到的就是一整幅图。设计要做的就是产生行同步(HS)、场同步(VS)以及 RGB 三路颜色信号,让显示器正确识别。

验收指标是:以 100MHz 输入经 DCM 得到 65MHz 像素时钟,驱动 SVGA 时序,拨动开关 SW0 能在两种显示状态间切换。65MHz 对应的是 1024×768 级别的 SVGA 分辨率,这个像素时钟不是随便定的,它和行场时序参数是一套绑定的关系,后面会给出具体数值。

2.3 为什么选 ISE 而不是更新的工具链

这是很多人会问的选型问题。原因很实际:目标器件是 Spartan-6,而较新的 Vivado 对 Spartan-6 的支持并不完整,ISE 才是这套器件的原生工具链。选型不是追新,而是跟着器件走。ISE 的流程是新建工程 → 设计输入 → 综合(Synthesize-XST)→ 实现(Implement Design)→ 生成比特流 → 下载配置,这条链路虽然老,但每一步都能看到中间结果,比如综合后能打开 RTL Schematic 看电路结构,对理解设计非常有帮助。对课程设计来说,这种“看得见中间态”的特性反而是优点。

3. 总体设计:DCM 与 VGA 两条链路的模块划分

3.1 数字时钟管理实验的模块结构

这个实验的结构很轻,只有一个顶层模块加一个 IP 核。顶层top负责端口定义和例化 DCM,DCM 由 Clocking Wizard 生成,输入 100MHz,输出两路时钟。模块职责划分如下:

模块类型职责
topVerilog 顶层端口定义、例化 DCM、引出输出时钟
dcm_coreIP 核(Clocking Wizard)时钟分频、倍频、相移
top_tbVerilog Test Fixture产生激励、驱动仿真

顶层不写任何逻辑,只做连线,这是推荐的做法——把时钟管理完全交给 IP 核,顶层保持干净,后面换器件或改频率只需要重新配置 IP,不用动顶层代码。

3.2 VGA 显示实验的模块结构

VGA 实验是典型的分层设计,四个源文件各司其职:

模块文件职责
时序宏定义SVGA_DEFINES.v定义行场同步的计数值、前后沿等参数
时序产生vga_timing.v产生 HS、VS、行场计数、有效显示区信号
颜色生成color_gen.v根据计数和开关状态输出 RGB
时钟管理dcm_dsgn.xco100MHz 输入转 65MHz 像素时钟
顶层VGA_display.v例化上述三个子模块并连线

这种划分的好处是时序和颜色解耦:改分辨率只动宏定义和时序模块,改显示内容只动颜色模块,互不干扰。顶层VGA_display.v只负责把 DCM 输出的 65MHz 接到时序模块,再把时序模块的有效显示信号和坐标接到颜色模块。

3.3 时钟域与复位策略

两个实验都涉及时钟,需要提前想清楚时钟域。DCM 实验里 CLK_OUT1 和 CLK_OUT2 是两个不同频率的时钟,如果后续逻辑要跨这两个域传信号,必须做同步处理,不能直接连。VGA 实验里像素时钟是 65MHz,而开关输入是异步的,拨动开关的瞬间可能落在任意时刻,稳妥的做法是对 SW0 做两级寄存器同步再使用,避免亚稳态。这类细节报告里不一定要写全,但设计时心里要有数,答辩被问到能答上来就是加分项。

4. 关键实现:从 IP 核配置到 VGA 时序落地

4.1 DCM IP 核的生成与顶层例化

在 ISE 里通过 Project → New Source 选择 IP(CORE Generator & Architecture Wizard),文件名dcm_core,然后在向导里选 FPGA Features and Design → Clocking → Clocking Wizard。第一页保持输入频率 100MHz,第二页把 CLK_OUT1 设为 50MHz、CLK_OUT2 设为 200MHz、相位 180 度。生成后通过 View HDL Instantiation Template 拿到例化模板,粘到顶层里改端口名。顶层大致长这样:

// 顶层模块:例化 DCM,引出两路输出时钟 module top( input clk, // 板载 100MHz 输入时钟 input rst_n, // 低电平复位 output clk_out1, // 50MHz,0 度相位 output clk_out2 // 200MHz,180 度相位 ); // DCM 例化,端口名与 Clocking Wizard 生成的模板保持一致 dcm_core u_dcm ( .CLK_IN1 (clk), .CLK_OUT1 (clk_out1), .CLK_OUT2 (clk_out2), .RESET (~rst_n), .LOCKED () // 锁定指示,本实验不观察,留空 ); endmodule

这段代码的关键在于LOCKED信号。DCM 上电后需要一段时间锁定输出时钟,锁定前输出是不稳定的,严谨的设计会用LOCKED作为后续逻辑的复位释放条件。本实验只观察波形,可以留空,但如果要上板驱动实际逻辑,忽略LOCKED就是给自己埋雷。另外RESET是高有效,所以用~rst_n取反,这个极性搞反会导致 DCM 一直处于复位状态、输出全无,是新手常踩的坑。

4.2 测试激励的编写

仿真文件用 Verilog Test Fixture 生成,ISE 会自动例化被测模块并给出基本信号,需要补的是时钟翻转逻辑:

// 测试激励:100MHz 时钟,周期 10ns,每 5ns 翻转一次 initial begin clk = 0; rst_n = 0; #100 rst_n = 1; // 复位保持 100ns 后释放 end always #5 clk = ~clk; // 半周期 5ns,对应 100MHz

#5翻转意味着半周期 5ns、全周期 10ns,正好是 100MHz,和 DCM 输入频率对齐。复位保持 100ns 是为了让 DCM 有足够时间完成锁定,仿真里如果复位太短,可能看到输出时钟还没稳定就开始观察,波形会显得“莫名其妙”。仿真时把 view 切到 Simulation,选中测试文件,双击 Simulate Behavioral Model 启动 ISE Simulator,观察 clk_out1 是否为 clk 的 1/2、clk_out2 是否为 2 倍且相位差 180 度。

4.3 VGA 时序参数的宏定义

VGA 的时序是一组固定数值,用宏定义集中管理最清晰。以 65MHz 像素时钟、1024×768 为例,典型参数如下:

// SVGA_DEFINES.v:1024x768 @ 65MHz 的行场时序参数 `define H_ACTIVE 1024 // 行有效像素 `define H_FP 24 // 行前沿 `define H_SYNC 136 // 行同步脉冲宽度 `define H_BP 160 // 行后沿 `define H_TOTAL 1344 // 行总周期 = 有效+前沿+同步+后沿 `define V_ACTIVE 768 // 场有效行数 `define V_FP 3 // 场前沿 `define V_SYNC 6 // 场同步脉冲宽度 `define V_BP 29 // 场后沿 `define V_TOTAL 806 // 场总周期

这些数字不是拍脑袋来的,行总周期 1344 乘以像素时钟 65MHz 约等于 87.4kHz 的行频,场总周期 806 行对应约 60Hz 的刷新率,正好落在显示器能接受的范围内。改分辨率时这四个量(有效、前沿、同步、后沿)必须成套改,只改一个会导致画面偏移或不同步。宏定义放在单独文件里,时序模块用`include "SVGA_DEFINES.v"引入,这样颜色模块和时序模块共享同一套坐标基准,不会出现“时序按 1024 算、颜色按 800 画”的错位。

4.4 时序产生模块的核心逻辑

vga_timing.v的本质是两个计数器加比较逻辑:

// 行场计数器:产生同步信号与有效显示区指示 always @(posedge clk_pix or negedge rst_n) begin if (!rst_n) begin h_cnt <= 0; v_cnt <= 0; end else if (h_cnt == `H_TOTAL - 1) begin h_cnt <= 0; // 行计数到末尾时场计数加一,场到头则归零 v_cnt <= (v_cnt == `V_TOTAL - 1) ? 0 : v_cnt + 1; end else begin h_cnt <= h_cnt + 1; end end // 同步信号低有效:落在同步脉冲区间内拉低 assign hs = ~(h_cnt >= `H_ACTIVE + `H_FP && h_cnt < `H_ACTIVE + `H_FP + `H_SYNC); assign vs = ~(v_cnt >= `V_ACTIVE + `V_FP && v_cnt < `V_ACTIVE + `V_FP + `V_SYNC); // 有效显示区:行场都处于有效范围内 assign video_on = (h_cnt < `H_ACTIVE) && (v_cnt < `V_ACTIVE);

这里hs、vs是低有效同步信号,这是 VGA 标准的约定,写成高有效显示器会认不出来。video_on用来告诉颜色模块“现在这个像素该不该画”,在消隐区颜色必须输出黑色,否则画面边缘会出现杂色条纹。计数器用clk_pix(65MHz)驱动,和像素输出严格同源,这是保证画面稳定的前提。

4.5 颜色生成与开关切换

color_gen.v根据当前像素坐标和 SW0 状态决定 RGB 输出。最简单的两种状态可以是纯色背景和条纹图案的切换:

// 颜色生成:SW0 选择两种显示模式 always @(posedge clk_pix) begin if (!video_on) begin rgb <= 12'h000; // 消隐区输出黑色 end else if (sw0) begin // 模式一:按行坐标画彩色条纹 rgb <= {h_cnt[9:6], v_cnt[9:6], 4'hF}; end else begin // 模式二:纯色背景 rgb <= 12'h0F0; end end

video_on为假时强制输出黑色,这一步不能省。SW0 是异步输入,严格来说应该先做同步,课程实验里直接使用通常也能跑,但如果画面在拨动瞬间出现闪烁,多半就是这里没同步导致的。颜色位宽按开发板实际接线来定,Nexys3 的 VGA 是每通道 4 位共 12 位,写代码前先对照板卡原理图确认,位宽对不上会出现颜色错乱。

4.6 约束文件与上板配置

UCF 约束文件负责把 Verilog 端口映射到实际引脚。需要约束的是时钟输入、复位、SW0 以及 VGA 的 HS、VS、RGB 各路信号。引脚编号必须查开发板原理图,不能凭记忆写,写错一个引脚轻则功能不显示,重则把输出接到电源脚上。约束写好后依次双击 Synthesize-XST 综合、Implement Design 实现、Generate Programming File 生成比特流,再用 Digilent Adept 把比特流下载到 FPGA。VGA 线接显示器,拨动 SW0 观察两种状态切换是否正常。

5. 避坑与排查:五个最容易翻车的点

5.1 仿真波形对但上板无输出

现象:行为仿真里 clk_out1、clk_out2 频率相位都正确,下载到板子后示波器或逻辑分析仪测不到输出。原因通常是忽略了LOCKED信号,或者 DCM 的RESET极性接反导致一直处于复位。解决方法是把LOCKED引出来观察,确认上电后它确实拉高;同时核对 Clocking Wizard 里 RESET 的有效电平,和代码里的取反逻辑对齐。另外确认输出时钟是否真的连到了引脚约束上,没约束的信号综合时可能被优化掉。

5.2 VGA 画面偏移或不同步

现象:显示器提示“无信号”或画面整体偏左偏右、上下滚动。原因基本是行场时序参数不成套,比如只改了H_ACTIVE没改H_TOTAL,或者同步脉冲宽度和显示器要求不匹配。解决方法是回到SVGA_DEFINES.v,按目标分辨率的行业标准参数逐项核对,四个量(有效、前沿、同步、后沿)必须同时满足总和等于H_TOTAL/V_TOTAL。改完重新综合,别只改宏定义不重新生成比特流。

5.3 颜色错乱或只有单色

现象:画面能显示但颜色明显不对,比如该红的地方发绿。原因是 RGB 位宽和引脚映射与板卡原理图不一致,或者颜色拼接顺序写反了。解决方法是打开开发板原理图,确认每个颜色通道实际用了几位、对应哪几个引脚,再回头检查rgb的位拼接顺序和 UCF 里的引脚分配是否一一对应。这类问题靠猜没用,必须对着原理图逐位核。

5.4 综合报错找不到 IP 核

现象:顶层例化了dcm_core,综合时报“模块未定义”。原因是 IP 核生成后没有正确加入工程,或者例化时端口名和生成模板不一致。解决方法是确认.xco文件在工程管理区可见,用 View HDL Instantiation Template 重新对照端口名,注意大小写和信号名必须完全一致。ISE 对 IP 核的引用依赖工程内的核文件,拷贝工程时要把整个目录一起拷,只拷.v文件会丢核。

5.5 拨动开关画面闪烁或死机

现象:切换 SW0 时画面短暂花屏甚至卡死。原因是异步输入直接进了时钟域逻辑,产生亚稳态。解决方法是在color_gen前对 SW0 加两级寄存器同步:

// 两级同步,消除开关抖动带来的亚稳态 reg sw0_r1, sw0_r2; always @(posedge clk_pix) begin sw0_r1 <= sw0; sw0_r2 <= sw0_r1; end // 后续逻辑使用 sw0_r2

两级同步不能消除机械抖动本身,但能把亚稳态概率降到可接受范围。如果切换仍有抖动,可以再加一个简单的计数器做消抖,不过课程实验里两级同步通常够用。

6. 验收与答辩:怎么证明这套设计真的跑通了

验收这件事,我一般按“仿真证据 + 上板现象 + 参数核对”三条线走,缺一条都容易被问住。

第一条线是仿真证据。DCM 实验要给出波形截图,标出 clk 与 clk_out1 的周期比是 2:1、clk_out2 是 1:2,并用光标量出相位差 180 度。截图不要只截一小段,要包含复位释放和LOCKED拉高的过程,证明时钟是稳定后才开始工作的。VGA 实验的仿真重点看 HS、VS 的周期和脉宽是否符合宏定义,video_on的占空比是否等于有效区占总周期的比例。

第二条线是上板现象。DCM 实验如果没有外部仪器,可以用输出时钟驱动一个计数器再点亮 LED,通过闪烁频率间接验证分频倍频关系。VGA 实验要拍到两种显示状态的实际画面,并说明 SW0 切换时画面如何变化。答辩时老师常问“你怎么知道 65MHz 是对的”,答案要落到“65MHz 对应 1024×768 的行频约 87kHz、场频约 60Hz,在显示器规格范围内”,而不是“向导里填的”。

第三条线是参数核对。准备一张对照表,把设计里的关键参数和标准值列出来:

参数设计值依据
DCM 输入100MHz板载晶振
CLK_OUT150MHz / 0°二分频需求
CLK_OUT2200MHz / 180°二倍频+相移需求
像素时钟65MHzSVGA 1024×768 标准
行总周期1344有效+前沿+同步+后沿
场总周期806同上

这张表在答辩时非常管用,老师扫一眼就知道你是真算过还是抄的。另外提前想好两个问题的答案:为什么 DCM 要放在顶层例化而不是塞进子模块(职责分离、便于复用)、VGA 消隐区为什么必须输出黑色(防止边缘杂色、符合标准)。这两个问题几乎每轮答辩都会出现。

血泪经验是,很多同学把报告写成“操作步骤流水账”,点哪个菜单、填哪个框写得很细,但原理和参数依据一笔带过。验收时老师不看你会不会点菜单,看的是你懂不懂为什么这么配。我后来每次带设计,都强制要求先写清楚“每个参数从哪来、改它会怎样”,再动手点软件。从那以后,答辩被问倒的情况少了很多。希望这套结构能帮到你,照着把需求、设计、实现、验收四块填实,报告自然就立住了。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询