题解 | #根据状态转移表实现时序电路#

根据状态转移表实现时序电路

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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务