版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
详细介绍FPGA状态机的设计和应用FPGA的特点是并行执行,但如果需要处理一些具有前后顺序的事件,就需要使用状态机。状态机是一种用于处理具有前后顺序的事件的计算机模型,包含现态、条件、动作和次态四个要素,它可以将一个复杂的控制流程分解成多个互相独立的状态,从而简化设计过程并提高了系统的可靠性和性能。本文将对FPGA状态机进行详细介绍,帮助大家了解状态机的设计和应用。一、FPGA状态机基础1、基础概念FPGA状态机是一种能够描述对象在运行周期内的所有状态,以及从一个状态到另一个状态转换的过程的抽象模型。状态机可归纳为4个要素,即现态、条件、动作、次态。①现态:当前所处的状态。②条件:当一个条件被满足,将会触发一个动作,或者执行一次运行状态的变化。③动作:条件满足后执行的动作。动作不是必需的,也可以直接迁移到新状态而不进行任何动作。④次态:条件满足后要跳转到的新状态。其中,“次态”是相对于“现态”而言的,一旦被跳转后,“次态”就转变成新的“现态”了。2、状态机分类通常情况下,FPGA状态机一般有两种类型:Moore型状态机:下一状态只由当前状态决定。Mealy型状态机:下一状态不但与当前状态有关,还与当前输入值有关。由于Mealy型状态机的输出与输入有关,输出信号很容易出现毛刺,所以一般采用Moore型状态机。(1)Mealy状态机输出逻辑不但取决于当前“状态”还取决于“输入”,如图所示。(2)Moore状态机输出逻辑仅仅取决于当前状态,且与当前时刻的输入无关,如图所示。二、FPGA状态机实现方式FPGA状态机的描述方式主要分为3种,分别是一段式、两段式、三段式。1、一段式状态机一段式状态机使用1个always块,把状态跳转和寄存器输出逻辑都写在一起,其输出是寄存器输出,无毛刺,但是这种方式代码较混乱,逻辑不清晰,难于修改和调试,应该尽量避免使用。下面给出一个一段式的Mealy状态机示例:moduleone_state_machine(
inputclk,
inputrst_n,
input[1:0]inp,
outputregoutp
);
//定义状态
localparamSTATE_0=0,
STATE_1=1,
STATE_2=2,
STATE_3=3;
//定义状态寄存器和初始状态
reg[1:0]state_r;
//初始化状态寄存器
always@(posedgeclkornegedgerst_n)begin
if(~rst_n)begin
state_r<=STATE_0;
endelsebegin
case(state_reg)
STATE_0:begin
if(inp==2'b00)begin
state_r<=STATE_0;
outp<=0;
endelseif(inp==2'b01)begin
state_r<=STATE_1;
outp<=1;
endelseif(inp==2'b10)begin
state_r<=STATE_2;
outp<=0;
endelsebegin
state_r<=STATE_3;
outp<=1;
end
end
STATE_1:begin
if(inp==2'b00)begin
state_r<=STATE_1;
outp<=1;
endelseif(inp==2'b01)begin
state_r<=STATE_2;
outp<=0;
endelseif(inp==2'b10)begin
state_r<=STATE_3;
outp<=1;
endelsebegin
state_r<=STATE_0;
outp<=0;
end
end
STATE_2:begin
if(inp==2'b00)begin
state_r<=STATE_2;
outp<=0;
endelseif(inp==2'b01)begin
state_r<=STATE_3;
outp<=1;
endelseif(inp==2'b10)begin
state_r<=STATE_0;
outp<=0;
endelsebegin
state_r<=STATE_1;
outp<=1;
end
end
STATE_3:begin
if(inp==2'b00)begin
state_r<=STATE_3;
outp<=1;
endelseif(inp==2'b01)begin
state_r<=STATE_0;
outp<=0;
endelseif(inp==2'b10)begin
state_r<=STATE_1;
outp<=1;
endelsebegin
state_reg<=STATE_2;
outp<=0;
end
end
endcase
end
end
endmodule2、二段式状态机二段式状态机使用2个always块,都是时序逻辑,其中一个always块用于写状态机的状态跳转逻辑,另一个always块用于写当前状态下的寄存器输出逻辑。这种方式逻辑代码清晰,易于调试和理解,是比较推荐的一个方式。下面给出一个二段式的Moore状态机示例:modulestate_machine(
inputclk,
inputrst_n,
outputregout_reg
);
//状态寄存器和下一个状态寄存器
reg[1:0]state_r;
//状态定义
parameterIDLE=2'b00;
parameterSTATE1=2'b01;
parameterSTATE2=2'b10;
parameterSTATE3=2'b11;
//always@(posedgeclkornegedgerst_n)时序逻辑代码块,实现状态跳转逻辑
always@(posedgeclkornegedgerst_n)begin
if(~rst_n)begin
state_r<=IDLE;
endelsebegin
case(state_r)
IDLE:begin
state_r<=STATE1;
end
STATE1:begin
state_r<=STATE2;
end
STATE2:begin
state_r<=STATE3;
end
STATE3:begin
state_r<=IDLE;
end
endcase
end
end
//always@(*)时序逻辑代码块,实现状态输出逻辑
always@(posedgeclkornegedgerst_n)begin
if(~rst_n)begin
out_reg<=1'b0;
endelsebegin
case(state_r)
IDLE:begin
out_reg<=1'b0;
end
STATE1:begin
out_reg<=1'b1;
end
STATE2:begin
out_reg<=1'b1;
end
STATE3:begin
out_reg<=1'b0;
end
endcase
end
end
endmodule3、三段式状态机三段式状态机使用3个always块,其中一个组合always块用于写状态机的状态跳转逻辑,一个时序always块用于缓存状态寄存器,另一个always块用于写当前状态下的寄存器输出逻辑。这种方式逻辑代码清晰,易于调试和理解,也是比较推荐的一个方式。modulestate_machine(
inputclk,
inputrst_n,
input[1:0]inp,
outputregoutp
);
//定义状态
localparamSTATE_0=0,
STATE_1=1,
STATE_2=2,
STATE_3=3;
//定义状态寄存器和初始状态
reg[1:0]state_r,next_state;
//定义状态寄存器
always@(posedgeclkornegedgerst_n)begin
if(~rst_n)begin
state_r<=STATE_0;
endelsebegin
state_r<=next_state;
end
end
//定义状态转移逻辑
always@(*)begin
case(state_r)
STATE_0:begin
if(inp==2'b00)begin
next_state=STATE_0;
endelseif(inp==2'b01)begin
next_state=STATE_1;
endelseif(inp==2'b10)begin
next_state=STATE_2;
endelsebegin
next_state=STATE_3;
end
end
STATE_1:begin
if(inp==2'b00)begin
next_state=STATE_1;
endelseif(inp==2'b01)begin
next_state=STATE_2;
endelseif(inp==2'b10)begin
next_state=STATE_3;
endelsebegin
next_state=STATE_0;
end
end
STATE_2:begin
if(inp==2'b00)begin
next_state=STATE_2;
endelseif(inp==2'b01)begin
next_state=STATE_3;
endelseif(inp==2'b10)begin
next_state=STATE_0;
endelsebegin
next_state=STATE_1;
end
end
STATE_3:begin
if(inp==2'b00)begin
next_state=STATE_3;
endelseif(inp==2'b01)begin
next_state=STATE_0;
endelseif(inp==2'b10)begin
next_state=STATE_1;
endelsebegin
next_state=STATE_2;
end
end
endcase
end
//定义输出逻辑
always@(*)begin
case(state_r)
STATE_0:outp=0;
STATE_1:outp=1;
STATE_2:outp=0;
STATE_3:outp=1;
endcase
end
endmodule注意:组合逻辑代码中,if语句和case语句必须写满,否则容易形成latch,导致实际运行出问题。三、状态机的编码方式1、独热码独热码(One-hot)是一种状态编码方式,其特点是对于任意给定的状态,状态寄存器中只有1位为1,其余位都为0。使用独热码可以简化译码逻辑电路,因为状态机只需对寄存器中的一位进行译码,同时可用省下的面积抵消额外触发器占用的面积。相比于其他类型的有限状态机,加入更多的状态时,独热码的译码逻辑并不会变得更加复杂,速度仅取决于到某特定状态的转移数量。此外,独热码还具有诸如设计简单、修改灵活、易于综合和调试等优点。但值得注意的是,相对于二进制码,独热码速度更快但占用面积较大。modulestate_machine(
inputclk,
outputreg[3:0]state_out
);
localparamSTATE_A=4'b0001;
localparamSTATE_B=4'b0010;
localparamSTATE_C=4'b0100;
localparamSTATE_D=4'b1000;
reg[3:0]current_state,next_state;
always@(posedgeclk)begin
current_state<=next_state;//当时钟上升沿到来时更新状态
end
always@(*)begin
case(current_state)
STATE_A:next_state=STATE_B;
STATE_B:next_state=STATE_C;
STATE_C:next_state=STATE_D;
STATE_D:next_state=STATE_A;
default:next_state=STATE_A;//默认情况下返回初始状态
endcase
end
assignstate_out=current_state;//将当前状态作为输出
endmodule2、格雷码格雷码是一种相邻的两个码组之间仅有一位不同的编码方式。在格雷码中,相邻的两个码组之间仅有一位不同,这种编码方式可以用于实现相邻的两个状态之间只有一位不同的状态机;FPGA中的状态机通常需要高速运行,因此使用格雷码可以减少状态转换的开销,并提高时序性能。modulegray_code_state_machine(
inputclk,
outputreg[3:0]state_out
);
localparamG0=4'b0000;
localparamG1=4'b0001;
localparamG2=4'b0011;
localparamG3=4'b0010;
reg[3:0]current_state,next_state;
always@(posedgeclk)begin
current_state<=next_state;//当时钟上升沿到来时更新状态
end
always@(*)begin
case(current_state)
G0:next_state=G1;
G1:next_state=G3;
G2:next_state=G0;
G3:next_state=G2;
default:next_state=G0;//默认情况下返回初始状态
endcase
end
assignstate_out=current_state;//将当前状态作为输出
endmodule3、普通二进制码FPGA状态机可以用普通二进制码表示,不同状态按照二进制数累加表示,是常用的一种方式,仿真调试时,状态显示清晰,易于理解代码。modulebinary_state_machine(
inputclk,
outputreg[1:0]state_out
);
localparamSTATE_A=2'b00;
localparamSTATE_B=2'b01;
localparamSTATE_C=2'b10;
reg[1:0]current_state,next_state;
always@(posedgeclk)begin
current_state<=next_state;//当时钟上升沿到来时更新状态
end
always@(*)begin
case(current_state)
STATE_A:next_state=STATE_B;
STATE_B:next_state=STATE_C;
STATE_C:next_state=STATE_A;
default:next_state=STATE_A;//默认情况下返回初始状态
endcase
end
assignstate_out=current_state;//将当前状态作为输出
endmodule4、格雷
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 同意签订合同的纪要
- 《夏商周秦汉大事》课件
- 2025年海南货运从业资格证恢复考试题
- 2025年滨州货运资格证考试真题
- 2025年山东货运上岗证模拟考试0题
- 2025年江西货运从业资证孝试模似题库
- 2025年达州道路运输从业资格证考试模拟试题
- 治安院务公开管理办法
- 智能家居大白施工合同
- 航空航天木地板施工合同
- 出车前的安全检查
- 山东省烟台市2023-2024学年高一上学期期末考试 化学 含解析
- 2024落实意识形态责任清单及风险点台账
- 2024年度护士长工作总结
- 《篮球:原地持球交叉步突破》教案(三篇)
- 稀土新材料在新能源技术领域的应用
- 2024年无人驾驶航空植保技能大赛理论考试题库(含答案)
- 2024山东高速集团社会招聘189人高频难、易错点500题模拟试题附带答案详解
- 2024年人教部编本七年级上册教学比赛说课材料16《诫子书》说课稿
- PLC入门课程课件
- 2025年研究生考试考研法律硕士综合(非法学498)试卷及解答参考
评论
0/150
提交评论