您的位置 首页 厂商

关于运用FPGA三段式状态机的三点优点,你有什么观点?

关于使用FPGA三段式状态机的三点好处,你有什么看法?- 用三段式描述状态机的好处,国内外各位大牛都已经说的很多了,大致可归为以下三点:

用三段式描绘状况机的优点,国内外各位大牛都现已说的许多了,大致可归为以下三点:

1.将组合逻辑和时序逻辑分隔,利于归纳器剖析优化和程序保护;

2.更契合规划的思想习气;

3.代码少,比一段式状况机更简练。

关于榜首点,我十分认可,后两点在Clifford E. Cummings著的(Synthesizable Finite State Machine Design Techniques Using theNew SystemVerilog 3.0 Enhancements和The Fundamentals ofEfficient Synthesizable Finite State Machine Design using NC-Verilog andBuildGates)中屡次说到,我并不彻底附和,下面谈谈我的一些观点。

先谈谈第二点关于思想习气。我发现有些人会有这样一种习气,先用一段式状况机完结功用,仿真ok后,再将其转成三段式,他们对这种开发方法的解说是一段式更直观,能够更快捷的构建功用结构,可是咱们都说三段式功用会更好,所以最终又在搭好的逻辑结构下,将一段式转化为了三段式。这从一个旁边面说明晰,对一部人来说一段式更契合他们的思想习气,但当现已习气了一段式的思想方法后,再要换用三段式时,可就不这么简单了,一段式和三段式的写法之间存在着思想圈套,特权同学也从前不小心在此失足过。

举一个比方,初始状况是wr_st,q和p输出都为0,当计数器count计数到指定的数值10后,输出完毕信号end,状况机接收到end有用后跳转为 rd_st,一起输出q变为1,在rd_st状况,如jump有用则跳转到erase_st,如end有用p输出0不然输出1,用一段式完结起来很简单,如下所示。

assign end = (count == 10);

always @(posedge clk)

begin

case(state)

wr_st: if(end) begin

q 《= 1;

state《= rd_st;

end

else begin

q 《= 0;

state《= wr_st;

end

rd_st: if(jump) begin

p 《=1;

state《= erase_st;

end

elseif(end) begin

p 《= 0;

state《= rd_st;

end

else begin

p 《= 1;

state《= rd_st;

end

。..

endcase

end

状况机一

输出波形如下所示。

关于运用FPGA三段式状况机的三点优点,你有什么观点?

图一

换用三段式描绘时,有些人会写成这样。

always @(posedge clk or negedge rst)

begin

if(!rst) state 《= wr_st;

else state 《=nextstate;

end

always @(*)

begin

case(state)

wr_st: if(end) nextstate = rd_st;

else nextstate = wr_st;

rd_st: if(jump) nextstate = erase_st

else nextstate = rd_st;

。..

end

endcase

always @(posedge clk)

begin

case(nextstate)

wr_st: if(end) q 《= 1;

else q《= 0;

rd_st: if(end) p 《= 0;

else p 《= 1;

。..

endcase

end

状况机二

看似代码如同没有什么问题,但从输出波形能够看出,q没有正确输出。

关于运用FPGA三段式状况机的三点优点,你有什么观点?

图二

上图中状况搬运正确,可是q输出过错,nextstate由组合逻辑输出,当end有用后,nextstate马上变为rd_st,导致A时间q没有改变,在将一段式改为三段式的过程中,咱们仍保留了一段式的思想习气,想当然的使用了end信号去操控状况跳转,一起又操控了q的输出,这种思想误区由以下两点对三段式状况机的认知缺点构成。

1.书本网上大部分状况机例程的第三段都是依据nextstate输出的,很少看到有依据state输出的,这就形成了一种思想定势,以为三段式的第三段只能依据nextstate描绘。

2.当三段式状况机的输出依据nextstate描绘时,无法用同一个输入信号即触发当时状况跳转,又操控当时状况输出正确逻辑,上述比方中A时间q的过错输出印证了这一点,end能够触发状况从wr_st跳转到rd_st,但无法一起让q输出1。

有两种解决办法。

榜首种解决办法是添加状况,将wr_st拆分为wr_st0和wr_st1两个状况,end信号只操控状况跳转,q的输出跟从wr_st0和wr_st1改变,榜首段不变,如下所示

always @(*)

begin

case(state)

wr_st0: if(end) nextstate = wr_st1;

else nextstate = wr_st0;

wr_st1: nextstate= rd_st;

rd_st: if(jump) nextstate = erase_st;

else nextstate = rd_st;

。..

end

endcase

always @(posedge clk)

begin

case(nextstate)

wr_st0: q《= 0;

wr_st1: q《= 1;

rd_st: if(end) p 《= 0;

else p 《= 1;

。..

endcase

end

状况机三

更改后波形输出正确,如图一所示。有些人会觉得这种方法没有一段式直观,数据手册标明的协议只要写和读两个状况,为什么用三段式状况机描绘时还要添加一个状况呢?反而有一种凑集时序的感觉;另一些人会觉得这种思想方法很天然,协议里只要两个状况,可是每个状况里又会有不同的输出,依据输入和输出的不同能够将一个状况解剖为多个细分状况,状况分的越细,越利于归纳东西剖析优化,可是状况太多了也不利于人员的检查保护。将这个问题延打开,现在网站书本中解说状况机的比方都以“状况多,输出少”为主,这品种型的状况机,不必太多考虑状况区分问题,直接用moor型就ok了,不过,实践工作中咱们还会遇到许多“状况少,输出多”的状况,那该怎么区分状况呢?

一帮人会觉得状况少更直观,运用尽量少的状况,把一切跟当时状况相关的输出都写在同一个状况里,这种习气会倾向于写成一段式或许mealy型;

一帮人觉得假如一个状况里的输出太多了不利于了解,会运用尽量多的状况,每一个状况只对应一种输出,这种习气会将状况机倾向写成moor型。

如换用上文的例程,建议状况少的帮派会写成一段式的状况机一,或写成过错的状况机二,建议多状况的帮派会写成状况机三,从功用方面考虑,后者将状况细分的更清楚,归纳东西会更简单优化剖析,取得更好的功用,可是归纳东西altera和xilinx每年都在更新,剖析才能也越来越强,越来越聪明,削减开发者的经历门槛,按这种趋势,前者和后者的功用差异也会逐年缩小。从保护晋级的方面考虑,前者和后者的输出都相同,可是前者的状况少,代码会更少些,更利于检查,对代码了解上面,本来就存在两种不同的思想习气,只能智者见智了。

回到本例中,第二种解决办法是,仅将状况机二的第三段的nextstate换成state,其他两段不变,如下所示。

always @(posedge clk)

begin

case(state)

wr_st: if(end) q 《= 1;

else q《= 0;

rd_st: if(end) p 《= 0;

else p《= 1;

。..

endcase

end

输出波形和一段式相同,如图一所示,三段式状况机的第三段并没有规则必定要依据nextstate输出,仅仅干流材料在介绍三段式状况机时,多用moor型为例,moor型的特色是输出仅由状况决议,当状况改变时,输出马上改变,如要完结输出紧跟着状况改变,第三段中就必需求依据nextstate输出才能够,比照图一和图二B时间,运用state时,当时状况现已变为rd_st,输出p滞后了一个时钟才输出,而运用nextstate时,当时状况变为 rd_st的一起输出p就改变了,再比较图一和图二的C时间,在同一个状况下,end有用后,两者的p输出都相同,所以可得出,第三段运用nextstate和state的差异在于,当状况跳转时,依据nextstate的输出是马上改变的,而依据state输出会推迟一个周期,其他状况都相同,应该依据自己的时序要求,挑选用nextstate仍是state。

这儿说到的三段式的思想圈套,特权同学从前也不小心犯过,所著的《浅显易懂玩转FPGA》的p40,闲谈状况机规划一节中举了sram的比方比较一段式和三段式的差异,一段式是能够依照程序正常运转的,可是三段式的输出在读取的状况下会和一段式略有不同,当cstate进入RD_S1时,假如此刻wr_req有用,cmd不会输出3`b101,而是3`b111,问题在于运用了 wr_req一起操控了RD_S1的跳转和cmd输出,RD_S2也存在相同的问题,如下所示。

case(cstate)

。..

RD_S1: if(wr_req) nstate 《=WR_S2;

else nstate 《= RD_S2;

RD_S2: if(wr_req) nstate 《=WR_S1;

else nstate 《= IDLE;

。..

endcase

。..

case(nstate)

。..

WR_S2: cmd 《= 3‘b111;

RD_S1: if(wr_req) cmd 《=3’b101;

else cmd 《= 3‘b110;

RD_S2: if(wr_req) cmd 《=3’b011;

else cmd 《= 3‘b111;

。..

endcase

再回到开篇,谈谈第三点关于代码量,Clifford E. Cummings在文中说到一段式状况时机比三段式状况时机多20%到80%的代码量,并重例证明。可是举得比方都有一个特色“状况多,输出少”,比方有 10种状况,可是输出品种只要5种,许多的状况都是相同的输出,这在第三段式描绘时就能够使用case的简写语法削减代码量,如下所示

case (next)

S0, S2, S4, S5 : ; // defaultoutputs

S7 : y3《= 1’b1;

S1 : y2《= 1‘b1;

S3 :begin

y1《= 1’b1;

y2《= 1‘b1;

end

S8 :begin

y2《= 1’b1;

y3《= 1‘b1;

end

S6,S9 : begin

y1《= 1’b1;

y2《= 1‘b1;

y3《= 1’b1;

end

endcase

可是实践的状况机中,还有许多是“状况少,输出多”的状况,每种状况都会有不同的输出,这就无法使用上述的case的简写语法了,再试着比较一下,一段式和三段式的输出逻辑代码量简直相同,状况搬运部分也差不多,可是在输入判别代码量方面,一段式只用判别一次可完结状况搬运和输出,关于mealy型,第二段和第三段都要判别,这就必定比一段式多了,关于moor型,第二段需求判别一次,第三段尽管不必判别可是为了完结相同的功用必定要将状况扩展,比较一段式添加了不少的代码量。所以不能混为一谈一段式的代码量就必定比三段式多,要视具体状况而定。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部