题解 | #根据状态转移表实现时序电路#
根据状态转移表实现时序电路
https://www.nowcoder.com/practice/455c911bee0741bf8544a75d958425f7
`timescale 1ns/1ns /* 本题给出的状态转移图是典型的时序电路状态转移示例, 当被转移状态有多位数据时,需要分别分析每一位的状态转移函数。 根据时序电路的定义,电路的下一状态不仅与当前的输入信号有关,还与当前状态有关。 因此要分析状态Q1,Q0当前状态和当前输入对下一状态的影响。 图中Q1(n+1)在Q1当前状态和A都不变的情况下还发生了转变,因此其结果肯定还与Q0当前状态有关。 经过卡诺图分析得知,(特别注意:~(A^B)=(~A~B+AB),这一步是化简状态函数的关键) Q1(n+1)=A^Q1(n)^Q0(n)。 据状态转移表观察知,Q0(n+1)和 Q0(n)、A有关,再经过卡诺图化简得知,Q0(n+1)=~Q0(n) 题目中给出的输入信号没有Q1和Qn,但根据题目可知,Q1和Qn保存了电路的状态,因此,Q1和Q0应当在编码时使用寄存器变量定义。 对于电路数据Y,根据卡诺图化简,得到 Y = Q1 & Q0 */ module seq_circuit ( A, clk, rst_n, Y ); input A; input clk; input rst_n; output Y; reg[1:0] q; // q[1] always@(posedge clk, negedge rst_n) begin if(~rst_n) q[1] <= 1'b0; else q[1] <= A ^ q[1] ^ q[0]; end // q[0] always@(posedge clk, negedge rst_n) begin if(~rst_n) q[0] <= 1'b0; else q[0] <= ~q[0]; end assign Y = q[1]&q[0]; endmodule //seq_circuit