对状态机的总结: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