(只限整数)
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