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

描述

某同步时序电路的状态转换图如下,→上表示“C/Y”,圆圈内为现态,→指向次态。

请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。

如图所示:

电路的接口如下图所示,C是单bit数据输入端。 

如图所示:

输入描述

   input                C   ,
   input                clk ,
   input                rst_n

输出描述

output   wire        Y 

解题分析

        本题提供的是状态转换图,可采用状态机实现,也可采用列激励方程、输出方程,进而用D触发器和组合逻辑电路实现。本题解采用第二种方案实现。

        由状态转换图可得出,电路共4个状态,所以使用2个寄存器来实现状态的寄存。两个寄存器的输出为Q1和Q0,两个寄存器的输入为D1和D0。可列出状态转换表如下:

由状态转换表可列出激励方程如下:

 输出方程如下:

根据激励方程和输出方程以及思路整理,关键电路如下:

将电路转换成Verilog代码描述如下: 

reg Q1 ;

reg Q0 ;

always @(posedge clk or negedge rst_n)begin

   if(!rst_n)

      Q1 <= 1'b0;

   else

      Q1 <= (Q1 & (Q0 | C)) | (~Q1 & Q0 & ~C);

end

always @(posedge clk or negedge rst_n)begin

   if(!rst_n)

      Q0 <= 1'b0;

   else

      Q0 <= (~Q1 & (Q0 | C)) | (Q1 & Q0 & ~C);

end

   

assign Y = (C & Q1) | (Q1 & Q0);

参考代码

`timescale 1ns/1ns

module seq_circuit(
   input                C   ,
   input                clk ,
   input                rst_n,
 
   output   wire        Y   
);

reg Q1 ;
reg Q0 ;
      
always @(posedge clk or negedge rst_n)begin
   if(!rst_n)
      Q1 <= 1'b0;
   else 
      Q1 <= (Q1 & (Q0 | C)) | (~Q1 & Q0 & ~C);
end 
always @(posedge clk or negedge rst_n)begin
   if(!rst_n)
      Q0 <= 1'b0;
   else 
      Q0 <= (~Q1 & (Q0 | C)) | (Q1 & Q0 & ~C);
end 
    
assign Y = (C & Q1) | (Q1 & Q0); 
   
endmodule

方法二

`timescale 1ns/1ns

module seq_circuit(
   input                C   ,
   input                clk ,
   input                rst_n,
 
   output   wire        Y   
);
reg [1:0] state;
always @(posedge clk or negedge rst_n)
    begin
        if(~rst_n)
            begin
                state <= 2'b00;
            end
        else
            begin
                case(state)
                    2'b00:
                        begin
                            if(C)
                                state <= 2'b01;
                            else
                                state <= 2'b00;
                        end
                    2'b01:
                        begin
                            if(C)
                                state <= 2'b01;
                            else
                                state <= 2'b11;
                        end
                    2'b10:
                        begin
                            if(C)
                                state <= 2'b10;
                            else
                                state <= 2'b00;
                        end
                    2'b11:
                        begin
                            if(C)
                                state <= 2'b10;
                            else    
                                state <= 2'b11;
                        end
                endcase
            end
    end

assign Y = (state == 2'b11)?1'b1:(state == 2'b10)?C:1'b0 ;
endmodule

注:解题分析来源于网友,如有侵权,请告删之。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值