简介这份资源是面向电子信息、计算机等专业学生的FPGA数字系统设计实验报告对应XDU软工院选课程第二次实验适合正在学习ISE开发环境、需要完成实验报告或复习FPGA基础设计流程的读者参考。压缩包内为1个docx文档约219KB完整记录了数字时钟管理与VGA显示两个实验。内容涵盖实验原理、详细操作步骤、测试结果与实验总结数字时钟管理部分讲解如何用Clocking Wizard IP核配置分频、倍频与相移并给出顶层模块例化、综合与仿真的完整流程VGA显示部分则从时序宏定义、扫描原理出发拆解vga_timing、color_gen等子模块设计与约束文件编写。读者可据此理解Xilinx IP核的生成与调用方法掌握从新建工程到板级验证的完整链路也可作为撰写同类实验报告的参考模板。目前已有193人学习。1. 一份能直接跑通 ISE 的 FPGA 实验报告到底值不值得拆如果你手头正好有一块 Spartan-6 的开发板又被迫要在 ISE 这套老掉牙的工具链里把 DCM 和 VGA 两个实验跑通那这份实验报告的价值就不在“报告”两个字上而在它把 Clocking Wizard 的配置参数、顶层例化模板、VGA 时序宏定义和 UCF 约束这几块最容易翻车的地方都留了痕迹。ISE 这套工具在 FPGA 开发里属于典型的“玄学环境”——版本对不上、IP 核生成失败、仿真库没编译任何一个环节都能让人卡一下午。这份材料覆盖了数字时钟管理DCM 分频、倍频、相移和 VGA 显示640×48060Hz 时序、颜色生成、开关切换两条主线适合刚接触 Xilinx 7 系列之前老器件、需要照着步骤复现实验的软工/电子类学生也适合想快速回忆 ISE 流程的从业者。它不是教程是一份带参数的施工记录下面我按“能复现”的标准把它拆开。2. 数字时钟管理实验Clocking Wizard 参数怎么填才不翻车DCM 这个模块在 Spartan-6 上叫 DCM_SP但实验里走的是 Clocking Wizard 封装底层还是 DCM 原语。很多人第一次配的时候会盯着“输入 100MHz、输出 50MHz 和 200MHz”直接填结果综合报错说输出频率超出范围——因为 Spartan-6 的 DCM 对输出频率有硬约束CLK_OUT2 拉到 200MHz 已经踩在器件速度等级的边缘上能不能过取决于你选的芯片型号和速度等级。实验里用的是 xc6slx16这个器件在 -2 速度等级下 DCM 输出上限大概在 200MHz 出头所以 200MHz 是能配出来的但余量很小。这一章把配置逻辑、顶层例化和仿真验证三块拆开讲参数怎么改、为什么这么改都落到具体操作上。2.1 Clocking Wizard 的输入输出参数与相位设置新建 IP 核的路径是 Project → New Source → IP (CORE Generator Architecture Wizard)文件名给dcm_core然后在 IP 列表里选 FPGA Features and Design → Clocking → Clocking Wizard。第一页保持输入频率 100MHz这个值对应开发板上的晶振Nexys3 板载的是 100MHz 单端时钟接在 E3 引脚上后面 UCF 里要约束。第二页是重点CLK_OUT1 设 50MHzCLK_OUT2 设 200MHz相位填 180 度。这里有个细节——相位 180 度是在输出频率确定之后才生效的如果你先填相位再改频率向导有时会把相位重置回 0血泪经验是先把两个输出频率都定下来最后再回头填相位。配置完成后向导会生成.xco文件这个文件是 IP 核的描述文件不是 Verilog 源码真正的例化模板要通过 View HDL Instantiation Template 拿到。下面这段是典型的例化骨架端口名以向导生成的为准我按实验里的命名习惯整理// 顶层模块中例化 DCM端口名需与 .xco 生成模板一致 dcm_core u_dcm_core ( .CLK_IN1 (clk_100m), // 输入 100MHz来自板载晶振 .CLK_OUT1 (clk_50m), // 50MHz 输出相位 0 .CLK_OUT2 (clk_200m_180), // 200MHz 输出相位 180 度 .RESET (rst_n), // 低有效复位接按键 .LOCKED (locked) // 锁定指示稳定后拉高 );CLK_IN1必须接板载时钟不能接普通 IO 分出来的信号否则 DCM 锁不住RESET建议接一个按键做低有效复位上电后给一段复位脉冲让 DCM 重新锁定LOCKED信号很多人直接悬空正确做法是把它引到 LED 或者作为后续逻辑的使能DCM 没锁定之前输出时钟是不稳定的拿它去驱动时序逻辑就是黑匣子式的不定时出错。相位 180 度在仿真里看的是 CLK_OUT2 相对 CLK_OUT1 的边沿偏移实际板子上用示波器量的时候要注意探头带宽200MHz 方波用普通探头看会明显失真别把探头的问题当成 DCM 配错了。2.2 顶层例化与 Test Fixture 的时钟激励写法顶层模块top.v的端口只需要时钟、复位和两个观测输出实验里没要求接具体外设所以把clk_50m和clk_200m_180引到 LED 或者测试点就行。例化的时候把 2.1 里的模板粘进去端口名对齐locked可以再引一个 LED 做指示。综合前在工程管理区把 view 切到 Implementation双击 Synthesize-XST综合完展开看 View RTL Schematic正常应该能看到一个 DCM 原语加缓冲如果 RTL 图里 DCM 被优化掉了多半是输出没被任何逻辑使用综合器直接裁了。仿真文件用 Verilog Test Fixture 新建ISE 会自动生成被测模块例化和基本信号需要手动补的是时钟翻转逻辑。实验要求时钟每 5ns 翻转一次也就是 100MHz、周期 10ns// 测试激励100MHz 时钟每 5ns 翻转周期 10ns initial begin clk_100m 0; rst_n 0; #100 rst_n 1; // 上电复位 100ns 后释放 end always #5 clk_100m ~clk_100m; // 半周期 5ns对应 100MHz#5这个延迟单位取决于 timescaletest fixture 默认带timescale 1ns/1ps所以 5 就是 5ns。复位保持 100ns 是为了让 DCM 有足够时间锁定仿真里 DCM 的锁定行为是行为级模型锁定时间比实际器件短但复位太短仍然会看到locked一直不拉高。仿真跑起来之后看波形clk_50m周期应该是 20nsclk_200m_180周期 5ns 且相对clk_50m有 180 度偏移——注意 180 度是相对同频率信号的相位200MHz 和 50MHz 之间比相位没有意义实验报告里说的“相位差 180 度”是指 CLK_OUT2 相对其自身 0 度版本的偏移看波形的时候别拿两个不同频率的上升沿去对。2.3 综合实现阶段看什么RTL 图与锁定信号综合通过不代表实现能过。Spartan-6 的 DCM 是硬核位置固定在芯片的时钟管理单元里如果设计里用了多个 DCM 而布局冲突Implement Design 阶段会报 placement 错误。单 DCM 的设计一般不会撞这个坑但如果你把 CLK_OUT2 又拿去驱动另一个 DCM就会触发级联限制。实现完之后看静态时序报告200MHz 输出对应的时钟约束要手动加Clocking Wizard 不会自动帮你写 UCF 里的周期约束实验报告里没提这一条但实际做的时候不加约束时序分析就是空的等于没验证。锁定信号locked的处理是这一节最容易被忽略的点。仿真里它很快拉高实际板子上从复位释放到锁定大概要几十微秒到几百微秒取决于输入时钟稳定时间。如果后续逻辑直接用clk_200m_180而不等locked上电瞬间可能跑飞。常见做法是把locked和外部复位做与逻辑生成一个内部复位// 内部复位外部复位释放且 DCM 锁定后才放开 wire rst_internal_n rst_n locked;这个写法在实验里不是必须的因为实验只观测时钟输出但如果你要把这个 DCM 复用到后面的 VGA 实验里locked就必须参与复位逻辑否则 VGA 时序计数器可能在上电时锁死在一个非法状态现象是显示器黑屏但板子看起来“在跑”。3. VGA 显示实验640×480 时序宏定义与三模块拆分VGA 实验的复杂度比 DCM 高一个量级因为它涉及三个子模块的协同vga_timing.v产生行场同步信号和像素坐标color_gen.v根据坐标输出 RGB 颜色dcm_dsgn.xco提供 65MHz 像素时钟。实验里用 SVGA_DEFINES.v 做宏定义这个做法在 ISE 时代很常见因为 Verilog-2001 没有 parameter 包的概念宏定义是跨模块传参最省事的方式。640×48060Hz 的时序参数是固定的但不同资料给的消隐区数值有出入下面按 VESA 标准给一套能直接用的。3.1 SVGA_DEFINES.v 的时序参数与 65MHz 像素时钟来源640×48060Hz 的像素时钟理论值是 25.175MHz但实验里 DCM 输出的是 65MHz这是 800×60060Hz 的像素时钟。这里有个容易看漏的地方——实验报告写的是“SVGA”SVGA 通常指 800×600而 640×480 是 VGA。报告里 VGA 实验的 DCM 输出 65MHz对应的是 800×600 时序但正文又提 640×480 的扫描原理两处口径不完全一致。按 65MHz 反推实际跑的应该是 800×60060Hz时序参数如下参数水平像素垂直行有效显示800600前肩front porch401同步脉冲sync1284后肩back porch8823总周期1056628宏定义文件里把这些写成define注意宏名不要和系统保留字冲突// SVGA_DEFINES.v800x60060Hz 时序宏定义像素时钟 65MHz define H_ACTIVE 800 define H_FP 40 define H_SYNC 128 define H_BP 88 define H_TOTAL 1056 define V_ACTIVE 600 define V_FP 1 define V_SYNC 4 define V_BP 23 define V_TOTAL 628H_TOTAL和V_TOTAL是计数器回绕值行计数器数到 1055 归零场计数器数到 627 归零。同步脉冲的极性要注意VGA 标准里行场同步都是负极性也就是同步期间信号为低vga_timing.v里输出hsync和vsync的时候要按这个极性取反否则显示器识别不到信号现象是“无信号输入”而不是花屏。65MHz 时钟从 DCM 出来之后直接驱动像素计数器不要再经过任何组合逻辑否则像素时钟上会有毛刺显示器边缘会出现抖动。3.2 vga_timing.v 的行场计数器与同步信号生成vga_timing.v的核心是两个计数器加比较逻辑。行计数器在像素时钟下从 0 数到H_TOTAL-1数到末尾归零并给场计数器一个使能场计数器在行计数器归零时加一数到V_TOTAL-1归零。同步信号在计数器落在同步区间时拉低有效显示区间用h_active和v_active两个标志表示供color_gen.v判断当前像素是否在可视区。// vga_timing.v行场计数与同步信号负极性同步 always (posedge clk_65m or negedge rst_n) begin if (!rst_n) begin h_cnt 0; v_cnt 0; end else begin if (h_cnt H_TOTAL - 1) begin h_cnt 0; if (v_cnt V_TOTAL - 1) v_cnt 0; else v_cnt v_cnt 1; end else begin h_cnt h_cnt 1; end end end // 同步信号落在同步区间时为低 assign hsync ~((h_cnt H_ACTIVE H_FP) (h_cnt H_ACTIVE H_FP H_SYNC)); assign vsync ~((v_cnt V_ACTIVE V_FP) (v_cnt V_ACTIVE V_FP V_SYNC)); // 有效显示区标志 assign h_active (h_cnt H_ACTIVE); assign v_active (v_cnt V_ACTIVE);计数器位宽要够H_TOTAL是 1056需要 11 位V_TOTAL是 628需要 10 位位宽不够会回绕错误现象是图像水平方向撕裂或者重复。hsync和vsync用组合逻辑 assign 生成综合后会映射到 LUT延迟很小但如果你在后面又加了一级寄存器打拍同步信号会晚一个像素时钟显示器可能勉强能认但边缘会偏实验阶段不建议打拍。h_active和v_active只表示坐标在有效区真正决定像素是否输出的还要看color_gen里的判断两个标志与起来才是可视区。3.3 color_gen.v 的颜色逻辑与 SW0 切换实现color_gen.v的输入是像素坐标和有效标志输出 RGB 三路各若干位。Nexys3 的 VGA 接口是 12 位色RGB 各 4 位实验里用开关 SW0 切换两种显示状态常见做法是状态 0 显示彩条状态 1 显示纯色或者棋盘格。彩条的实现是按h_cnt的高位分段每段给不同的 RGB 值// color_gen.vSW00 彩条SW01 纯绿仅在有效显示区输出颜色 always (*) begin if (h_active v_active) begin if (sw0 1b0) begin // 彩条按水平坐标分 8 段每段 100 像素 case (h_cnt / 100) 3d0: {r, g, b} 12hF00; // 红 3d1: {r, g, b} 12h0F0; // 绿 3d2: {r, g, b} 12h00F; // 蓝 3d3: {r, g, b} 12hFF0; // 黄 3d4: {r, g, b} 12hF0F; // 品红 3d5: {r, g, b} 12h0FF; // 青 3d6: {r, g, b} 12hFFF; // 白 default: {r, g, b} 12h000; // 黑 endcase end else begin {r, g, b} 12h0F0; // 纯绿 end end else begin {r, g, b} 12h000; // 消隐区输出黑色 end endh_cnt / 100这种除法在综合时会展开成比较器链800 像素分 8 段每段 100资源消耗可以接受但如果段数再多建议改成移位或者查表。消隐区必须输出黑色否则显示器会把消隐区的随机值当成颜色现象是图像周围有一圈噪点或者整屏偏色。sw0是异步输入直接进组合逻辑会有亚稳态风险实验阶段可以接受严谨做法是打两拍同步到clk_65m域再用。SW0 切换的瞬间图像会跳变这是正常的因为颜色逻辑是纯组合的没有做过渡。3.4 UCF 约束引脚分配与时钟周期约束UCF 文件是 ISE 里最容易写错又最难查的部分引脚号写错一个现象可能是某个颜色通道不亮或者同步信号完全没输出。Nexys3 的 VGA 接口引脚在板卡手册里有固定映射实验报告没给具体引脚号这里按常见分配给一份骨架实际以你手上板卡的手册为准# UCF 约束骨架时钟、复位、VGA 输出、开关 NET clk_100m LOC E3; # 板载 100MHz 晶振 NET rst_n LOC C3; # 复位按键低有效 NET sw0 LOC T10; # 拨动开关 SW0 # VGA 输出RGB 各 4 位 行场同步 NET r0 LOC G19; NET r1 LOC H19; NET g0 LOC F19; NET b0 LOC D19; NET hsync LOC L18; NET vsync LOC L17; # 时钟周期约束100MHz 输入65MHz 像素时钟由 DCM 派生 NET clk_100m TNM_NET clk_100m; TIMESPEC TS_clk_100m PERIOD clk_100m 10 ns HIGH 50%;TNM_NET和TIMESPEC这两行是给输入时钟加周期约束DCM 派生出来的 65MHz 时钟 ISE 会自动推导但前提是 DCM 的输入时钟有约束。如果只写 LOC 不写 TIMESPEC实现能过但时序报告里没有分析路径等于闭着眼睛布线。引脚分配里 RGB 只列了低位高位按同样规律补全漏掉某一位的现象是对应颜色只能显示一半亮度比如红色只有 0 和 8 两档看起来像偏色。4. 避坑与排查ISE 环境下五个高频翻车点这一章按“现象 → 原因 → 解决”列五条都是我在复现这类实验时真实撞过的不是从手册上抄的。现象一Clocking Wizard 生成时报“输出频率超出器件范围”。原因通常是芯片型号或速度等级选错工程新建时如果默认选了 -1 速度等级200MHz 输出就过不了 DCM 的 VCO 范围。解决是把工程器件改成 xc6slx16-2 或更高速度等级或者在向导里把 CLK_OUT2 降到 160MHz 先跑通确认流程没问题再往上调。现象二仿真波形里locked一直是低。原因是复位释放太早或者输入时钟在复位期间没有翻转。DCM 的行为模型需要看到输入时钟稳定若干个周期后才锁定如果 test fixture 里复位和时钟同时起步locked可能永远不拉高。解决是把复位保持时间加到 200ns 以上并确保always #5的时钟在 0 时刻就开始翻转。现象三VGA 显示器提示“无信号”而不是花屏。原因基本是行场同步极性反了或者同步信号根本没输出。先查 UCF 里hsync/vsync的引脚有没有写错再用示波器量同步引脚正常应该是 65MHz 时钟下周期性拉低的脉冲。如果极性反了把assign hsync ~(...)里的取反去掉试试但标准 VGA 是负极性去掉取反只是临时验证。现象四图像水平方向偏移或者右侧有黑边。原因是消隐区参数和显示器不匹配前肩或后肩数值偏了。800×600 的H_FP40、H_BP88是 VESA 标准值但有些显示器对前肩容忍度低把H_FP调到 48 或者H_BP调到 80 可能就正了。这类问题没有唯一解拿几个值试看哪个居中。现象五综合通过但 Implement 报 placement 错误提示时钟资源冲突。原因是设计里用了多个 DCM 或者把普通信号接到了全局时钟引脚。Spartan-6 的全局时钟资源有限VGA 实验里 DCM 输出 65MHz 应该走 BUFG如果综合器自动推断成了普通布线布局阶段就会冲突。解决是在代码里显式例化 BUFG或者检查是不是把clk_65m又拿去驱动了别的 DCM。5. 从实验到可复用把 DCM 和 VGA 时序抽成模板这两个实验跑通之后真正有价值的是把可复用的部分抽出来下次换分辨率或者换板子不用从头配。我一般会把 DCM 配置和 VGA 时序做成两个独立模板DCM 模板里固定locked参与复位的写法VGA 模板里把时序参数全部宏定义化换 1024×768 只改宏定义和像素时钟vga_timing.v和color_gen.v的结构不动。验证方法也固定下来——先仿真看hsync/vsync的周期对不对周期对了再上板上板先看同步信号有没有再看颜色这个顺序能省掉大量来回烧板子的时间。复用项抽取方式换分辨率时改什么DCM 配置独立.xco 顶层例化模板改输出频率和相位VGA 时序SVGA_DEFINES.v宏定义改 H/V 的 ACTIVE、FP、SYNC、BP同步极性vga_timing.v内固定负极性一般不动颜色逻辑color_gen.v按坐标分段改分段阈值和 RGB 值UCF按板卡手册单独维护改 LOC 和 TIMESPEC有一个细节值得单独说DCM 的locked信号在换分辨率之后锁定时间会变因为 VCO 频率变了仿真里看不出来上板时如果复位逻辑卡在locked上现象是显示器一直黑屏但 LED 指示正常。我现在的习惯是每次改完 DCM 参数先用一个 LED 直接驱动locked确认它能亮再接后续逻辑这个动作花不了两分钟但能省掉一次“以为是 VGA 时序错了”的误判。从那以后我每次动时钟配置都强制先看locked再往下走希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?