UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 19665

6.2i SP3 XST - VHDL 文「if xxx/=0 then」を使用すると間違ったロジックが生成される

説明

キーワード : XST, if, elsif, else, set, Behavioral, Post-translate, netlist, clear, synchronous, ビヘイビア, ネットリスト, クリア, 同期

重要度 : 重要

概要 :
カウンタが同じプロセス内にある 1 つの同期クリア、セット、定数ロード、およびカウント イネーブルの組み合わせで制御されるとき、ビヘイビア シミュレーション結果が変換後のシミュレーション結果と異なり、XST で合成中に不正なロジックが生成されたことが示されます。

次のコードに XST が不正に合成してしまう VHDL コードを示します。

Example:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

entity LTI_Gen is
generic (LTI_Time : INTEGER := 90) ;
port (
Clk: in STD_LOGIC; -- DVP_Clk (40MHZ)
CLR_n: in STD_LOGIC; -- Reset
LTI_En: in STD_LOGIC; -- LTIEnable
LTI_Tick: in STD_LOGIC; -- ClkEn
LTI_CamTr: out STD_LOGIC;
Debug: out std_logic_vector(31 downto 0)
);
end LTI_Gen;

architecture LTI_Gen_arch of LTI_Gen is

signal LTI_CamTr_i: std_logic;

begin

pLTI: process (CLK)
variable LTI_Cnt: integer range 0 to LTI_Time/10-1;
begin
if CLK'event and CLK='1' then
if CLR_n='0' or LTI_En='0' then
LTI_Cnt := 0;
LTI_CamTr_i <= '0';
else
if LTI_Tick='1' then
if LTI_Cnt/=0 then
LTI_Cnt := LTI_Cnt-1;
LTI_CamTr_i <= '1';
else
LTI_Cnt := LTI_Time/10-1;
LTI_CamTr_i <= '0';
end if;--LTI_Cnt
end if;--LTI_Tick
end if;--CLR_n
end if; -- CLK
end process pLTI;

LTI_CamTr <= LTI_CamTr_i;
Debug(0) <= LTI_En;
Debug(1) <= LTI_Tick;
Debug(2) <= LTI_CamTr_i;
end LTI_Gen_arch;

ソリューション

この問題を回避するには、if XXX /= 0 を if xxx =0 then に変更し、if 文および else 文の内容を入れ替えます。
次の例を参照してください。

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

entity LTI_Gen is
generic (LTI_Time : INTEGER := 90) ;
port (
Clk: in STD_LOGIC; -- DVP_Clk (40MHz)
CLR_n: in STD_LOGIC; -- Reset
LTI_En: in STD_LOGIC; -- LTIEnable
LTI_Tick: in STD_LOGIC; -- ClkEn
LTI_CamTr: out STD_LOGIC;
Debug: out std_logic_vector(31 downto 0)
);
end LTI_Gen;

architecture LTI_Gen_arch of LTI_Gen is

signal LTI_CamTr_i: std_logic;

begin

pLTI: process (CLK)
variable LTI_Cnt: integer range 0 to LTI_Time/10-1;
begin
if CLK'event and CLK='1' then
if CLR_n='0' or LTI_En='0' then
LTI_Cnt := 0;
LTI_CamTr_i <= '0';
else
if LTI_Tick='1' then
if LTI_Cnt = 0 then
LTI_Cnt := LTI_Time/10-1;
LTI_CamTr_i <= '0';
else
LTI_Cnt := LTI_Cnt-1;
LTI_CamTr_i <= '1';
end if;--LTI_Cnt
end if;--LTI_Tick
end if;--CLR_n
end if; -- CLK
end process pLTI;





LTI_CamTr <= LTI_CamTr_i;

Debug(0) <= LTI_En;
Debug(1) <= LTI_Tick;
Debug(2) <= LTI_CamTr_i;

end LTI_Gen_arch;

AR# 19665
日付 07/18/2007
ステータス アーカイブ
種類 一般
このページをブックマークに追加