1.Don't-Care
在综合的时候,含有“-”,或者“D”, “X”这类表示don’t-care的值是无法与相关硬件综合的,在<<A VHDL Synthesis Primer (2nd Edition)>> (p98)这本书上,作者是这样表述的:
“A don’t-care value can be compare using the “=” (equality) operator or the “/=” (inequality) in and if statement. In such a case, the “=” operator always returns false while “/=” operator always returns true.”
这里作者只是表述了if statement 一种状况,但是实际上,我们可以把它推广至所有需要比较的情况。一些表示 don’t-care 的符号例如“-”,“D” 如果从仿真的角度来看,是非常方便的,但是用在综合里面,由于找不到对应的硬件与之关联,很容易发生错误。我们现在用一个Priority Encoder 的例子来看一下。
首先用可综合的VHDL来表述:
LIBRARY IEEE;
USE IEEE.Std_Logic_1164.ALL;
ENTITY priority IS
port(
datain: in std_logic_vector (3 downto 0);
z : out std_logic_vector (1 downto 0)
);
END entity priority;
architecture metalogic of priority IS
begin
Z<= "00" when datain(0)=’1’ else
"01" when datain(2 downto 0)="100" else
"10" when datain(1 downto 0)="10" else
"11" when datain(3 downto 0)="1000" else
"00" ;
end architecture metalogic;
综合的结果如下:
而如果我们使用带有“-”的符号来表示 don’t-care,并用VHDL编写代码:
LIBRARY IEEE;
USE IEEE.Std_Logic_1164.ALL;
ENTITY priority IS
port(
datain: in std_logic_vector (3 downto 0);
z : out std_logic_vector (1 downto 0)
);
END entity priority;
architecture metalogic of priority IS
begin
Z<= "00" when datain="---1" else
"01" when datain="--10" else
"10" when datain="-100" else
"11" when datain="1000" else
"00" ;
end architecture metalogic;
综合结果如下:
在第二个例子中,可以看到由于前三个判断句
z<="00" when datain="---1" else
"01" when datain="--10" else
"10" when datain="-100" else
中含有“-”,所以它们的值永远为false.所以生成的电路完全忽略了这三个判断分句,而只对
"11" when datain="1000" else
"00" ;
做出综合。
上面是对组合逻辑做出的分析,同样我们可以推知:如果含有“-”的判断条件出现在 if else 这样的时序判断分句里面,这样的判断分句相当于无效(null statement), 那样会出现条件覆盖不完整的情况,因此可能出现 latch 等我们不希望出现的东西。
结论:
综合的时候,对 Don't-care 的比较判断永远为 false.所以,对 don’t-care 的比较判断操作一定要小心,最好把 don’t-care只是限定在仿真阶段。
Don't-care可以对其他信号或者变量赋值,而综合工具会自动找出一种消耗资源最少的实现方式来实现。
2.Unknown
我们还是使用上面那个Priority Encoder 的程序,只是把“-”代换为“U”.
程序如下:
LIBRARY IEEE;
USE IEEE.Std_Logic_1164.ALL;
ENTITY priority IS
port(
datain: in std_logic_vector (3 downto 0);
z : out std_logic_vector (1 downto 0)
);
END entity priority;
architecture metalogic of priority IS
begin
Z<= "00" when datain="UUU1" else
"01" when datain="UU10" else
"10" when datain="U100" else
"11" when datain="1000" else
"00" ;
end architecture metalogic;
而综合的结果和don’t care一样:
结论:
综合的时候,对 Unknown的比较判断永远为 false.所以,对 Unknown的比较判断操作一定要小心。
Unknown 不可以对其他信号或者变量赋值。如果硬把 unknown 赋给变量或者信号,赋值所在的行完全无效;
3.High-impedance
High impedance 对应电路中的高阻态,也就是三态门。和其他两个一样:
(偷个懒,这里直接给出结论了)
结论:
综合的时候,对 High-impedance 的比较判断永远为 false,所以,对High-impedance 的比较判断操作一定要小心。
High-impedance 可以对其他信号或者变量赋值,会形成三态门,但是必须要引入条件判断,比如 if else, case, when….
文章评论(0条评论)
登录后参与讨论