DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1381|回复: 0
打印 上一主题 下一主题

[待整理] 硬件描述语言Verilog HDL设计进阶之:使用函数实现简单的处理器

[复制链接]
跳转到指定楼层
楼主
发表于 2015-4-27 16:40:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        4.8  典型实例8:使用函数实现简单的处理器

        4.8.1  实例的内容及目标

        1.实例内容

          本实例使用Verilog HDL设计一个简单8位处理器,可以实现两个8位操作数的4种操作。在设计过程中,使用了函数调用的设计方法。
           
        2.实例目标

          通过本实例,读者应达到下面的一些目的。
          ·  掌握使用Verilog函数设计的方法。
          ·  掌握Verilog设计的一般方法。
           
        4.8.2  原理简介

          处理器发展到现在,已经变成一个功能极其强大,设计也极为复杂的单元。现在一颗小小的CPU的运算能力远远的超过了以前的超级计算机的能力。虽然处理器处理能力的提高和很多方面的因素有关,可是处理器最终要完成的目标还是早期CPU设计时的那个目标,那就是使用操作码实现对操作数的控制和计算。
          在本实例中,实现的处理器是一个8位处理器,只实现简单的4种操作:相加、相减、操作数减1和操作数加1。通过这4种操作向读者展示如何使用Verilog语言设计看似复杂的CPU单元。
          当然,这个处理器只是一个算术单元,处理器还包括很多其他的功能,在此不进行介绍,感兴趣的读者可以查阅相关的书籍,按照本实例提供的设计方向补充和完善这个处理器。
           
        4.8.3  代码分析

          下面给出这个处理器的Verilog源代码,读者可以将此处理器模块实例化至自己的工程设计中。
          module mpc(instr,out);
                  //端口说明
                  input[17:0] instr;               //输入指令
                  output[8:0] out;           //输出结果
                  //内部信号说明
                  reg[8:0] out;
                  reg func;                     //指令中提取出的操作码的内部变量
                  reg[7:0] op1,op2;        //从指令中提取的两个操作数
                  //函数声明
                  function[16:0] code_add;  //函数的定义,返回一个17位的指令
                    input[17:0] instr;       //函数的输入,采用与模块输入同样的命名,可不同
                    //函数内部信号说明
                    reg add_func;             //函数内部的操作码变量
                    reg[2:0] code;          //操作码
                    reg[7:0] opr1,opr2;    //两个操作数
                   
                    begin
                         code=instr[17:16]; //输入指令instr的高2位为操作码code
                         opr1=instr[7:0];   //输入指令instr的低8位为操作数opr1
                         //通过case语句判断操作码的类型,获得操作数opr2
                         case(code)
                               2'b00: begin
                                     add_func=1;
                                     opr2=instr[15:8]; //从instr中取第二个操作数
                                     end
                               2'b01: begin
                                     add_func=0;
                                     opr2=instr[15:8]; //从instr中取第二个操作数
                                     end
                               2'b10: begin
                                     add_func=1;
                                     opr2=8'd1;           //第二个操作数取为1,实现+1操作
                                     end
                               2'b11: begin
                                     add_func=0;
                                     opr2=8'd1;           //实现-1操作
                                     end
                               endcase
                               code_add={add_func,opr2,opr1}; //函数的返回值
                    end
                    endfunction
                    //函数调用模块
                    always @(instr) begin
                      {func,op2,op1}=code_add(instr);   //调用函数
                      if(func==1)
                              out=op1+op2;                  //实现两数相加或操作数1加1操作
                      else
                              out=op1-op2;                  //实现两数相减或操作数1减1操作
                      end
        endmodule
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-2-22 17:10 , 耗时 0.083717 秒, 19 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表