VHDL解析错误,意外的DIV

时间:2016-05-09 16:23:26

标签: vhdl

我被要求在键盘上显示最多按下的数字 这是唯一显示

的错误
  

错误:HDLParsers:164 - “D:/project/compartor.vhd”第37行。解析   错误,意外的DIV

这是第37行

if Int_Key = i  then

错误是什么意思?我该如何解决?

这是完整的代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.std_logic_arith.all;
---------------------------------------------------------------

entity compartor is
port
(
Key_out : in  std_logic_vector(3 downto 0);
clk,rst: in std_logic;
Winner: out std_logic_vector (3 downto 0)    
);
end compartor;

architecture Behavioral of compartor is

Type Data is array (0 to 15) of integer;
Signal Counters:Data:=(others=>0);
Signal Max:integer;
Signal MaxPlace:integer;
Signal INT_Key:integer:=conv_integer(Key_out);


begin


process (clk,rst)
begin
if (rst='1') then
Winner<= (others=>'0');

elsif (rising_edge(clk)) then


  for i in 0 to 15 loop
     if Int_Key = i  then   
       Counters(i)<= Counters(i)+1;
     end if;
  end loop;

Max <= Counters(0);
MaxPlace <= 0;
    for i in 0 to 15 loop 
      if (Counters(i) > Max) then 
        Max <= Counters(i);
    MaxPlace <= i;
      end if;
    end loop;

end if;
end process;
Winner<= conv_std_logic_vector (MaxPlace,4);

end Behavioral;

1 个答案:

答案 0 :(得分:1)

看不到该特定错误消息的原因,但代码还存在其他问题。

Winners输出端口在过程中和过程外都被驱动,因此具有多个驱动器,Xilinx综合工具将不接受这些驱动器。

在声明中分配给INT_Key,如:

Signal INT_Key:integer:=conv_integer(Key_out);

根据INT_Key输入端口给出Key_out和初始值,这可能不是您想要的,所以请考虑做:

Signal INT_Key:integer;
...
INT_Key <= conv_integer(Key_out);

请注意,在下一次执行流程之前,流程中<=的信号分配不会使新值可用,例如在Max <= Counters(0)的情况下。它可能是你想要的,但它是VHDL启动器的常见缺陷。

即使VHDL不区分大小写,对于相同的标识符使用不同的大小写也是不好的方式,就像您使用INT_KeyInt_Key一样。

考虑缩进代码以遵循控制结构;这将节省大量的调试并使代码更具可读性。

最后的建议是,为设计做一个测试平台,并在尝试使其在硬件上运行之前进行模拟。做这个额外的模拟工作实际上会让你早点完成,而不是更晚。