always @(posedge clk orposedge clr) begin if(clr) begin state <= state_0; end
elsebegin case (state) state_0: begin if(in > 6'd47 && in < 6'd58)begin state <= state_2; end elsebegin//first input must be number state <= state_1; end end
state_1: begin state <= state_1; end
state_2: begin if(in == 6'd42 || in == 6'd43)begin state <= state_3; end elsebegin state <= state_1; end end
state_3: begin if(in > 6'd47 && in < 6'd58) begin state <= state_4; end elsebegin state <= state_1; end end
state_4: begin if(in == 6'd42 || in == 6'd43) begin state <= state_3; end elsebegin state <= state_1; end end
其实就是把之前数据结构的一道括号匹配题魔改了,核心思路差不多,通过一个flag来标志匹配状态,读入 Begin(左括号)时 flag 加 1 ,End(右括号)时flag - 1,最后判断 flag 是否为 0 来进行输出,同时如果输入 begin 之后,不输入空格,而是输入其他字符,则应该把flag相应地加(减)回去。 值得注意的是:本题是一道本题依旧是 Moore 状态机,因为观察波形输出 result 只在 clk 上升沿变化 !
对于输入,如果未匹配的 end 出现在了 begin 前面, 则输入已经非法,此后不管输入如何,都输出 0 (除非reset),那么我们便可以设置一个单独的状态来保存这一状态, 当flag < 0 时直接就“锁”在这个状态里。
always @(posedge clk orposedge reset) begin if(reset) begin state <= st_1; match <= 32'b0; end
elsebegin case (state) st_0: begin state <= st_0; end
st_1: begin if($signed (match) < $signed(32'b0)) begin state <= st_0; end elsebegin if(in == "b" || in == "B") begin state <= st_2; end elseif(in == "e" || in == "E") begin state <= st_8; end elseif(in == " ")begin state <= st_1; end elsebegin state <= st_7; end end
end
st_2: begin if(in == "e" || in == "E") begin state <= st_3; end elsebegin state <= st_7; end end
st_3: begin if(in == "g" || in == "G") begin state <= st_4; end elseif(in == " ")begin state <= st_1; end elsebegin state <= st_7; end end
st_4: begin if(in == "i" || in == "I") begin state <= st_5; end elseif(in == " ")begin state <= st_1; end elsebegin state <= st_7; end end
st_5: begin if(in == "n" || in == "N") begin match <= match + 32'b1; state <= st_6; end elseif(in == " ")begin state <= st_1; end elsebegin state <= st_7; end end
st_6: begin if(in == " ") begin state <= st_1; end elsebegin match <= match - 32'b1; state <= st_7; end end
st_7: begin if(in == " ") begin state <= st_1; end elsebegin state <= st_7; end end
st_8: begin if(in == "n" || in == "N") begin state <= st_9; end elseif(in == " ")begin state <= st_1; end elsebegin state <= st_7; end end
st_9: begin if(in == "d" || in == "D") begin match <= match - 32'b1; state <= st_10; end elseif(in == " ")begin state <= st_1; end elsebegin state <= st_7; end end
st_10: begin if(in == " ") begin state <= st_1; end elsebegin match <= match + 32'b1; state <= st_7; end end