FPGA状态机学习笔记verilog.docx

上传人:b****8 文档编号:9623354 上传时间:2023-02-05 格式:DOCX 页数:17 大小:547.54KB
下载 相关 举报
FPGA状态机学习笔记verilog.docx_第1页
第1页 / 共17页
FPGA状态机学习笔记verilog.docx_第2页
第2页 / 共17页
FPGA状态机学习笔记verilog.docx_第3页
第3页 / 共17页
FPGA状态机学习笔记verilog.docx_第4页
第4页 / 共17页
FPGA状态机学习笔记verilog.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

FPGA状态机学习笔记verilog.docx

《FPGA状态机学习笔记verilog.docx》由会员分享,可在线阅读,更多相关《FPGA状态机学习笔记verilog.docx(17页珍藏版)》请在冰豆网上搜索。

FPGA状态机学习笔记verilog.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 纺织轻工业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1