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