锯齿波图形显示系统详细设计
推荐给好友
打印
加入收藏
更新于2008-01-22 13:53:40

第一章

引言
本文档用于描述基于 THX3E-I 锯齿波的图形显示系统的功能定义,各模块详细设计及设计流程。

1.2 适应范围
THX3E-I 的锯齿波图形显示适用于本文档所描述的设计规范

1.3 文档简述
本文档对于 THX3E-I 试验系统,Xilinx FPGA 设计,IP core 设计,嵌入式 MicroBlaze处理器部署,锯齿波显示原理进行了详细论述。

1.4 术语
SOPC:System On Programmable Core,
IP : Intellectual Property,
IPIF: Intellectual Property Interface,
IPIC: Intellectual Interconnect,
OPB: On-chip Peripheral Bus,
UCF: User Constraints File,

1.5 参考文献
THX3E-I 试验教材,课程示例文档,课程 PPT 资源,Xilinx 帮助文件


第二章

2.1 系统总体功能及模块划分
锯齿波图形显示系统概述
该系统的硬件平台采用了 THX3E-I 创新 SOPC 实验套件,其核心 FPGA 芯片采用了XILINX 公司 SPARTAN III 系列的 XC3S250E。实验套件提供了 1 个 7 段数码管、7 个 LED、4 个轻触按键、256 色标准 VGA 彩显接口、1 个 PS/2 鼠标/键盘接口、1 个 RS232 接口。该实验平台资源较为丰富。XC3S250E 可以提供 25 万逻辑门,216kb 块 RAM 以及较为丰富 I/O脚的,完全可以满足我们的设计要求。
该系统的主要功能为锯齿波图形的演示。系统可以演示多种锯齿波波型,并可以通过键盘控制锯齿波的振幅和频率以及前景和背景色。系统通过 RS232 显示提示信息并可以输入一些简单命令。系统功能框图如图 2.1 所示。


该系统按照功能主要分为三大模块,MicroBlaze 处理器模块,键盘及串口 IP Core 功能模块和 VGA 显示模块。MicroBlaze 处理器控制模块包括了软件和硬件的设计:硬件主要负责处理器核的生成和各个模块的挂接。软件则负责实现锯齿波生成算法,以及各模块之间的通信和协调。该模块的硬件设计由马喆负责,软件则由王小洋负责。键盘及串口模块主要负责键盘和串口的驱动,以及控制命令的输入和用户界面的显示,该部分工作由王永胜负责。显示控制模块主要负责 CRT 显示器的驱动以及锯齿波的图形显示,该部分工作由王东负责。

2.2 系统硬件功能
本章主要介绍各个模块的结构和功能。

2.2.1 MicroBlaze 处理器功能描述
Xilinx 公司的 MicroBlaze 软处理器核是业界最快的软处理解决方案,它是精简指令集处理器(RISC),是 Xilinx 公司为其 FPGA 芯片专门优化后的一种产品。MicroBlaze 支持CoreConnect 总线的标准外设集合为 MicroBlaze 设计人员提供了兼容性和重复利用能力。
MicroBlaze 处理器最高运行频率是 200MHz,可提供 125 D-MIPS 的性能,非常适合设计针对网络、电信、数据通信、嵌入式和消费市场的复杂系统。

2.2.1.1 MicroBlaze 的体系结构
MicroBlaze 就是基于 Xilinx 公司 FPGA 的微处理器 IP 核,利用它和其他外设 IP 核一起,就可以完成可编程系统芯片(SOPC)的设计。MicroBlaze 处理器是采用 RISC 架构和哈佛结构的独立 32 位指令和数据总线,可以全速度执行存储在片上存储器和外部存储器中的程序并访问其中的数据。其内核结构如图 2.2.1 所示。MicroBlaze 内部有 32 个 32 位通用寄存器和 2 个 32 位特殊寄存器——PC 指针和 MSR 状态标志寄存器。为了提高性能,MicroBlaze还具有指令和数据缓存。所有的指令字长都是 32 位,允许三个操作数和两种寻址模式。指令按功能划分有逻辑运算、算术运算、分支、存储器读/写和特殊指令等。指令执行的流水线是并行流水线,它分为 3 级流水:取指、译码和执行。


2.2.1.2 MicroBlaze 的 CoreConnect 技术
CoreConnect 是由 IBM 开发的片上总线通信链,它使多个源的芯片核相互连接成为一个完整的新芯片成为可能。CoreConnect 技术使整合变得更为容易,而且在标准产品平台设计中处理器、系统以及外围的核可以重复使用,以达到更高的整体系统性能。
CoreConnect 总线架构包括处理器本机总线(PLB)、片上外围总线(OPB)、一个总线桥、两个判优器,以及一个设备控制寄存器(DCR)总线,CoreConnect 总线架构如图 2.2.2所示。Xilinx 将为所有嵌入式处理器用户提供 IBM CoreConnect 许可,因为它是所有 Xilinx嵌入式处理器设计的基础。MicroBlaze 处理器使用了与 IBM PowerPC 相同的总线,用作外设。虽然 MicroBlaze 软处理器完全独立于 PowerPC,但它让设计者可以选择芯片上运行的方式,包括一个嵌入式 PowerPC,并共享它的外设。

  • CoreConnect 体系结构——片上外设总线(OPB)

    内核通过片上外设总线(OPB)来访问低速和低性能的系统资源。OPB 是一种完全同步总线,它的功能处于一个单独的总线层级。它不是直接连接到处理器内核。OPB 接口提供分离的 32 位地址总线和 32 位数据总线。处理器内核可以借助“PLB to OPB”桥,通过 OPB 访
    问从外设。作为 OPB 总线控制器的外设可以借助“OPB to PLB”桥,通过 PLB 访问存储器。
  • CoreConnect 体系结构——处理器本机总线(PLB)

    PLB 接口为指令和数据一侧提供独立的 32 位地址和 64 位数据总线。PLB 支持具有 PLB总线接口的主机和从机通过 PLB 信号连接来进行读写数据的传输。总线架构支持多主从设备。每一个 PLB 主机通过独立的地址总线、读数据总线和写数据总线与 PLB 连接。PLB 从机
    通过共享的但是分离的地址总线、读数据总线和写数据总线与 PLB 连接,对于每一个数据总线都有一个复杂的传输控制和状态信号。为了允许主机通过竞争来获得总线的所有权,有一个中央判决机构授权对 PLB 的访问。这种判决机制的灵活性可以提供各种各样的优先级。
  • CoreConnect 体系结构——设备控制寄存器总线(DCR)

    设备控制寄存器总线(DCR)是为在 CPU 通用寄存器(GPR)和 DCR 的从逻辑设备控制寄存器(DCR)之间的数据传输而设计。

2.2.2 键盘及串口 IP Core 功能描述
本小节主要介绍键盘 IP Core 与 RS232 串口 IP Core 的基本功能。

2.2.2.1 键盘 IP Core 的基本功能与实现原理
键盘 IP Core 通过 PS2 接口规范独立接收来自键盘的扫描码。所谓扫描码是指键盘上每一个按键被按下时由键盘控制器发出的 8 位代码。当按键始终保持按下时,每隔 100ms 发送一次扫描码;当一个按键被松开时,断码“F0”会跟随在相应扫描码之后被发送。键盘控制器实际发送的码值是一个 11 位的字,包括一位“0”起始位、8 位数据位、一位奇偶校验位以及一位“1”停止位。键盘控制器在发送数据时产生传输 11 位数据的 Clock 时钟,大约在 20~30KHz,数据在下降沿有效。
键盘 IP Core 首先用 VHDL 语言编写相应的代码逻辑来解读接收到的键盘扫描码,确定按下的键值,同时通过识别紧随于扫描码之后的断码“F0”来判断一次按键结束,之后将本次识别的按键值通过寄存器 reg0_data 发送给 FPGA 内嵌 CPU。同时为识别相邻两次按键按下相同按键的情况,在键盘 IP Core 发送给 CPU 的寄存器键值中加入一个 8 位字表示按键次数的计数值。CPU 主控程序中可以通过这一计数值的有无更新来判断当前寄存器的键值是否被更新,从而识别相邻两次按键相同的情况。具体的程序细节参阅本文相关章节论述。




2.2.2.2 串口 IP Core 的基本功能与实现原理
在设计初期计划使用串口通信在 FPGA 内嵌 CPU 与 PC 机之间通信大量数据,但随着工作的不断进展与调整,最后串口部分主要作为调试的观察手段以及初始启动系统工作的一个接口。
RS232 串口的数据收发驱动是参阅 RS232 IP Core 的文档独立设计的,实现了内嵌 CPU与 PC 机之间的数据收发通信。在调试阶段,经常需要实时了解某一程序变量的当前值,即利用串口的发送功能将需要观察的变量值发送给上位 PC 机的串口调试工具显示,这对我们程序的调试起到了很重要的作用,大大加快了整个系统的调试与整合进程。最后的系统中,为展示我们在串口方面的工作,特别使用串口作为整个系统的启动接口。
通过 PC 机串口调试工具向内嵌 CPU 首先发送一个字符,系统才会进入正常工作状态,否则一直等待其到来。这也表明串口的接收功能是正常的。


2.2.3 VGA 显示模块功能描述

VGA 显示控制模块的主要功能是负责 CRT 显示器的驱动以及锯齿波的图形显示。该模块设计实现了分辨率为 640*480,256 色的彩色显示驱动。
从功能上来讲,显示模块可分为两个部分:显示控制和 DB15 接口驱动。显示控制模块设计实现了 2kB 的显存,可以保存 2 行显示数据。显示控制模块接收处理器的显示数据,存入显存;并按照一定时序控制驱动 DB15 在 VGA 显示器进行显示。


2.3 系统软件功能
本节介绍 THX3E-I 锯齿波图形显示系统软件部分功能。分为系统软件功能简介和用户
操作流程两个小节。

2.3.1 系统软件功能简介
在利用 Xilinx FPGA 设计实现嵌入式 MicroBlaze 处理器部署、键盘及串口 IP Core 的添加以及 VGA 显示模块的生成等硬件功能的基础上,需要设计一个可以综合利用所有硬件模块的实际应用,并利用 Xilinx EDK 开发工具内嵌的 SDK 标准开放包用软件实现应用功能本小组经过反复讨论与比较,决定采取波形显示系统这种能综合各硬件模块的软件应用。具体的软件控制下各模块功能关系简图如下所示:


首先,处理器向串口发送“系统已准备完毕”的对应字符信号;待使用者从串口发送“开始绘图”指令后,处理器即按照默认绘图波形参数向显示器输出显示数据,显示器可以完成波形的显示;使用者可在发出“开始绘图”指令后,利用键盘的对应按键发送波形参数调整信号控制波形的幅度与相位,处理器接收到波形调整信号后根据波形参数计算波形各点位置,并将显示数据输出到显示器;每次波形参数调整后,处理器会将新的波形参数输出到串口。
系统软件经编译下载后,以处理器指令形式存储在 FPGA 内置的指令存储器中,处理器加载指令后即按照指令设定完成上述功能简图所示各项控制、通讯以及计算功能。经过实际编程对比与尝试,最终选定实现锯齿波图形显示,由此即构成 THX3E-I 锯齿波图形显示系统。

2.3.2 用户操作流程
本系统综合使用键盘、串口实现系统的操作控制,并将锯齿波图形数据通过 VGA 接口发送至显示器。用户将 PS2 键盘、串口通讯模块、VGA 接口显示器通过对应接口线连接至FPGA 开发板上即完成了系统的硬件准备。打开电源后,用户的主要操作流程如下图所示:


本小节将分别根据上述五个步骤讲解本系统的各项操作细节。
1.等待系统初始化完毕


基于 FPGA 的锯齿波图形显示系统初始化完毕后,会向串口发送“Press any key tocontinue”字符串。用户只需利用合适的串口通讯模块接收到该字符串后,即可开始下一步骤;否则,需要继续等待。如上图所示:对于一般的 PC 用户,可以将 FPGA 开发板上的串口与 PC 机主板上的串口相连,利用可在网上下载的各种串口调试工具接收和发送串口消息。下图中是一个串口调试工具:串口调试助手的界面截图,如图所示,已经接收到系统初始化完毕的消息。
2.用串口发送任意字符
等待接收到系统初始化完毕的字符串后,可向串口发送任意字符,系统接收到该字符后即开始进行锯齿波曲线绘制。如果利用 PC 机和第 1 步所述串口调试工具,可以在发送框内发送任意字符,点击“发送”,即可进入下一步,如下图中选择发送字符“a”。


3.观察显示波形图形
等待显示器显示图像稳定后,即可观察经 FPGA 生成的处理器软核 MicroBlaze 通过软件默认参数计算,并控制 VGA 模块逐行扫描显示出来的锯齿波波形图。实际显示器显示的波形曲线和背景为分别取两种颜色的彩色波形图。由于报告中无法再现显示器的实际显示效果,以下为给读者一个直观印象,特提供用 Matlab 绘制的与实际显示器输出波形一致的波形形式图。系统预设显示器分辨率大小为 640×480,坐标轴是 Matlab 给出的。如下所示:默认参数系统输出波形形式图


4.用键盘调整波形参数
如下图键盘示意图所示,红框中的按键如果被敲击,系统会产生对应响应,并改变所显示的波形图


“A”、“S”、“D”、“W”四键控制曲线的对应参数,其中“A”与“D”分别控制曲线周期减小和增大,“S”与“W”分别控制曲线幅度减小和增大。“1”、“2”、“3”、“4”四键控制显示界面中曲线和背景的颜色,其中“1”、“2”两键控制背景颜色,“3”、“4”两键控制前景颜色。 敲击上述八个按键的任何一个之后,显示器屏幕会刷新重绘,待显示器显示稳定后,即为改变波形参数和状态后的显示波形。
5.程序运行结束
点击开发板上定义的系统 Reset 键后,断开开发板电源,结束系统程序运行。


第三章

3.1 总体设计流程
锯齿波图形显示系统设计流程
锯齿波图形显示系统的硬件结构如下图所示:


该系统的主要功能是锯齿波的显示和变换。因此,必然有一个图形的生成算法,同时也要有一个输入输出的界面和命令。为了实现这些功能,我们在系统得设计中引入了嵌入式设计,使用 MicroBlaze 作为主控 CPU,标准 OPB 总线作为外部总线,各个外设模块采通过该总线与 CPU 交换数据,构成一个 SOPC。
嵌入式 MicroBlaze 是 Xilinx 公司提供的软 32 位 CPU 核,采用 RISC 设计,具有独立总线。THX3E-I 提供了 50M 时钟作为 CPU 的主频。MicroBlaze 内部实现双 BRAM 各 16k 作为指令和数据内存,分离的结构利于编写程序和提高程序执行速度。为了设计的简单和节省资源,我们并没有使用 Cache。32k 内存基本可以满足设计的需要。MicroBlaze 使用 PLB 高速总线来连接内部 BRAM,通过 OPB 与其它外设通信,MicroBlaze 通过 OPB 接收从外设发送来的数据,通过使用 SDK 编程作出相应的处理。
通过 OPB,MicroBlaze 总共挂接了四个外设:Debug 调试模块(opb_mem),RS232 串口模块(opb_uartlite),键盘控制模块(thekb),VGA 显示控制模块(myvga_32bit)。其中,Debug 调试模块为自动生成,调试所用。RS232 为 Xilinx 提供标准 IP core 可以直接加入使用。RS232 作为一个串口的调试界面,可以输入开始和结束命令,并显示当前的锯齿波的参数。
键盘控制的设计采用通用键盘的实现形式。用户通过通用键盘向 MicroBlaze 输送信息,使用的键盘方式只向主机单向传输数据,而不接收主机发送过来的数据。键盘输出的是扫描码,按串行方式输出。键盘输出的信号包括时钟信号和串行数据信号。键盘接口电路,按照串行传送的键盘代码的应答约定,接收键盘发送的扫描码,同时,还向键盘发送主机的控制信号。扫描码存放在寄存器中,MicroBlaze 定时检查寄存器状态,读取新的键盘数据数据命令,程序根据该命令调整显示参数,改变锯齿波的频率和振幅。
VGA 显示控制模块,VGA( 视频图形阵列 ) 作为一种标准的显示接口得到广泛的应用,它的设计主要有两个方面:一是时序驱动,VGA 的显示需要正确的时序;另一个是显存的设计,由于 FPGA 资源有限我们的显存设计显然无法放入一个完整的帧,因此要采用部分保存,每行更新的方法。

3.2 系统硬件设计流程
本节主要介绍锯齿波显示系统各个硬件模块的设计流程。 

3.2.1 MicroBlaze 处理器设计流程

3.2.1.1 MicroBlaze 的开发
应用 Xilinx EDK(嵌入式开发套件)可以进行 MicroBlaze IP 核的开发,构建嵌入式系统。工具包中集成了硬件平台产生器、软件平台产生器、仿真模型生成器、软件编译器和软件调试工具等,EDK 中提供了一个集成开发环境 XPS(Xilinx 平台工作室),以便使用系统提供的所有工具,完成嵌入式系统开发的整个流程。EDK 中还带有一些外设接口的 IP 核,如 LMB、OPB 总线接口、外部存储控制器、SDRAM 控制器、UART、中断控制器、定时器等,利用这些资源,可以构建一个较为完善的嵌入式微处理器系统。在 FPGA 上设计的嵌入式系统的层次结构分为 5 级。其中,可在最低层硬件资源上开发IP 核,或利用已开发的 IP 核搭建嵌入式系统的硬件开发部分;开发 IP 核的设备驱动、应用接口(API)和应用层(算法)属软件开发内容。利用 MicroBlaze 构建基本的嵌入式系统,
如图 3.2.1 所示。通过标准总线接口-LMB 总线和 OPB 总线的 IP 核,MicroBlaze 就可以和各
种外设 IP 核相连。


3.2.1.2 MicroBlaze 处理器生成流程
下面结合我们课程小组的设计,详细说明我们利用 Xilinx EDK 生成软核到 CPU 的过程。我们的芯片是 250E,设计过程如下:
打开 Xilinx Platform Studio 软件,选新建 project,如图 3.2.2(a)点击 OK 进入下一步,选择文件目录,进入下一步。


选择 I would like to create a new design,进入下一步如图 3.2.2(b)选择,点击Next。


我们电路板上的 FPGA 型号是 Spartan3e 系列的 xc3s250e,封装型号是 tq144,如图3.2.2(c)选择,下载处理器型号是 Microblaze,点击 Next。

 
如图 3.2.2(d),选取时钟频率 50MHz,BRAM 为 8Kb,点击 next。因为我的设计要用到串口,因此在 Add Device 里添加串口,如图 3.2.2(e)所示,选取波特率 115200,字节宽度 8 位。随后一直 next 直到 Generate。这样就将 Microblaze 软核下载到了 xc3s250e 芯片中,同时在 OPB 总线上挂有外设 RS232 串口,如图 3.2.2(f)所示。这样,整体结构平台就建立好了。随后的工作就是添加我们自己的 IP 核,如 VGA 显示、键盘控制,最后再完成应用程序的编写。



3.2.2 键盘及串口 IP Core 模块设计流程
由于在课程中老师提供了一个较为可靠的的键盘 VHDL 实现,同时为便于整个系统最后各模块的整合调试,我们小组在讨论的基础上决定采用用户外设 IP Core 的技术来将键盘以及串口作为两个独立的 IP Core 来实现。这两个 IP Core 首先经过前期的独立验证之后,再联合 VGA 部分以及图形产生程序部分来整合为我们最终的系统。
本节首先介绍 OPB 总线的概念,之后针对键盘 IP Core 的生成来介绍用户外设 IP Core的生成过程以及键盘 IP Core 的添加调试过程,最后针对串口 RS232 IP Core 介绍 EDK 自带IP Core 的添加与使用过程。虽然 EDK 软件对于自带 RS232 串口 IP Core 可以自动生成底层数据收发驱动,但由于前期对于这一部分工作的不熟悉,串口部分的 IP Core 事实上是由小组成员王东自行编写的底层数据收发的驱动,并在最后的应用中表现良好。关于这一驱动部分的编写请参阅有关章节。
在 2.2.2 小节中,我们注意到内嵌 CPU 与外设 IP Core 之间的数据通信都是通过对寄存器的读写来实现的。事实上,寄存器的读写并不是 CPU 与相应 IP Core 直接交互的,而是通过 OPB 总线作为中介来实现的。其连接原理图如图 3.2.3 所示:


从图中可以看到,用户 IP Core 的逻辑需要放入 USER LOGIC 部分,通过 IP 接口(IPIF )挂载到 OPB 总线上,CPU 通过对 OPB 总线的访问来访问用户 IP Core 的逻辑部分。具体更为详细的介绍可以参阅 EDK 自带文档 opb_ipif_arch.pdf 等。
从图 3.2.3 可以看到,我们需要做的工作可以分为两部分:一是编写用户 IP Core 的逻辑部分 USER LOGIC;二是将 USER LOGIC 挂载到 OPB 总线上去,使得 CPU 可以访问 IP Core。
第一部分的工作首先是编写相应逻辑,并在 ISE 中验证其功能的正确性,最后再将其拷贝到相应的文件 User_Logic 中;第二部分的工作借助 EDK 自带的 IP Core 生成工具来实现 IP Core到 OPB 总线的挂载,这里大部分的连接关系只需要通过相应的配置就可以实现,同时生成供用户修改的SER LOGIC 部分。其中生成的 USER LOGIC 部分包含两个文件,一个是第一部分的逻辑要拷贝到的文件 User_Logic,另一个是以 IP Core 名称命名的逻辑实现文件。在修改完 USER LOGIC 部分之后,需要再次使用 IP Core 工具来引导使得新修改的逻辑生效。
下面以键盘 IP Core 的生成为例介绍 IP Core 的生成过程。首先使用 EDK 创建好一个MicoreBlaze CPU 内核,之后选择菜单 Hardware/Creeat and Import Peripheral Wizard,进入 IP Core 生成与引导向导。如下图所示。


点击“Next”,保持默认 Select Flow 选择状态为 Create templates for a newperipheral;点击“Next”,保持默认选项为 To an XPS project;点击“Next”,进入 Nameand Version 对话框,在 Name 一栏添入用户 IP Core 的名字,此处我们键盘 IP Core 的名字为 thekb,如图 3.2.5 所示;点击“Next”,保持 Bus Interface 默认选项为 On—ChipPeripheral Bus(OPB);点击“Next”,进入 IPIF 对话框,根据需要配置寄存器、中断等的需求,作为键盘 IP Core 仅使用软件寄存器即可,如图 2.3.6 所示;点击“Next”,进入用户寄存器个数与字长配置对话框,根据需要选择,此处我们保持默认 1 个寄存器,字长为32 位,如图 2.3.7 所示;点击“Next”,进入 IPIC 对话框,保持默认;点击“Next”,进入可选的 Peripheral Simulation Support 对话框,保持默认;点击“Next”,进入可选的 Peripheral Implement Support 对话框,保持默认;点击“Next”,进入 Finish 对话框,点击“Finish”完成 IP Core 的生成,如图 2.3.8 所示。这一过程主要是生成一个空的 IP Core所需的基本文件,包括生成用户需要修改的 USER LOGIC 部分所需文件。同时在 Finish 对话框中可以看到关于所生成的 IP Core 的主要信息。




之后将经过 ISE 验证过的键盘 VHDL 程序的相应部分拷贝到 USER LOGIC 部分相应的文件中,并作相应的修改,再重新使用 Create and Import Peripheral Wizard 来引导外设。USERLOGIC 需要修改的有:文件 user_logic.vhd,文件 thekb.vhd。这两个文件均在所生成的 IPCore 目 录 下 。 例 如 我 们 所 生 成 的 IP Core 目 录 为 “ D:\FPGA_Xilinx\WORK\pcores\thekb_v1_00_a”,则这两个文件的目录即为“D:\FPGA_Xilinx\WORK\pcores\thekb_v1_00_a\hdl\vhdl”。具体修改符合 VHDL 的语法规则,此处不再详细赘述。
下面介绍引导外设的过程:选择菜单 Hardware/Creeat and Import Peripheral Wizard,进入 IP Core 生成与引导向导。如图 3.2.4 所示。点击“Next”, 修改 Select Flow 选择状态为 Import existing peripheral;点击“Next”,保持默认选项为 To an XPS project;点击“Next”,进入 Name and Version 对话框,在 Name 下拉框中选择用户 IP Core 的名字,此处我们键盘 IP Core 的名字为 thekb,同时选中 Use version 复选框;如图 3.2.9 所示;点击“Next”,选择源文件类型的为 HDL source file,如图 3.2.10 所示,点击“Next”,选中 Use existing Peripheral Analysis Order file(*.pao),并 Browse 用户 IP Core 的“*.pao”文件,如图 12 所示;点击“Next”,保持默认;点击“Next”,进入 Bus Interface
对话框,此处我们选择 OPB Slave(SOPB);点击“Next”,进入 Port 对话框,保持默认;点击“Next”,保持 SOPB:Parameter 默认;点击“Next”,进入 Identify Interrupt Signals,取消选择 Select and configure interrupt(s),如图 3.2.12 所示;点击“Next”,保持默认 Parameter Attributes;点击“Next”,保持默认 Port Attributes;点击“Next”,进入 Finish 对话框,如图 3.2.13 所示。Finish 对话框中列出用户外设 IP Core 的主要信息。




点击此处,下载全图


至此用户外设 IP Core 的生成完成,下一步是将其加入到 EDK 工程中。在 EDK 界面的左侧 Project Information Area 的 IP Catalog 中双击 Project Local pcores 下的 thekb,即可将键盘 IP Core thekb 添加至工程中。此时,在右侧 System Assembly View1 中可以看到新添加的 IP Core thekb,单击上方 Filter 区域的 Bus Interface,再单击 OPB 与 thekb的节点,使之有空心变为实心,即表示该 IP Core 已经挂载到 OPB 总线上,如图 3.2.14 所示;之后单击上方 Filter 区域的 Port,为用户 IP Core 连接外部管脚,如图 3.2.15 所示之后单击上方 Filter 区域的 Address,为用户 IP Core 分配寄存器地址,如图 3.2.16 所示。
之后,在左侧 Project Information Area 的 Project 中双击 Project Files 下的 UCF File:*.ucf,在打开的 UCF 文件中为用户 IP Core 的外部管脚分配实际管脚,如图 3.2.17 所示。
最后可以在 EDK 中的 Application 中编写测试程序,也可以在启动 SDK 来编写应用程序。同时 EDK 的生成向导自动生成一些头文件以及相应于配置过程的基本函数,在实际的程序编写时可以利用之,简化编程的复杂度。例如,对于我们的 IP Core thekb,生成的头文件“thekb.h”中包含键盘 IP Core 的寄存器的基地址宏定义,以及该寄存器的读写访问函数,都是可以直接利用的,这些基本函数的具体实现在工程文件目录下的 drivers 目录下以用户IP Core 名字命名的文件夹中可以找到,在工程 CPU 目录 microblaze_0 下也可以找到。此处不再详细赘述。
至此,基于用户逻辑的用户外设 IP Core 的生成与添加就全部完成,下一步工作就是编写应用程序来访问用户 IP Core 这一外设。




下一步介绍 EDK 自带 RS232 串口 IP Core 的生成与添加过程,使用 EDK 自带的 RS232 串口 IP Core 外设可以有两种办法。一种为在初始生成 CPU 内核时选择添加串口 RS232 设备,如图 19 所示;另一种是在生成 CPU 内核以后,通过在 EDK 界面左侧 Project Information Area
的 IP Catalog 中双击 Communication Low-Speed 下的 OPB UART(Lite),将该串口 IP Core添加到工程中,如图 3.2.19 所示,之后需要像引导用户外设键盘 IP Core 一样操作:首先将该 IP Core 与 OPB 总线连接,之后连接 IP Core 的外部管脚,分配地址以及在 UCF 文件中分配管脚。




3.2.3 VGA 显示模块设计流程
如前所述,该模块实现了分辨率为 640*480 的 256 色的彩色显示驱动。VGA( 视频图形阵列 ) 作为一种标准的显示接口得到广泛的应用 , 一般有专用芯片,本实验采用 VHDL 设计 VGA 接口可以将要显示的数据直接送到显示器,加快了数据的处理速度,节省了 CPU的处理时间。
显示模块的设计如图所示:


显示模块从 MicroBlaze 的图形算法接收数据存入帧缓冲中,视频控制器则从帧缓冲器中取数据然后按照相应的时序逻辑送到 VGA 中。
VGA 的输出接口如图所示:


由于显示模块是一个标准的 OPB 总线设备,因此我们首先要采用生成 IP Core 的方法为其生成一个标准 IPIF,(生成方法参见键盘驱动 IP Core 的生成),用于和 MicroBlaze 进行通信。然后设计自己的功能模块以及 IPIC。IPIF 使用的资源包括了作为显存的 2KB 的 RAM,以及 2 个寄存器。VGA 的显示模块的设计难点主要有两个部分:1 时序逻辑的驱动;2 帧缓冲器的设计。
时序逻辑是完成设计的关键,时序稍有偏差,显示必然不正常,甚至会损坏彩色显示器。我们的显示器是采用的光栅逐行扫描刷新频率为 60hz,显示带宽为 640×480×50=15.36MHz。像素位宽为 8 位,256 色。标准的 VGA 接口需要提供以下几组信号:3 个 RGB 模拟信号、行同步信号 HS 和场同步信号 VS。信号时序如图所示:



如图所示,我们采用一个像素发生器来产生行同步和消隐信号,计数器应该每 31.77us 被复位一次。由于采用了 25M 的时钟周期(由系统时钟分频所得),因此,相应的计数器计数值为 794。由时序图可知,消隐时间应该为 6.6us,相应计数为 165 次。HS 的关闭时间为3.77us,计数 94 次。场同步信号的产生使用了行计数器,工作时,每次像素计数器复位为 0时加 1。场消隐时间为 1.534ms,等于 48 行,VS 的关闭时间为 0.064ms,为 2 行。数据在每个行同步的显示时间内被驱动到 VGA 接口中。
由于芯片资源的限制,帧缓存器的设计较为复杂。由于其容量只能够保存 2 行的数据,因此帧缓冲区必须是每行更新的。这就要求 CPU 要及时将下一行需要显示的数据及时填入缓存中。在设计中,我们将帧缓存器划分大小相等的两块,可以分别存放一帧数据。采用双缓冲设计思想。由于数据显示的确定性,显示数据的提供必须是严格按照时序在图像显示周期内每时钟提供。因此当前显示的一行数据必须是显示前已经放入缓存中的,我们称之为当前显示帧缓存。当前显示帧缓存的数据已经全部读出后,控制模块将其标注为已读空;并将地址指向下一个帧起始地址,将新的帧缓存标记为当前显示帧缓存。CPU 实时监测读空标记,标记为空后,马上将其显示数据写入并标记填满。如此循环,因为只能缓存 2 帧数据,因此必须保证全部 CPU 的填充数据和帧控制模块读取数据严格同步,我们使用了状态寄存器来协调两者的处理。

3.3 系统软件设计流程
本节介绍软件系统的具体设计细节和算法流程,分为系统软件各模块整体流程图、串口RS232 底层数据收发驱动模块原理和绘图算法原理三个小节。
3.3.1 系统软件各模块整体流程图
软件系统运行的总流程图如下所示。


初始化完毕后,等待用户从串口发出任意字符信号,接收到信号后即按照默认参数绘制波形;绘制波形完成后检查键盘输入,如果有输入,则按照新输入参数绘制波形;否则,按照原有参数继续绘制波形。
本波形显示系统没有显存模块,需要通过处理器不断计算当前行波形数据,并将数据写入两个行寄存器,VGA 接口通过读这两个行寄存器获得行扫描数据。因此,实际程序操作中,在处理器填充两个行寄存器完毕后,随即确认键盘是否输入。如果有输入,则修改参数,并立即将全图置为背景色,将行计数器置为 0,按照新参数计算当前行图形数据并写入对应行寄存器;如果没有输入,则行计数器加 1,继续按照原有参数计算下一行图形,并写入相应寄存器。

3.3.2 RS232 底层数据收发驱动模块原理
系统设计时将串口作为 RS232 的 IP Core 挂载到 OPB 总线上进行串口与处理器之间的通信。参阅 Xilinx OPB UART Lite 文献可以发现,用软件实现串口与处理器之间的通信只需要读写四个 UART 寄存器即可。这四个 32 位寄存器的地址及功能如下图所示:


各寄存器地址分别为:
Receive FIFO                UART_BASE_ADDRESS+0byte
Transmit FIFO              UART_BASE_ADDRESS+4byte
Status Register            UART_BASE_ADDRESS+8byte
Control Register          UART_BASE_ADDRESS+12byte
UART 寄存器服从 Big-Endian 的位数据排布规则,即 32 位数据高位存储于较高的寄存器地址中。在实际程序中,使用到的各寄存器位数有:
①状态寄存器地址 31 数据位:检查接收寄存器是否有数,有则返回 1。该数据位可用于处理器等待和检查串口是否有数,有则选择读取;
②状态寄存器地址 29 数据位:检查发送寄存器是否为空,空则返回 1。该数据位可用于处理器检查发送串口数据是否已发送完毕,若发送完毕则停止等待进行后续处理;
③控制寄存器地址 30、31 数据位:为 1 时分别清空接收寄存器和发送寄存器。该两项数据位可用于串口系统初始化。
本软件程序的串口操作流程如下图所示:


先置接收寄存器和发送寄存器为空;写发送寄存器后待其为空则发送完毕;经过一定延时后检查接收寄存器是否为空,为空则继续等待,反之则经过一定延时后继续后续应用程序。

3.3.3 绘图算法原理

3.3.3.1 算法参数说明
对于本系统范围内的锯齿波,较为一般的参数设置是锯齿波的周期和相位。然而,在实际应用中,要快速确定每次行计数器加 1 后,对应点在当前行上移动的距离。因此,如果设定一个基础参数反映锯齿波的斜率,则可以利用这个参数快速的计算每增加一行点在行上的位移,这个参数记为
注:屏幕的实际分辨率为 640×480,由于行寄存器的读写需要以双字为单位,因此在本小节介绍绘图算法原理时,所有行坐标均表示行寄存器双字坐标。


如上图所示,。实际算法中,,是一个存储在数组里的一系列预设变量,由键盘的“A”、和“D”键确定具体取数组里的哪一个值。另一项存储在数组里的预设变量是 ,其物理含义如上图所示。
通过这两项预设的基本变量,我们可以通过程序设计让处理器计算下述变量:


3.3.3.2 绘图流程说明
在预先设定了两个基本参数后,按照上述公式分别计算各项参数,并在每一行绘制  个对应位置点后,理论上即可获得所需的波形图形。
但在实际绘图过程中,尚受到三个因素制约:
①由于是逐行计算、写寄存器和供给显示器扫描,所以每一行计算量要尽可能小。面对这种制约,需要将更多的与当前行计数器无关的计算参量放在行扫描之外先行计算完毕;
②由于是寄存器逐行扫描,故前一行的某列 j 如果是前景像素,而后一行的列 j 是背景像素,则要在后一时刻将该列重新置为背景像素;
③寄存器修改是需要时间的,如果修改次数过多,会造成行扫描延时从而无法稳定显示图形,按照理论时间推算可得每一行寄存器双字更改次数不能超过 30 次。
受到上述条件制约,本小组设计了如下的具体绘图流程:
点击此处,下载全图

对于锯齿波而言,从每一周期起点到该周期中点之间,只需按照每一行的“周期数×\u21608X 期宽度+偏移量”确定的坐标画前景点,同时把该坐标的前一坐标置为背景点即可;对于周期起点和周期终点这两个边界点,需要同时考虑到将前一个双字位置的像素置为背景,又需要用合适的办法画出锯齿波中间的竖线,因此需要重新考虑。由于行寄存器输入 VGA 接口后扫描原则为:从上到下直至最后一行,继而继续进行下一帧从上到下扫描。因此,当扫描到前一周期最后一点时,该点必为锯齿波的最低点,将该点不置为前景而置为背景;而在下一周期扫描时,由于下一周期的第一个像素点也必为锯齿波最高点,将该点行所在的前一像素点不置为背景而置为前景。这样的设置可以刚好保证最低点和最高点中间的线段被画为前景,而该列除该线段以外的地方被画为背景。
按照这样的流程可以画出参数随键盘输入变化的各种波形。考虑到尽量使为 一个整数,设置的 取值范围分别为:(12,8,4}和{0,60,120,180}。



第四章

设计中遇到的问题及建议
1. 初始阶段在 IP Core 的生成上花了不少功夫,如果老师能够提供一些往届关于 IP Core或者其他关于 IP Core 的例子可能会加快小组的进程。
2. 在设计中对于显示的设计,感觉资源有限,显存的设计不易实现。可供参考的方法有FIFO 和双口 RAM 但是由于无法使用显示的增量更新而未采用。对现在的算法感觉不满意,CPU 的程序运行速度影响了显存的填充速度。由于时间关系,没有进行更多的尝试。也许使用汇编的编程可以有更好的效果。
3. 本门课是前八周的课程,可作业还是在期末提交,时间跨度很长,后期本课程的压力仍然很大。课程 Project 并非课程结束才能开始做,短时集中突破效率很高收效也很大;另外,课程基础作业也可尽早提交。因此建议进一步提前 Project 和作业的提交日期,例如设置在期中考试考完后的第十到十二周内提交。
4. 为了保证每个小组能够短时间高效率地完成课程设计,建议在课程进行一半如第四周时登记每个小组的题目,便于题目的难度控制和教师的辅导;并在第八周课程结束时提交课程设计的中期报告,监督和控制课程设计的进度,如果讨论积极进展顺利,这个时候各小组离完成 project 距离也不会太远。
5. 更正,原试验板串口接线有错误,耽误了不少时间,已经更正。




 


 












 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.