FPGA状态机学习笔记verilog.docx
- 文档编号:9623354
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:17
- 大小:547.54KB
FPGA状态机学习笔记verilog.docx
《FPGA状态机学习笔记verilog.docx》由会员分享,可在线阅读,更多相关《FPGA状态机学习笔记verilog.docx(17页珍藏版)》请在冰豆网上搜索。
FPGA状态机学习笔记verilog
FPGA之有限状态机学习笔记
有限状态机(FSM)是由寄存器组合组合逻辑构成的硬件时序电路。
FSM的状态只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态。
Mealy型FSM的下一个状态不仅取决于当前所在状态,还取决于各个输入值。
Moore型FSM的下一个状态只取决于当前状态。
VerilogHDL可以用很多方法描述FSM,最常用的是用always语句和case语句。
FSM常用模型有Gray和独热码两种,对于用FPGA实现的FSM建议采用独热码。
因为采用独热码可省下许多组合电路的使用,提高电路的速度和可靠性,且总的单元数并无显著增加。
用Verilog语言描述FSM,可以充分发挥硬件描述语言的抽象建模能力。
有限状态机设计的一般步骤:
(1)、逻辑抽象,得出状态转换图
(2)、状态化简
(3)、状态分配
(4)、选定触发器的类型并求出状态方程、驱动方程和输出方程
(5)、按照方程得出逻辑图
以下就是分别用独热码和Gray码实现上述状态的源程序:
采用独热码源程序:
modulefsm(
Clock,
Reset,
A,B,C,D,E,Multi,Contig,Single
);
inputClock;
inputReset;
inputA,B,C,D,E;
outputMulti,Contig,Single;
regMulti;
regContig;
regSingle;
parameter[6:
0]
S1=7'b0000001,
S2=7'b0000010,
S3=7'b0000100,
S4=7'b0001000,
S5=7'b0010000,
S6=7'b0100000,
S7=7'b1000000;
parameterU_DLY=1;
reg[6:
0]curr_st;
reg[6:
0]next_st;
always@(posedgeClockorposedgeReset)
begin
if(!
Reset)
curr_st=S1;
else
curr_st=#U_DLYnext_st;
end
always@(curr_storAorBorCorDorE)
begin
case(curr_st)
S1:
begin
Multi=1'b0;
Contig=1'b0;
Single=1'b0;
if(A&~B&C)
next_st=S2;
elseif(A&B&~C)
next_st=S4;
else
next_st=S1;
end
S2:
begin
Multi=1'b1;
Contig=1'b0;
Single=1'b0;
if(!
D)
next_st=S3;
else
next_st=S4;
end
S3:
begin
Multi=1'b0;
Contig=1'b1;
Single=1'b0;
if(A|D)
next_st=S4;
else
next_st=S3;
end
S4:
begin
Multi=1'b1;
Contig=1'b1;
Single=1'b0;
if(A&B&~C)
next_st=S5;
else
next_st=S4;
end
S5:
begin
Multi=1'b1;
Contig=1'b0;
Single=1'b0;
next_st=S6;
end
S6:
begin
Multi=1'b0;
Contig=1'b1;
Single=1'b1;
if(!
E)
next_st=S7;
else
next_st=S6;
end
S7:
begin
Multi=1'b0;
Contig=1'b1;
Single=1'b0;
if(E)
next_st=S1;
else
next_st=S7;
end
default:
next_st=S1;
endcase
end
endmodule
Modelsim仿真激励文件程序如下:
`timescale1ns/1ps
modulefsm_vlg_tst();
//constants
//generalpurposeregisters
regeachvec;
//testvectorinputregisters
regA;
regB;
regC;
regClock;
regD;
regE;
regReset;
//wires
wireContig;
wireMulti;
wireSingle;
//assignstatements(ifany)
fsmi1(
//portmap-connectionbetweenmasterportsandsignals/registers
.A(A),
.B(B),
.C(C),
.Clock(Clock),
.Contig(Contig),
.D(D),
.E(E),
.Multi(Multi),
.Reset(Reset),
.Single(Single)
);
initial
begin
Clock=0;
forever#10
Clock=~Clock;
end
initial
begin
Reset=0;
#100
Reset=1;
end
initial
begin
//{A,B,C,D,E}=5'b10101;
//#10
//{A,B,C,D,E}=5'b11000;
{A,B,C,D,E}=5'b10111;
//A=1;
//B=0;
//C=1;
#100
//{A,B,C,D,E}=5'b10101;
D=0;
#50
//{A,B,C,D,E}=5'b10111;
A=1;
D=1;
#50
//{A,B,C,D,E}=5'b11011;
A=1;
B=1;
C=0;
#100
//{A,B,C,D,E}=5'b11010;
E=0;
#50
//{A,B,C,D,E}=5'b11011;
E=1;
end
endmodule
注:
initial块中语句是顺序执行的,因此在需要延时的时候,按相对时间延时。
运行仿真图如下:
Gray码源程序如下:
modulefsm(
Clock,
Reset,
A,B,C,D,E,Multi,Contig,Single
);
inputClock;
inputReset;
inputA,B,C,D,E;
outputMulti,Contig,Single;
regMulti;
regContig;
regSingle;
parameter[2:
0]
S1=7'b001,
S2=7'b010,
S3=7'b011,
S4=7'b100,
S5=7'b101,
S6=7'b110,
S7=7'b111;
parameterU_DLY=1;
reg[2:
0]curr_st;
reg[2:
0]next_st;
always@(posedgeClockorposedgeReset)
begin
if(!
Reset)
curr_st=S1;
else
curr_st=#U_DLYnext_st;
end
always@(curr_storAorBorCorDorE)
begin
case(curr_st)
S1:
begin
Multi=1'b0;
Contig=1'b0;
Single=1'b0;
if(A&~B&C)
next_st=S2;
elseif(A&B&~C)
next_st=S4;
else
next_st=S1;
end
S2:
begin
Multi=1'b1;
Contig=1'b0;
Single=1'b0;
if(!
D)
next_st=S3;
else
next_st=S4;
end
S3:
begin
Multi=1'b0;
Contig=1'b1;
Single=1'b0;
if(A|D)
next_st=S4;
else
next_st=S3;
end
S4:
begin
Multi=1'b1;
Contig=1'b1;
Single=1'b0;
if(A&B&~C)
next_st=S5;
else
next_st=S4;
end
S5:
begin
Multi=1'b1;
Contig=1'b0;
Single=1'b0;
next_st=S6;
end
S6:
begin
Multi=1'b0;
Contig=1'b1;
Single=1'b1;
if(!
E)
next_st=S7;
else
next_st=S6;
end
S7:
begin
Multi=1'b0;
Contig=1'b1;
Single=1'b0;
if(E)
next_st=S1;
else
next_st=S7;
end
default:
next_st=S1;
endcase
end
endmodule
注:
激励文件仿真图均如上述独热码所述。
设计可综合状态机的指导原则
(1)、独热码
因为大多说FPGA内部的触发器数目相当多,又加上独热码状态机的译码逻辑比较简单,所以在设计采用FPGA实现的状态机时,往往采用独热码状态机。
(2)case语句
采用case语句设计状态机时,不要忘记写上case语句的最后一个分支default,并将状态变量设为’bx。
这就等于告知综合器,case语句已经指定了所有的状态。
这样综合器就可以删除不需要的译码电路,使生成的电路简洁,并与设计要求一致。
如果还有多余的状态,应将缺省状态设置为某一确定的有效状态,因为这样做能使状态机若偶然进入多余状态仍能在下一时钟跳变沿时返回正常工作状态,否则会引起死锁。
(3)复位
状态机应该有一个异步或者同步复位端,以便在通电时将硬件电路复位到有效状态,也可以在操作中将硬件电路复位(大多说FPGA结构都允许使用异步复位端)。
(4)惟一触发
目前大多说综合器往往不支持在一个always块中由多个事件触发的状态机(即隐含状态)。
因此为了能综合出有效电路,由VerilogHDL描述的状态机应明确地由惟一时钟触发。
(5)异步状态机
异步状态机是没有确定时钟的状态机,它的状态转移不是由惟一的时钟跳变沿触发。
目前大多数综合器不能综合采用VerilogHDL描述的异步状态机。
如果一定要设计异步状态机,建议采用电路图输入方法。
(6)状态赋值
VerilogHDL中,状态必须明确赋值,通常使用参数parameter或宏定义define语句加上赋值语句来实现。
使用参数parameter语句赋状态值如下:
parameterstate1=2’b01,state2=2’b10,state3=2’b00;
使用宏定义define语句赋状态值如下:
‘definestate12’b01(后面不需要分号)
‘definestate22’b10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 状态机 学习 笔记 verilog