我用VHDL编写了这个程序,alle语法很好,我试图仔细检查所有的端口映射,但是我得到som警告导致程序无法工作,甚至很难生成位文件。这里有谁可以帮忙吗?我变得疯了!
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity topMain is
port( clk : in std_logic;
alarm : in std_logic_vector (1 downto 0);
d_open : in std_logic_vector (1 downto 0);
d_closed : in std_logic_vector(1 downto 0);
d_out : out std_logic_vector (1 downto 0));
end topMain;
architecture Behavioral of topMain is
type state_type is (S0,S1,S3);
signal NS, Current_State : state_type;
begin
process (clk, alarm)
begin
if alarm ="11" then
Current_State <= S3; --
elsif rising_edge (clk) then
Current_State <= NS; -- state change
end if;
end process;
--------------------------------
process(Current_State,d_open, d_closed, clk)
begin
case Current_State is
----
when S3 => d_out <= "11";
if (d_open = "10") then
NS <= S3;
elsif (d_closed = "01") then
NS <= S3;
elsif (d_closed = "00") then
NS <= S3;
end if;
----
when S0 => d_out <= "10"; -- open door
if ( d_open = "10" ) then
NS <= S0;
elsif (d_closed= "01") then
NS <= S1;
elsif (d_closed = "10") then
NS <= S0;
else
NS <= S0;
end if;
when S1 => d_out <= "01"; -- open door
if ( d_closed = "01" ) then
NS <= S1;
elsif (d_open <= "10") then
NS <= S0;
elsif (d_open <= "01") then
NS <= S1;
else
NS <= S1;
end if;
end case;
end process;
end Behavioral;
如果有人可以看一下,这就是完整的项目。 它是一个简单的程序,包含有限状态机和3个变化,模拟防盗报警。 当闹钟关闭时,你可以打开门并关闭它,但如果它打开,你什么都不能做。这是我想做的事情,尽管我是新手。如有任何不便,请原谅我。
我现在收到的警告:
警告:Xst:819 - “C:/Xilinx/OP/BAlarm/topMain.vhd”第36行:过程灵敏度列表中缺少一个或多个信号。为了能够合成FPGA / CPLD硬件,XST将假设灵敏度列表中存在所有必需的信号。请注意,合成的结果可能与初始设计规格不同。丢失的信号是: 警告:Xst:737 - 找到信号的3位锁存器。锁存器可以从不完整的case或if语句生成。我们不建议在FPGA / CPLD设计中使用锁存器,因为它们可能会导致时序问题。 警告:Xst:647 - 从不使用输入。如果该端口属于顶级块或者属于子块并保留该子块的层次结构,则该端口将被保留并保持未连接状态。 警告:PhysDesignRules:372 - 门控时钟。时钟网顶/ NS_not0001来源 通过组合引脚。这不是好的设计实践。使用CE引脚 控制将数据加载到触发器中。 警告:路由:455 - CLK Net:top / NS_not0001可能有过度偏斜,因为
答案 0 :(得分:2)
在组合过程的所有分支中未分配NS
信号
process(Current_State, d_open, d_closed, clk)
,它将推断锁存;另请参阅https://stackoverflow.com/a/20394822/2352082和https://stackoverflow.com/a/20411227/2352082
代码:
when S3 => d_out <= "11";
if (d_open = "10") then
ns <= S3;
elsif (d_closed = "01") then
ns <= S3;
elsif (d_closed = "00") then
ns <= S3;
end if;
没有else
,因此如果之前没有条件
为TRUE,然后未分配NS
,这导致由...推断的锁存器
合成
您可以通过添加else
并正确分配NS
值来解决此问题,例如:
...
else
ns <= S0; -- TBD[S0 is only example; use correct value]
end if;
我没有在过程敏感度列表中看到任何信号丢失,但是clk
是
由于此过程实现了组合设计,因此包括在最后一个中并且不是必需的。