【发布时间】:2015-05-10 18:17:51
【问题描述】:
我是所有涉及 VHDL 物理描述代码的新手,我有一个大学项目要完成(Nexys2 或 Nexys3 板上的四个不同的文本动画)并且我不断收到以下警告消息:
WARNING:Xst:737 - 找到信号的 7 位锁存器。不完整的 case 或 if 语句可能会生成锁存器。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。
警告:Xst:737 - 找到信号的 7 位锁存器。不完整的 case 或 if 语句可能会生成锁存器。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。
警告:Xst:737 - 找到信号的 7 位锁存器。不完整的 case 或 if 语句可能会生成锁存器。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。
警告:Xst:737 - 找到信号的 7 位锁存器。不完整的 case 或 if 语句可能会生成锁存器。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。
警告:PhysDesignRules:372 - 门控时钟。时钟网络 temp_reg1_not0001 由组合引脚提供。这不是好的设计实践。使用 CE 引脚控制数据加载到触发器中。
警告:PhysDesignRules:372 - 门控时钟。时钟网络 temp_reg3_not0001 由组合引脚提供。这不是好的设计实践。使用 CE 引脚控制数据加载到触发器中。
警告:PhysDesignRules:372 - 门控时钟。时钟网络 temp_reg2_not0001 由组合引脚提供。这不是好的设计实践。使用 CE 引脚控制数据加载到触发器中。
警告:PhysDesignRules:372 - 门控时钟。时钟网络 temp_reg4_not0001 由组合引脚提供。这不是好的设计实践。使用 CE 引脚控制将数据加载到触发器中。
这是所有源文件的链接(我正在使用 Ise Design Suite 14.7) http://www.fileshare.ro/e31590660
编辑:不幸的是,我已经花了将近半天的时间,我仍然无法准确指出问题所在。 我只能粗略地说,它是在下面代码中的过程中(第 73 行及以后)。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Folosim mai jos pachetul nostru
use work.Constante_si_componente.all;
entity Optiune1 is
port(
clk_50M:in std_logic;
reset:in std_logic;
catozi: out std_logic_vector(0 to 6);
anozi: out std_logic_vector(0 to 3);
opt1, opt2, opt3, opt4: in std_logic);
end entity;
architecture Behavioral of Optiune1 is
-- Instantierea semnalelor locale
signal local_clk_1Hz: std_logic;
signal local_clk_1Khz: std_logic;
signal adresa: integer range 0 to nr_cuvinte_distincte-1;
signal sec_4: integer range 0 to limita_sup:=0; -- Numara exact 5 secunde
signal cuvant: std_logic_vector(lungime_cuvinte-1 downto 0);
signal reg1, reg2, reg3, reg4: std_logic_vector(0 to 6):=(others=>'0');
signal temp_reg1, temp_reg2, temp_reg3, temp_reg4: std_logic_vector(0 to 6) := (others=> '0');
-- Declarare componente
component ROM
port (addr : in integer range 0 to nr_cuvinte_distincte-1;
data: out std_logic_vector(lungime_cuvinte-1 downto 0));
end component ROM;
component numarator
port(reset: in std_logic;
clk: in std_logic;
limita_numarare: in integer;
count: out integer range 0 to limita_sup);
end component;
component registru
port(clk_1Hz: in std_logic;
reset: in std_logic;
write_mode: in std_logic;
input: in std_logic_vector(0 to 6);
output: out std_logic_vector(0 to 6));
end component;
component RRate
port(clk_1KHz: in std_logic;
reg1, reg2, reg3, reg4: in std_logic_vector(0 to 6);
catozi: out std_logic_vector(0 to 6);
b:out std_logic_vector(0 to 3));
end component;
begin
-- Instantiem divizoarele de tact
COMP_CLOCK_tat: divizor port map(clk_50M=>clk_50M, reset => reset, clk_1Hz => local_clk_1Hz, clk_1KHz=>local_clk_1KHz);
-- Instantiem numaratorul
Numarator_1: numarator port map(reset => reset, clk => local_clk_1Hz, limita_numarare => nr_cuvinte_distincte-1, count => adresa);
Numarator_2: numarator port map(reset => reset, clk => local_clk_1Hz, limita_numarare => 4, count => sec_4);
-- Instantiem memoria
Memorie1: ROM port map(addr => adresa, data => cuvant);
-- Instantiem registrul
Registrul_1: registru port map(local_clk_1Hz, reset, '1', temp_reg1, reg1);
Registrul_2: registru port map(local_clk_1Hz, reset, '1', temp_reg2, reg2);
Registrul_3: registru port map(local_clk_1Hz, reset, '1', temp_reg3, reg3);
Registrul_4: registru port map(local_clk_1Hz, reset, '1', temp_reg4, reg4);
-- Instantiem refresh rate-ul de la anozi
Refresh_Rate: RRate port map (local_clk_1KHz, reg1, reg2, reg3, reg4, catozi, anozi);
process(opt1, opt2, opt3, opt4, local_clk_1Hz, temp_reg1, temp_reg2, temp_reg3, temp_reg4, cuvant, sec_4)
begin
if(opt1='1')and(opt2='0')and(opt3='0')and(opt4='0')and(local_clk_1Hz='1') then
temp_reg1 <= cuvant;
temp_reg2 <= temp_reg1;
temp_reg3 <= temp_reg2;
temp_reg4 <= temp_reg3;
elsif(opt1='0')and(opt2='1')and(opt3='0')and(opt4='0')and(local_clk_1Hz='1') then
temp_reg4 <= cuvant;
temp_reg3 <= temp_reg4;
temp_reg2 <= temp_reg3;
temp_reg1 <= temp_reg2;
elsif(opt1='0')and(opt2='0')and(opt3='1')and(opt4='0')and(local_clk_1Hz='1') then
if sec_4 = 0 then
temp_reg1 <= cuvant;
elsif sec_4 = 1 then
temp_reg2 <= cuvant;
elsif sec_4 = 2 then
temp_reg3 <= cuvant;
elsif sec_4 = 3 then
temp_reg4 <= cuvant;
elsif sec_4 = 4 then
temp_reg1 <= "1111111";
temp_reg2 <= "1111111";
temp_reg3 <= "1111111";
temp_reg4 <= "1111111";
end if;
elsif(opt1='0')and(opt2='0')and(opt3='0')and(opt4='1')and(local_clk_1Hz='1') then
if sec_4 = 0 then
temp_reg1 <= cuvant;
elsif sec_4 = 1 then
temp_reg2 <= cuvant;
temp_reg1<="1111111";
elsif sec_4 = 2 then
temp_reg3 <= cuvant;
temp_reg2<="1111111";
elsif sec_4 = 3 then
temp_reg4 <= cuvant;
temp_reg3<="1111111";
elsif sec_4 = 4 then
temp_reg1 <= "1111111";
temp_reg2 <= "1111111";
temp_reg3 <= "1111111";
temp_reg4 <= "1111111";
end if;
else
temp_reg1 <= (others => '0');
temp_reg2 <= (others => '0');
temp_reg3 <= (others => '0');
temp_reg4 <= (others => '0');
end if;
end process;
end architecture Behavioral;
最后一次编辑:我昨天必须提交项目,它在 Nexys2 FPGA 板上按预期工作,我将 David Koontz 的多路复用器代码添加到项目文档的“未来开发”部分.
非常感谢您的帮助:)
【问题讨论】:
-
请更新问题以显示发出警告的最少代码。这样做的好处是,您实际上可以自己找到解决方案。
标签: vhdl