FPGA学习笔记24--用函数实现简单的处理器

module mpc(instr,out); 

input[17:0] instr;                         //instr为输入的指令 


    output[8:0] out;                          //输出结果 

    reg[8:0] out; 

    reg func; 

    reg[7:0] op1,op2;                         //从指令中提取的两个操作数 

    function[16:0] code_add;                  //函数的定义 

    input[17:0] instr; 

    reg add_func; 

    reg[7:0] code,opr1,opr2; 

        begin 

        code=instr[17:16];                    //输入指令 instr的高2位是操作码 

        opr1=instr[7:0];                      //输入指令 instr的低 8位是操作数 opr1 

        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 

         default: 

            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 


`timescale 10ns/1ns 

module mpc_tp(); 

reg[17:0] instr; 

wire[8:0] out; 

parameter DELY=10; 

mpc m1(instr,out);                             //调用待测试模块 

initial begin 

       instr=18'd0; 

#DELY instr=18'b00_01001101_00101111; 

#DELY instr=18'b00_11001101_11101111; 

#DELY instr=18'b01_01001101_11101111; 

#DELY instr=18'b01_01001101_00101111; 

#DELY instr=18'b10_01001101_00101111; 

#DELY instr=18'b11_01001101_00101111; 

#DELY instr=18'b00_01001101_00101111; 

#DELY $finish; 

end 

initial $monitor($time,,,"instr=%b out=%b",instr,out); 

endmodule 

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值