关于VerilogHDL生成的锁存器

匿名 (未验证) 提交于 2019-12-03 00:18:01

总是会遇到有写文档中提到,不要生成锁存器。问题是

锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制其与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。
。综合工具会将Latch优化掉,造成前、后仿真结果不一致。
module datadistributor(datain,sel,enable,a,b,c,d); input datain; input[1:0] sel; input enable; output a; output c; output d; output b; reg a,b,c,d; always @(datain or enable or sel)    begin       if(enable==1'b1)           begin              case(sel)                 2'b00:a<=datain;                 2'b01:b<=datain;                 2'b10:c<=datain;                 2'b11:d<=datain;                 default:a<=datain;               endcase           end        else           begin              a<=1'bz;              b<=1'bz;              c<=1'bz;              d<=1'bz;           end    end   endmodule

这个帖子的结论就是 //synthesis full_case 去除的是没有描述到的case情况所产生的锁存器。所以上述代码中产生的锁存器是无法通过这条简单的语句来消除的,好又有大神提及到

在 always 块的 if..else 语句中如果所列的条件不完整,综合时则会产生锁存器。



|

 1 //pulse_count  and  bit_count    2 reg [2:0]  pulse_count  = 3'd0;  3 reg [3:0]  bit_count    = 4'd0;  4 always @ (posedge i2c_clk)  begin   5     if (curr_state == `IDLE)  begin   6          pulse_count <= 3'd0;  7           bit_count   <= 4'd0;  8      end else begin   9              if (pulse_count == 3'd4)  pulse_count <= 3'd0; 10                 else if ((curr_state != `WAIT) || scl )  11                          pulse_count <= pulse_count + 3'd1; 12                 if (((curr_state == `TX) || (curr_state == `RX))  &&  (pulse_count == 3'd4))  begin  13                     if (bit_count == 4'd8) bit_count <= 4'd0; 14                      else                   bit_count <= bit_count + 4'd1; 15                 end  16          end  17 end 

第12行产生的真值表并不全面那么事产生了锁存器吗?这个是李亚民老师的代码

上面那位大神博文我只看了一半,后来才发现下面这么写:

但是,在描述时序逻辑的时候,也通常利用 if 语句的隐式条件对带时钟使能的 D 触发器建模

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!