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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5015|回复: 12

[求助] 寄存器组与latch的问题?

[复制链接]
发表于 2009-12-27 20:20:02 | 显示全部楼层 |阅读模式

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

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

x
大家帮忙看一下,我这个程序在综合时老是说产生了latch,请问如何修改?感激不尽~
其中frame_20为一个宽度为8,深度为20的寄存器组。
always @ (*)
begin
next_state <= idle;         
  if(!rst_n)
    begin
      b_full_reg <= 1'b0;
      led_flag <= 1'b0;
      des <= 8'd0;
      res <= 8'd0;
      datatype <= 8'd0;
      send_en <= 1'b0;
      addr<=8'b00000000;
    end
  else
  begin
     b_full_reg <= 1'b0;
      led_flag <= 1'b0;
     res <= frame_20[0];
      des <= frame_20[1];
      datatype <= frame_20[2];
       send_en <= 1'b0;
  case(state)
  idle:
  begin
  if(ri_cnt==5'd20)
    begin
      b_full_reg <= 1'b1;
      next_state <= select_do;
    end
  else if(ri_posedge)
     begin
      frame_20[ri_cnt]<=datain;
      next_state <= idle;
     end
  else
  begin
      send_en <= 1'b0;
      b_full_reg <= 1'b0;
      led_flag <= 1'b0;
      next_state <= idle;
  end
   end
  select_do:
     begin
     if(des == 8'h01)
      begin
               case (res)
               TWO:
                  begin
                   addr<=8'b00101100; //44
                   next_state <= pro_frame;
                  end
               THREE:
                 begin
                   case(datatype)
                     d_one:
                       begin
                        addr<=8'b01000010;  //66
                        next_state <= pro_frame;
                       end
                     d_two:
                        begin
                         led_flag<=1'b1;
                         next_state <= pro_led_w;
                        end
                     default
                       begin
                        addr<=8'b00000000;
                                    led_flag<=1'b0;
                        next_state <= pro_frame;
                       end
                       endcase
                 end
              FOUR:
               begin
                addr<=8'b01011000;  //88
                next_state <= pro_frame;
               end
              default
               begin
                  addr<=8'b00000000;  //0
                  next_state <= pro_frame;
               end
             endcase
     end
else
       begin
          next_state <= idle;
          led_flag <= 1'b0;
          addr<=8'b00000000;
       end
end
pro_led_w:
    if(led_on_neg)
    begin
    next_state <= idle;
    b_full_reg <= 1'b0;
    led_flag <= 1'b0;
    addr <= addr+8'b0;
    end
  else
  begin
     b_full_reg <= 1'b1;
    led_flag <= 1'b1;
    next_state <= pro_led_w;
    addr <= addr+8'b0;
    end
pro_frame:
begin
  send_en <= 1'b1;
  next_state <= pro_frame_w;
  addr <= addr+8'b0;
  end
pro_frame_w:
begin
addr <= addr+8'b0;
   if(ti_22_pos)
     begin
       next_state <= idle;
       b_full_reg <= 1'b0;
       addr <= addr+8'b0;
     end
    else
    begin
    next_state <= pro_frame_w;
      b_full_reg <= 1'b1;
       if(ti_posedge & send_en)
          addr <= addr+8'b1;
       else addr <= addr+8'b0;
    end
end
default
begin
next_state <= idle;
addr <=8'b00000000;
b_full_reg <= 1'b0;
      led_flag <= 1'b0;
      des <= 8'd0;
      res <= 8'd0;
      datatype <= 8'd0;
       send_en <= 1'b0;
end
endcase
end
end
出错的警告信息为:
frame_20[0],frame_20[1],frame_20[2]和addr四个地方均产生了latch,怎么修改啊 ?
发表于 2009-12-28 10:42:24 | 显示全部楼层
这个状态机 我看看
发表于 2009-12-28 11:11:31 | 显示全部楼层
本帖最后由 极品飞车10 于 2009-12-28 11:13 编辑

楼主好
always @ (*) 变化一次就会对代码判断一次 当(!rst_n)==1时会做清0操作,如果(!rst_n)==0  状态idle中是不是要给addr赋值下吧 (如果跳入idle状态中,由于这个状态里没有对addr赋值,那会生成个latch对addr数据保存下的)
frame_20[0],frame_20[1],frame_20[2]这3个信号 是输入信号吗? 这3个信号产生latch的原因也类似。
发表于 2009-12-28 11:22:23 | 显示全部楼层
楼上说的对
发表于 2009-12-31 00:08:41 | 显示全部楼层
没怎么看懂。。。。。。
发表于 2009-12-31 07:09:18 | 显示全部楼层
frame_20 在除了idle状态外没有被赋值
综合工具就认为是保持原值,由于你写的是组合逻辑,这就产生latch了
在default 里面赋值就可以了
发表于 2009-12-31 07:10:30 | 显示全部楼层
1# verilog20090412

补充一下 你写的是组合逻辑建议使用 阻塞赋值“=”
发表于 2009-12-31 09:07:26 | 显示全部楼层
1. 搞清楚时序与组合没有?
2. 搞清阻塞与非阻塞没有?
3. 看看 “极品非车10” 的回复
4. 写状态机不建议这样写,只关心状态就可以了,不要把其他逻辑引入
5. 最好不要把rst引入到组合逻辑中
发表于 2010-1-2 13:33:42 | 显示全部楼层
不要用always @ (*)。

用 always @(posedge clk or negedge rst_n) 就好了。
发表于 2010-1-3 17:06:22 | 显示全部楼层
程序太长
没有仔细看
在程序最前面(begin后)给出现Latch的信号附初值就好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-28 13:29 , Processed in 0.023385 second(s), 8 queries , Gzip On, Redis On.

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