赞
踩
某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路
电路的接口如下图所示
A表示输入,Y 表示输出
理解状态转移表,画成状态转移图
`timescale 1ns/1ns module seq_circuit( input A , input clk , input rst_n, output wire Y ); parameter state1 = 2'b00; parameter state2 = 2'b01; parameter state3 = 2'b10; parameter state4 = 2'b11; reg [1:0] c_state; reg [1:0] n_state; //第一段:状态转移,次态给现态 always@(posedge clk or negedge rst_n) begin if(!rst_n) c_state <= state1; else c_state <= n_state; end //第二段:现态和输入决定次态 always@(*) begin case(c_state) state1: begin if(A == 0) n_state = state2; else n_state = state4; end state2: begin if(A == 0) n_state = state3; else n_state = state1; end state3: begin if(A == 0) n_state = state4; else n_state = state2; end state4: begin if(A == 0) n_state = state1; else n_state = state3; end default:n_state = state1; endcase end //第三段:输出赋值 // reg Y_reg; // always@(posedge clk or negedge rst_n) // begin // if(!rst_n) // Y_reg <= 1'b0; // else if(c_state == state4 && c_state != n_state) // Y_reg <= 1; // end // assign Y = Y_reg; assign Y = (c_state == state4)?1:0; endmodule
知识点
三段式状态机
第一段:时序逻辑;主要实现状态转换:次态赋给现态
//第一段
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
curr_state <= 2'b00;
else
curr_state <= next_state;
end
第二段:组合逻辑;主要是实现:现态和输入决定次态
//第二段
always(*)
begin
case(curr_state)
2'b00:net_state = (A == 1'b1)?2'b11:2'b01;
2'b01:net_state = (A == 1'b1)?2'b00:2'b10;
2'b10:net_state = (A == 1'b1)?2'b01:2'b11;
2'b11:net_state = (A == 1'b1)?2'b10:2'b00;
default:next_state = 2'b00;
end
第三段:时序逻辑;主要是实现:输出判断
//第三段
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
Y <= 1'b0;
else if(next_state == ...)
Y <= 1'b1;
end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。