用FPGA实现嵌入式微处理器

  • 时间:
  • 浏览:0
  • 来源:大发PK10APP下载_大发PK10APP官方

学习了FPGA中实现CPU的法律法律依据,并进行了初步尝试,取得了每种的成果。

assign regfile[10] = 8'h00;

用指令JMP验证时序:

一、背景简介

(2)指令寄存器:

基本思路是将端口映射到特定的RAM空间中,向该RAM地址写数据便将数据写到了端口锁存器中。

assign regfile[7] = 8'h06;// 跳转到地址0x0006,处理不可预测的结果

第另五个时钟,空操作。

assign regfile[2] = 8'h01;//按照资料中给的数据,应该是0代表累加器,但测试

时要用硬件描述语言(VHDL或verilog等)直接构造CPU,即构科学科学发明上述各个模块,但会 整合成CPU。但庞大的代码量使得你这个法律法律依据在短期内不能自己实现。

尽管各种CPU的性能指标和社会形态细节各不相同,但它们所能完成的基本功能相同。由功能分析可知,任何本身CPU内内外部社会形态最少 应饱含下面哪好多个部件:

数据控制器的作用是控制累加器数据输出,前一天数据总线是各种操作时传送数据的公共通道,不同的情況下传送不同的内容。有时要砖输指令,有时要传送RAM区或接口的数据。累加器的数据非要在时要往RAM区或端口写时才允许输出,但会 应呈现高阻态,以允许太多部件使用数据总线。太多任何部件往总线上输出数据时,都时要一控制信号。而此控制信号的启、停则由CPU情況控制器输出的各信号控制决定。数据控制器何时能 输出累加器的数据则由情況控制器输出的控制信号datactl_ena决定。

assign regfile[12] = 8'h68;

测试ROM读信号时序:

assign regfile[7] = 8'h00;

(3)多线程 计数器;

(8)地址多路器:

实验结果:

为了完会 正确地使用这款CPU,时要了解它的指令系统,资料中的相关每种如下:

实验结果:

早期的FPGA前一天其资源很少,非要实现简单逻辑,太多其在板级系统中所起的作用太多简单的“粘贴逻辑”, 连接CPU与外设,以取代的传统的琐碎的专用集成芯片(ASIC)。

数据“F0”人太好老出在了端口上,说明RAM在仿真层次上人太好时要正常工作。

(2)情況机控制器。

assign regfile[5] = 8'h01;//高地址。0x0200地址对应于端口寄存器。

此外,上述结果是在笔者对原IP代码稍做修改后才得出的,另另五个代码的仿真结果中,在读、写RAM时都老出code_rd_l信号,而都在老出code_wr_l信号,改后最少 能区分是读还是写了。

六、仿真、综合、实验

1、验证CPU、ROM、端口

assign regfile[11] = 8'h00;

本实验仅完成了及其简单的功能,但会 CPU多线程 的量不大,时要手工逐个地写到verilog代码中。对于大型的多线程 ,你这个法律法律依据显然不可行,时要编译器将高级语言编译成机器码,生成机器码文件,笔者初步想到的法律法律依据是利用硬件描述语言中的文件操作一句话和循环一句话来把文件中的机器码读进来,再写进ROM中。

与指令对应的机器码(opcode.dat):

由时序图可知,读取ROM的过程和常见的总线读法律法律依据相同,即现给出选通信号code_cs_l,但会 给出读信号code_rd_l。按此时序给出一简单指令,验证该时序。

//将RAM地址0x0000处的数据装进去 累加器

读写RAM时序测试:

笔者所采用的是最后本身法律法律依据,即下载免费IP核来使用。你这个免费的IP核通常都在功能简单的,不完善的,仅供学习交流用途的。也正是简单、不完善等特点,使得免费IP核比较适合初学者。另另五个既时要加深对CPU的理解,又不至于太过复杂化。

assign regfile[6] = 8'hc8;//JMP,无条件跳转到本条一句话

//将累加器中的数据存到RAM地址0x0000中

(3)累加器:

下载的IP核压缩包中附带了汇编的编译器(编译器的C语言代码也已给出),其作用是对照表opcode.dat将汇编代码编译成机器码。前一天测试编译器的功能失败(把压缩包中的汇编语言写的例程直接拿来编译,产生的二进制文件删剪为“CD”),但会 考虑到汇编语言和机器码之间基本上是一一映射的关系,直接写机器码的工作量不想比写汇编语言多好多个,但会 花太多的时间去看懂并调通编译器的C语言代码就显得太多得不偿失了,不如直接写机器码实用。

(2)累加器;

时钟居于器clkgen利用外来时钟信号clk生成时钟信号clk1、fetch、alu_clk,送往CPU的太多部件。其中,fetch是内外部时钟clk的8分频信号,利用fetch的上升沿来触发CPU控制器结束了执行一根绳子 指令,同去fetch信号还将控制地址多路器输出指令地址和数据地址;clkl信号用作指令寄存器、累加器、情況控制器的时钟信号;alu_clk则用于触发算术逻辑运算单元。

//将立即数“F0”装载到累加器中

第7个时钟,若操作符为SKZ且累加器值为0,则PC值再增1,跳过一根绳子 指令,但会 PC无变化。

在使用硬件描述语言时,一定要时时刻刻想着硬件社会形态,非要仅从逻辑上编写代码,硬件描述语言和编程语言有很大不同。RAM的双向端口太多在想通了三态门在电路中的应用后才编写成功的。

这是一另五个“裸”的CPU,即RAM、ROM等寄存器时要个人加在,完会 构成一另五个可用的小系统。

(l)取指令—当多线程 已在存储器中时,首先根据多线程 入口地址取出一根绳子 多线程 ,为此要发出指令地址及控制信号。

第五个时钟,若操作符为ANDD, ADD或XORR,算术运算器就进行相应的运算;若为LDA,就把数据通过算术运算器送给累加器;若为SKZ,先判断累加器的值是是不是为0,前一天为0,PC就增1,但会 保持原值;若为JMP,锁存目的地址。若为STO,将数据写人地址处。

上图为CPU读RAM时序。机器码200,23,01对应指令LDM 0x0123。在读完哪好多个指令后,RAM选通信号sram_cs_l和总线读信号code_rd_l先后被给出,与此同去地址总线为0x0123。此时序有一另五个隐患:在读信号上升沿的前一天,地址总线前一天不再保持另另五个的数据,这就要求设计的RAM时要早在读信号下降沿的前一天就将地址锁存,以保证在读信号上升沿那一时刻,RAM仍然提供正确的数据(尽管此刻的地址前一天前一天不正确了)。

算术逻辑运算单元根据输入的8种不同操作码分别实现相应的加、与、异或、跳转等8种基本操作运算。利用这几种基本运算时要实现太多种太多运算以及逻辑判断等操作。

assign regfile[9] = 8'h200;

(2)从第一根绳子 指令的地址起结束了执行该多线程 ,得到所需结果,结束了运行。

情況控制器由两每种组成:

仿真结果:

通过课程设计,了解了CPU的原理,对CPU取指令,执行指令的过程有了比较深入的认识。

三、FPGA中实现CPU

http://www.eefocus.com/book/08-01/3285412720058786.html

行。但会 它时要具有以下基本功能:

assign regfile[0] = 8'h87;

assign regfile[3] = 8'h68;

2、RAM

为了使CPU实际可用,仅用CPU内内外部的寄存器是远远缺陷的,时要有足够的RAM空间。测试RAM时序的指令采用LDM和STM。

第五个时钟,PC增1,指向下一根绳子 指令。若操作符为HLT,则输出信号HLT为高;前一天操作符不为HLT,除了PC增1外(指向下一根绳子 指令),太多各控制线输出为零。

//死循环

CPU即中央处理单元的英文缩写,它是计算机的核心部件。计算机进行信息处理可分为另五个步骤:

assign regfile[3] = 8'h68;//STM,将累加器中的数输出到RAM空间中

(3)执行指令—根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器、存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。

第0个时钟,前一天CPU情況控制器的输出rd和load_ir为高电平,其余均为低电平。指令寄存器寄存由ROM送来的高8位指令代码。

ROM区的机器码多线程 如下:

assign regfile[1] = 8'hf0;

assign regfile[17] = 8'h00;

(1)能对指令进行译码并执行规定的动作;

仿真结果:

assign regfile[15] = 8'hc8;

第l个时钟,与上一时钟相比太多inc_pc从0变为1,故PC增1,ROM送来低8位指令代码,指令寄存器寄存该8位代码。

assign regfile[8] = 8'h00;

(4)指令寄存器、译码器;

指令寄存器的触发时钟是clkl,在clkl的正沿触发下,寄存器将数据总线送来的指令存入高8位或低8位寄存器中,但并都在每个clk 1的上升沿都寄存数据总线的数据,前一天数据总线上有时传输指令。有时传输数据。哪好多个前一天寄存,哪好多个前一天不寄存由CPU情況控制器的load_ir信号控制。load_ir信号通过ena口输入到指令寄存器,复位后,指令寄存器被清为零。

另本身法律法律依据是把亲戚亲戚朋友前一天写好的CPU代码直接拿来使用。你这个已写好的模块代码称作IP核。 IP核的获取法律法律依据有几种:向厂商购买有知识产权的IP核代码;用IP核生成软件(如Xilinx的EDK等)生成可定制的IP核;从网络上下载免费的IP核等。

指令周期由8个时钟周期组成,每个时钟周期都在完成固定的操作。

3、简单的动态效果

(3)能与存储器及外设交换数据;

复位后,指令指针为零,即每次CPU重新启动将从ROM的零地址结束了读取指令并执行。每条指令执行完需另五个时钟,这时pc_addr已被增2,指向下一根绳子 指令(前一天每条指令占另五个字节立。前一天正执行的指令是跳转一句话,这时CPU情況控制器前一天输出load_pc信号,通过load口进入多线程 计数器。多线程 计数器(pc_addr)将装进去 目标地址(ir_addr),而都在增2。

assign regfile[0] = 8'h87;//LDI,将立即数装载到累加器中

指令寄存器用于寄存指令。

首次尝试了用机器码编写多线程 。

二、CPU原理介绍

1、哪几但是CPU

(2)分析指令—即指令译码,是对当前取得的指令进行分析,指出它要求哪好多个操作,并产生相应的操作控制命令。

//为了证明累加器中的数据是从RAM中读出来的,而都在另另五个装载的,太多故意在读//RAM前一天将累加器清零。

成功实现用小灯显示数字“0F”。

CPU的作用是协调并控制计算机的各个部件执行多线程 的指令序列,使其有条不紊地进

指令格式(Pc_spec.pdf):

地址多路器用于选用 输出的地址是PC(多线程 计数)地址还是数据/端口地址。每个指令周期的前另五个时钟周期用于从ROM中读取指令,输出的应是PC地址;后另五个时钟周期用于对RAM或端口的读写,该地址由指令给出。地址的选用 输出信号由时钟信号的8分频信号fetch提供。

(5)数据控制器:

多线程 计数器用于提供指令地址,以便读取指令。指令按地址顺序存装进去 存储器中。有本身途径可形成指令地址:其一是顺序执行的情況,其二是遇到要改变顺序执行多线程 的情況,同类执行JMP指令后,时要形成新的指令地址。下面就来删剪说明PC地址是如保建立的。

assign regfile[4] = 8'h00;//低地址

assign regfile[6] = 8'h87;

(1)算术逻辑运算部件(ALU);

assign regfile[1] = 8'h0f;//被装载的立即数

assign regfile[16] = 8'h0f;

、‘

累加器用于存放当前的结果,它也是双目运算中一另五个数据来源。复位后,累加器的值是零。当累加器通过ena口收到来自CPU情況控制器load_acc信号时,在clkl时钟正跳沿时就收到来自于数据总线的数据。

assign regfile[14] = 8'h01;

每条指令为另五个字节,即16位。高3位是操作码,低13位是地址(CPU的地址总线为13位,寻址空间为8K字节)。本设计的数据总线为8位,太多每条指令需取两次。先取高8位,后取低8位。

本实验所用CPU核是从网络上下载的一款名为PopCorn的mini CPU,其社会形态如下图所示:

第6个时钟,空操作。

太多CPU、ROM和端口完会 正常使用。

数字“0F”被成功送到输出端口“port”。

//将累加器中的数据输出至端口寄存器

assign regfile[13] = 8'h00;

(4) RISC_ CPU算术逻辑运算单元:

(6)情況控制器:

随着FPGA集成度的增加,其所能提供的资源太多断增多,rom、ram、CPU等庞大的复杂化的社会形态也逐渐能在FPGA中实现,从而有了“片上系统”(SOPC――System On a Programable Chip)。

另另五个,便时要放心大胆地编写ROM和其中的机器码了。

(7)多线程 计数器:

(2)时要进行算术和逻辑运算;

assign regfile[8] = 8'h01;

(1)将数据和多线程 (即指令序列)输入到计算机的存储器中;

情況机控制器接受复位信号RST,当RST有效时通过信号ena使其为0,输入到情況机中停止情況机的工作。

将cpu的功能进一步细化,可概括如下:

五、基于PopCorn(PC)核搭建个人的系统

1、ROM

写好的机器码时要装进去 多线程 存储器ROM中,以被CPU读取并执行。在编写ROM前一天,时要知道CPU读取ROM的时序,而下载的压缩包中如此相应的资料,但会 时要通过其它法律法律依据得出时序图。最简单可行的法律法律依据是黑匣子仿真测试,即提供CPU时钟,观察其地址总线,数据总线和各控制信号的变化,从而得出时序图。



小灯显示数字“F0”,实验成功!

编写RAM的注意事项:

前一天写的RAM中居于BUG,主太多双向端口带来的麻烦,时要三态门。而前一天三态门的关闭时刻采用的RD信号的上升沿,前一天CPU有前一天是在此刻锁存数据的,太多此时关闭三态门前一天由于CPU读到的数据是“ZZ”而都在“F0”。但是该成CS信号的上升沿才关闭三态门,另另五个完会 保证数据被可靠读入CPU。

你这个改变时要用情況机来实现。前一天三态门的开、关是由RD的下降沿和CS的上升沿同去控制的,而边沿敏感列表非要有一另五个变量,另五个always块又非要给同一另五个变量赋值,时要写在同一另五个always块中,如此RD和CS信号就时要为电平敏感信号了,但在每次读RAM时,是先置低CS,但会 置低RD,但会 拉高RD,但会 再拉高CS,在前后都在RD高、CS低的情況,而这本身情況是不同的情況,但会 时要情況机来实现。

但会 前一天前面的分析,在RD信号的下降沿锁存了地址对应的数据,但会 就能正常使用了。

RAM社会形态见下图:

(5)时序和控制部件。

四、本实验所用CPU核

assign regfile[4] = 8'h00;

第另五个时钟,若操作符为AND、ADD、XOR或LDA,读相应地址的数据;若为JMP,将目的地址送给多线程 计数器;若为STO,输出累加器数据。

仿真图中,最少 把机器码C8,23,01依次装进去 ROM地址的0,1,2中,最少 指令JMP 0x0123。在仿真结果中,CPU取完前3条指令后,的确跳转到地址0x0123去读取指令了。

assign regfile[5] = 8'h00;

指令集(Pc_spec.pdf):

//结果表明应该是1。

(4)提供整个系统所时要的控制。

(1)情況机;

为了完会 用实验验证CPU功能,上述另五个模块是必不可少的。在ROM中写一另五个最简单的多线程 ,向端口寄存器置一特定数字,在实验板上观察小灯的亮/灭,从而验证系统运行正确是是不是。ROM区控制CPU的机器码如下:

assign regfile[2] = 8'h01;

根据CPU的指令系统,验证RAM的法律法律依据是向RAM区中写数据,再读出来,但会 写到端口中,看小灯的亮灭。

该CPU提供了一另五个8位的IO端口,但同样如此提供如保对其操作。笔者猜想是对PORT寄存器进行操作来控制IO口。但双向端口的方向是如保选用 就问你了。做了好多个尝试失败后,笔者决定个人来写个简单的单向输出端口。

情況机是CPU的控制核心,用于产生一系列的控制信号,启动或停止太多部件。CPU何时能 进行读指令读写I/O端口、RAM区等操作,都在由情況机来控制的。情況机的当前情況,由变量state记录,state的值太多当前你这个指令周期中经过的时钟数〔从零计起)。

(1)时钟居于器:

上图为CPU写RAM时序。机器码68,23,01对应指令STM 0x0123。在读完哪好多个指令后,RAM选通信号sram_cs_l和总线写信号code_wr_l先后被给出,与此同去地址总线为0x0123。但奇怪的是读信号code_rd_l也被给出,不过好在读和写操作时要区分开,通过一另五个简单组合逻辑电路就时要把信号code_wr_l、code_rd_l翻译成想要的RAM读、写信号。你这个处理法律法律依据也前一天带来隐患:在写RAM时,code_wr_l、code_rd_l到来时刻的细微差别前一天给翻译输出的写信号带来毛刺,即竞争/冒险疑问。