2015-03-18 6 views
0

Я вопрос о сазе и VHDL 2008 я объект, определенном таким образом:VHDL 2008 и саз

entity multiplier_v2 is 
generic( WIDTH_WORD : integer := 32; 
      WIDTH_RSA : integer := 2048; 
      LENGTH_ADDRESS : integer := 6); 
port (
    reset     : in std_logic; 
    clk      : in std_logic; 
    start     : in std_logic; 
    input_1     : in std_logic_vector(WIDTH_WORD - 1 downto 0); 
    input_2     : in std_logic_vector(WIDTH_WORD - 1 downto 0); 
    module     : in std_logic_vector(WIDTH_WORD - 1 downto 0); 
    output     : out std_logic_vector(WIDTH_WORD - 1 downto 0); 
    ack_data    : out std_logic; 
    data_valid    : out std_logic; 
    new_module    : in std_logic; 

Внутри модуля я сигнал объявленным таким образом, :

signal counter_ack     : std_logic_vector(LENGTH_ADDRESS - 1 downto 0); 

Я использую этот сигнал в случае заявления:

case counter_ack is 
when (others => '1') => 
    ack_data <= '0'; 
when others => 
    counter_ack <= counter_ack + 1; 
end case; 

Теперь, я уверен, что VHDL-2008 опция включена в моем синтеза инструмент, но у меня есть следующее сообщение об ошибке в отношении той части моего кода:

2049990 ERROR - E:/My_Designs/Пользовательский модуль/Montgomery_Multiplier/Алмазные/SRC/multiplier_v2.vhd (456,6-461,15) (VHDL-1544), должен иметь локальный статический подтип

Я читал, что эту ошибку следует исправить в VHDL-2008. Есть идеи ?

+0

Я не уверен, что это законно в VHDL-2008 (даже если какой-либо инструмент может его принять), поскольку диапазон не ограничен. IMO, вам было бы лучше с «if counter_ack = 2 ** counter_ack'length-1 then ack_data <= '0'; else counter_ack <= counter_ack + 1; end if; –

+0

@JonathanDrolet Спасибо за помощь. я знаю, что это законно или нет. Я видел, что на многих форумах это предлагаемое решение. Я могу использовать оператор if, но он отличается от синтеза из случая (у меня есть несколько случаев, подобных этому в моем источнике код) .Тогда я действительно не понимаю, где проблема. Когда я размещаю компонент в моей кодовой системе VHDL, синтезатор знает размер сигналов. Это не безусловный. Тогда почему с «If» следует быть в порядке, а с «случаем» нет? Возможно, моя ошибка - думать как программист С. – haster8558

+0

VHDL строго типизирован (C не является) и был разработан, чтобы уловить столько ошибок во время компиляции, насколько это возможно. совершенно ясно, как следует интерпретировать код, VHDL попросит вас явно написать его на всякий случай. тип литья существует в C, но не в VHDL. VHDL-2008 смягчил педантичность, но никогда не удалит его. Моя строка кода if сравнивает std_logic_vector (я предположил, что вы использовали ieee.numeric_std_unsigned) с целым числом, что является законным, так как существует перегруженный оператор сравнения. –

ответ

1

Я скомпилировал код, представленный ниже в Quartus II с опцией компилятора VHDL 2008. У меня нет ошибок. Проводится ли ваше дело в процессе?

LIBRARY ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
use ieee.std_logic_signed.all; 

ENTITY casestate IS 
generic( WIDTH_WORD : integer := 32; 
      WIDTH_RSA : integer := 2048; 
      LENGTH_ADDRESS : integer := 6); 
port (
    reset     : in std_logic; 
    clk      : in std_logic; 
    ack_data    : out std_logic 
    ); 
END casestate; 

ARCHITECTURE fpga OF casestate IS 
    signal counter_ack     : std_logic_vector(LENGTH_ADDRESS - 1 downto 0); 

BEGIN 

process(clk,reset) 
begin 
if(reset = '0')then 
    ack_data <= '0'; 
elsif(rising_edge(clk))then 
    case counter_ack is 
     when (others => '1') => 
      ack_data <= '0'; 
     when others => 
      counter_ack <= counter_ack + 1; 
      ack_data <= '1'; 
     end case; 
end if; 
end process; 
end fpga; 
+0

Да, он находится в процессе. На мой взгляд, Diamond (Lattice Semiconductor IDE), который отстой. У меня также нет ошибок в synplify. VHDL-2008 он плохо справляется. Я могу выбрать инструмент синтеза в инструменте Diamond (Synplify или Lattice). Первая работа, вторая - нет. Теперь я предполагаю, что если я хочу использовать логический анализатор Lattice, я не должен использовать VHDL-2008. – haster8558

+0

@Nicolas, пожалуйста, не используйте пакет «std_logic_signed». Что вы предлагаете делать с counter_ack для его сброса? Как указано в кодировке, ваша конструкция должна иметь значение counter_ack при его текущем значении во время сброса. Это приведет к подключению вашего сигнала сброса к функциональной логике, что может создать проблемы WRT глобальной линии сброса. –

+0

@Jim я написал этот код только для тестирования, если компилятор мне дал ошибку. Меня не волнует, имеет ли этот код смысл, но вы правы. –