interig 发表于 2010-6-26 00:16:55

关于如何把组合逻辑添加到三段式状态机中的问题

本帖最后由 fpgaw 于 2010-11-18 16:15 编辑

状态机的3段式(这是最标准的写法),即
   ...
   always @(posedge clk or negedge rst_n)
   ...
   current_state <= next_state;
   ...
   always @ (current_state ...)
   ...
   case(current_state)
   ...
   s1:
      if ...
      next_state = s2;
   ...
   ...
   always @(posedge clk or negedge rst_n)
   ...
   else
      a <= 1'b0;
      c <= 1'b0;
      c <= 1'b0;    //赋默认值
   case(current_state)
       s1:
         a <= 1'b0; //由于上面赋了默认值,这里就不用再对b
、c赋值了(b、c在该状态为0,不会产生锁存器,下同)
       s2:
         b <= 1'b1;
       s3:
         c <= 1'b1;
       default:
       ...
...
现在的问题是把组合逻辑添加在那一段中呢?如果要实现多个双重循环甚或三重循环,怎么用状态机实现呢?

AAT 发表于 2010-6-26 00:22:43

不懂verilog,你的组合逻辑是值什么,数据处理单元的还是控制单元的

ngtim 发表于 2010-6-26 00:27:18

放在第二个always中,不要第三个always。不明白你说的多个双重循环或三重循环是什么意思。最好先考虑一下实际的硬件实现,千万别硬把逻辑设计当软件编程。

CTT 发表于 2010-6-26 02:05:10

其实三段式可以压缩成两段式,一个always是时序进程块,另一个是组合逻辑块.<br>
所有的组合逻辑电路都要放在第二个always块中

CTT 发表于 2010-6-26 03:13:31

因为许多算法是先用c语言写出来,所以我先用c语言写了出来,现在要把它转换为verilog语言。而c语言算法中有双重循环。那么还有在组合逻辑执行完后,根据结果选择不同的下一状态。那么这一部分又应该放在第几个always中呢?像如下面的循环如何转换为verilog表示呢?:<br>
&nbsp; &nbsp;&nbsp;&nbsp;for(i=0;i&lt;10;i++)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; c=a+b;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; for(j=0;j&lt;20;j++)<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;{<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;sum=d+g;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; h=sum+c;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>
请高手把这个循环转换为状态机中的一个状态试试。谢谢啦

VVIC 发表于 2010-6-26 05:02:55

如果想流水得话,可以吗?

longtime 发表于 2010-6-26 06:24:58

不管用什么方法,实现一下!请高手们出手吧。

UFP 发表于 2010-6-26 07:28:02

用流水线加状态机, 用流水来计算sum=d+g;&nbsp;&nbsp;也用一个c=a+b; h=sum+c;这些流水线的控制信号由状态来控制.

longtime 发表于 2010-6-26 07:36:43

用流水来计算sum=d+g;&nbsp;&nbsp;但是这个结果并不能流水的传给 h=sum+c吧,也就是说怎么也得这个算满20次以后再能进入下一步的计算的吧?

ICE 发表于 2010-6-26 08:14:43

对这个问题不是很清楚哈。但是问一下楼主:你 放的那个内部循环没有意义啊,因为它和外部的循环变量i无关啊,可以把它放在外面。对于任意的 i ,里面的对 j 求和结果都一样嘛,为什么要算那么多次啊?<br>
一点浅见,请指正!
页: [1] 2
查看完整版本: 关于如何把组合逻辑添加到三段式状态机中的问题