FPGA中锁存器本质总结
1.时序逻辑不会出现锁存器,组合逻辑在特定情况下会综合出锁存器。
or
沿敏感的语句只会综合出触发器,电平敏感的语句在覆盖不全时会出现锁存器。
2.特定情况:在组合逻辑中,在电平敏感的语句中,出现存储功能就会出现锁存器。
典型的if…else…或case…default…语句不完整,也就是出现了信号保持(出现存储功能)
(1)
always @()
begin
if(d)
a = b;
end
(2)
always @()begin
if(d)
a = b;
else
a = a;
end
(3)
always @ (b or d)
case(d)
2’b00: a=b>>1;
2’b11: c=b>>1;
default:
begin
a=b;
c=b;
end
endcase
(4)
always @(b or d)
begin
a = b;
c = b;
case (d)
2’b00: a = b >> 1;
2’b11: c = b >> 1;
endcase
end
(5)
always@(b or d)
begin
case (d) //synopsys full_case
2’b00: a = b >> 1;
2’b11: c = b >> 1;
endcase
end
(6)
always@(posedge clk)begin
if(a1)begin
b<=d;
end
else if(a2)begin
c<=d;
end
end
1.代码1 在综合时语句自动补全,补全后就是代码2,因为else后的信号赋值是保持,出现存储功能,所以产生锁存器。
2.代码3属于信号赋值语句不完整,即在d=2’b00时没有对信号c赋值,在d=2’b11时没有对信号a赋值,综合时语句自动补全,明显也出现信号保持,出现存储功能,所以产生锁存器。
(3)
always @ (b or d)
case(d)
2’b00: begin
a=b>>1;
c=c;
end
2’b11:begin
c=b>>1;
a=a;
end
default:
begin
a=b;
c=b;
end
endcase
3.代码4,不出现锁存器
4.代码5,会产生锁存器
5.代码6,缺else,信号赋值语句不全,但属于时序逻辑,不产生锁存器。