导言
这一篇记录Moore型状态机与Mealy型状态机的区别。题目的要求是将一个不定长的数据装成对应的二进制补码,直到reset出现时才结束转换。
光看波形图没有看出来怎么设计状态机,看了其他博主的解法才理解这题的解法依据的是二进制转补码的一个规则:
- 从LSB开始到首个非0值保持不变,剩余位到MSB全部取反
代码
Moore FSM:
module top_module (
input clk,
input areset,
input x,
output z
);
parameter S0=0,S1=1;
reg state,next;
always@(posedge clk or posedge areset) begin
if(areset) begin
state <= S0;
end
else begin
state <= next;
end
end
always@(*) begin
case(state)
S0: next = x ? S1:S0;
S1: next = S1;
endcase
end
always@(posedge clk or posedge areset) begin
if(areset) begin
z <= 1'b0; //convesion ends when reset is asserted
end
else if(state == S0) begin
z <= x;
end
else begin
z <= ~x;
end
end
endmodule
Mealy FSM:
module top_module (
input clk,
input areset,
input x,
output z
);
parameter S0=0,S1=1;
reg state,next;
always@(posedge clk or posedge areset) begin
if(areset) begin
state <= S0;
end
else begin
state <= next;
end
end
always@(*) begin
case(state)
S0: next = x ? S1:S0;
S1: next = S1;
endcase
end
always@(*) begin
case(state)
S0: z = x;
S1: z = ~x;
endcase
end
endmodule
小结
- 本题关键在于采取哪一种转补码的方法。
- 区别Mooree型FSM和Mealy型FSM。