




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘要我们实现了一个 mips32 处理器,并在 FPGA 平台上做了验证。最初设计一些小模块时,我们主要的测试是,测试指令则是手工汇编为二进制,在复位时给指令和数据器赋初值。随着课题的进展,工程的规模和复杂度不断增加,最基本的付。为此,我们学习和使用了 quartus 提供的一些机制,包括:已经难以应lll调用片上 ram,并为其指定初始化文件增量编译逻辑分析仪 SignalTap II我们采用 uniIDE 作为软件代码的编译器,并制作了小工具 bin2hex,将编译得到的二进制 bin 文件转换为特定格式的十六进制 hex 文件。:mips;FPGA;增量编译;SignalTap II;u
2、niIDE;hexIABSTRACTWe implemented a mips32 processor and complete the verification in the FPGA platform.When we designed some Small modules at the first time, our main means of tests is simulation. Test instructions are compiled to binary by hand. In the reset, give the initial value to the instructi
3、on and data memory.With the progress of issues, project size and complexity increase, the most basic means to have been unable to cope. Because of this, we learned and used some of themechanismsthes provided by quartus, including:lllCall-chip ram, specify its initialization file. Incremental compila
4、tion.Logic analyzer SignalTap II.We use uniIDE as software code compiler, and produced a small tool bin2hex,change the compiled bin file to a specific format hex file.KEY WORDS:mips; FPGA; Incremental compilation; SignalTap II; uniIDE; hexII目录流水线的验证和调试1集成 CP0 和总线接口单元312345678910集成串口器4集成总线模块6集成主存器7增量
5、编译8逻辑分析仪SignalTap II10软件开发环境及加载步骤12启动和测试代码14格式转换工具bin2hex15参考文献17致谢181流水线的验证和调试指令cache数据cachePC图 1对于 5 级流水线的取指和访存阶段,直接用寄存器组模拟指令和数据 cache。测试指令采用手工汇编,得到二进制代码。为指令和数据 cache 模块接入复位信号,在系统启动时写入初始值,包括测试指令和数据。数据和指令 cache 模块的初始化 verilog 代码形如:always(posedge clock)beginif(reset)cache_reg Insert Node or Bus,在跳出的
6、对话框中,点击 Node Finder,加入要观察的寄存器和线网型变量。要观察内部变量,而非模块的外部接口信号,则在 Node Finder 的 Filter 下拉框中,将默认选项 Pins:all 改为 SignalTap II:pre-synthesis。为模块的输入信号提供激励。3.4.5.6.点击按钮,即可得到波形图。分析并追踪波形图,找出并修正错误。有些信号的结果为空,这可能是因为该信号在编译时被优化掉了。如果要观察该信号,可以在源文件中该信号定义处,添加综合属性/* synthesis keep */或者/* synthesis preserve */,建议编译器保留该节点。前者用
7、于保留 wire,后者用于保留寄存器。使用方法是,把综合属性放在变量定义语句末尾, 分号之前。如果把/* synthesis preserve */放在模块定义处的分号之前,则整个模块中的寄存器都不会被优化掉;不过/* synthesis keep */不支持这种用法,只能逐个对要保留的 wire 型变量使用该综合属性。22集成 CP0 和总线接口单元指令器总线接口CPO单元PC图 35 级流水线经过一定的验证后,虽然还不够全面,但是我们对其的信心不断增加。1.2.3.是集成 CP0 和总线接口单元。此阶段的步骤为:除去流水线中的指令和数据 cache,将流水线与 CP0 相连。将访存信号送到
8、 CP0 做地址转换,然后转送到总线接口单元。将指令和数据 cache 模块改写为兼容 wishbone 总线的指令和数据器,并直接挂接在总线接口单元的两个主端口上。4.在指令和数据器中,用复位设初值的方法,设定测试指令和数据,包括 CP0 读写指令,器读写指令,以及在异常处的响应代码。5.依旧利用辑。的方法,验证 CP0 的基本读写操作,和异常、中断处理逻6.验证总线接口单元的逻辑,及其和流水线的交互操作。在访存请求(包括指令和数据)没有得到应答之前,处理器的流水线应当停顿。3MEM/WBEX/MEMID/EXIF/ID数据器3集成串口器为我们的5 级流水线集成CP0 和总线接口单元后,处理
9、器已经初具雏形,下面我们希望将其到开发板上,让其真正运转起来,这比结果更具说服力,也是我们的阶段性目标。在板上运行,可以用逻辑分析仪,像一样查看和分析运行时刻波形。但是这终究只是测试,并且根据 SignalTap II 的实现方式,只能查看到周期采样的波形,而不是真正的运行时刻波形。这时,我们处理器并不只是一个流水线,而是一个,除了运算逻辑,还要包括输入和输出。我们选用了串口,作为系统的第一个 I/O 设备。他的逻辑简单,系字符设备,并且既可以输入,也可以输出。指令器总线接口CPO单元PC图 4对总线接口单元上的两个主端口,其中一个为数据主端口,除去上面挂接的数据器,将串口器挂接上去。在指令器
10、。器中,加入串口初始化代码,以及串口收发代码,用以驱动串口用的方法验证串口器的逻辑。此处主要验证逻辑。对于接收逻辑,串入信号的激励波形并不好编辑,此处可以有两种方法解决。一是编写一个模块,作为串口的是采用逻辑分析仪 SignalTap II,模型,挂接到串口器的对外接口上。二调试硬件逻辑。实际上我们选用的串口器可靠性非常好,用的通逻辑后,硬件设计到开发板上运行,收发功能都正确无误。此处开始,测试指令的规模已经很大,手工汇编的方式变得异常痛苦。而且指令器是用寄存器组来实现,当定义的寄存器数目过大时,quartus 的编译进程将异常缓慢;寄存器越多,分析与优化就越复杂与耗时。为此,我们做了这些工作
11、:1. 在 quartus 环境下,利用 MegaWizard 调用 FPGA 器件的片上 ram4器,MEM/WBEX/MEMID/EXIF/ID串口为其编写总线 wrapper,并取代原先的指令元的指令主端口上。器,挂接在总线接口单2.选用集成开发环境 uniIDE,作为 mips 编译器。uniIDE 的配置和使用方式,参见章节 8 软件开发环境及加载步骤。在 uniIDE 环境下,直接编写汇编代码和 c 代码,编译为二进制 bin 文件。在 visio studio 环境下,制作小工具 bin2hex,将二进制 bin 文件转换为满足特定要求的十六进制 hex 文件。3.4.5.将转换
12、得到的十六进制 hex 文件,作为指令器的初始化文件。至此,从汇编代码到二进制指令的转换,不再需要手工汇编,而是由工具自动完成。器中的测试指令和数据也不再需要复位信号置初值,而是指定十六进制 hex 文件置初值。由于采用片上 ram 器件,而非大量寄存器,工程中的寄存器数量减少,大大降低了 quartus 编译耗费的时间。处理器上运行,振奋人心。的在 FPGA54集成总线模块总线接口CPO单元指令器串口PC图 5之前都是将兼容 wishbone 总线的主从设备点对点相连,没有透过总线进行通讯。现在,我们在处理器的总线接口单元和从设备(如片上 ram,串口等)间引入总线模块,这样,挂接在总线上的
13、器既可以被总线接口单元的指令主端口,也可以被数据主端口。并且,可以在总线上方便的挂接的从设备,处理器透过总线来和操作这些设备。我们选用的总线模块为共享型总线,不多个主端口同时从端口,即使他们的不是同一个从端口。这样效率不高,但是占用的少。不过既然我们在处理器上采用了分立的数据和指令主端口,以后会考虑将总线模块换成交叉互连型实现,使数据和指令主端口可以同时挂接在总线上的从设备。这个总线模块的开源 IP 核非常可靠,在我们的系统中运行稳定。唯一的问题是,从端口模块只有在被选中的情况下才可以应答信号。因为总线模块是将所有从端口的应答信号取或,提交给主端口。如果未被选中的从端口无故应答信号,会扰乱正常
14、的总线周期。之所以采用这种方式,可能是为了节省电路;不过,给当前通讯的主从设备建立通道应该更合理一些。有了总线模块后,我们又在总线上挂接了板上智能 lcd 的器,一个简单的字符设备,并显示测试字符。6WISHBONEEX/MEMID/EXIF/ID总线MEM/WB5集成主存器片上的 ram器容量非常有限,只有几十 KB,稍大的程序将无法装入,这大大限制了系统的实用性。为此,我们在总线上集成了主存的 flash,sdram 和 sram。器,支持板上此时工程规模已经很大,编译很耗时间;为此,引入增量编译。增量编译的相关操作参见章节 6 增量编译。对于流水线、总线、串口器等相对稳定的模块,利用增量
15、编译,将其设置为 Post-Fit。这样,每次全编译时,这些模块将跳过分析和综合阶段,大大缩短编译时间。对于当前调试的模块,比如主存器,由于其源代码在不断更改,所以设置为 Source File,每次编译时,从源代码开始执行分析、综合等编译步骤。对于挂接在总线上的各种设备,主要工作是阅读器件的,确定针脚定义、读写时序、时延参数等。这一方面是端口配置的需要,另一方面,也为调试和验证提供依据。要搞清楚正确的波形是什么,才能看懂和分析波形,找出并修正错误。目前的进度是:调通了 flash 并加载了该器件的驱动,调用驱动函数读取了器件配置信息;调通了 sdram 的基本读写操作,但是对于特定的读写操作
16、组合还有错误,尚未修正;调通了 ssram,并且将程序重到 ssram 中运行。76增量编译quartus 编译的步骤依次为:分析,综合,填充,生成 fpga 编程文件,时序分析,生成网表(用于)。其中最耗时间的是分析与综合。硬件工程的规模比较可观,逻辑复杂,全编译很耗时间,拖慢了调试的进度。这时可以使用增量编译功能,大大缩短编译时间。如果处理得当,编译时间可以缩短到原来的一半甚至更短。所谓增量编译,就是将相对稳定且没有变动的部分出来,对这些出来的部分,再次编译时跳过某些步骤,直接使用上次编译的成果,代入后面的步骤。为了做到这一点,需要如下步骤:1.全编译一次工程。图 6 PartitionP
17、lanner2.将工程分块:在 quartus 环境下,选择 Tools-Design Partition Planner,弹出窗口如图 6 Partition Planner,即可对工程分块。在弹出的窗口中,右击设计中的某个模块,选 Create Design Partition,将该模块出来,设置为分块。8图 7 Design Partitions Window3.设置各分块的状态:在 quartus 环境下,使用快捷键 a,调出分块管理窗口 Design Partitions Window,如图 7 Design Partitions Window。其中列出了已经设置的分块。其中 Net
18、list Type 一列为分块状态,双击某分块在该列的值,出现下拉菜单,更改分块状态。主要选项有:源文件,分析后,填充后。比如选择源文件,那么下次编译时该分块从源文件开始进行编译步骤;分析后,则下次编译时,该分块跳过分析步骤, 使用上次编译时的分析成果,直接代入后面的综合等步骤;填充后,则下次编译时,该分块跳过填充以及其前的所有步骤,使用上次编译时的填充成果,直接代入后面的步骤。设置好分块及其状态后,点击全编译按钮,即可增量编译工程。如果某个分块的源代码有改动,则应将该分块的状态设置为“源文件”,以免跳过了分析步骤。4.5.需要注意的是,将某些部分的状态固定住,意味着编译器不能进行分块的全局优
19、化,得到的编译结果,其效能可能会稍有降调试和验证完成后,应该将各分块的状态调回“源文件”,并全编译一次工程,得到高效的编译结果。97逻辑分析仪 SignalTap II图 8 SignalTap II对于运行时刻错误,需要实时抓取电路上某些节点的波形,进行分析。SignalTap II 是片上逻辑分析仪,可以实时抓取片上信号,通过 jtag 端口与 PC 主机通讯,将波形送到 PC 屏幕上显示。实际上,在硬件设计中需要提供一个采样时钟,SignalTap II 以该时钟对观察节点进行采样。所以采样时钟的频率应当要高于被观测信号的频率,可以用锁相环产生高频时钟。但是采样频率也不宜过高,因为采样到
20、的数据是暂存在片上器中,而片上器的容量十分有限,硬件设计本身还要占用一部分。波形的时间跨度就越小。SignalTap II 的使用步骤:器容量一定,则采样频率越高,所得1.2.3.4.5.在工程中预留一个时钟信号,作为采样时钟。全编译一次工程。将开发板与主机用 jtag 口相连。新建 stp 文件。在 stp 文件的编辑窗口(如图 8 SignalTap II),JTAG Chain Configration视图中配置硬件,选中与主机相连的开发板。在 stp 文件的编辑窗口,Signal Configration 视图中,设置采样时钟, 采样深度等。采样深度就是采样数量。在 stp 文件的编辑
21、窗口,主界面有 Data 和 Setup 两个选项卡。在 Setup 中双击,即可添加要观察的信号。在 Setup 中,对于要观察的信号,设置触发条件。就是从触发条件满足106.7.8.开始,SignalTap II 根据设定的采样深度采取一定数量的样本,并将结果暂存在片上器,然后通过 jtag 口送至主机显示。9. 保存 stp 文件,提示是否使能 SignalTap II,选择是。在 quartus 主界面,Assignments-Settings,跳出设置界面,选 Timing Analysis Settings 节点下的 SignalTap II Logic Analyzer 分支,有
22、 Enable SignalTap II Logic Analyzer 选项,可以使能或禁用 SignalTap II, 并可以指定当前的 stp 文件。现在我们要使能 SignalTap II。10. 再次全编译工程。当编译进行到 EDA Netlist Writter 时,可能会报错, 无法进行下去。这是因为引入逻辑分析仪后,如果观察节点列表中有 I/O针脚,则这些 I/O 针脚被附加了硬件逻辑,编译器判定为的端口类型。可以忽略这个错误,因为硬件逻辑(pof 文件)已经生成,可以继续。11. 将编译得到的 pof 文件到开发板,对 fpga 编程。12. 在 stp 文件编辑窗口中,点击运
23、行按钮。13. 运行的硬件。14. 当触发条件满足,比如拨动开关产生某个信号的正延,SignalTap II 即开始采样。在 stp 文件编辑窗口中,Data 选项卡下可以查看采样结果,分析波形。15. 更改 stp 文件后,需要转到第 10 步,重新编译工程。16. 有些信号采样结果为空,这可能是因为该信号在编译时被优化掉了。如果要观察该信号,可以在源文件中该信号定义处,添加综合属性/* synthesis keep */或者/* synthesis preserve */,建议编译器保留该节点。前者用于保留 wire,后者用于保留寄存器。使用方法是,把综合属性放在变量定义语句末尾, 分号之
24、前。如果把/* synthesis preserve */放在模块定义处的分号之前,则整个模块中的寄存器都不会被优化掉。17. 有时处理器会因为错误的访存请求得不到响应而死锁,整个停顿下来。为此,程序计数器 PC 的值输出在开发板上的 7 段数码管。系统死锁时,可以从 7 段数码管当前的 PC 值。然后在逻辑分析仪中,将此 PC 值作为触发条件,从而观察死锁前后处理器的态,找到出错。118软件开发环境及加载步骤图 9 uniIDEuniIDE 是应用于领域的集成开发环境,界面友好,和 visual studio的风格类似。各参数和选项全部在图形界面下交互设置,不用手工编写makefile、等。
25、其运行平台是 windows,编译器是 gcc。我们的系统现在还很简单,因此使用到的 uniIDE 中的功能很有限。此处只对已经用到的部分作简要说明, 安装目录下的 help 子目录。软件的开发与加载步骤为:高级功能,参见 uniIDE 的帮助文档,位于1.到官网uniIDE 的安装程序:。2.3.4.在 windows 系统下安装 uniIDE。打开 uniIDE 集成开发环境,新建无操作系统工程。uniIDE 会自动生成工程模板,包括汇编语言的启动代码 crt0.s 和 c 语言的 main 函数。uniIDE 还为工程自动生成了串口驱动 serial.c,封装了收发函数,以及串口状态函数
26、。5.对于 crt0.s,除去其中的设备初始化代码,只保留用于代码重分。根据系统的实际情况,添加设备初始化代码。的部6.对于 serial.c,开头是串口的基地址、寄存器位定义等。有两个选项,通过宏开关。根据我们的系统,选取 GODSONI 下的内容,另一个选项除掉。基地址的宏定义更改为系统实际分配给串口的地址。127.8.对于 main.c,可以添加应用和测试代码。在 uniIDE 的主界面下,选 Build 选项卡,在其中配置工程属性。图 10 编译配置9.编译器选项卡中,出于测试目的,不开启优化;我们的处理器暂时只支持序,所以端序配置为低字节低址。中,根据系统的实际情况,填写代码10.地
27、址,以及程序的实际运行地址。代码从到正确的地方运行。地址启动,然后根据这里的信息,将搬运11. 编写测试代码或应用程序,编译,生成可bin 文件。文件,以及二进制12. 对于可文件,用反汇编工具 idapro 打开,查看汇编代码,其中还可以查看各条指令和数据的地址,各函数的地址等信息,在系统善的情况下,这些信息对调试很有帮助。13. 对于二进制 bin 文件,用我们的小工具 bin2hex 转换为特定的十六进制hex 文件,作为启动 ram 的初始化文件。14. 在 quartus 环境下,编译工程,并运行。15. 当软件部分有变动而硬件逻辑不变时,首先用 uniIDE 和 bin2hex 更
28、新十六进制 hex 文件;然后在 quartus 环境下,点 Processing -Update Memory Initialization File,通知 quartus 更新 ram 的初始化文件; 点 Processing -Start-Start Assembler,重新生成 FPGA 编程文件。并运行。139启动和测试代码我们还没有为系统搭建一个功能完善的 bootloader,在我们的启动代码中, 只是对已经集成的设备做初始化,外带一些设备测试代码。代码的结构和流程:1.程序的为 start,位于 crt0.s 中。在 uniIDE 的配置选项中可以更改点。2.处理器初始化。我们
29、的处理器尚未集成 cache、tlb 等,所以其初始化非常简单,只是将 cp0 中 cause 寄存器的 IV 位置 1,用以指定异常和中断的。3.设备的初始化,包括串口,主存lcd,并打印测试字符。器(flash,sdram,ssram)和智能4.代码的重。将代码从位置搬运到 ssram 运行。为了做到这一点,需要在 uniIDE 中设置程序的运行地址为 ssram 的地址空间。如果设置程序的运行地址为 sdram 的地址空间,则运行。将搬运到 sdram 中5.堆栈初始化。实际上就是初始化栈指针 sp,对应处理器中的 29 号寄存器。清除 cp0 中 status 寄存器的 EXL 和 E
30、RL 位,设置中断掩码,并开中断。6.7.8.跳转到 main 函数,也就是 c 代码的测试和应用代码。,位于 main.c 中。在uniIDE 中,我们包含了 stdio.h 作为输入输出库,但是似乎只封装了printf 函数,没有封装 scanf 函数。printf 函数已经运行,但是目前只支持打印字符变量或字符串,不支持整形变量。因为打印非字符变量时,要将其转换为字符,转换过程用到除法指令,而我们的处理器尚未集成除法器。可选方案是,让处理器产生一个未定义指令异常,然后异常处理程序到后,调用软件来模拟除法指令。我们不打算这么做,计划是集成除法器。另外,mips 中的除法指令并不产生除 0
31、和溢出异常,经典做法是在除法指令后紧跟一条 break 指令,产生断点异常,由异常处理程序检查除法指令是否有除 0 或溢出。实际上 uniIDE 下的编译结果就是如此,每条除法指令后紧跟一条break 指令。为此,有必要编写完善的异常处理程序,来应对这些异常。我们的计划是,借用 uboot 或 pmon、yamon 等成bootloader 的代码。1410 格式转换工具 bin2hex在我们的系统中,是用测试代码作为片上 ram 的初始化文件,处理器从片上ram 启动,运行其中程序。片上 ram 的初始化文件只支持 quartus的 mif 格式和 hex 格式。而测试软件编译完成后生成的可
32、执行程序是 bin 格式,此处我们需要将 bin 文件转换为 hex 文件。hex 格式简介:一种可执行文件的前一阶段格式。Intel HEX 文件是文本行的 ASCII 文本文件,在 Intel HEX 文件中,每一行是一个 HEX。由十六进制数组成的码或者数据常量。格式为:: LL AAAA TT DD.DD CC共六部分llll:冒号 是每一条 Intel HEX的开始LL 是这条的长度域,他表示数据(dd)的字节数目.AAAA 是地址域,他表示数据的起始地址TT 这个域表示这条 HEX的类型,他有可能是下面这几种类型00010204-数据-文件结束-扩展段地址-扩展线性地址lDD 是数
33、据域,表示一个字节的数据,一个节数目可以查看 LL 域的说明。可能有多个数据字节,字lCC 是效验和域,表示所有字母对的效验和,计算方法是将本条冒号开始的其中的地址域 AAAA 为 4 个字符,只能表示 16 位的地址空间,也就是 64k。当数据或文件大于 64k 时,就要用到扩展线性地址,用法是在 64k 地址边界处,放置扩展线性地址,指出当前位置的高 16 位基地址。bin 文件的暂时只支持:按字节序,所以软件代码以,低地址存放数据低字节。因为处理器序编译。我们的目标格式是 hex,按字寻址,每行 1 个字,这个字中的 4 个字节,高字节在前,低字节在后。我们在网上了格式转换工具 bin2
34、hex 的源代码,但是该版本得到的 hex文件是按字节寻址,每行 16 个字节,低字节在前,高字节在后。对代码稍作调整,即得到了我们需要的 hex 文件。生成的 hex 文件名为 test.hex,没有提供指定文件名的功能,用户可以自行更改 hex 文件的名字。bin2hex.exe 工具采用VC6.0 编译生成。调用 bin2hex 工具需要使用命令行,每次都要切换工作目录、传递参数,相当麻烦。为此,bin2hex.exe到软件部分的工程目录下,将其和编译15生成的 bin 文件放在一起,然后使用 dos 批处理机制。软件编译bin 文件后,在软件目录下双击运行批处理bin2hex.bat,即可生成 hex 文件。图 11 quartus 查看 hex 文件视图可以用记事本打开 hex 文件,但是这样查看很不方便,其中包含了太多的附加信息。quartus 软件可以打开和编辑 hex 文件,其提供了更直观的视图,看上去就好像将数据填充到单元中,如图 11 quartus 查看 hex 文件视图。打开 hex文件时,需要指定数据单元的宽度,我们生成的32 位。hex文件中数据单元的宽度为16参考文献1MIPS32 Architecture For Programmers Volume II: The
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 麦当劳炸鸡的顾客满意度调查
- 一年级语文期末工作总结
- 2025标准个人劳务承包合同范本
- 节庆活动场地租赁合同终止及活动安排协调函
- 智能停车系统车辆车位租赁运营合同
- 2025合同模板宠物领养协议范本
- 2025船只租赁合同范本
- 2025技术研发委托合同
- 2025年全球贸易销售合同
- 房地产开发中的政策法规解读
- 北斗卫星导航发展及其的应用课件
- 克雷伯菌属课件
- 人类行为与社会环境全套课件
- 中国医科大学免疫-绪论
- 风电项目造价控制的方法
- 40m预制箱梁汽车吊双机台吊专项技术方案设计经典
- 六年级下册道德与法治课件第四单元第九课
- 热式质量流量计技术协议
- 公司质量异常处理单
- 办公文具协议合同模板
- 医院检验科实验室生物安全管理委员会及工作职责
评论
0/150
提交评论