我的毕业设计,用verilog hdl语言编的计算器程序,算加减乘除运算,但是运行时有问题,望高手指点一下.
程序如下:/*信号定义:clk:输入时钟;reset:复位计数器;instr:输入out:输出*/modulejisuanqi(instr,out,clk,reset);...
程序如下:
/*信号定义:
clk:输入时钟;
reset:复位计数器;
instr:输入
out:输出
*/
module jisuanqi(instr,out,clk,reset);
parameter add=2'b00,min=2'b01,mul=2'b10,div=2'b11;
input clk,reset;
input[27:0] instr;
output[15:0] out;
reg[15:0] out;
reg[1:0] func1,func2;
reg[7:0] op1,op2,op3;
//定义函数
function[27:0] code_jisuanqi;
input[27:0] instr;
reg[1:0] code1, code2;
reg[7:0] opr1,opr2,opr3;
begin
code1=instr[19:18];
code2=instr[9:8];
opr1=instr[27:20];
opr2=instr[17:10];
opr3=instr[7:0];
code_jisuanqi={opr1,code1,opr2,code2,opr3};
end
endfunction
//乘法计算函数
function[15:0] code_mul;
input[7:0] opa,opb;
reg[15:0] result;
integer i;
begin
result=opa[0]?opb:0;
for(i=1;i<=7;i=i+1)
begin
if(opa[i]==1) result=result+(opb<<(i-1));
end
code_mul=result;
end
endfunction
//除法计算函数
function[7:0] code_div;
input[7:0] opa,opb;
reg[7:0] result;
begin
if(opa>=(opb<<7))result[7]=1;
opa=opa-(opb<<7);
else result[7]=0;
if(opa>=(opb<<6))result[6]=1;
opa=opa-(opb<<6);
else result[6]=0;
if(opa>=(opb<<5))result[5]=1;
opa=opa-(opb<<5);
else result[5]=0;
if(opa>=(opb<<4))result[4]=1;
opa=opa-(opb<<4);
else result[4]=0;
if(opa>=(opb<<3))result[3]=1;
opa=opa-(opb<<3);
else result[3]=0;
if(opa>=(opb<<2))result[2]=1;
opa=opa-(opb<<2);
else result[2]=0;
if(opa>=(opb<<1))result[1]=1;
opa=opa-(opb<<1);
else result[1]=0;
if(opa>=opb)result[0]=1;
else result[0]=0;
code_div=result;
end
endfunction
always@(posedge clk)
begin
if(!reset)
begin
instr=0;
end
else
begin
{op1,func1,op2,func2,op3}=code_jisuanqi(instr);
case(func1)
add:
begin
if(func2==add)out=op1+op2+op3;
if(func2==min)out=op1+op2-op3;
if(func2==mul)out=op1+code_mul(op2,op3);
if(func2==div)out=op1+code_div(op2,op3);
end
min:
begin
if(func2==add)out=op1-op2+op3;
if(func2==min)out=op1-op2-op3;
if(func2==mul)out=op1-code_mul(op2,op3);
if(func2==div)out=op1-code_div(op2,op3);
end
mul:
begin
if(func2==add)out=code_mul(op1,op2)+op3;
if(func2==min)out=code_mul(op1,op2)-op3;
if(func2==mul)out=code_mul(code_mul(op1,op2),op3);
if(func2==div)out=code_div(code_mul(op1,op2),op3);
end
div:
begin
if(func2==add)out=code_div(op1,op2)+op3;
if(func2==min)out=code_div(op1,op2)-op3;
if(func2==mul)out=code_mul(code_div(op1,op2),op3);
if(func2==div)out=code_div(code_div(op1,op2),op3);
end
endcase
end
endmodule
编译的时候不能通过,除法那段很多错误.哪位高手能告诉我问题出在什么地方吗?不甚感谢!我给分全拿出来了. 展开
/*信号定义:
clk:输入时钟;
reset:复位计数器;
instr:输入
out:输出
*/
module jisuanqi(instr,out,clk,reset);
parameter add=2'b00,min=2'b01,mul=2'b10,div=2'b11;
input clk,reset;
input[27:0] instr;
output[15:0] out;
reg[15:0] out;
reg[1:0] func1,func2;
reg[7:0] op1,op2,op3;
//定义函数
function[27:0] code_jisuanqi;
input[27:0] instr;
reg[1:0] code1, code2;
reg[7:0] opr1,opr2,opr3;
begin
code1=instr[19:18];
code2=instr[9:8];
opr1=instr[27:20];
opr2=instr[17:10];
opr3=instr[7:0];
code_jisuanqi={opr1,code1,opr2,code2,opr3};
end
endfunction
//乘法计算函数
function[15:0] code_mul;
input[7:0] opa,opb;
reg[15:0] result;
integer i;
begin
result=opa[0]?opb:0;
for(i=1;i<=7;i=i+1)
begin
if(opa[i]==1) result=result+(opb<<(i-1));
end
code_mul=result;
end
endfunction
//除法计算函数
function[7:0] code_div;
input[7:0] opa,opb;
reg[7:0] result;
begin
if(opa>=(opb<<7))result[7]=1;
opa=opa-(opb<<7);
else result[7]=0;
if(opa>=(opb<<6))result[6]=1;
opa=opa-(opb<<6);
else result[6]=0;
if(opa>=(opb<<5))result[5]=1;
opa=opa-(opb<<5);
else result[5]=0;
if(opa>=(opb<<4))result[4]=1;
opa=opa-(opb<<4);
else result[4]=0;
if(opa>=(opb<<3))result[3]=1;
opa=opa-(opb<<3);
else result[3]=0;
if(opa>=(opb<<2))result[2]=1;
opa=opa-(opb<<2);
else result[2]=0;
if(opa>=(opb<<1))result[1]=1;
opa=opa-(opb<<1);
else result[1]=0;
if(opa>=opb)result[0]=1;
else result[0]=0;
code_div=result;
end
endfunction
always@(posedge clk)
begin
if(!reset)
begin
instr=0;
end
else
begin
{op1,func1,op2,func2,op3}=code_jisuanqi(instr);
case(func1)
add:
begin
if(func2==add)out=op1+op2+op3;
if(func2==min)out=op1+op2-op3;
if(func2==mul)out=op1+code_mul(op2,op3);
if(func2==div)out=op1+code_div(op2,op3);
end
min:
begin
if(func2==add)out=op1-op2+op3;
if(func2==min)out=op1-op2-op3;
if(func2==mul)out=op1-code_mul(op2,op3);
if(func2==div)out=op1-code_div(op2,op3);
end
mul:
begin
if(func2==add)out=code_mul(op1,op2)+op3;
if(func2==min)out=code_mul(op1,op2)-op3;
if(func2==mul)out=code_mul(code_mul(op1,op2),op3);
if(func2==div)out=code_div(code_mul(op1,op2),op3);
end
div:
begin
if(func2==add)out=code_div(op1,op2)+op3;
if(func2==min)out=code_div(op1,op2)-op3;
if(func2==mul)out=code_mul(code_div(op1,op2),op3);
if(func2==div)out=code_div(code_div(op1,op2),op3);
end
endcase
end
endmodule
编译的时候不能通过,除法那段很多错误.哪位高手能告诉我问题出在什么地方吗?不甚感谢!我给分全拿出来了. 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询