集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 8167|回复: 16

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

[复制链接]
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[j]+g[j];<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[j]+g[j];&nbsp;&nbsp;也用一个c=a+b; h=sum+c;这些流水线的控制信号由状态来控制.
longtime 发表于 2010-6-26 07:36:43 | 显示全部楼层
用流水来计算sum=d[j]+g[j];&nbsp;&nbsp;但是这个结果并不能流水的传给 h=sum+c吧,也就是说怎么也得这个算满20次以后再能进入下一步的计算的吧?
ICE 发表于 2010-6-26 08:14:43 | 显示全部楼层
对这个问题不是很清楚哈。但是问一下楼主:你 放的那个内部循环没有意义啊,因为它和外部的循环变量i无关啊,可以把它放在外面。对于任意的 i ,里面的对 j 求和结果都一样嘛,为什么要算那么多次啊?<br>
一点浅见,请指正!
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 17:51 , Processed in 0.069310 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表