我是VHDL编程的初学者,我正在尝试使用ISE项目导航器13.1合成以下vhdl代码(软件谴责按钮)
entity PBdebouncer is
Port ( PB : in STD_LOGIC;
CLK : in STD_LOGIC;
reset : in STD_LOGIC;
PBdebounced : out STD_LOGIC);
end PBdebouncer;
architecture Behavioral of PBdebouncer is
begin
p1: process(CLK , PB , reset)
variable enable,count : integer range 0 to 100000 := 0;
begin
if(reset = '1') then
count := 0;
enable :=0;
elsif(CLK' event and CLK = '1' ) then
if (enable = 1) then
count := count + 1;
end if;
if(count = 99999 ) then
if(PB = '0') then
PBdebounced <= '0';
else
PBdebounced <= '0';
end if;
count := 0;
enable := 0;
end if;
count := count;
else
enable := 1;
end if;
end process;
end Behavioral;
但遗憾的是我遇到了以下错误:
错误:Xst:827 - “...... /数字实验室II 110 / PBdebouncer / PBdebouncer.vhd”第43行:信号启用无法合成,错误的同步描述。当前软件版本不支持您用于描述同步元素(寄存器,内存等)的描述样式。
你能帮我解释一下这个错误吗?
答案 0 :(得分:4)
尝试没有Clk'和事件之间的空间......
其他一些问题:
为什么当你只使用其中两个值时,“enable”的范围为0到100000?为什么不只使用布尔值或std_logic?
“pbdebounced”应该被设置为除“0”以外的任何东西吗?
为什么围绕布尔表达式的括号?
为什么PB在灵敏度列表中?
它是否在模拟中按预期工作?
现在可能会这样做......
编辑:错误的格式化隐藏了问题:
begin
if reset = '1' then
count := 0;
enable :=0;
elsif rising_edge(clk) then
if enable = 1 then
count := count + 1;
end if;
if count = 99999 then
-- do stuff
end if;
count:= count;
-- else
-- enable := 1;
-- THE TWO LINES ABOVE are the problem
-- They are outside both the CLK and RESET clauses.
end if;
end process;
答案 1 :(得分:2)
只是一个小建议:避免变量作为初学者。 它们似乎像在软件程序中一样工作,但它们有时会映射到硬件中讨厌的东西。
答案 2 :(得分:1)
问题的原因似乎已经被Brians的答案确定 - 但我只是为这些案例添加了一个提示:
在Xilinx ISE中,您可以查看多种语言模板(选择编辑 - >语言模板),这可以帮助您实现各种类型的触发器(同步/异步复位,上升/下降沿触发等等) )和其他结构。
这些可能非常有用 - 特别是在获取这样的错误消息时,这通常是由于语法正确的VHDL代码,它描述了无法在所选设备中合成的硬件。