Mealy Fsm----米里状态机(4种状态)
程序员文章站
2024-03-19 18:00:22
...
状态转移图:
//米里状态机,输出与输入和当前状态有关
module ex_fsm(
input wire sclk,
input wire rst_n,
output reg k1,
output reg k2,
input wire A
);
parameter IDIE = 4'b0001;//显式的写出状态表达式
parameter START = 4'b0010;
parameter STOP = 4'b0100;
parameter CLEAR = 4'b1000;
reg [3:0] state;
//用独热编码,独热码用的寄存器数量多,但组合逻辑资源少
//2'b00 2'b01 2'b10 2'b11 二进制编码的寄存器数量少,但是用的组合逻辑资源多
//采用两段式
//一段描述状态机
always @(posedge sclk or negedge rst_n)
if(rst_n == 1'b0)
state <= IDIE;
else
case(state)
IDIE:if(A == 1'b1)
state <= START;
//因为是时序逻辑,不加else相当于保持
START:if(A == 1'b0)
state <= STOP;
STOP:if(A == 1'b1)
state <= CLEAR;
CLEAR:if(A == 1'b0)
state <= IDIE;
default:state <= IDIE;
endcase
//第二段描述输出,有几个输出用几个always块描述
always @(posedge sclk or negedge rst_n)
if(rst_n == 1'b0)
k1 <= 1'b0;
else if(state == IDIE && A == 1'b1)
k1 <= 1'b0;
else if(state == CLEAR && A == 1'b0)
k1<=1'b1;
always @(posedge sclk or negedge rst_n)
if(rst_n == 1'b0)
k2 <= 1'b0;
else if(state == CLEAR && A == 1'b0)
k2 <= 1'b0;
else if(state == STOP && A == 1'b1)
k2 <= 1'b1;
endmodule
//米里状态机的Test Bench
`timescale 1ns/1ns
module tb_ex_fsm;
reg sclk;
reg rst_n;
wire k1;
wire k2;
reg in_A;
initial begin
sclk <= 0;
rst_n <= 0;
#100;
rst_n <= 1;
end
//task的调用
initial begin
#200;//过了延时;
in_data();
end
always #10 sclk=~sclk;
//模块例化
ex_fsm ex_fsm_inst(
.sclk (sclk) ,
.rst_n (rst_n) ,
.k1 (k1) ,
.k2 (k2) ,
.A (in_A)//将in_A中的数据与A关联;
);
//写一个输入变量A的任务,用于调用,也可以直接复制。
task in_data();
integer i;
begin
for(i=0;i<1024;i=i+1)
begin
@(posedge sclk)
if(i<50)
in_A <= 0;
else if (i<200)
in_A <= 1;
else if (i<700)
in_A <= 0;
else if (i<800)
in_A <= 1;
else if (i<900)
in_A <= 0;
end
end
endtask
endmodule