基于Verilog HDL微处理器ALU运算流水线设计.docVIP

基于Verilog HDL微处理器ALU运算流水线设计.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于Verilog HDL微处理器ALU运算流水线设计

基于Verilog HDL微处理器ALU运算流水线设计   摘要:本文使用硬件描述语言Verilog HDL设计了一个ALU运算流水线,包括接口、FIFO模块、ALU模块和测试环境等,有助于提高微处理器的运算效率,为通过先进的描述手段设计微处理器打下良好的基础。   关键词:Verilog HDL 微处理器 ALU 流水线   中图分类号:TP334 文献标识码:A 文章编号:1007-9416(2014)04-0159-02   1 引言   随着超大规模集成电路工艺和技术的发展,设计师可以用硬件描述语言Verilog HDL来设计超大规模集成的硬件,并通过EDA开发平台中的工具来验证其功能和时序的正确性[1]。本文将使用Verilog HDL设计一个包含输入FIFO、ALU和输出FIFO的三级流水线,并构建相应的测试环境。   2 设计原理与接口   流水线的工作原理是:无规律地读取来自某一个数据源的数据,输入FIFO;在读入来自新的数据源的数据时将变量分级,并在ALU不忙时送到ALU运算;ALU对数据完成运算后送到作为数据接收器的输出FIFO中[2]。整个流水线是由全局单相时钟CP控制的。两个FIFO结构相同[3]。ALU可以完成两个操作数的加、减、乘和除运算,数据来自输入FIFO。加法和减法运算用5个时钟周期完成,乘法和除法运算需要10个时钟周期完成。   在输出FIFO的设计时必须考虑到ALU不是在每个CP沿都产生运算结果[4]。一方面,ALU不能向已满的FIFO送数据;另一方面,FIFO也必须通过SPACELEFT_OUT或SPACELEFT_IN信号指示ALU。   本设计中的接口包括:输入FIFO的输入端口、FIFO和ALU之间的接口、ALU与输出FIFO之间的接口、以及输出FIFO的输出端口。执行过程是通过SPACELEFT_OUT信号,ALU和FIFO信号被告知送前级取数据,然后前级通过设定WORK_IN信号将新数据写入到DATA_IN上,UNIT在CP时钟中读取数据。在CP的下降沿,WORK_IN信号被复位。SPACELEFT_OUT只有在CP为0时才变化。类似地,UNIT只有在得到SPACELEFT_IN信号的有效指示,表示可以读之后,才能向下一级写数据。   3 FIFO设计   两个FIFO只有存储数据的WIDTH不同,这可以在FIFO实例化时通过修改参数定义parameter来实现。参数WIDTH_LD_2表示FIFO的地址信号宽度,因此有2^WIDTH_LD_2-1的FIFO空间可以写数据,并且保存在MEMORY阵列中。HEAD指向MEMORY中的下一个变量位置,TAIL指向下一个要读出的数据位置。这3个变量构成了一个“环状缓冲器”的数据结构。FIFO置空和初始化的代码如下:   task set_spaceleft   if ((HEAD + 1) % WIDTH != TAIL)   SPACELEFT_OUT = 1;   else   SPACELEFT_OUT = 0;   endtask   always @ (posedge RESET) begin   HEAD = 0;   TAIL = 0;   SPACELEFT_OUT = 1;   WORK_OUT = 0;   READ = 0;   WRITE = 0;   end   当WORK_IN和CP信号有效时,FIFO从DATA_IN读取数据,然后HEAD地址自加。这个数据首先通过设定READ信号来保存,然后在时钟CP的下降沿自加HEAD地址值。如果FIFO非空(HEAD!=TAIL),且如果下一个单元空闲(SPACELEFT),数据就可以写入,这个过程由信号WRITE记录。在下一个CP下降沿,TAIL自加。FIFO读/写和HEAD/TAIL指针处理的代码如下:   always @ (CP or DATA_IN or WORK_IN)   if (CP = = 1 WORK_IN = = 1 ) begin   MEMORY [HEAD] = DATA_IN;   READ = 1;   end   always @ (CP)   if(CP==1 HEAD!=TAIL SPACELEFT_IN==1)   begin   DATA_OUT = MEMORY [TAIL];   WORK_OUT = 1;   WRITE = 1;   end   always @ (negedge CP) begin   if ( READ = = 1) begin   HEAD = (HEAD + 1) % WIDTH;   READ = 0;

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档