📄 基于fpga的八位risc cpu的设计.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0042)http://www.gd-emb.org/detail/id-38554.html -->
<HTML><HEAD><TITLE>基于FPGA的八位RISC CPU的设计</TITLE>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
<META content="基于FPGA的八位RISC CPU的设计" name=description>
<META content="基于FPGA的八位RISC CPU的设计" name=keywords><LINK
href="基于FPGA的八位RISC CPU的设计.files/org.css" type=text/css rel=stylesheet>
<SCRIPT>
function checkdata(ob){
if(ob.title.value==""||ob.statement.value==""){
alert("请填写标题和内容");
ob.title.select();
return false;
}
if(ob.validate.value==""){
alert("请填写验证码");
ob.validate.focus();
return false;
}
return true;
}
</SCRIPT>
<STYLE type=text/css>#inform {
Z-INDEX: 1; LEFT: -949px; WIDTH: 10px; POSITION: absolute; TOP: -545px; HEIGHT: 10px
}
</STYLE>
<META content="MSHTML 6.00.2900.3243" name=GENERATOR></HEAD>
<BODY><LINK href="/images/favicon.ico" rel="shortcut icon">
<TABLE cellSpacing=0 cellPadding=0 width=950 align=center border=0>
<TBODY>
<TR>
<TD width=488 rowSpan=2><A href="http://www.gd-emb.org/"><IMG height=84
src="基于FPGA的八位RISC CPU的设计.files/gd_emb_02.gif" width=488 border=0></A></TD>
<TD width=122 background="基于FPGA的八位RISC CPU的设计.files/gd_emb_03.gif"
height=25> </TD>
<TD align=right width=340 bgColor=#f1f1f1><A
style="FONT-WEIGHT: 600; COLOR: red" href="http://www.gd-emb.com/"
target=_blank>广嵌科技</A> <A style="FONT-WEIGHT: 600; COLOR: red"
href="http://www.gdemb.com/" target=_blank>广嵌教育</A> <A
href="http://vk.gd-emb.org/" target=_blank>广嵌威客</A> <A
href="http://www.gd-emb.org/en/"
target=_blank>English</A> </TD></TR>
<TR>
<TD colSpan=2 height=61> </TD></TR>
<TR>
<TD class=menucolor style="PADDING-TOP: 2px" align=right colSpan=3
height=25>
<DIV class=toplink style="MARGIN-RIGHT: 2px"><A class=toplink
href="http://www.gd-emb.org/general/id-33.html">新闻资讯</A> | <A
class=toplink
href="http://www.gd-emb.org/general/id-35.html">行业应用</A> | <A
class=toplink href="http://www.gd-emb.org/development.html">技术开发</A> | <A
class=toplink href="http://ask.gd-emb.org/" target=_blank>有问有答</A> | <A
class=toplink href="http://download.gd-emb.org/">下载中心</A> | <A
class=toplink href="http://map.gd-emb.org/">网站导航</A> | <A class=toplink
href="http://bbs.gd-emb.org/"
target=_blank>技术论坛</A> </DIV></TD></TR></TBODY></TABLE></TD></TR></TABLE>
<DIV id=inform></DIV>
<TABLE cellSpacing=0 cellPadding=0 width=950 align=center border=0>
<TBODY>
<TR>
<TD
style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px"
width=750>
<DIV><A href="http://www.gd-emb.org/">首页</A> <A
href="http://www.hawaycn.com/">></A> 硬件设计 > 总线设计 > 基于FPGA的八位RISC
CPU的设计 </DIV>
<DIV style="FONT-WEIGHT: 600; FONT-SIZE: 16px; MARGIN: 20px 0px 10px"
align=center>基于FPGA的八位RISC CPU的设计</DIV>
<DIV style="MARGIN-BOTTOM: 10px"
align=center>来源:微计算机信息 作者:张杰 时间:2007-07-30 发布人:<A
href="http://www.gd-emb.org/personhome/id-25218.html">卢春妙</A></DIV>
<DIV align=center>
<DIV class=split_line style="WIDTH: 90%"></DIV></DIV>
<DIV align=center>
<DIV
style="FONT-SIZE: 14px; WIDTH: 90%; TEXT-ALIGN: left"><STRONG>摘 要:</STRONG>从CPU的总体结构到局部功能的实现采用了自顶向下的设计方法和模块化的设计思想,利用Xilinx公司的Spartan
II系列FPGA,设计实现了八位CPU软核。在FPGA内部不仅实现了CPU必需的算术逻辑器、寄存器堆、指令缓冲、跳转计数、指令集,而且针对FPGA内部的结构特点对设计进行了地址和数据的优化。
<BR><BR><STRONG>关键词:</STRONG> Verilog, RISC CPU, FPGA <BR><BR><STRONG>1 引
言</STRONG>
<BR><BR> 随着数字通信和工业控制领域的高速发展,要求专用集成电路(ASIC)的功能越来越强,功耗越来越低,生产周期越来越短,这些都对芯片设计提出了巨大的挑战,传统的芯片设计方法已经不能适应复杂的应用需求了。SoC(System
on a
Chip)以其高集成度,低功耗等优点越来越受欢迎。开发人员不必从单个逻辑门开始去设计ASIC,而是应用己有IC芯片的功能模块,称为核(core),或知识产权(IP)宏单元进行快速设计,效率大为提高。CPU
的IP核是SoC技术的核心,开发出具有自主知识产权的CPU
IP核对我国在电子技术方面跟上世界先进的步伐,提高信息产业在世界上的核心竟争力有重大意义。
<BR><BR> 精简指令集计算机RISC(Reduced Instruction Set
Computer)是针对复杂指令集计算机CISC(Complex Instruction Set
Computer)提出的,具备如下特征1)一个有限的简单的指令集; 2)强调寄存器的使用或CPU配备大量的能用的寄存器;3)强调对指令流水线的使用。
<BR><BR><STRONG>2 CPU IP核的组成</STRONG>
<BR><BR> 尽管各种CPU的性能指标和结构细节不同,但所要完成的基本功能相同,从整体上可分为八个基本的部件:时钟发生器、指令寄存器、累加器、RISC
CPU算术逻辑运算单元、数据控制器、状态控制器、程序控制器、程序计数器、地址多路器。状态控制器负责控制每一个部件之间的相互操作关系,具体的结构和逻辑关系如图1所示。
<BR><BR> 时钟发生器利用外部时钟信号,经过分频生成一系列时钟信号给CPU中的各个部件使用。为了保证分频后信号的跳变性能,在设计中采用了同步状态机的方法。
<BR><BR> 指令寄存器在触发时钟clk1的正跳变触发下,将数据总线送来的指令存入寄存器中。数据总线分时复用传递数据和指令,由状态控制器的load_ir信号负责判别。load_ir信号通过使能信号ena口线输入到指令寄存器。复位后,指令寄存器被清为零。每条指令为两个字节16位,高3位是操作码,低13位是地址线。CPU的地址总线为是13位,位寻址空间为8K
字节。本设计的数据总线是8位,每条指令取两次,每次由变量state控制。
<BR><BR> 累加器用于存放当前的运算结果,是双目运算中的一个数据来源。复位后,累加器的值为零。当累加器通过使能信号ena
口线收到来自CPU状态控制器load_acc 信号后,在clk1时钟正跳沿时就接收来自数据总线的数据。 <BR>
<P align=center><IMG height=289 alt=""
src="基于FPGA的八位RISC CPU的设计.files/070726152992354.gif" width=564><BR>图1
CPU结构图 </P> 算术逻辑运算单元根据输入的不同的操作码分别实现相应的加、与、异或、跳转等基本运算。
<BR><BR> 数据控制器其作用是控制累加器的数据输出,由于数据总线是各种操作传送数据的公共通道,分时复用,有时传输指令,有时要传送数据。其余时候,数据总线应呈高阻态,以允许其他部件使用。所以,任何部件向总线上输出数据时,都需要一个控制信号的,而此控制信号的启、停则由CPU状态控制器输出的各信号控制决定。控制信号datactl_ena决定何时输出累加器中的数据。
<BR><BR> 地址多路器用于输出的地址是PC(程序计数器)地址还是数据/端口地址。每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址,后4个时钟周期用于对RAM或端口的读写,该地址由指令给出,地址的选择输出信号由时钟信号的8分频信号fecth提供。
<BR><BR> 程序计数器用于提供指令地址,以便读取指令,指令按地址顺序存放在存储器中,有两种途径可形成指令地址,一是顺序执行程序的情况,二是执行JMP指令后,获得新的指令地址。
<BR><BR> 状态机控制器接受复位信号RST,当RST有效时,能通过信号ena使其为0 ,输入到状态机中以停止状态机的工作。状态机是CPU
的控制核心,用于产生一系列的控制信号,启动或停止某些部件,CPU何时进行读指令来读写I/O端口及RAM区等操作,都是由状态机来控制的。状态机的当前状态,由变量state记录,state的值就是当前这个指令周期中已经过的时钟数。指令周期是由8
个时钟组成,每个时钟都要完成固定的操作。 <BR><BR><STRONG>3 系统时序 <BR></STRONG><BR> RISC
CPU的复位和启动操作是通过rst引脚的信号触发执行的,当rst信号一进入高电平,RISC
CPU就会结束现行操作,并且只要rst停留在高电平状态,CPU就维持在复位状态,CPU各状态寄存器都设为无效状态。当信号rst回到低电平,接着到来的第一个fetch
上升沿将启动RISC CPU开始工作,从ROM的000处的开始读取指令并执行相应的操作。
<BR><BR> 读指令时序,每个指令的前3个时钟周期用于读指令,4~6周期读信号rd有效,第7
个周期读信号无效,第8个周期地址总线输出PC地址,为下一个指令作准备。
<BR><BR> 写指令时序,每个指令的第3.5个时钟周期建立写地址,第四个周期输出数据,第5个时钟周期输出写信号,第6个时钟结束,第7.5个时钟周期输出为PC地址,为下个指令做准备。
<BR><BR> 如图2 所示,这是ModelSim SE6.0进行波形仿真的结果。 <BR><BR><STRONG>4
微处理器指令</STRONG>
<BR><BR> 数据处理指令:数据处理指令完成寄存器中数据的算术和逻辑操作,其他指令只是传送数据和控制程序执行的顺序.因此,数据处理指令是唯一可以修改数据值的指令,数据处理指令一般需两个源操作数,产生单个结果.所有的操作数都是8位宽,或者来自寄存器,或者来自指令中定义的立即数.每一个源操作数寄存器和结果寄存器都在指令中独立的指定。
<P align=center><IMG height=207 alt=""
src="基于FPGA的八位RISC CPU的设计.files/20070522144059274.gif" width=550><BR>图2
读写指令时序</P> 数据传送和控制转移类指令:共有17条,不包括按布尔变量控制程序转移的指令。其中有全存储空间的长调用、长转移和按2KB分块的程序空间内的绝对调用和绝对转移;全空间的长度相对转移及一页范围内的短相对转移;还有条件转移指令。这类指令用到的助记符有ACALL,
AJMP, LCALL, LJMP, SJMP, M, JZ, JNZ,
ONE,DJNZ。控制转移类指令主要用来修改1x指针从而达到对程序流的控制,所用到的寄存器主要有sp, pc, ir等寄存器。
<BR><BR> 指令由操作码和操作数组成,取指令电路的目的就是把指令码和操作数分开。组成电路由如图3所示。取指令电路由程序指针,程序指针解析模块、ROM,
IR(指令寄存器),控制器状态寄存器组成。取指令指令的过程如下:PC指针的值经过pc_mux模块赋值,把ROM中的指令取出来,送到指令寄存器的数据输入口。指令寄存器受状态寄存器的控制,当取指令信号有效时,ROM中的指令码被保存在指令寄存器中,然后经控制器译码,产生控制信号,对PC指针的增量加以控制取出下一条指令。
<BR>
<P align=center><IMG height=266 alt=""
src="基于FPGA的八位RISC CPU的设计.files/20070522144124329.gif" width=518><BR>图3
取指令电路 <BR><BR></P><STRONG>5 汇编</STRONG>
<BR><BR> 汇编程序是为了调试软核而开发的,手工编写机器码很容易出错并且工作量很大。在调试过程中修改指令集时,汇编程序也要作相应的修改。所以要求编译器的结构简单性能可靠,在程序中必要的地方可以用堆叠代码方法实现,不必考虑编程技巧和汇编器效率问题。汇编程序用于测试RISC
CPU的基本指令集,如果CPU的各条指令执行正确,停止在HLT指令处。如果程序在其它地址暂停运行,则有一个指令出错。程序中,@符号后的十六进制表示存储器的地址,每行的//后表示注释。下面是一小段程序代码,编译好的汇编机器代码装入虚拟ROM,要参加运算的数据装入虚拟RAM就可以开始进行仿真。
<BR><BR>机器码 地址 汇编助记符 注释 <BR><BR>@00 //地址声明 <BR><BR>101_11000 //00 BEGIN:
LDA DATA_2 <BR><BR>0000_0001 <BR><BR>011_11000 //02 AND DATA_3
<BR><BR>0000_0010 <BR><BR>100_11000 //04 XOR DATA_2 <BR><BR>0000_0001
<BR><BR>001_00000 //06 SKZ <BR><BR>0000_0000 <BR><BR>000_00000 //08 HLT
//AND does't work <BR><BR><STRONG>6 调试 <BR></STRONG><BR> 最基本的调试手段是基于FPGA
厂商提供的开发和仿真环境,用硬件描述语言编写TESTBENCH,构成一个最小运行环境。TESTBENCH产生对目标软核的激励,同时记录软核的输出,和预期值进行比对,可以确定核的设计错误。这种方法的好处是实现容易,结果准确,但硬件描述语言编码量较大。为了仿真结果的准确性,无论功能仿真还是时序仿真,仿真的步长都不能太小,结果导致整个系统仿真时间太长。本设计中先对RISC
CPU的各个子模块进行了分别综合,检查正确性,如果发现错误可以在较小的范围内来检查并验证。子模块综合完毕后,把要综合的RISC
CPU的模块与外围器件以及测试模块分离出来组成一个大模块,综合后的的RISC CPU模块如图4所示,这是Xilinx ISE7.1
所综合生成的技术原理图。 <BR>
<P align=center><IMG height=335 alt=""
src="基于FPGA的八位RISC CPU的设计.files/20070522144148293.gif" width=349><BR>图4
CPU技术原理图
<BR><BR></P> 综合的结果只是通用的门级网表,只是一些与、或、非门的逻辑关系,和芯片实际的配置情况还有差距。此时应该使用FPGA/CPLD厂商提供的实现与布局布线工具,根据所选芯片的型号,进行芯片内部功能单元的实际连接与映射。这种实现与布局布线工具一般要选用所选器件的生产商开发的工具,因为只有生产者最了解器件内部的结构,如在ISE的集成环境中完成实现与布局布线的工具是Flow
Engine。 <BR><BR> STA(Static Timing
Analysis)静态时序分析,完成FPGA设计时必须的一个步骤。在FPGA加约束、综合、布局布线后,在ISE中可以运行Timing
Analyzer生成详细的时序报告,本设计中Minimum period: 12.032ns (Maximum Frequency:
83.112MHz),Minimum input arrival time before clock: 6.479ns,Maximum output
required time after clock: 9.767ns。然后,设计人员检查时序报告,根据工具的提示找出不满足Setup/Hold
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -