一个简易的8位计算器,可实现加减乘除,testbench写的较为简易,代码覆盖率有点低。方法比较笨,综合之后的频率不高。

(只限整数)

module   calculator(
                    num,
                    num_sig,
                    cal,
                    enter,
                    result_int,
                    result_sig,
                    yshang,
                    yyushu,
                    clk,
                    rst
                  
                   
                    );

input            clk;
input            rst;

input    [7:0]    num;
input            num_sig;

input    [3:0]    cal;
input            enter;

output    [15:0]    result_int;
output            result_sig;
output     [7:0]   yshang; 
output     [7:0]   yyushu;





reg        [7:0]    num1;
reg                num1_sig;
reg        [7:0]    num2;
reg                num2_sig;

reg        [7:0]    num1cal;
reg                num1cal_sig;
reg        [7:0]    num2cal;
reg                num2cal_sig;

reg        [15:0]   num1calreg;
reg        [15:0]   num2calreg;

reg        [7:0]     yshang;
reg        [7:0]     yyushu;
reg        [15:0]    result_int;
reg                  result_sig;

reg        [3:0]    cal_tmp;
reg        [3:0]    cal_st;


reg         [2:0] count;
reg         [3:0] count1;
reg               div_done;
reg         [1:0] state;
reg         [15:0] p,t;
reg         [7:0]  m;
parameter  s0=0,s1=1,s2=2;
always@(posedge clk or negedge rst)
begin
    if(~rst)
    begin
        cal_tmp=4'b0000;
        num1=0;
        num2=0;
        num1_sig=0;
        num2_sig=0;
      
        num1cal=0;
        num2cal=0;
        num1cal_sig=0;
        num2cal_sig=0;
       
        result_int=0;
        result_sig=0;
       
        cal_st=0;
        count=0;
        count1=0;
        state=2'b00;
       
       num1calreg=16'b0000000000000000;
       num2calreg=16'b0000000000000000;
        div_done = 1'b0;
       
        yshang=8'b00000000;
        yyushu=8'b00000000;
       
    end
    else
    begin
        if(cal!=4'b0000)
        begin
            num1_sig=num_sig;
            num1=num;
          
            cal_tmp=cal;
        end
        else
        begin
            if(enter)
            begin
                num2_sig=num_sig;
                num2=num;
              
               case({num1_sig,num2_sig,cal_tmp})
                   6'b000001://num1+num2
                    begin
                        cal_st=1;//num1+num2,result_sig=num1_sig&num2_sig
                       num1cal_sig=num1_sig;
                       num1cal=num1;
                     
                       num2cal_sig=num2_sig;
                        num2cal=num2;
                      
                    end
                   6'b010001://num1+(-num2)=num1-num2
                    begin
                       cal_st=2;//num1-num2,num1_sig=num2_sig=0
                       num1cal_sig=num1_sig;
                        num1cal=num1;
                       
                       num2cal_sig=0;
                       num2cal=num2;
                      
                    end
                   6'b100001://-num1+num2
                    begin
                        cal_st=2;
                        //alternate num1and num2, then it's still num1-num2
                       num1cal_sig=0;
                       num1cal=num2;
                       
                       num2cal_sig=0;
                        num2cal=num1;
                       
                    end
                   6'b110001://-num1+(-num2)
                    begin
                       cal_st=1;//num1+num2,result_sig=num1_sig&num2_sig
                        num1cal_sig=num1_sig;
                       num1cal=num1;
                      
                       num2cal_sig=num2_sig;
                       num2cal=num2;
                       
                    end
                   6'b000010://num1-num2
                    begin
                       cal_st=2;//num1-num2,num1_sig=num2_sig=0
                       num1cal_sig=num1_sig;
                       num1cal=num1;
                       
                       num2cal_sig=num2_sig;
                        num2cal=num2;
                     
                    end
                   6'b010010://num1-(-num2)
                    begin
                       cal_st=1;//num1+num2,result_sig=num1_sig&num2_sig
                       num1cal_sig=0

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值