Ошибка при записи в 3-й корпус в интерфейсе сопоставления памяти HPS FPGA Avalon

Мне нужно передать count_x 32-битных данных в HPS через интерфейс отображения памяти Avalon. 1-й и 2-й корпус работали нормально. И я получил данные в HPS. Но в 3-м случае WHEN '2' => avs_s0_readdata <= count_x(31 downto 0); показывает ошибку, так как ''2'' не объявлено, что это значит? Vhdl был сделан в Altera quartus 16.1, а система HPS была сделана в Qsys.

architecture behavior of encorder is
signal count : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal count_x : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal count_y : STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";


begin   

    PROCESS(avs_s0_read)
    BEGIN
    IF avs_s0_read = '1' THEN
    CASE(avs_s0_address) IS


WHEN '2' => avs_s0_readdata <= count_x(31 downto 0);

WHEN others => avs_s0_readdata <= x"00000000";
END CASE;
ELSE
avs_s0_readdata <= x"00000000";

END IF;
END PROCESS;`

person vassidefuk    schedule 13.04.2017    source источник
comment
Добро пожаловать в СО. Вы можете помочь человеку, который жертвует временем, чтобы помочь вам. Ваш код неполный. Мы не знаем, какой тип avs_s0_address ('2' относится к типу character. avs_s0_address не будет этого типа). Опубликуйте MCVE.   -  person Matthew Taylor    schedule 13.04.2017
comment
Не видя объявлений для avs_s0_address, может показаться, что «2» не является значением перечисления своего типа. Предоставьте минимальный, полный и поддающийся проверке пример. Ваша проблема не может быть продублирована (или, что более важно, кто-то может придумать пример вокруг вашего фрагмента, который не демонстрирует синтаксической проблемы). Если бы тип был std_logic (базовый тип std_ulogic), его значения перечисления состояли бы из символьных литералов 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H' , а также '-'. Обратите внимание, что условие if не привело к ошибке.   -  person    schedule 13.04.2017
comment
Другой инструмент может дать более описательное сообщение об ошибке — encorder.vhdl:34:6:error: can't match character literal '2' with type std_ulogic. std_logic является разрешенным подтипом std_ulogic - ("U", "X", "0", "1", "Z", "W", "L", "H" и "-"). '2' не является допустимым выбором в операторе case, поскольку он не представляет значение std_logic.   -  person    schedule 13.04.2017
comment
@user1155120 user1155120 спасибо, я понял, что вы сказали, тогда как я могу получить эти 3-е 32 бита данных?   -  person vassidefuk    schedule 13.04.2017
comment
Ваш код по-прежнему не является MCVE, но вы не можете выбирать между 3 (или 4 элементами с «3») с одним двоичным битовым представлением. Вы ожидаете больше декодированных выборок (например, avs_s0_address), где у каждой будет одно полезное состояние. В качестве альтернативы составное значение выбирает один из более чем двух элементов.   -  person    schedule 14.04.2017


Ответы (1)


avs_s0_address имеет тип STD_LOGIC. Этот тип не включает «2» в качестве возможного значения, поэтому он сказал, что он не объявлен. STD_LOGIC обычно используется для описания только двух логических значений одного бита, где есть «0» и «1». Вы можете найти все варианты, например, здесь

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

signal avs_s0_address_int : integer;

и в теле архитектуры вы можете добавить следующую строку:

avs_s0_address_int <= to_integer(unsigned(avs_s0_address));

Иметь значение адреса в целочисленном типе, который легче сравнивать в операторе case.

person Staszek    schedule 14.04.2017