本题与之前的一题Fsm onehot在逻辑上有异曲同工之妙,相当于Exams/m2014 q6b与Fsm onehot的结合体,关于这两道题,大家可以参考我之前给出的题解了解它们各自的解题要点,欢迎大家批评指正!
Fsm onehot题解请点击这里~
Exams/m2014 q6b题解请点击这里~
如果大家看过之前两篇题解,就能立刻找出本题涉及的两个关键点:
- 将现态作为输入,根据状态转移图获取次态,输出是次态的一部分,这里为了使输出逻辑更加直观,采用描述次态逻辑而非只使用assign语句描述输出。
- 题目testbench会给出非独热码输入,这就导致不能将输入的现态作为整体判断来确定次态,而是利用独热码的特性,对输入的每一位单独进行判断,即对输入的每一位都认为其余位为1’b0,根据状态图跳转的次态也只需将对应位值1’b1即可,相当于多个独热码叠加输入。
对于输出则只需要输出次态寄存器的对应位即可。
根据以上两个关键点我们可以得出该题的Verilog HDL:
module top_module (
input [6:1] y,
input w,
output Y2,
output Y4);
localparam A = 6'b000001, B = 6'b000010, C = 6'b000100,
D = 6'b001000, E = 6'b010000, F = 6'b100000;
reg [6:1] next_state;
assign next_state[1] = y[1] && w || y[4] && w;
assign next_state[2] = y[1] && !w;
assign next_state[3] = (y[2] || y[6]) && !w;
assign next_state[4] = (y[2] || y[3] || y[5] || y[6]) && w;
assign next_state[5] = (y[3] || y[5]) && !w;
assign next_state[6] = y[4] && !w;
assign Y2 = next_state[2];
assign Y4 = next_state[4];
endmodule
总结: 通过对之前题目的分析积累,可以在遇到新的题目时直接套用先前的思路,将问题的解法也变得“模块化”,同时还能复习先前的思路,一举两得。