题解 | 基础版22#根据状态转移图实现时序电路#

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

http://www.nowcoder.com/practice/e405fe8975e844c3ab843d72f168f9f4

FSM有限状态机序列检测,涉及到:

(1)摩尔型与米利型状态机;

(2)一段式、两段式、三段式状态机;

(3)状态编码(二进制、格雷码、独热码);

1. 题目

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

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

 

 

2. 解析

已经给了状态转移图,按固定写法写状态跳转就行了。

关键是判断什么时候输出1,什么时候输出0。

 

assign Y = ((curr_state == 2'b11) | ((curr_state == 2'b10)&&(C == 1'b1)) )? 1 : 0;

3. 代码

`timescale 1ns/1ns

module seq_circuit(
   input                C   ,
   input                clk ,
   input                rst_n,
 
   output   wire        Y   
);
    
    reg [1:0] curr_state;
    reg [1:0] next_state;
    // one step
    always @ (posedge clk&nbs***bsp;negedge rst_n)
        begin
            if( ~rst_n ) begin
                curr_state <= 2'b00;
            end 
            else begin
                curr_state <= next_state;
            end 
        end 
    
    // two step
    always @ (*)
        begin
            case(curr_state)
                2'b00 : next_state = (C == 1'b1) ? 2'b01 : 2'b00;
                2'b01 : next_state = (C == 1'b1) ? 2'b01 : 2'b11;
                2'b10 : next_state = (C == 1'b1) ? 2'b10 : 2'b00;
                2'b11 : next_state = (C == 1'b1) ? 2'b10 : 2'b11;
                default : next_state = 2'b00;
            endcase
        end
    
    assign Y = ((curr_state == 2'b11) | ((curr_state == 2'b10)&&(C == 1'b1)) )? 1 : 0;
    
endmodule


全部评论

相关推荐

尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:28
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务