1.状态机
有限状态机是由寄存器和组合逻辑构成的硬件时序电路。其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态。转向哪个状态不但取决于输入值,还取决于当前状态。其可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑,是数字逻辑的核心控制。
- Mealy状态机
下一个状态 = F(当前状态,输入信号)
输出信号 = G(当前状态,输入信号) - Moor状态机
下一个状态 = F(当前状态,输入信号)
输出信号 = G(当前状态)
写状态机前,先弄清楚状态转移图!!!

2.两段式描述状态机
- 一段描述状态转移
- 一段描述变量输出

视频教程:【FPGA高级讲师-尤恺元-从入门到实战】
module ex_fsm(
input wire sclk,
input wire rst,
output reg k1,
output reg k2,
input wire A
);
parameter IDLE = 4'b0001; //写出状态的表达式
parameter START = 4'b0010;
parameter STOP = 4'b0100;
parameter CLEAR = 4'b1000;
reg [3:0] state; //4'b0001,4'b0010,4'b0100,4'b1000
//四个状态:4'b0001,4'b0010,4'b0100,4'b1000。独热码占用寄存器数量多,但是组合逻辑资源消耗少,高速。
//用独热码时,每个状态用1比特表示。if(state == 4'b0001) ---> if(state[0] == 1'b1)
//四个状态:2'b00,2'b01,2'b10,2'b11。二进制编码用的寄存器数量少,但是用的组合逻辑资源较多
//第一段描述状态机
always @ (posedge sclk or negedge rst)
if(rst == 1'b0)
state <= IDLE;
else
case(state)
IDLE: if(A == 1'b1) //输入A=1进行状态的跳转
state <= START;
START: if(A == 1'b0)
state <= STOP;
STOP: if(A == 1'b1)
state <= CLEAR;
CLEAR: if(A == 1'b0)
state <= IDLE;
default: state <= IDLE;
endcase
//第二段用状态机控制变量输出---k1
always @ (posedge sclk or negedge rst)
if(rst == 1'b0)
k1 <= 1'b0;
else if(state == IDLE && A== 1'b1)
k1 <= 1'b0;
else if(state == CLEAR && A == 1'b0)
k1 <= 1'b1;
//k2
always @ (posedge sclk or negedge rst)
if(rst == 1'b0)
k2 <= 1'b0;
else if(state == STOP && A == 1'b1)
k2 <= 1'b1;
else if(state == CLEAR && A == 1'b0)
k2 <= 1'b0;
endmodule
3.仿真文件
`timescale 1ns/1ns
module tb_ex_fsm;
reg sclk,rst;
reg A;
wire k1,k2;
initial begin
sclk <= 0;
rst <= 0;
#100;
rst <= 1;
end
initial begin
#200;
in_data();
end
always #10 sclk <= ~sclk;
ex_fsm tb_ex_fsm(
.sclk(sclk),
.rst(rst),
.k1(k1),
.k2(k2),
.A(A)
);
task in_data(); //产生数据A
integer i;
begin
for (i=0;i<1024;i=i+1)
begin
@(posedge sclk);
if(i<50)
A <= 0;
else if (i < 200)
A <= 1;
else if (i < 700)
A <= 0;
else if (i < 800)
A <= 1;
else if (i < 900)
A <= 0;
end
end
endtask
endmodule
后仿真:带有器件延时文件的仿真。
.sdo文件是延时文件
.vo是网表文件
库文件:quartus—>eda—>sim_ilb
689

被折叠的 条评论
为什么被折叠?



