这道题其实不难,但是要把题目的要求搞懂,就是求一个数的补码,而且按照题目的意思理解,这个数就是一个负数。负数求补码的规则如下:
在负数时候,补码是由负数的原码取反之后+1获得(可以理解为:从低位到高位(不包括最高位),当遇到第一个1之后,其余的高位全部取反,最后再加上最高位1)。
下面就是状态转移图:
根据状态转移图写出的代码如下:
module top_module (
input clk,
input areset,
input x,
output z
);
parameter S0 = 2'd0,S1 = 2'd1,S2 = 2'd2;
reg [1:0] state,next_state;
always@(posedge clk or posedge areset)begin
if(areset)begin
state <= S0;
end
else begin
state <= next_state;
end
end
always@(*)begin
case(state)
S0:next_state = x?S1:S0;
S1:next_state = x?S2:S1;
S2:next_state = x?S2:S1;
endcase
end
assign z = (state==S1);
endmodule