微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求教!代码编译产生了latch

求教!代码编译产生了latch

时间:10-02 整理:3721RD 点击:
各位大神,我写了一段代码,本意是根据命令字中为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,请各位指点!谢谢!

将 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 @(*)
不全就会有

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top