求教!代码编译产生了latch
- module gpio_select( input [ 7 : 0 ] gpio,
- output [ 3 : 0 ] led,
- input ext_rst_n,
- input clk_25M);
-
- reg[3:0] flag;
- integer i,j;
- always @*
- if( !ext_rst_n )
- begin
- led[3:0] <= 4'b0;
- flag[3:0] <= 4'b0;
- else
- begin
- for( i = 0; i <= 7; i=i+1 )
- begin
- if( ( gpio_sel[i] == 1 ) && (flag[0] == 0) ) //gpio_sel为命令字,从外部spi输入,定义为reg [ 7 : 0 ]gpio_sel
- begin
- led[0] <= gpio[i];
- flag[0] <= 1'b1;
- end
- else if( ( gpio_sel[i] == 1 ) && ( flag[1] == 0 ) )
- begin
- led[1] <= gpio[i];
- flag[1] <= 1'b1;
- end
- else if( ( gpio_sel[i] == 1 ) && ( flag[2] == 0 ) )
- begin
- led[1] <= gpio[i];
- flag[1] <= 1'b1;
- end
- else if( ( gpio_sel[i] == 1 ) && ( flag[3] == 0 ) )
- begin
- led[1] <= gpio[i];
- flag[1] <= 1'b1;
- end
- end
- endmodule
这段代码综合时产生了大量的latch,请各位指点!谢谢!
将 always @* 改成 always @(posedge clk_25M or negedge ext_rst_n) 试试
你这连组合电路时序电路都还没搞清楚啊。
时序组合逻辑不分?
第一,integer和real这些变量仿真用用可以,实际要上板子就不要用了。
第二,组合逻辑和时序逻辑没分清楚,你的latch应该是由组合逻辑产生的。
第三,for语句也不能用
“第一,integer和real这些变量仿真用用可以,实际要上板子就不要用了。
第二,组合逻辑和时序逻辑没分清楚,你的latch应该是由组合逻辑产生的。
第三,for语句也不能用”----如何修改啊?新手上路,请指点下,谢谢!
always @*
改成
always @(posedge clk_25M or negedge ext_rst_n)
for改成 generate for的用法(具体可以查资料)
这个问题挺有意思的,我想了大半天,竟然没想到简单明了的方式来实现
期待大神给出简单明了,比较亮眼的解决方法
我看了半天没看懂……所以就把那几个if……else……看了一下
如果只是为了功能的话,用case语句吧。
latch产生的原因,不知道是不是因为没有else
还有for这种语句不要放在功能模块里面。
最好不要用for语句,因为for语句执行是在一个时钟周期的,也不要用过多的if else,可以改用case;同时led信号要声明为reg,否则肯定会产生latch。
“我看了半天没看懂……所以就把那几个if……else……看了一下
如果只是为了功能的话,用case语句吧。
latch产生的原因,不知道是不是因为没有else
还有for这种语句不要放在功能模块里面。”
-----------------------------------------------------------
问题来源是这样的:
有10路串行信号,需要根据mcu发来的控制字,将控制字中bit位为1的那路信号转发到另一个管脚,比如:
0001011010,就是将第2和第4、5、7路信号(最多不超过4路)转发到另外的管脚led0 = 2路,led1=4路,led2=5路,led3=7路,按照从低到高的次序将信号转发。请大神指点下!谢谢!
always @(*)
不全就会有
