我被要求在键盘上显示最多按下的数字 这是唯一显示
的错误错误: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;
答案 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_Key
和Int_Key
一样。
考虑缩进代码以遵循控制结构;这将节省大量的调试并使代码更具可读性。
最后的建议是,为设计做一个测试平台,并在尝试使其在硬件上运行之前进行模拟。做这个额外的模拟工作实际上会让你早点完成,而不是更晚。