一个状态机的电路示例-乒乓操作的使能控制器

对状态机的总结:Next_state用于表示下一个时钟到来时的状态,提前准备好,所以所有的输出行为均由此值决定
Current_state用于表示此时钟周期所处于的状态,故从N_st中同步获取
通过组合逻辑电路在本时钟周期内,用C_st的值及其他状态量,绝定下一个周期的N_st,故而这些组合逻辑的延迟要小于一个
时间周期。

 

本状态机的功能为,乒乓操作的控制器。将数据用乒乓操作写入两个bram,数据源给控制器数据写入请求信号wr_req后,随后发出时钟同步的数据,控制器通过invite1,invite2两个告知其bram是否准备好的外部信号,通过输出wr_en使能信号决定是否将数据写入bram。

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2018/09/19 15:48:15
// Design Name:
// Module Name: bram_switch
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
//IDLE最差的情况,需要在wr_rq = 0 后进入挂起状态

module bram_switch(clk,rst,invite1,invite2,wr_req,wr_en
);
input clk;
input rst;
input wr_req;
input invite1;
input invite2;


output wr_en;//this signal is to control wr2bram_ctl to start trans.


reg [1:0]N_ST;
reg [1:0]C_ST;
reg wr_en;

parameter[1:0]
IDLE = 2'b00,
S_RUN = 2'b01,
S_SUP = 2'b10;

 


always @(posedge clk or negedge rst)
    if(!rst)
        C_ST <= IDLE;//当前状态为初始状态
    else
        C_ST <= N_ST;//将下一个状态作为

always @ (rst or C_ST or wr_req or invite1 or invite2)
begin
    N_ST = 2'bxx;//默认时,N_ST为00也就是IDLE
    case(C_ST)
        IDLE:
        begin
            if(wr_req)
                N_ST = IDLE;    
            else
                N_ST = S_SUP;         
        end
        
        S_SUP:
        begin
            if(!wr_req)
            N_ST = S_SUP;
            else if(invite1|invite2)
            N_ST = S_RUN;
            else
            N_ST = IDLE;
        end
        
        S_RUN:
        begin
            if(!wr_req)
            N_ST = S_SUP;
            else if(invite1|invite2)
            N_ST = S_RUN;
            else
            N_ST = IDLE;
        end
        default:
        begin
            N_ST = IDLE;
        end
    endcase
end
        
always @(posedge clk or negedge rst)
    if(!rst)
    wr_en <=0;
    else
    begin
        case(N_ST)
        IDLE :
        wr_en <=0;
        S_RUN :
        wr_en <=1;
        S_SUP :
        wr_en <=0;
        endcase
    end
            
        

 

endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值