1、这个题纠结了好久,当时看到补码+1还想着进位啥的。后来看别人的博客得到点想法就刚开始低位如果是0,取反加1以后还是0,(状态机的思想的话这里就可以是第一个状态),当有第一个1出现的时候,取反+1,就还是1(这里就可以是第二个状态),当后面变为0的时候,这个时候就单纯的取反就行了就还是1(第二个状态),后面变为1的时候就,取反就是0(就是第三个状态)。参考的三个状态
2、这个题对于原码补码反码有了点认识以及为什么有符号为的时候正数最高位是0,负数最高位是1。参考的知乎的文章 补码的计算方法 - 知乎 (zhihu.com)
完整代码如下:
module top_module (
input clk,
input areset,
input x,
output z
);
parameter A=0,B=1,C=2;
reg [1:0] state,next_state;
always@(*)begin
case(state)
A: next_state=x?B:A;
B: next_state=x?C:B;
C: next_state=x?C:B;
endcase
end
always@(posedge clk or posedge areset)begin
if(areset)
state<=A;
else
state<=next_state;
end
always@(*)begin
case(state)
A:z=0;
B:z=1'b1;
C:z=0;
endcase
end
endmodule