特 权 和 你 一 起 学 NIOS2 欢 迎 加 入 EDN FPGA/CPLD 助 学 小 组 共 同 交 流 学 习 :http://group.ednchina.com/1375/ 本 教 程 仅 适 用 于 特 权 制 造 的 SF-NIOS2 FPGA 开 发 板, 转 载 请 注 明 出 处! 版 本 信 息 时 间 说 明 备 注 2010-9-3 创 建 V1.0 1
第 三 章 流 程 实 践 案 例 手 把 手 第 一 个 工 程 理 清 了 一 些 基 本 概 念, 也 对 开 发 流 程 有 了 一 个 大 体 的 了 解, 特 权 同 学 寻 思 着 下 一 步 该 学 点 什 么 好 呢? 要 达 到 循 序 渐 进 的 效 果, 是 不 可 以 上 来 就 一 个 大 工 程, 虽 然 效 果 可 能 会 比 较 炫, 但 是 看 设 计 细 节 估 计 要 吓 倒 一 片 但 是, 如 果 一 开 始 就 只 谈 理 论, 没 有 能 够 很 好 的 让 大 家 在 实 践 中 对 整 个 开 发 的 流 程 有 一 个 理 性 上 的 认 识, 好 像 也 不 太 合 适 小 时 候 语 文 老 师 教 咱 们 写 作 文 有 种 结 构 叫 做 总 分 总, 还 记 得 吧? 特 权 同 学 就 要 继 承 这 种 风 格, 在 大 家 学 会 了 写 字 认 字 以 后, 在 咱 们 的 文 章 里 开 篇 就 要 点 题, 让 大 家 在 总 体 上 对 今 后 要 详 细 学 习 的 知 识 点 都 走 马 观 花 式 的 实 践 一 遍 不 过 请 放 心, 这 个 实 践 不 会 太 难 为 大 家, 只 要 稍 微 有 点 悟 性 就 能 学 会 并 且 后 面 的 教 程 会 如 题 所 示 的 手 把 手, 基 本 上 一 傻 瓜 教 程, 各 位 只 要 手 握 SF-NIOS2 开 发 板, 操 着 鼠 标 按 部 就 搬 即 可, 重 在 体 会 流 程, 不 需 要 你 太 多 的 深 入 细 节 ( 也 别 担 心, 细 节 的 东 西 以 后 会 慢 慢 讲 ) 硬 件 平 台 都 说 到 这 里 了, 没 有 板 板 的 初 学 者 一 定 要 郁 闷 了 ( 都 怪 特 权, 板 子 没 出 来, 教 程 就 放 出 来 了 ) 估 计 大 家 对 新 版 SF-NIOS2 学 习 板 垂 涎 已 久, 那 么 特 权 同 学 也 就 先 来 几 张 靓 照 让 各 位 饱 饱 眼 福 图 3.1 SF-NIOS2 板 正 面 1 2
图 3.2 SF-NIOS2 板 正 面 2 图 3.3 SF-NIOS2 板 背 面 若 想 得 到 此 板, 还 需 一 段 时 日 ( 唯 一 的 办 法 是 关 注 END 的 FPGA/CPLD 助 学 小 组 : http://group.ednchina.com/1375/) 特 权 同 学 会 就 着 教 程 进 度 对 SF-NIOS2 板 进 行 各 个 实 验 例 程 编 写 和 教 程 归 档 的 工 作 所 以, 您 的 期 待 和 声 援 是 对 特 权 同 学 的 最 大 支 持 和 鼓 励 关 于 SF-NIOS2 板 的 外 设 介 绍 不 是 本 章 的 重 点, 在 后 续 相 关 章 节 中 会 对 相 应 例 程 所 涉 及 的 硬 件 外 设 做 说 明 3
软 件 平 台 光 有 一 块 板 子, 若 没 有 PC 机 上 的 软 件 开 发 工 具, 哪 怕 它 再 神 奇 再 伟 大 也 是 徒 然 因 此, download 一 个 WEB 版 Quartus II 和 NIOS2 EDS 是 当 务 之 急 当 然 了, 免 费 的 WEB 版 本 无 论 是 功 能 和 性 能 都 要 大 打 折 扣 如 果 你 或 者 应 该 说 你 们 公 司 腰 包 够 鼓, 能 买 一 个 正 版 的, 绝 对 是 件 值 得 庆 幸 的 事 但 是, 买 不 起 也 很 正 常, 特 权 同 学 给 个 建 议 :google 或 者 baidu 上 加 个 骏 龙 破 解 看 看 有 没 有 什 么 惊 喜 特 权 同 学 也 很 纳 闷, 骏 龙 可 也 是 堂 堂 正 正 Altera 在 大 陆 的 代 理, 居 然 不 过 话 说 回 来, 不 得 不 承 认 他 们 的 服 务 做 得 很 到 位, 比 其 它 竞 争 对 手 都 更 体 恤 中 国 国 情 好 了, 软 件 的 事 情 大 家 自 己 花 时 间 去 琢 磨 吧, 话 说 工 欲 善 其 事, 必 先 利 其 器, 特 权 同 学 使 用 的 是 Quartus II 9.1 和 Nios II 9.1 Software Build Tools for Eclipse, 二 者 都 需 要 打 上 SP1 的 补 丁, 其 它 的 组 合 或 者 版 本 都 存 在 一 些 让 用 户 很 无 可 奈 何 的 小 bug v10 也 上 市 了, 但 我 们 的 口 号 是 不 求 最 新 的, 但 求 最 稳 定 的 图 3.4 Quartus II 安 装 图 3.5 NIOS II EDS 安 装 Quartus II 相 信 大 家 都 很 熟 悉 了, 应 该 不 太 有 人 还 在 用 MAX+PLUS II 了, 特 权 同 学 两 年 前 4
一 开 始 接 触 Q II 是 7.1 版 本, 压 根 就 没 有 在 MAX+PLUS II 平 台 上 玩 过 这 两 个 东 西 其 实 只 是 Altera 的 开 发 工 具 的 前 后 版 本 而 已, 界 面 风 格 有 点 区 别, 其 它 基 本 是 相 通 的 说 到 软 件 的 升 级, 不 光 是 版 本, 整 个 开 发 平 台 换 代 也 是 常 有 的 事 NIOS2 的 开 发 也 在 经 历 着 从 IDE 升 级 到 EDS 的 过 程 中 特 权 同 学 一 年 前 玩 NIOS2 只 知 道 IDE, 而 且 官 方 的 文 档 也 基 本 是 基 于 IDE 平 台 的 当 把 IDE 用 熟 以 后, 这 才 发 现 不 对 劲,EDS 才 是 altera 在 主 推 的 新 平 台, 于 是 就 一 阵 找 资 料 熟 悉 这 个 玩 意 其 实 平 台 的 升 级 也 还 是 换 汤 不 换 药 的, 对 于 电 子 工 程 师, 毛 主 席 教 导 我 们 要 活 到 老 学 到 老, 多 看 资 料 多 尝 试 咱 们 一 样 可 以 用 得 很 前 卫 好 了, 点 到 即 止, 希 望 每 一 章 都 能 够 给 读 者 带 来 一 些 有 营 养 的 文 字, 虽 然 有 时 候 不 细 谈, 是 要 先 让 你 知 道 有 那 么 一 回 事, 这 个 教 程 会 滔 滔 不 绝 没 完 没 了 的 写 下 去, 特 权 同 学 也 不 确 定 哪 一 天 会 把 你 想 知 道 的 细 节 展 开 来 发 挥 所 以, 这 份 教 程 的 一 个 特 点 就 是 : 要 多 给 读 者 留 一 份 期 待 哈 哈, 是 不 是 觉 得 特 权 同 学 太 可 恶 了! 教 程 就 是 要 做 得 自 由 一 点, 如 果 还 是 条 条 框 框 的 来, 不 如 翻 译 官 方 文 档 算 了 不 是 压 力, 也 不 是 随 意, 特 权 同 学 是 以 一 种 近 乎 热 爱 的 方 式 来 写 这 些 文 字, 所 以, 这 些 教 程 中 流 露 出 的 知 识 点, 对 的 不 对 的, 好 的 不 好 的, 大 家 都 可 以 和 我 交 流 可 以 发 EDN 站 内 信 给 我, 可 以 在 小 组 里 留 言 (http://group.ednchina.com/1375/), 当 然 也 可 以 发 email 给 我 (wuhouhang@gmail.com), 至 于 电 话 就 不 必 了, 特 权 同 学 尤 其 不 喜 欢 工 作 的 时 候 被 打 扰, 思 路 被 打 断 是 件 很 糟 糕 的 事 在 开 始 后 面 的 手 把 手 工 程 演 示 之 前, 和 大 家 透 露 个 秘 密, 我 想 有 心 的 朋 友 其 实 都 已 经 发 现 了 这 个 不 是 秘 密 的 秘 密 : 但 凡 市 面 上 的 altera 开 发 板 做 教 程 的 第 一 个 NIOS2 工 程, 基 本 都 是 翻 译 tt_nios2_hardware_tutorial.pdf 文 档 而 已, 哈 哈, 特 权 同 学 下 面 这 个 教 程 也 不 例 外, 虽 然 不 是 原 本 照 抄, 有 一 些 改 动 和 加 工 的 成 分 在 里 面, 但 确 也 是 换 汤 不 换 药 的 提 这 件 事 并 不 是 让 大 家 以 为 没 有 什 么 原 创 的 元 素 在 里 面, 而 是 告 诉 大 家 好 的 东 西 大 家 都 会 去 借 鉴, 并 且 如 果 要 做 得 更 好 也 只 有 站 在 巨 人 的 肩 膀 上 再 说 一 件 事, 也 正 好 是 这 几 天 遇 上 的, 和 这 里 要 说 的 意 思 也 沾 得 上 边, 所 以 决 定 和 大 家 分 享 一 下 有 阵 子 由 于 项 目 上 可 能 需 要 用 到 BGA 封 装 的 FPGA, 因 此 到 altera 官 网 一 阵 海 找, 发 现 了 http://www.altera.com.cn/literature/an/an114.pdf 这 么 个 不 错 的 application note 然 后 昨 天 在 edn 瞎 逛, 无 意 中 发 现 了 lattice 也 有 个 BGA 布 局 布 线 相 关 的 中 文 资 料 ( 链 接 用 搜 索 关 键 词 BGA 再 去 找 的 时 候 找 不 着 了 ), 好 奇 的 下 载 一 看, 发 现 怎 么 内 容 和 文 档 的 结 构 怎 么 都 那 么 眼 熟 啊, 仔 细 一 想, 这 不 整 个 一 altera 的 application note 翻 译 嘛! 话 说 得 有 些 过 激 5
了, 其 实 谁 抄 谁, 谁 译 谁, 抑 或 追 根 问 底 文 档 的 原 创 到 底 是 谁, 这 都 没 有 意 义 好 的 东 西 就 是 好, 很 多 流 程 规 范 或 知 识 点 那 是 大 家 都 认 可 的, 所 以 大 家 都 会 以 相 同 的 方 式 向 用 户 展 示 我 们 所 能 做 的, 也 是 借 鉴 学 习, 消 化 后 就 是 自 己 的 了 手 把 手 硬 件 工 程 一 新 建 Quartus II 工 程 1. 打 开 Quartus II v9.1, 如 图 3.6 所 示, 新 建 一 个 工 程 图 3.6 新 建 Quartus II 工 程 2. 如 图 3.7 所 示, 进 行 工 程 目 录 与 工 程 名 配 置 用 户 可 以 新 建 一 个 专 用 文 件 夹, 该 实 例 用 nios2ex1 文 件 夹 来 存 放 当 前 的 工 程 文 件 新 建 工 程 名 为 first_q2_prj 在 这 里 再 提 一 下 地 球 人 都 知 道 的 规 矩 : 工 程 名 以 及 工 程 文 件 所 在 的 相 关 路 径 均 使 用 英 文 字 母 阿 拉 伯 数 字 或 者 下 划 线, 不 要 使 用 其 它 的 符 号 或 汉 字 虽 然 大 多 数 时 候 好 像 没 有 问 题, 但 是 要 记 住 EDA 工 具 大 6
都 是 老 外 开 发 的, 尤 其 对 中 文 兼 容 性 不 好, 特 权 同 学 的 经 验 是 Modelsim 仿 真 中 如 果 出 现 中 文 路 径 基 本 是 编 译 不 了 的 所 以, 记 住 这 个 规 则 吧, 会 让 你 少 很 多 郁 闷 的 图 3.7 工 程 目 录 与 工 程 名 配 置 3. 如 图 3.8 所 示, 进 行 FPGA 器 件 选 择 配 置 该 实 例 使 用 了 特 权 打 造 的 SF-NIOS2 FPGA 板, 其 上 的 FPGA 为 Cyclone II 家 族 EP2C8Q208C8, 其 他 地 方 使 用 默 认 配 置 点 击 Finish 完 成 Quartus II 工 程 新 建 向 导 的 设 置 7
图 3.8 器 件 选 择 配 置 既 然 这 里 说 到 了 器 件 选 择, 那 么 就 应 该 让 大 家 对 所 使 用 的 EP2C8Q208C8 这 个 型 号 有 一 点 了 解, 至 少 要 明 白 它 命 名 的 原 则 简 单 的 说,EP2C 是 Cyclone II 系 列 器 件 的 代 号, 整 个 Cyclone( 有 Cyclone/Cyclone Ⅱ/Cyclone Ⅲ/Cyclone Ⅳ) 系 列 是 面 向 低 成 本 应 用 的 高 性 价 比 解 决 方 案, 因 此 也 可 以 说 是 普 及 率 最 高 的 一 个 系 列 了 紧 跟 EP2C 后 的 8 代 表 着 逻 辑 资 源 数 量, 对 于 Cyclone II 系 列 的 8 代 表 8256 个 LEs 往 后 的 Q208 代 表 着 封 装 和 管 脚 信 息, 即 TQFP208 后 面 的 C(Commerce) 表 示 器 件 等 级, 即 商 业 级 最 后 的 8 表 示 速 度 等 级, 这 个 系 列 一 般 可 以 是 -6/-7/-8 所 谓 速 度 等 级, 就 是 FPGA 器 件 理 论 可 以 达 到 的 一 个 频 率 水 平 二 SOPC Builder 配 置 1. 创 建 好 一 个 工 程, 我 们 接 着 就 使 用 SOPC Builder 给 这 个 工 程 搭 建 一 个 硬 件 系 统 如 图 3.9 所 示, 点 击 菜 单 栏 的 Tools SOPC Builder 选 项, 进 入 SOPC 配 置 页 面 8
图 3.9 打 开 SOPC Builder 2. 进 入 SOPC Builder 配 置 页 面 后, 首 先 映 入 眼 帘 的 是 如 图 3.10 所 示 的 创 建 新 系 统 的 界 面 本 实 例 输 入 系 统 名 为 first_nios2_sys 点 击 OK 完 成 系 统 新 建 图 3.10 新 建 系 统 三 添 加 和 配 置 NIOS2 处 理 器 和 通 用 外 设 在 配 置 这 个 硬 件 系 统 之 前, 我 们 对 要 创 建 的 系 统 架 构 一 定 要 心 中 有 数, 特 权 心 里 是 有 数 了, 各 位 同 学 可 不 能 没 数, 呵 呵 这 个 系 统 架 构 如 图 3.11 所 示, 核 心 肯 定 是 中 中 间 那 个 NIOS2 处 理 器, 一 个 最 小 的 嵌 入 式 系 统 无 非 还 要 加 上 时 钟 ( 包 括 复 位 单 元 ) 单 元 存 储 器 ( 用 于 存 9
储 代 码 的 ROM 和 存 放 变 量 的 RAM) 单 元 还 有 电 源 也 很 重 要, 只 不 过 我 们 的 系 统 是 在 FPGA 内 部, 电 源 系 统 已 经 是 FPGA 的 一 部 分 了, 不 需 要 我 们 在 器 件 编 程 时 考 虑 出 了 这 几 项, 还 需 要 一 个 下 载 调 试 的 接 口, 如 该 系 统 的 JTAG Uart, 说 白 了 也 就 是 一 个 串 口 另 外 有 一 个 叫 做 System ID 的 组 件, 它 能 够 帮 助 调 试 过 程 中 确 认 系 统 是 否 正 常 工 作 一 般 调 试 中 会 读 读 该 系 统 的 ID, 如 果 正 确 则 说 明 系 统 握 手 成 功, 如 果 错 误 则 系 统 握 手 失 败, 那 么 就 没 有 必 要 接 着 调 试 下 去 了 定 时 器 咱 也 不 说 了,GPIO 接 着 8 个 LED 做 演 示, 系 统 就 这 么 简 单, 关 键 是 要 用 心 去 体 会 这 个 流 程 JTAG Uart 时 钟 System ID NIOS2 处 理 器 定 时 器 RAM 8 GPIO 图 3.11 系 统 架 构 图 如 图 绝 对 图 3.11 有 点 山 寨 了, 那 么 不 妨 看 看 官 方 给 出 的 该 实 例 的 框 图 ( 如 图 3.12) 图 3.12 系 统 架 构 框 图 10
1. 首 先, 如 图 3.13 所 示, 进 行 系 统 时 钟 配 置 双 击 时 钟 名 称 或 时 钟 频 率 即 可 进 行 修 改, 这 里 修 改 时 钟 名 称 为 clk, 时 钟 频 率 为 25MHz, 与 SF-NIOS2 FPGA 板 实 际 所 外 接 的 晶 振 频 率 一 致 2. 添 加 配 置 NIOS2 片 内 存 储 器 图 3.13 配 置 系 统 时 钟 如 图 3.14 所 示, 双 击 组 件 库 中 的 On-Chip Memory(RAM or ROM), 添 加 片 内 存 储 器 组 件 图 3.14 双 击 添 加 片 内 存 储 器 组 件 对 片 内 存 储 器 的 配 置 如 图 3.15 所 示 选 择 片 内 存 储 器 类 型 (Memory type) 为 RAM(Writable); 使 用 的 资 源 (Block type) 为 M4K; 数 据 位 宽 (Data Width) 为 32; 总 存 储 11
大 小 为 (Total memory size)12kbytes 其 他 使 用 默 认 设 置 即 可, 点 击 Finish 完 成 配 置 图 3.15 配 置 片 内 存 储 器 如 图 3.16 所 示, 鼠 标 移 动 到 片 内 存 储 器 的 名 称 onchip_memonry2.0 上 并 点 击 右 键, 在 弹 出 菜 单 中 选 择 Rename, 然 后 更 改 名 称 为 onchip_mem 其 它 配 置 暂 不 做 更 改, 默 认 即 可 图 3.16 更 改 存 储 器 名 12
3. 添 加 配 置 NIOS2 处 理 器 核 如 图 3.17 所 示, 双 击 组 件 库 中 的 NIOS II Processor, 添 加 NIOS II 处 理 器 组 件 图 3.17 双 击 添 加 处 理 器 组 件 对 NIOS2 处 理 器 进 行 图 3.18 所 示 的 设 置 处 理 器 选 择 NIOS II/s; 硬 件 乘 法 器 (Hardware Multiply) 选 择 None, 即 不 需 要 硬 件 乘 法 器 ; 复 位 向 量 和 异 常 向 量 存 储 器 (Memory) 均 选 择 前 面 刚 刚 添 加 的 片 内 存 储 器 onchip_mem, 此 时 二 者 的 偏 移 量 (Offset) 自 动 设 置 为 0x0 和 ox20 复 位 向 量 是 指 整 个 系 统 软 件 复 位 后 启 动 的 程 序 地 址, 一 般 为 非 易 失 存 储 器 异 常 向 量 是 软 件 的 起 始 地 址, 一 般 是 易 失 存 储 器, 如 SDRAM 等 图 3.18 配 置 NIOS2 处 理 器 13
如 图 3.19 所 示, 更 改 指 令 缓 存 (Instruction Cache) 为 2Kbyte, 其 他 地 方 使 用 默 认 设 置 最 后 点 击 Finish 完 成 处 理 器 设 置 图 3.19 配 置 指 令 缓 存 更 改 NIOS2 处 理 器 组 件 名 为 cpu 4. 配 置 定 时 器 如 图 3.20 所 示, 双 击 组 件 库 中 的 Interval Timer, 添 加 定 时 器 组 件 图 3.20 选 择 定 时 器 组 件 如 图 3.21 所 示, 配 置 定 时 器 组 件 只 要 更 改 预 置 (Presets) 选 项 为 Full-featured 即 可, 其 他 地 方 使 用 默 认 设 置, 最 后 点 击 Finish 完 成 处 理 器 设 置 14
图 3.21 配 置 定 时 器 更 改 定 时 器 组 件 名 为 sys_clk_timer 5. 配 置 JTAG UART 如 图 3.22 所 示, 双 击 组 件 库 中 的 JTAG UART, 添 加 JTAG UART 组 件 15
图 3.22 添 加 JTAG UART 组 件 如 图 3.23 所 示,JTAG UART 的 配 置 均 使 用 默 认 设 置, 点 击 Finish 完 成 配 置 图 3.23 配 置 JTAG UART 16
更 改 JTAG UART 组 件 名 为 jtag_uart 6. 配 置 8 位 并 行 I/O(PIO) 如 图 3.24 所 示, 双 击 组 件 库 中 的 PIO(Parallel I/O), 添 加 PIO 组 件 图 3.24 添 加 PIO 组 件 PIO 配 置 如 图 3.25 所 示, 数 据 位 宽 (Width) 选 择 8; 管 脚 方 向 ( Direction) 选 择 输 出 (Output ports only); 复 位 值 (Reset value) 为 0x0; 其 他 选 项 为 默 认 设 置 点 击 Finish 完 成 配 置 图 3.25 配 置 PIO 17
更 改 PIO 组 件 名 为 led_pio 7. 配 置 系 统 ID 如 图 3.26 所 示, 双 击 组 件 库 中 的 System ID Peripheral, 添 加 系 统 ID 组 件 图 3.26 添 加 系 统 ID 组 件 如 图 3.27 所 示, 无 需 做 任 何 设 置, 直 接 点 击 系 统 ID 配 置 窗 口 的 Finish 按 纽 即 可 不 过 请 注 意 其 中 的 警 告 信 息 是 的, 在 配 置 完 成 后, 务 必 更 改 系 统 ID 名 称 为 sysid 图 3.27 配 置 系 统 ID 18
8. 自 动 分 配 地 址 如 图 3.28 所 示, 点 击 菜 单 栏 的 System Auto-Assign Base Addresses 选 项, 自 动 分 配 处 理 器 和 各 个 外 设 的 地 址 或 者 用 户 也 可 以 直 接 点 击 地 址 栏 进 行 更 改 图 3.28 自 动 分 配 地 址 9. 自 动 中 断 优 先 级 设 置 如 图 3.29 所 示, 点 击 菜 单 栏 的 System Auto-Assign IRQs 选 项, 自 动 分 配 各 个 外 设 间 的 中 断 优 先 级 ( 如 果 有 中 断 ) 或 者 用 户 也 可 以 直 接 点 击 中 断 栏 进 行 更 改 图 3.29 自 动 分 配 中 断 优 先 级 10. 生 成 系 统 所 有 配 置 完 成, 有 心 的 同 学 一 定 发 现 了 当 鼠 标 落 在 Connection 一 列 时, 如 图 3.30 所 示, 系 统 的 互 联 结 构 出 现 了, 这 些 连 接 都 是 在 我 们 添 加 组 件 后 系 统 自 动 产 生 的 至 于 为 什 么 如 此 连 接 已 经 连 接 的 基 本 原 理 等, 这 里 不 过 多 讨 论, 后 续 教 程 会 详 细 谈 论 图 3.30 系 统 互 联 架 构 如 图 3.31 所 示, 最 后 点 击 配 置 页 面 的 下 方 Generate 按 钮, 需 要 等 待 几 分 钟, 在 System Generation 的 Info 中 若 出 现 System generation was successful 则 说 明 系 统 成 功 生 成 19
图 3.31 生 成 系 统 四 例 化 NIOS2 工 程 1. 在 Quartus II 中 新 建 一 个 verilog 文 档, 作 为 工 程 的 顶 层 文 件, 命 名 为 first_q2_prj.v 再 新 建 一 个 sys_ctrl.v 文 档, 在 其 中 编 写 一 个 系 统 复 位 的 设 计 逻 辑, 并 将 该 模 块 例 化 到 顶 层 文 件 中 复 位 模 块 的 代 码 如 下 : module sys_ctrl( clk,ext_rst_n, rst_n ); input clk; //25MHz input ext_rst_n; // 外 部 输 入 复 位 信 号, 低 有 效 output rst_n; // 低 电 平 复 位 信 号 //--------------------------------------------------- reg[9:0] rst_cnt; // 上 电 延 时 计 数 器 reg rst_nr; // 复 位 寄 存 器, 低 有 效 always @ (posedge clk or negedge ext_rst_n) // 异 步 复 位 if(!ext_rst_n) begin rst_cnt <= 10'd0; rst_nr <= 1'b0; // 复 位 中 end else if(rst_cnt!= 10'd1000) rst_cnt <= rst_cnt+1'b1; else rst_nr <= 1'b1; // 复 位 完 成 // 计 时 到 40us assign rst_n = rst_nr; endmodule 2. 如 图 3.32 所 示, 打 开 一 个 已 经 生 成 的 NIOS2 系 统 的 例 化 模 板, 将 其 内 容 复 制 到 20
first_q2_prj.v 中 进 行 例 化 图 3.32 打 开 NIOS2 系 统 例 化 模 板 打 开 的 NIOS2 系 统 例 化 模 板 的 代 码 如 下 : //Example instantiation for system 'first_nios2_sys' first_nios2_sys first_nios2_sys_inst (.clk (clk),.out_port_from_the_led_pio (out_port_from_the_led_pio),.reset_n (reset_n) ); 对 其 进 行 相 应 的 接 口 例 化 更 改 后 如 下 : //nios2 系 统 例 化 first_nios2_sys first_nios2_sys_inst (.clk (clk),.out_port_from_the_led_pio (led_pio), 21
);.reset_n (rst_n) 最 终 得 到 的 工 程 顶 层 模 块 代 码 如 下 : module first_q2_prj( clk,ext_rst_n, led_pio ); input clk; //25MHz input ext_rst_n; // 外 部 输 入 复 位 信 号, 低 有 效 output[7:0] led_pio; //8 位 流 水 灯,0-- 点 亮 //--------------------------------------------------- wire rst_n; // 低 电 平 复 位 信 号 //--------------------------------------------------- // 复 位 产 生 模 块 sys_ctrl uut_sc(.clk(clk),.ext_rst_n(ext_rst_n),.rst_n(rst_n) ); //--------------------------------------------------- //nios2 系 统 例 化 first_nios2_sys first_nios2_sys_inst (.clk (clk),.out_port_from_the_led_pio (led_pio),.reset_n (rst_n) ); endmodule 五 分 配 管 脚 与 编 译 下 载 22
1. 对 上 述 例 化 并 编 写 好 的 代 码 进 行 综 合, 然 后 点 击 Assignments Pins 进 行 管 脚 分 配 分 配 完 管 脚 如 图 3.33 所 示 图 3.33 管 脚 分 配 2. 如 图 3.34 所 示, 双 击 Assembler(Generate programming files) 编 译 整 个 工 程, 并 产 生 下 载 用 的 *.pof 文 件 当 然 了, 在 编 译 过 一 次 工 程 后, 需 要 做 一 些 时 序 约 束 并 达 到 时 序 收 敛 才 可 以 继 续 往 下 走 这 个 步 骤 由 于 涉 及 的 知 识 点 比 较 深, 在 这 个 流 程 实 例 中 就 不 多 演 示, 希 望 大 家 能 现 有 这 样 一 个 概 念, 后 面 的 教 程 里 应 该 会 华 专 门 的 一 些 篇 幅 进 行 讨 论 图 3.34 编 译 产 生 下 载 文 件 3. 确 保 Blaster II( 并 口 ) 下 载 线 或 USB Blaster 下 载 线 与 SF-NIOS2 FPGA 板 连 接 好, 并 给 板 子 上 电 同 时 下 载 刚 刚 生 成 的 *.pof 文 件 到 开 发 板 中 手 把 手 软 件 工 程 一 新 建 软 件 模 板 工 程 23
1. 打 开 软 件 开 发 工 具 Nios II 9.1 Software Build Tools for Eclipse( 简 称 EDS) 第 一 次 打 开 EDS 软 件, 会 弹 出 如 图 3.35 所 示 的 workspace 选 择 框, 点 击 OK 即 可, 不 要 对 路 径 做 任 何 更 改 或 者 也 可 以 勾 选 Use this as the default and do not ask again 2. 如 图 3.36 所 示, 新 建 一 个 NIOS II Application and BSP from Template 工 程 图 3.36 新 建 NIOS2 工 程 2. 如 图 3.37 所 示, 对 新 建 的 NIOS2 软 件 工 程 进 行 设 置 点 击 SOPC Information File name 一 24
栏 后 的 按 钮, 找 到 硬 件 工 程 所 在 目 录 下 的 first_nios2_sys.sopcinfo 文 件, 这 里 硬 件 和 软 件 之 间 就 是 通 过 这 个.sopcinfo 文 件 进 行 关 联, 就 这 么 简 单, 个 中 奥 秘 还 有 待 各 位 花 精 力 自 己 去 研 究 指 定 了.sopcinfo 文 件 后,CPU name 自 动 显 示 为 cpu 在 Project name 一 栏 输 入 软 件 工 程 名 为 first_swprj 使 用 默 认 的 软 件 工 程 存 放 目 录, 即 在 硬 件 工 程 目 录 下 生 成 一 个 名 为 software 的 目 录 用 于 存 放 软 件 工 程 选 择 工 程 模 板 (Project Template) 中 的 Count Binary 然 后 点 击 Finish 完 成 工 程 新 建 图 3.37 配 置 新 建 工 程 3. 等 待 一 会 后, 如 图 3.38 所 示, 在 工 程 目 录 窗 口 生 成 了 两 个 工 程, 一 个 是 软 件 应 用 工 程, 另 一 个 是 bsp 工 程 前 者 用 于 工 程 师 编 写 程 序 ; 后 者 一 般 是 系 统 自 动 产 生, 无 需 用 户 手 动 编 辑, 他 主 要 是 根 据 不 同 的 硬 件 外 设 配 置 产 生 很 多 底 层 驱 动 相 关 的 程 序, 在 应 用 层 只 要 调 用 这 些 程 序 就 可 以 了, 因 此 可 以 说 bsp 工 程 的 主 要 作 用 就 是 做 底 层 驱 动, 衔 接 应 用 层 和 硬 件 层 图 3.38 工 程 目 录 25
七 设 置 软 件 编 译 属 性 由 于 正 常 的 工 程 模 板 软 件 C 代 码 量 比 较 大, 而 我 们 所 分 配 的 可 用 片 内 存 储 器 (onchip_mem) 容 量 也 不 大 (12KBytes), 因 此 需 要 在 软 件 编 译 属 性 里 做 一 些 简 单 的 设 置, 以 裁 剪 代 码 量, 否 则 编 译 将 无 法 通 过 代 码 裁 剪 不 是 无 依 据 的 随 便 设 置, 在 官 方 的 edh_ed_handbook.pdf Section II 3.Debugging Nios II Designs Reducing Code Size 一 节 有 所 描 述 因 此, 根 据 文 档 中 推 荐 的 消 减 代 码 需 要 做 如 下 设 置 如 图 3.39 所 示, 右 键 点 击 打 开 该 工 程 的 BSP 编 辑 界 面 26
图 3.39 打 开 BSP 编 辑 界 面 然 后 弹 出 如 图 3.40 所 示 的 BSP 编 辑 界 面, 在 这 个 编 辑 界 面 中 根 据 官 方 推 荐 进 行 设 置 最 后 需 要 保 存 并 点 击 右 下 角 的 Generate 完 成 后 退 出 即 可 图 3.40 BSP 编 辑 界 面 27
八 软 件 编 译 和 下 载 1. 如 图 3.41 所 示, 右 键 点 击 first_swprj 的 Build Project 选 项 进 行 软 件 工 程 编 译 因 为 我 们 采 用 的 是 模 板 工 程, 因 此 软 件 程 序 都 是 编 写 好 的, 是 可 以 直 接 驱 动 我 们 的 8 个 LED 外 设 进 行 跑 马 灯 演 示 感 兴 趣 的 朋 友 可 以 展 开 first_swprj 的 工 程 目 录, 打 开 count_binary.c 进 行 查 看 图 3.41 编 译 工 程 2. 第 一 次 编 译 时 间 稍 微 长 一 些 软 件 编 译 完 成 后,console 面 板 出 现 一 些 编 译 相 关 信 息, 其 中 有 两 行 如 下 : Info: (first_swprj.elf) 4452 Bytes program size (code + initialized data). Info: 7836 Bytes free for stack + heap. 说 明 编 译 的 软 件 工 程 产 生 代 码 4452 字 节,12KB 总 存 储 量 中 剩 余 7836 字 节 可 用 如 果 不 做 前 面 的 代 码 消 减 优 化, 产 生 的 代 码 量 肯 定 要 比 这 大 几 倍, 甚 至 超 出 12KB 使 得 编 译 无 法 通 过 因 为, 默 认 情 况 下 系 统 会 将 底 层 用 户 用 到 的 不 用 到 的 所 有 相 关 驱 动 程 序 都 编 译 进 生 成 的 代 码 里 优 化 的 目 的 就 是 删 除 一 些 不 使 用 的 驱 动 程 序 从 而 减 小 代 码 量 28
3. 如 图 3.42 所 示, 右 击 first_swprj 的 Run As Nios II Hardware 选 项 图 3.42 在 目 标 板 上 运 行 软 件 稍 等 片 刻, 此 时 一 般 会 弹 出 如 图 3.43 所 示 的 运 行 配 置 窗 口 在 该 窗 口 中 提 示 下 载 线 出 现 不 匹 配 错 误, 因 此 需 要 用 户 进 入 Target Connection 中 刷 新 一 下 即 可 如 图 3.44 所 示, 点 击 Refresh Connections, Cable 窗 口 下 就 出 现 了 已 经 连 接 上 的 下 载 线 名 称, 然 后 点 击 右 下 角 的 Run 按 钮 即 可 片 刻, 我 们 可 以 看 到 SF-NIOS2 FPGA 板 上 的 8 个 LED 闪 烁 的 很 欢 快 29
图 3.43 运 行 配 置 界 面 图 3.44 刷 新 下 载 线 连 接 并 运 行 最 后, 恭 喜 您 完 成 了 第 一 个 NIOS2 工 程 的 建 立 希 望 第 一 个 工 程 带 您 熟 悉 了 NIOS2 的 开 发 流 程 30
淘 宝 购 买 链 接 : http://item.taobao.com/item.htm?id=4960737623( 长 期 供 货, 拍 下 即 可 发 货 ) http://store.taobao.com/shop/view_shop-14b53135f7cecd2b76b747bde6793308.htm( 著 名 电 子 网 站 ednchina 的 淘 宝 店 铺, 周 一 至 周 五 上 班 时 间 在 线 ) http://store.taobao.com/shop/view_shop-14b53135f7cecd2b76b747bde6793308.htm( 长 期 在 线 ) 31