2014-09-04 3 views
0

Как использовать неподписанные литералы в назначениях?Неподписанные литералы в VHDL

Взгляните на этот пример:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use ieee.numeric_std.all; 

entity myTest is 
    Port (clk : in STD_LOGIC); 
end myTest; 

architecture Behavioral of myTest is 

    signal testSignal : unsigned (31 downto 0); 

begin 
    process (clk) is 
    begin 
     if (rising_edge (clk)) then 

      -- this compiles fine: 
      testSignal <= testSignal + 1; 

      -- this causes an error. Why? 
      testSignal <= 1; 

     end if; 
    end process; 
end Behavioral; 

Линия:

  testSignal <= 1; 

приводит следующее сообщение об ошибке на Xilinx ISE:

Line 22. Type of testSignal is incompatible with type of 1.

Может кто-нибудь объяснить, почему и как это исправить?

ответ

2

Оператор + перегружен в ieee.numeric_std для unsigned и integer, поэтому первая линия работает; однако назначение не является (и не может быть), и поскольку 1 является целым литералом, он не может быть назначен непосредственно на unsigned (который является вектором); он должен быть преобразован первым. Стандартный метод является:

testSignal <= to_unsigned(1, testSignal'length); 

to_unsigned() принимает 2 аргумента: natural для преобразования, а длина вектора, чтобы преобразовать в.

+0

Спасибо. Теперь имеет смысл. –

+2

В дополнение к ответу fru1tbat вы также можете использовать прямые векторные присваивания с двоичными или шестнадцатеричными значениями, такими как 'testSignal <= x" 00023AD5 ";' или установить каждый бит в ноль, как этот 'testSignal <= (others => '0');' P.S. вы должны добавить значение инициализации к объявлению сигнала вашего счетчика :) – Paebbels

Смежные вопросы