您的位置 首页 厂商

Verilog HDL规划进阶:有限状态机的规划原理及其代码风格

由于Verilog HDL和 VHDL 行为描述用于综合的历史还只有短短的几年,可综合风格的Verilog HDL 和VHDL的语法只是它们各自语言的一个子集。又由于HDL的可综合性研究近年来非常活

由于Verilog HDL和 VHDL 行为描绘用于归纳的前史还只需短短的几年,可归纳风格的Verilog HDL 和VHDL的语法仅仅它们各自言语的一个子集。又由于HDL的可归纳性研讨近年来十分活泼,可归纳子集的国际标准现在没有最终构成,因而各厂商的归纳器所支撑的HDL子集也略有所不同。

本书中有关可归纳风格的Verilog HDL的内容,咱们只侧重介绍RTL级、算法级和门级逻辑结构的描绘,而体系级(数据流级)的归纳由于还不太老练,暂不作介绍。

由于寄存器传输级(RTL)描绘是以时序逻辑笼统所得到的有限状况机为依据的,所以把一个时序逻辑笼统成一个同步有限状况机是规划可归纳风格的Verilog HDL模块的要害。

在本章中咱们将经过各种实例由浅入深地来介绍各种可归纳风格的Verilog HDL模块,并把关键放在时序逻辑的可归纳有限状况机的Verilog HDL规划关键。至于组合逻辑,由于比较简略,只需阅览典型的用Verilog HDL描绘的可归纳的组合逻辑的比如就能够把握。

为了更好地把握可归纳风格,还需求较深化地了解堵塞和非堵塞赋值的不同和在不同的情况下正确运用这两种赋值的办法。只需深化地了解堵塞和非堵塞赋值句子的纤细不同,才有或许写出不只能够仿真也能够归纳的Verilog HDL模块。

只需依照必定的准则来编写代码就能够确保Verilog模块归纳前和归纳后仿真的共同性。契合这样条件的可归纳模块是咱们规划的方针,由于这种代码是可移植的,可归纳到不同的FPGA和不同工艺的ASIC中,是具有知识产权价值的软核。

4.4.1 有限状况机(FSM)规划原理

有限状况机是由寄存器组和组合逻辑构成的硬件时序电路。有限状况机的状况(即由寄存器组的1和0的组合状况所构成的有限个状况)只或许在同一时钟跳变沿的情况下才干从一个状况转向另一个状况。

有限状况机的下一个状况不光取决于各个输入值,还取决于当时地点状况。这儿指的是米里Mealy型有限状况机,而莫尔Moore型有限状况机的下一个状况只决于当时状况。

Verilog HDL中能够用许多种办法来描绘有限状况机,最常用的办法是用always句子和case句子。如图4.1所示的状况搬运图表明晰一个有限状况机,例4.1的程序便是该有限状况机的多种Verilog HDL模型之一。

图4.1的状况搬运图表明晰一个四状况的有限状况机。它的同步时钟是Clock,输入信号是A和Reset,输出信号是F和G。

状况的搬运只能在同步时钟(Clock)的上升沿时发生,往哪个状况的搬运则取决于现在地点的状况和输入的信号(Reset和A)。下面的比如是该有限状况机的Verilog HDL模型之一。

例4.1:Gray码有限状况机模型1。

module fsm (Clock, Reset, A, F, G); //模块声明
input Clock, Reset, A;
output F,G;
reg F,G;
reg [1:0] state ;

parameter //状况声明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;

always @(posedge Clock)
if (!Reset) begin
state = Idle; F=0; G=0; //默许状况
end
else case (state)
idle: begin //Idle状况
if (A) begin
state = Start;
G=0;
end
elsestate = idle;
end
start: //Start状况
if (!A) state = Stop;
else state = start;
Stop: begin //Stop状况
if (A) begin
state = Clear;
F = 1;
end
else state = Stop;
end
Clear: begin //Clear状况
if (!A) begin
state =Idle;
F =0; G =1;
end
else state = Clear;
end
endcase
endmodule

也能够用下面的Verilog HDL模型来表明同一个有限状况。

例4.2:独热码有限状况和模型。

module fsm (Clock, Reset, A, F, G); //模块声明
input Clock, Reset, A;
output F,G;
reg F,G;
reg [3:0] state ;

parameter //状况声明
Idle = 4’b1000,
Start = 4’b0100,
Stop = 4’b0010,
Clear = 4’b0001;

always @(posedge clock)
if (!Reset) begin
state = Idle; F=0; G=0; //默许状况
end
else case (state)
Idle: begin //Idel状况
if (A) begin
state = Start;
G=0;
end
else state = Idle;
end
Start: //Start状况
if (!A) state = Stop;
else state = Start;
Stop: begin //Stop状况
if (A) begin
state = Clear;
F = 1;
end
else state = Stop;
end
Clear: begin //Clear状况
if (!A) begin
state =Idle;
F=0; G=1;
end
else state = Clear;
end
default: state =Idle; //默许状况
endcase
endmodule

例4.2与例4.1的首要不同点是状况编码办法。例4.2选用了独热编码,而例4.1则选用Gray码,终究选用哪一种编码好要看详细情况而定。


关于用FPGA完结的有限状况机主张选用独热码。由于虽然选用独热编码多用了两个触发器,但所用组合电路可省下许多,因而使电路的速度和可靠性有明显进步,而总的单元数并无明显添加。

选用了独热码后有了剩余的状况,就有一些不行抵达的状况,为此在CASE句子的最终需求添加default分支项,以确保剩余状况能回到Idle状况。

别的还能够用另一种风格的Verilog HDL模型来表明同一个有限状况。在这个模型中,咱们用always句子和接连赋值句子把状况机的触发器部分和组合逻辑部分分红两部分来描绘,如下所示。

例4.3:有限状况机模型3

module fsm (Clock, Reset, A, F, G); //模块声明
input Clock, Reset, A;
output F,G;
reg [1:0] state ;
wire [1:0] Nextstate;

parameter //状况声明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;

always @(posedge Clock)
if (!Reset) begin
state = Idle; //复位状况
end
else
state = Nextstate; //状况转化

assign Nextstate = //状况改换条件
(state == Idle ) ? (A ? Start : Idle):
(state==Start ) ? (!A ? Stop : Start ):
(state== Stop ) ? (A ? Clear : Stop ):
(state== Clear) ? (!A ? Idle : Clear) : Idle;

assign F = (( state == Stop) A ); //状况输出
assign G = (( state == Clear) (!A || !Reset)) //状况输出
endmodule

下面是第4种风格的Verilog HDL模型来表明同一个有限状况。在这个模型中,咱们分别用沿触发的always句子和电平灵敏的always句子把状况机的触发器部分和组合逻辑部分分红两部分来描绘。

例4.4:有限状况机模型4。

module fsm (Clock, Reset, A, F, G); //模块声明
input Clock, Reset, A;
output F,G;
reg [1:0] state, Nextstate;

parameter //状况声明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;

always @(posedge Clock)
if (!Reset) begin
state = Idle; //默许状况
end
else
state = Nextstate; //状况转化

always @( state or A ) begin
F=0;
G=0;
if (state == Idle) begin //处于Idel状况时,对A判别
if (A)
Nextstate = Start; //Start状况
else
Nextstate = Idle; //坚持Idel状况
G=1;
end
else if (state == Start) //处于Start状况时,对!A判别
if (!A)
Nextstate = Stop; //Stop状况
else
Nextstate = Start; //坚持Start状况
else if (state == Stop) //处于Stop状况时,对A判别
if (A)
Nextstate = Clear; //Clear状况
else
Nextstate = Stop; //坚持Stop状况
else if (state == Clear) begin //处于Clear状况时,对!A判别
if (!A)
Nextstate = Idle; //Idel状况
else
Nextstate = Clear; //坚持Clear状况
F=1;
end
else
Nextstate= Idle; //默许状况
End
endmodule

上面4个比如是同一个状况机的4种不同的Verilog HDL模型,它们都是可归纳的,在规划杂乱程度不同的状况机时有它们各自的优势。如用不同的归纳器对这4个比如进行归纳,归纳出的逻辑电路或许会有些不同,但逻辑功用是相同的。

下面解说有限状况机规划的一般过程。

(1)逻辑笼统,得出状况转化图。
便是把给出的一个实践逻辑关系表明为时序逻辑函数,能够用状况转化表来描绘,也能够用状况转化图来描绘,这就需求完结以下任务。

① 剖析给定的逻辑问题,确认输入变量、输出变量以及电路的状况数。一般是取原因(或条件)作为输入变量,取成果作为输出变量。
② 界说输入、输出逻辑状况的含义,并将电路状况次序编号。
③ 依照要求列出电路的状况转化表或画出状况转化图。
这样,就把给定的逻辑问题笼统到一个时序逻辑函数了。

(2)状况化简。
假如在状况转化图中呈现这样两个状况,它们在相同的输入下转化到同一状况去,并得到相同的输出,则称它们为等价状况。明显等价状况是重复的,能够兼并为一个。电路的状况数越少,存储电路也就越简略。状况化简的意图就在于将等价状况尽或许地兼并,以得到最简的状况转化图。

(3)状况分配。
状况分配又称状况编码。一般有许多编码办法,编码方案挑选妥当,规划的电路能够很简略。反之,若编码方案选得欠好,则规划的电路就会杂乱许多。

实践规划时,需归纳考虑电路杂乱度与电路功能之间的折衷。在触发器资源丰富的FPGA或AS%&&&&&%规划中,选用独热编码(one-hot-coding)既能够使电路功能得到确保,又可充分利用其触发器数量多的优势。

(4)选定触发器的类型并求出状况方程、驱动方程和输出方程。

(5)依照方程得出逻辑图。

用Verilog HDL来描绘有限状况机,能够充分发挥硬件描绘言语的笼统建模才能,运用always块句子和case(if)等条件句子及赋值句子即可便利完结。详细的逻辑化简及逻辑电路到触发器映射均可由计算机主动完结。上述规划过程中的第(2)、(4)、(5)步不再需求许多的人为干涉,使电路规划作业得到简化,功率也有很大的进步。


4.4.2 FSM规划实例

例4.5:宇宙飞船控制器的状况机。

module statmch1( launch_shuttle, land_shuttle, start_countdown,
start_trip_meter, clk, all_systems_go,
just_launched, is_landed, cnt, abort_mission
);
// I/O阐明
output launch_shuttle, land_shuttle, start_countdown,start_trip_meter;
input clk, just_launched, is_landed, abort_mission,all_systems_go;
input [3:0] cnt;
reg launch_shuttle, land_shuttle, start_countdown,start_trip_meter;
reg [4:0] present_state, next_state;
//设置独热码状况的参数
parameter HOLD=5’h1, SEQUENCE=5’h2, LAUNCH=5’h4;
parameter ON_MISSION=5’h8, LAND=5’h10;

always @(negedge clk or posedge abort_mission) begin
//把输出设置成某个缺省值,鄙人面的case句子中就不用再设置输出的缺省值
{launch_shuttle, land_shuttle, start_trip_meter, start_countdown} = 4’b0;
//查看异步reset的值,即abort_mission的值
if(abort_mission)
next_state = LAND;
else begin
//假如abort_mission为零,把next_state赋值为present_state
next_state = present_state;
//依据 present_state 和输入信号,设置 next_state和输出output
case ( present_state )
HOLD: //HOLD状况
if(all_systems_go) begin
next_state = SEQUENCE;
start_countdown = 1;
end
SEQUENCE: //SEQUENCE状况
if(cnt==0)
next_state = LAUNCH;
LAUNCH: begin //LAUNCH状况
next_state = ON_MISSION;
launch_shuttle = 1;
end
ON_MISSION: //ON_MISSION状况
if(just_launched)
start_trip_meter = 1; //撤销任务前,一向留在任务状况
LAND: //LAND状况
if(is_landed)
next_state = HOLD;
else land_shuttle = 1;
default: next_state = ‘bx;//把缺省状况设置为’bx(无关)或某种已
//知状况,使其在做仿真时,在复位前就
//与实践情况相共同
endcase
end // if-else句子完毕
present_state = next_state; //把当时状况变量设置为下一状况,
//待下一有用时钟沿来届时,当时状
//态变量已设置了正确的状况值
end //always块完毕
endmodule

4.4.3 规划可归纳状况机的辅导准则
(1)独热码。
由于大多数FPGA内部的触发器数目相当多,又加上独热码状况机(one hot state machine)的译码逻辑最为简略,所以在规划选用FPGA完结的状况机时,往往选用独热码状况机(即每个状况只需一个寄存器置位的状况机)。

(2)case句子。
主张选用case、casex或casez句子来树立状况机的模型。由于这些句子表达清晰明晰,能够便利地从当时状况分支转向下一个状况并设置输出。

选用这些句子规划状况机时,不要忘掉写上case句子的最终一个分支default,并将状况变量设为’bx。这就等于奉告归纳器:case句子现已指定了一切的状况。这样归纳器就能够删去不需求的译码电路,使生成的电路简练,并与规划要求共同。

假如将缺省状况设置为某一确认的状况(例如:设置default:state = state1),行不行呢?”这样做有一个问题需求留意:由于虽然归纳器发生的逻辑和设置“default:state=’bx”时相同,可是状况机的Verilog HDL模型归纳前和归纳后的仿真成果会不共同。

为什么会是这样呢?由于发动仿真器时,状况机一切的输入都不确认,因而当即进入default状况。假如经过设置将状况变量设为state1,可是实践硬件电路的状况机在通电之后,进入的状况是不确认的,很或许不是state1的状况,这样就会发生不用要的抵触。

因而,仍是设置“default:state=’bx”与实践硬件电路相共同。但在有剩余状况的情况下仍是应将缺省状况设置为某一确认的有用状况,由于这样做能使状况机若偶尔进入剩余状况后仍能鄙人一时钟跳变沿时回来正常作业状况,不然会引起死锁。

(3)复位。
状况机应该有一个异步或同步复位端,以便在通电时将硬件电路复位到有用状况,也能够在操作中将硬件电路复位(大多数FPGA结构都答应运用异步复位端)。

(4)专一触发。
现在大多数归纳器往往不支撑在一个always块中由多个事情触发的状况机(即隐含状况机,implicit state machines)。因而为了能归纳出有用的电路,用Verilog HDL描绘的状况机应清晰地由专一时钟触发。

(5)异步状况机。
异步状况机是没有确认时钟的状况机,它的状况搬运不是由专一的时钟跳变沿所触发。现在大多数归纳器不能归纳选用Verilog HDL描绘的异步状况机。

因而应尽量不要运用归纳东西来规划异步状况机。由于现在大多数归纳东西在对异步状况机进行逻辑优化时会胡乱地简化逻辑,使归纳后的异步状况机不能正常作业。假如必定要规划异步状况机,主张选用电路图输入的办法,而不要用Verilog HDL输入的办法。

(6)状况赋值。
Verilog HDL中,状况有必要清晰赋值,一般运用参数parameters或宏界说define句子加上赋值句子来完结。

运用参数parameters句子赋状况值如下所示:

parameter state1 = 2 ‘h1, state2 = 2 ‘h2;

current_state = state2; //把current state设置成 2’h2

运用宏界说define句子赋状况值如下所示:

‘define state1 2 ‘h1
‘define state2 2 ‘h2

current_state = ‘state2; //把current state设置成 2 ‘h2

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/287315.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部