0

完整的错误信息是:

ERROR:HDLCompiler:377 - "C:/Users/einar/Documents/Xilinx/ISE/Projects/EDA385/scale_clock_tb.vhd" Line 17: Entity port d does not match with type unsigned of component port

我正在使用 ISE webpack 并且我已经实现了顶层模块,顶层模块是 scale_clock。

此外,当我进行行为模拟时,它模拟得很好。但是对于 post-map 或 post-route,我会收到上面的错误消息。

这是组件的代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-----------------------------------------
-- scale_clock entity declaration --
-----------------------------------------
ENTITY scale_clock IS
  GENERIC (n_bits : INTEGER := 10);
  PORT
  (
    clk_i  : IN  STD_LOGIC;
    load   : IN  STD_LOGIC;
    d      : IN  UNSIGNED (n_bits-1 DOWNTO 0) := (OTHERS => '0');
    clk_o  : OUT STD_LOGIC 
  );
END scale_clock;

----------------------------------------------
-- scale_clock architecture definition --
----------------------------------------------
ARCHITECTURE behavioral OF scale_clock IS
  SIGNAL new_clk : STD_LOGIC := '0';

BEGIN
  clk_o <= new_clk;

  clk_gen: PROCESS(clk_i, load, d) -- Should load and d be in the stvty list? --
    VARIABLE cnt : UNSIGNED (n_bits-1 DOWNTO 0) := (0 => '1', OTHERS => '0');
    VARIABLE top : UNSIGNED (n_bits-1 DOWNTO 0) := (OTHERS => '0');
  BEGIN
    IF (rising_edge(clk_i)) THEN
      IF (load = '1') THEN
      -- Syncrounous load of prescaler value. --
        top     := d;
        cnt     := (0 => '1', OTHERS => '0');
        new_clk <= '0';
      ELSIF (cnt = top) THEN
        cnt     := (0 => '1', OTHERS => '0');
        new_clk <= NOT new_clk;
      ELSE
      -- Count up. --  
        cnt := cnt + 1;
      END IF;
    END IF;  
  END PROCESS;
END ARCHITECTURE;

这是测试台:

-- TestBench Template 
LIBRARY ieee;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;

ENTITY scale_clock_testbench IS
END scale_clock_testbench ;

ARCHITECTURE behavior OF scale_clock_testbench  IS 

-- Component Declaration
  COMPONENT scale_clock
  PORT
  (
    clk_i : IN STD_LOGIC;
    load  : IN STD_LOGIC;       
    d     : IN UNSIGNED (9 DOWNTO 0) := (OTHERS => '0');
    clk_o : OUT STD_LOGIC
  );
  END COMPONENT;

  SIGNAL  clk_i :  STD_LOGIC := '0';
  SIGNAL  load  :  STD_LOGIC := '0';
  SIGNAL  d     :  UNSIGNED (9 DOWNTO 0) := (OTHERS => '0');
  SIGNAL  clk_o :  STD_LOGIC := '0';

  CONSTANT CLK_PERIOD : TIME := 10 ns;

BEGIN

-- Component Instantiation
  uut: scale_clock PORT MAP
  (
    clk_i =>    clk_i,
    load  =>    load,
    d     =>    d,
    clk_o =>    clk_o
  );

  clk_process : PROCESS
  BEGIN
    clk_i   <=    '0';
    WAIT FOR CLK_PERIOD/2;
    clk_i   <=    '1';
    WAIT FOR CLK_PERIOD/2;
  END PROCESS;



--  Test Bench Statements
   tb : PROCESS
   BEGIN

      WAIT FOR 100 ns; -- wait until global set/reset completes

      -- Add user defined stimulus here

      WAIT FOR CLK_PERIOD * 3;
      d     <=  ("0100101100"); -- decimal 300 in binary --
      load  <= '1';
      WAIT FOR CLK_PERIOD * 1;
      load  <= '0';


      wait; -- will wait forever
   END PROCESS tb;
--  End Test Bench 

END;

我是 VHDL 的新手,但对我来说它们似乎匹配得很好。请指教。

4

2 回答 2

4

Tsukuyo 的回答中(几乎)正确地确定了这个问题。也就是说,综合(和 P&R)的 OUTPUTstd_logic[_vector]无处不在,如果您尝试模拟这些文件,您的测试台连接需要匹配它们的类型。

Xilinx 工具试图将一个糟糕的解决方案强加给您,即std_logic[_vector]随处使用,而不是让设计和测试平台真正反映设计的意图。如果你让它为一个模块自动生成一个测试平台,它会“有帮助地”将你所有的端口类型(如果你使用枚举或记录,通常是错误的!)转换为std_logic[_vector].

一个更好的解决方案(IMO)是按照它们应该的方式编写你的模块和测试平台 - 即你可以在最高级别(而不是浪费时间在低级别搞砸)。不仅无符号,而且枚举、整数、布尔值和记录都是可合成的。

然后(如果您需要进行路由后模拟)围绕自动生成的 std_logic 版本编写一个简单的包装器,它将其所有端口转换为正确的类型,并在您的测试台中实例化该包装器。

于 2013-09-14T15:08:54.243 回答
2

这里

引用:问题在于,对于综合而言,赛灵思假设每个端口都是 std_logic 或 std_logic_vector 类型(因为它会生成一个新的 VHDL 文件来执行综合模型,包括精确的时序仿真)。为了让它与合成器一起工作,您应该更改实体定义。

于 2013-09-14T09:41:21.710 回答