在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3067|回复: 10

[资料] 求教!代码编译产生了latch

[复制链接]
发表于 2016-11-23 09:01:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
各位大神,我写了一段代码,本意是根据命令字中为1的bit位(置1的个数可能是0-4个,位置不定)从7路输入信号中任选4路,输出到led。




  1. module gpio_select( input [ 7 : 0 ] gpio,
  2.                     output [ 3 : 0 ] led,
  3.                     input ext_rst_n,
  4.                     input clk_25M);

  5.                     
  6. reg[3:0] flag;

  7. integer i,j;
  8. always @*
  9.   if( !ext_rst_n )
  10.   begin
  11.     led[3:0] <= 4'b0;
  12.     flag[3:0] <= 4'b0;
  13.   else
  14.     begin
  15.         for( i = 0; i <= 7; i=i+1 )
  16.         begin
  17.             if( ( gpio_sel[i] == 1 ) && (flag[0] == 0) )  //gpio_sel为命令字,从外部spi输入,定义为reg [ 7 : 0 ]gpio_sel
  18.               begin
  19.                  led[0] <= gpio[i];
  20.                  flag[0] <= 1'b1;
  21.                end
  22.             else if( ( gpio_sel[i] == 1 ) && ( flag[1] == 0 ) )
  23.                begin
  24.                      led[1] <= gpio[i];
  25.                  flag[1] <= 1'b1;
  26.                end
  27.             else if( ( gpio_sel[i] == 1 ) && ( flag[2] == 0 ) )
  28.                begin
  29.                      led[1] <= gpio[i];
  30.                  flag[1] <= 1'b1;
  31.                end
  32.             else if( ( gpio_sel[i] == 1 ) && ( flag[3] == 0 ) )
  33.                begin
  34.                      led[1] <= gpio[i];
  35.                  flag[1] <= 1'b1;
  36.                end
  37.             end
  38. endmodule


复制代码

这段代码综合时产生了大量的latch,请各位指点!谢谢!
发表于 2016-11-23 09:53:33 | 显示全部楼层
将 always @*  改成 always @(posedge clk_25M or negedge ext_rst_n) 试试
发表于 2016-11-23 10:37:56 | 显示全部楼层
你这连组合电路时序电路都还没搞清楚啊。
发表于 2016-11-23 14:41:16 | 显示全部楼层
时序组合逻辑不分?
发表于 2016-11-23 15:16:56 | 显示全部楼层
第一,integer和real这些变量仿真用用可以,实际要上板子就不要用了。
第二,组合逻辑和时序逻辑没分清楚,你的latch应该是由组合逻辑产生的。
第三,for语句也不能用
 楼主| 发表于 2016-11-24 08:31:49 | 显示全部楼层
本帖最后由 freebigfish 于 2016-11-24 08:35 编辑

“第一,integer和real这些变量仿真用用可以,实际要上板子就不要用了。
第二,组合逻辑和时序逻辑没分清楚,你的latch应该是由组合逻辑产生的。
第三,for语句也不能用”----如何修改啊?新手上路,请指点下,谢谢!
发表于 2016-11-25 14:18:31 | 显示全部楼层
always @*
改成
always @(posedge clk_25M or negedge ext_rst_n)
for改成 generate for的用法(具体可以查资料)
这个问题挺有意思的,我想了大半天,竟然没想到简单明了的方式来实现
期待大神给出简单明了,比较亮眼的解决方法
发表于 2016-11-25 17:43:22 | 显示全部楼层
我看了半天没看懂……所以就把那几个if……else……看了一下
如果只是为了功能的话,用case语句吧。
latch产生的原因,不知道是不是因为没有else
还有for这种语句不要放在功能模块里面。
发表于 2016-11-28 12:46:10 | 显示全部楼层
最好不要用for语句,因为for语句执行是在一个时钟周期的,也不要用过多的if else,可以改用case;同时led信号要声明为reg,否则肯定会产生latch。
 楼主| 发表于 2016-11-29 15:34:12 | 显示全部楼层
“我看了半天没看懂……所以就把那几个if……else……看了一下
如果只是为了功能的话,用case语句吧。
latch产生的原因,不知道是不是因为没有else
还有for这种语句不要放在功能模块里面。”
-----------------------------------------------------------
问题来源是这样的:
有10路串行信号,需要根据mcu发来的控制字,将控制字中bit位为1的那路信号转发到另一个管脚,比如:
0001011010,就是将第2和第4、5、7路信号(最多不超过4路)转发到另外的管脚led0 = 2路,led1=4路,led2=5路,led3=7路,按照从低到高的次序将信号转发。请大神指点下!谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-10 12:57 , Processed in 0.027748 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表