Почему я получаю, что Entity port d не соответствует типу unsigned компонента portParsing, когда я пытаюсь смоделировать этот VHDL?

Полное сообщение об ошибке:

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 и реализовал верхний модуль, верхний модуль — 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, но мне кажется, что они прекрасно подходят друг другу. Пожалуйста посоветуй.


person evading    schedule 14.09.2013    source источник


Ответы (2)


Проблема (почти) правильно определена в ответе Цукуё. А именно, что OUTPUT из синтеза (и P&R) содержит std_logic[_vector] везде, и если вы пытаетесь смоделировать эти файлы, ваши подключения к тестовому стенду должны соответствовать их типам.

Инструменты Xilinx пытаются навязать вам ужасное решение, а именно использовать std_logic[_vector] везде вместо того, чтобы дизайн и тестовый стенд действительно отражали замысел проекта. До такой степени, что если вы позволите ему автоматически сгенерировать тестовую среду для модуля, он «услужливо» преобразует все ваши типы портов (часто неправильно, если вы используете перечисления или записи!) в std_logic[_vector].

Лучшее решение (IMO) состоит в том, чтобы написать как ваши модули, так и тестовый стенд такими, какими они должны быть, а именно на максимально возможном уровне (вместо того, чтобы тратить время на возню на низком уровне). Синтезируются не только беззнаковые, но и перечисления, целые числа, логические значения и записи.

Затем (если вам нужно выполнить симуляцию после маршрута) напишите простую оболочку вокруг автоматически сгенерированной версии std_logic, которая преобразует все ее порты в правильные типы, и создайте экземпляр этой оболочки в своем тестовом стенде.

person user_1818839    schedule 14.09.2013

См. здесь.

Cite: Проблема в том, что для синтеза Xilinx предполагает, что каждый порт имеет тип std_logic или std_logic_vector (поскольку он генерирует новый файл VHDL, который выполняет синтезированную модель, включая точное моделирование синхронизации). Чтобы он работал с синтезатором, необходимо изменить определение сущности.

person Community    schedule 14.09.2013
comment
Это точно помогло. Однако один вопрос: это только для моделирования после маршрута? Неподписанный должен быть синтетическим, я вообще верно? - person evading; 14.09.2013
comment
Да. Инструменты всегда преобразуют ваши контакты в std_logic и std_logic_vector. Конечно, беззнаковое можно синтезировать. - person ; 14.09.2013