1.原题复现
https://hdlbits.01xz.net/wiki/Fsm_onehot
2.代码
刚开始采用的是独热码形式的程序来进行测试,结果发现不行:
经过仿真提示之后,才发现测试原来并非以一位的独热码形式来进行的,因此我们应该寻找另一种办法
经过在网上寻找之后,才发现题目的是意思是,并非每次输入当中,只有一位为高电平,也有可能是两位的独热码或者其他一些自由的输入,因此,采用参数定义独热码形式是不可行的。同时,也不能采用case语句,因为输入情况千变万化,无法列写完全。
因此,提出的方法是 按照state[i]上的每一个位来进行逐个判断next_state[i]的发生的条件。 因此 得出以下更正代码:
module top_module(
input in,
input [9:0] state,
output [9:0] next_state,
output out1,
output out2);
parameter S0=10'b00_0000_0001;
parameter S1=10'b00_0000_0010;
parameter S2=10'b00_0000_0100;
parameter S3=10'b00_0000_1000;
parameter S4=10'b00_0001_0000;
parameter S5=10'b00_0010_0000;
parameter S6=10'b00_0100_0000;
parameter S7=10'b00_1000_0000;
parameter S8=10'b01_0000_0000;
parameter S9=10'b10_0000_0000;
always@(*)begin
next_state[0] = state[0]&(~in)|state[1]&(~in)|state[2]&(~in)|state[3]&(~in)|state[4]&(~in)|state[7]&(~in)|state[8]&(~in)|state[9]&(~in);
next_state[1] = state[0]&(in)|state[8]&(in)|state[9]&(in);
next_state[2] = state[1]&(in);
next_state[3] = state[2]&(in);
next_state[4] = state[3]&(in);
next_state[5] = state[4]&(in);
next_state[6] = state[5]&(in);
next_state[7] = state[6]&(in)|state[7]&(in);
next_state[8] = state[5]&(~in);
next_state[9] = state[6]&(~in);
end
assign out1 = (state[8] == 1)|(state[9] == 1);
assign out2 = (state[7] == 1)|(state[9] == 1);
endmodule