|
这是一个用Gauss消去法求三元一次方程组的代码,fpu模块是单精度(32位)运算模块,fpu_op是0,1,2,3是分别是加,减,乘,除,经过我的仔细检查,代码如果按case(0)一直运行下去,结果不会错。但最后的结果都是11111111100000000000000000000000(负无穷),不知错在哪
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
module gauss3(clk,a11,a12,a13,a21,a22,a23,a31,a32,a33,b1,b2,b3,x1,x2,x3);
input clk;
input [31:0] a11,a12,a13,a21,a22,a23,a31,a32,a33,b1,b2,b3;
output [31:0] x1,x2,x3;
wire [31:0] tv1,tv2,tv3,pit1,pit2,pit3;
wire [2:0] op;
tty t2(clk,a11,a12,a13,a21,a22,a23,a31,a32,a33,b1,b2,b3,tv1,tv2,tv3,op,pit1,pit2,pit3);
fpu w3( .clk(clk), .rmode(2'b00), .fpu_op(op), .opa(tv1), .opb(tv2), .out(tv3));
assign x1=pit1;
assign x2=pit2;
assign x3=pit3;
endmodule
module tty(clk,a11,a12,a13,a21,a22,a23,a31,a32,a33,b1,b2,b3,tv1,tv2,tv3,op,pit1,pit2,pit3);
input clk;
input [31:0] a11,a12,a13,a21,a22,a23,a31,a32,a33,b1,b2,b3,tv3;
output [31:0] tv1,tv2,op,pit1,pit2,pit3;
reg [31:0] /*ra11,ra12,ra13,ra21,ra22,ra23,ra31,ra32,ra33,rb1,rb2,rb3,*/tv1,tv2,op,pit1,pit2,pit3;
reg [31:0] u1,u2,rrt1,rrt2,rrt3,rrt4,rrt5,rrt6,rrt7,rrt8,rrt9,rrt10,rrt11,rrt12,
rrt13,rrt14,rrt15,rrt16,rrt17,rrt18,rrt19,rrt20,rrt21,rrt22;
reg [5:0] yu=6'd0;
always @(posedge clk)
begin
ra11=a11;
ra12=a12;
ra13=a13;
ra21=a21;
ra22=a22;
ra23=a23;
ra31=a31;
ra32=a32;
ra33=a33;
rb1=b1;
rb2=b2;
rb3=b3;
end
always @(posedge clk)
begin
case(yu)
6'd0:begin op=3'd3; tv1=ra21; tv2=ra11; u1=tv3; end//u1
6'd1:begin op=3'd3; tv1=ra31; tv2=ra11; u2=tv3; end//u2
6'd2:begin op=3'd2; tv1=ra12; tv2=u1; rrt1=tv3; end//a12*u1
6'd3:begin op=3'd1; tv1=ra22; tv2=rrt1; rrt3=tv3; end//a22-a12*u1
6'd4:begin op=3'd2; tv1=ra13; tv2=u1; rrt2=tv3; end//a13*u1
6'd5:begin op=3'd1; tv1=ra23; tv2=rrt2; rrt4=tv3; end//a23-a13*u1
6'd6:begin op=3'd2; tv1=rb1; tv2=u1; rrt9=tv3; end//b1*u1
6'd7:begin op=3'd1; tv1=rb2; tv2=rrt9; rrt10=tv3; end//b2-b1*u1
6'd8:begin op=3'd2; tv1=ra12; tv2=u2; rrt5=tv3; end//a12*u2
6'd9:begin op=3'd1; tv1=ra32; tv2=rrt5; rrt6=tv3; end//a32-a12*u2
6'd10:begin op=3'd2; tv1=rb1; tv2=u2; rrt11=tv3; end//b1*u2
6'd11:begin op=3'd1; tv1=rb3; tv2=rrt11; rrt12=tv3; end//b3-b1*u2
6'd12:begin op=3'd2; tv1=ra13; tv2=u2; rrt7=tv3; end//a13*u2
6'd13:begin op=3'd1; tv1=ra33; tv2=rrt7; rrt8=tv3; end//a33-a13*u2
6'd14:begin op=3'd3; tv1=rrt6; tv2=rrt3; u2=tv3; end//u2
6'd15:begin op=3'd2; tv1=rrt4; tv2=u2; rrt13=tv3; end//a23*u2
6'd16:begin op=3'd1; tv1=rrt8; tv2=rrt13; rrt14=tv3; end//a33-a23*u2
6'd17:begin op=3'd2; tv1=rrt10; tv2=u2; rrt15=tv3; end//b2*u2
6'd18:begin op=3'd1; tv1=rrt12; tv2=rrt15; rrt16=tv3; end//b3-b2*u2
6'd19:begin op=3'd3; tv1=rrt16; tv2=rrt14; pit3=tv3; end//pit3=b3/a33
6'd20:begin op=3'd2; tv1=pit3; tv2=rrt4; rrt17=tv3; end//x3*a23
6'd21:begin op=3'd1; tv1=rrt10; tv2=rrt17; rrt18=tv3; end//b2-x3*a23
6'd22:begin op=3'd3; tv1=rrt18; tv2=rrt3; pit2=tv3; end//pit2=(b2-x3*a23)/a22
6'd23:begin op=3'd2; tv1=pit3; tv2=ra13; rrt19=tv3; end//x3*a13
6'd24:begin op=3'd2; tv1=pit2; tv2=ra12; rrt20=tv3; end//x2*a12
6'd25:begin op=3'd1; tv1=rb1; tv2=rrt19; rrt21=tv3; end
6'd26:begin op=3'd1; tv1=rrt21; tv2=rrt20; rrt22=tv3; end
6'd27:begin op=3'd3; tv1=rrt22; tv2=ra11; pit1=tv3; end//pit1
endcase
end
always @(posedge clk)
begin
if(yu==6'd28)
yu=6'd0;
else
yu=yu+1;
end
endmodule |
|