关于如何把组合逻辑添加到三段式状态机中的问题
本帖最后由 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:
...
...
现在的问题是把组合逻辑添加在那一段中呢?如果要实现多个双重循环甚或三重循环,怎么用状态机实现呢? 不懂verilog,你的组合逻辑是值什么,数据处理单元的还是控制单元的 放在第二个always中,不要第三个always。不明白你说的多个双重循环或三重循环是什么意思。最好先考虑一下实际的硬件实现,千万别硬把逻辑设计当软件编程。 其实三段式可以压缩成两段式,一个always是时序进程块,另一个是组合逻辑块.<br>
所有的组合逻辑电路都要放在第二个always块中 因为许多算法是先用c语言写出来,所以我先用c语言写了出来,现在要把它转换为verilog语言。而c语言算法中有双重循环。那么还有在组合逻辑执行完后,根据结果选择不同的下一状态。那么这一部分又应该放在第几个always中呢?像如下面的循环如何转换为verilog表示呢?:<br>
for(i=0;i<10;i++)<br>
{<br>
c=a+b;<br>
for(j=0;j<20;j++)<br>
{<br>
sum=d+g;<br>
}<br>
h=sum+c;<br>
}<br>
请高手把这个循环转换为状态机中的一个状态试试。谢谢啦 如果想流水得话,可以吗? 不管用什么方法,实现一下!请高手们出手吧。 用流水线加状态机, 用流水来计算sum=d+g; 也用一个c=a+b; h=sum+c;这些流水线的控制信号由状态来控制. 用流水来计算sum=d+g; 但是这个结果并不能流水的传给 h=sum+c吧,也就是说怎么也得这个算满20次以后再能进入下一步的计算的吧? 对这个问题不是很清楚哈。但是问一下楼主:你 放的那个内部循环没有意义啊,因为它和外部的循环变量i无关啊,可以把它放在外面。对于任意的 i ,里面的对 j 求和结果都一样嘛,为什么要算那么多次啊?<br>
一点浅见,请指正!
页:
[1]
2