题解 | #根据状态转移表实现时序电路#
根据状态转移表实现时序电路
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