Files
neulacpu/lacpu/rtl/cpu/div.v

52 lines
1.2 KiB
Verilog

module div(
input clk,
input reset,
output stallreq,
input in_valid,
output out_valid,
input [31:0] a,
input [31:0] b,
output reg [31:0] quotient, //商
output reg [31:0] remainder //余数
);
reg [ 5:0] cnt;
wire [31:0] sub_result;
wire carry;
wire [31:0] temp;
always @ (posedge clk) begin
if (reset) begin
cnt <= 0;
end
else if (cnt != 0) begin
cnt <= cnt -1;
end
else if (in_valid) begin
cnt <= 32;
end
end
assign temp = {remainder[30:0],quotient[31]};
assign carry = temp < b ? 0 : 1;
assign sub_result = carry ? temp - b : temp;
always @ (posedge clk) begin
if (reset) begin
quotient <= 0;
remainder <= 0;
end
else if (cnt != 0) begin
{remainder, quotient} <= {sub_result, quotient[30:0], carry};
end
else if (in_valid) begin
quotient <= a;
remainder <= 0;
end
end
assign out_valid = (cnt==0);
assign stallreq = in_valid | (~(cnt==0));
endmodule