题解 | 基础版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


全部评论

相关推荐

11-29 00:55
门头沟学院
区域赛银,邀请赛金,打算十二月打下Java基础、背点八股、写个外卖后去投福建小厂的寒假实习,简历应该怎么写呢?以及福州/和厦门有推荐的小厂吗?
牛客53210502...:简历一页:把区域银,邀请赛金标粗,其他的奖除非凑一页否则没有必要写。或者多页:每个站一行这样都列出来。项目经历看看牛客其他人是怎么写的,写的不好呢。简历打磨好按部就班没问题的
点赞 评论 收藏
分享
面了100年面试不知...:今年白菜这么多,冬天可以狂吃了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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