题目如下所示:
首先介绍独热码:
其特征就是:只有一个位为1其余全为0 的编码方式
优点:因为每一个状态只有一位为1,减少了毛刺的产生(时序电路增加,组合电路减少
)
缺点:会消耗过多的寄存器。
解决思路:本题中我首先是想到将每个状态定义成如下:
parameter s0 = 10'b00_0000_0001, s1 = 10'b00_0000_0010,
s2 = 10'b00_0000_0100, s3 = 10'b00_0000_1000,
s4 = 10'b00_0001_0000, s5 = 10'b00_0010_0000,
s6 = 10'b00_0100_0000, s7 = 10'b00_1000_0000,
s8 = 10'b01_0000_0000, s9 = 10'b10_0000_0000;
然后就是状态跳转的八股文,此处不做详解
问题来了!!!!!!!!!!
如果状态有成百上千个的话,我依旧采用这种方式很花费大量的时间,并且容易出错。
从hdlbit网站练习时学到了一种用下标解决此类问题的方法,具体如下:
parameter S0 = 0, S1 =1, S2 =2, S3 = 3, S4 = 4,
S5 = 5, S6 = 6, S7 = 7, S8 = 8, S9 = 9;
然后将其作为下标进行引用:
assign next_state[S2] = (state[S1] & in);
格式为:
assign next_state[第几个状态] = (state[当前第几个状态] & 输入);
全部代码如下:
module top_module(
input in,
input [9:0] state,
output [9:0] next_state,
output out1,
output out2);
parameter S0 = 0, S1 =1, S2 =2, S3 = 3, S4 = 4,
S5 = 5, S6 = 6, S7 = 7, S8 = 8, S9 = 9;
assign next_state[S0] = (state[S0] & ~in) | state[S1] & (~in) |state[S2] & (~in) | state[S3] & (~in) |state[S4] & (~in)|state[S7] & (~in) | state[S8] & (~in)| state[S9] & (~in);
assign next_state[S1] = (state[S0] & in) | state[S8] & (in)|state[S9] & (in);
assign next_state[S2] = (state[S1] & in);
assign next_state[S3] = (state[S2] & in);
assign next_state[S4] = (state[S3] & in);
assign next_state[S5] = (state[S4] & in);
assign next_state[S6] = (state[S5] & in);
assign next_state[S7] = (state[S7] & in) | state[S6] & (in);
assign next_state[S8] = state[S5] & (~in);
assign next_state[S9] = state[S6] & (~in);
assign {out1,out2 } = {(state[S8] || state[S9]),(state[S7] || state[S9])};
endmodule
仿真结果: