14.1版本的ise xst综合器对状态机的处理 的疑问!同学们请进!
为什么xst不把这段代码当成FSM处理?综合时,next_stute 变了生成了不推荐的锁存器。我百思不得其解,不知道是不是代码中存在一些不妥的地方,请指点!多谢!
付xst报告,大家可以拿去综合下,V7的片子。
</next_stute</next_stute</next_stute</next_stute
状态转换改成阻塞赋值也一样。
改成两段式结果也一样
case 'd1那里,只有if没有else造成if条件未击中时latch。
不建议fsm独立写组合逻辑,这个做法落后了20年。一个时序always块写完就可以了。
小编的这种写法不是三段式吗?
最新的方法是怎么写?请指教!基本上每本教科书三段式和二段式是标准的推荐写法啊。
关于if,我去试一下
已经验证生成lutche不是因为if没有else保护。
从设计上来说,是可能生成lutch的,但是我以为,这种标准格式,综合其会自动识别,避免lutche,直接生成组合逻辑
已经验证生成lutche不是因为if没有else保护。
从设计上来说,是可能生成lutch的,但是我以为,这种标准格式,综合其会自动识别,避免lutche,直接生成组合逻辑
- `timescale 1ns/1ps
- module FSM_test
- (
- input wire last,
- input wire f_begin,
- input wire clk,
- input wire rst,
- output reg [7:0] data
- );
- reg [3:0] stute;
- reg [3:0] next_stute;
- always @ (posedge clk or posedge rst)
- begin
- if(rst)
- begin
- stute <= 'd1;
- end
- else
- begin
- stute <= next_stute;
- end
- end
- always @ (*)
- begin
- if(rst)
- begin
- next_stute = 'd1;
- end
- else
- begin
- case (stute)
- 'd1 : begin
- if(f_begin)
- next_stute = 'd2;
-
- else
- next_stute = 'd1; //Modified end
- 'd2 : begin
- next_stute = 'd4;
- end
- 'd4 : begin
- next_stute = 'd8;
- end
- 'd8 : begin
- next_stute = 'd2;
- if (last)
- next_stute = 'd1;
- end
- default : begin
- next_stute = 'd1;
- end
- endcase
- end
- end
- always @ (posedge clk or posedge rst)
- begin
- if(rst)
- begin
- data <= 'd0;
- end
- else
- begin
- case (stute)
- 'd1 : begin
- if(f_begin)
- data <= 'd2;
- end
- 'd2 : begin
- data <= 'd4;
- end
- 'd4 : begin
- data <= 'd8;
- end
- 'd8 : begin
- data <= data+1;
- end
- default : begin
- data <= 'd0;
- end
- endcase
- end
- end
- endmodule
就这段代码,能综合出Latch我吃鼠标
你好。你的方法是正解!综合器认识他是状态机了!
为什么?请指点!多谢了!
dddk 发表于 2012-9-8 21:52 
[/quote]
你的改动是
next_data = 'd1;
我的改动是next_state = next_state;
差距就有这么大?
真心感谢 Timme ,多谢指点!
原因我第一次回复已经说得比较明白了。如果你暂时理解不了,就在一个时序always块(always@(posedge clk))里写完整个状态机。不要分两段写,不要用always块写组合逻辑(always@(*)),可以100%避免出Latch,除非你把异步复位写成一个不定值。
现在的综合器对付一段式状态机毫无压力,不用担心有什么副作用。
你的改动是
next_data = 'd1;
我的改动是next_state = ne ...
dddk 发表于 2012-9-8 22:00
[/quote]
Latch就是实现一个“保持”的组合逻辑。比如:
- always@(*)
- if(A)
- Y = B;
- else
- Y = Y;
- always@(*)
- if(A)
- Y = B;
为了去除Latch,我们需要去掉“保持”这个动作,即在else时不保持,如:
- always@(*)
- if(A)
- Y = B;
- else
- Y = C;
- always@(*)
- begin
- Y = C;
- if(A)
- Y = B;
- end
当同一个always块中组合逻辑信号不止一个时,要留意隐含的“保持”动作,如:
- always@(*)
- if(A)
- begin
- Y1 = B;
- Y2 = C;
- end
- else
- Y1 = D;
多谢这么详细的指点!
那个保持的问题生成lutch,我能理解,这也是我之前为什么说按设计思路就应该是个lutch的原因。
还有那种先赋值再if的写法,我在实际功能上是出了问题的,存在严重的毛刺问题,不知道是不是其他原因造成的。
我还想请教下,就是你说分段式的状态机已经落后了,那么当前流行的状态机写法是什么样子的呢?能指点一二么?
我5年前搞了3年简单的逻辑,后来转做了其他的,现在换工作,又回到了逻辑的路上,所以请多指点。
一段式状态机综合器是能识别,关键是代码可读性比较差,单位目前不允许使用一段式的。
深受启发 学习了
正解!
小编高人!
