我是这个世界的新人。
实际上,我正在学习VHDL。我写了下面的代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Problems is
port(
S : in std_logic;
D : in std_logic;
CLK : in std_logic;
R : in std_logic;
Q : out std_logic;
Q_n : out std_logic
);
end Problems;
architecture Behavioral of Problems is
signal t_tmp1 : std_logic;
begin
DFF: process (S,R,D,CLK)
begin
if (S = '0' and R = '0') then
t_tmp1 <= not t_tmp1;
elsif (S = '0' and R = '1') then
t_tmp1 <= '1';
elsif (S = '1' and R = '0') then
t_tmp1 <= '0';
elsif (rising_edge(CLK)) then
t_tmp1 <= D;
end if;
end process DFF;
Q <= t_tmp1;
Q_n <= not t_tmp1;
end Behavioral;
当我合成时出现以下警告:
警告:HDLCompiler:92 - “/home/joseph/ISEProjects/Exercise_BasicMemoryElements/Problems.vhd”第41行:t_tmp1应位于流程的敏感度列表中
警告:Xst:3002 - 此设计包含一个或多个直接寄存器/锁存器 与Spartan6架构不兼容。造成这种情况的两个主要原因是 用异步集和。描述的寄存器或锁存器 异步复位或用异步描述的寄存器或锁存器 设置或重置但是具有相反的初始化值 极性(即初始化值为1的异步复位)。
模拟效果很好。
我想知道为什么警告以及我必须学会解决这样的问题。
此致
JosephPeña。
答案 0 :(得分:2)
如果您要阅读 Spartan-6原理图设计库指南,您可以找到一个同时具有异步预设和异步清除的D触发器不是由Spartan提供的6(或以后的设备系列)。
您的if语句的第一个条件语句的行为似乎并不表示如果同时复位和集合都为TRUE会发生什么。区分您可以模拟的内容以及技术通过合成进行映射的内容。
例如,在Spartan-3e中,重置将覆盖集合:
用于映射到目标技术中的寄存器传输逻辑元素的VHDL语言的合成合格子集的约束可在IEEE Std 1076.6-2004中找到,现已废除,并且可以在ISE XST中找到Xilinx用户指南或 Vivado Design Suite用户指南综合(ug901)。
映射VHDL描述的能力取决于是否具有设备系列的受支持目标。