|
module gcd(clk,x_i,y_i,go_i,d_o);
parameter N=6;
input[N-1:0] x_i,y_i;
input clk, go_i;
output[N-1:0] d_o;
parameter s0=3'b000,s1=3'b001,s2=3'b011,s3=3'b111,
s4=3'b101,s5=3'b100,s6=3'b110;
reg[N-1:0] d_o;
reg[2:0] current_state,next_state;
reg[N-1:0] x,y,r;
always @(posedge clk)
current_state<=next_state;
always@(current_state or x_i or y_i or go_i or x or y or r)
case( current_state )
s0:if(go_i)
next_state<=s1;
else next_state<=s0;
s1:if(x_i>=y_i)
next_state<=s2;
else next_state<=s3;
s2:begin next_state<=s4;end
s3:begin next_state<=s4;end
s4:if(y>0)
next_state<=s5;
else next_state<=s6;
s5:begin next_state<=s4;end
s6:begin next_state<=s0;end
default:next_state<=s0;
endcase
always @(negedge clk)
case(current_state)
s2:begin x=x_i;y=y_i; end
s3:begin x=y_i;y=x_i; end
s5:begin r=x%y;x=y;y=r; end
//求余可以直接这么做吗?
s6:begin d_o=x; end
default: ;
endcase
endmodule |
|